Você está fornecendo suporte técnico para o Bruce Dickenson como ele produz uma sessão de gravação Blue Oyster Cult. Quando ele pede mais chocalho , você pode dar a ele.
Sua tarefa
Escreva um programa ou função que use uma string (ou equivalente no seu idioma) como entrada e emita uma string relacionada contendo mais um cowbell.
Quantos chocalhos contém uma corda?
O número de campainhas que uma string contém é igual ao número máximo de cópias distintas de "cowbell" que podem ser obtidas permutando os caracteres da string. Por exemplo, "bbbccceeellllllooowwwwwwwww"
contém 3 cencerros, enquanto "bbccceeellllllooowwwwwwwww"
e "bbbccceeelllllooowwwwwwwww"
contêm cada um 2 cencerros, e "cowbel"
contém 0 Tama.
Como a saída deve estar relacionada à entrada?
A saída deve consistir na concatenação, nessa ordem, da sequência de entrada e o prefixo mais curto da sequência de entrada necessária para aumentar o número de chocalhos.
Por exemplo, "bbbccceeelllllooowwwwwwwww"
precisa apenas de um adicional "l"
para conter 3 chocalhos em vez de 2; o prefixo curto que contém o "l"
é "bbbccceeel"
. Portanto, se a entrada for "bbbccceeelllllooowwwwwwwww"
, a saída deve ser "bbbccceeelllllooowwwwwwwwwbbbccceeel"
.
Technicalities
- Você pode assumir que a entrada contém apenas caracteres ASCII imprimíveis. Se houver um ou dois caracteres que são irritantes para o processamento de strings do seu idioma (como novas linhas ou
\
), você pode assumir que a entrada não os contém - apenas mencione esta restrição. - Você também pode assumir que os caracteres alfabéticos na entrada estão todos em minúsculas ou em maiúsculas. Se você optar por não assumir uma delas, conte os chocalhos sem diferenciar maiúsculas de minúsculas.
- Você pode ainda assumir que a entrada contém pelo menos uma cópia de cada um dos personagens
b
,c
,e
,l
,o
, ew
. Isso equivale a supor que algum prefixo da string possa ser concatenado para produzir uma string que contenha mais cowbell. (Observe que a própria string de entrada não precisa conter um chocalho.) - Se o seu idioma possui um built-in que resolve esse problema ... use-o totalmente, sério, o quão impressionante é isso.
Fraldas folheadas a ouro
Como o tempo de gravação do estúdio é caro, seu código deve ser o mais curto possível. A entrada com menos bytes é o vencedor!
Casos de teste
( link pastebin para facilitar a cópia / colar)
Entrada de teste nº 1: "christopher walken begs for more cowbell!"
Teste de saída 1: "christopher walken begs for more cowbell!christopher wal"
Entrada de teste nº 2: "the quick brown fox jumps over the lazy dog"
Teste de saída # 2: "the quick brown fox jumps over the lazy dogthe quick brown fox jumps over the l"
Entrada de teste nº 3: "cowbell"
Teste de saída # 3: "cowbellcowbell"
Entrada de teste # 4: "cowbell cowbell cowbell"
Teste de saída # 4: "cowbell cowbell cowbellcowbell"
Entrada de teste nº 5: "cowbell cowbell cowbel"
Teste de saída # 5: "cowbell cowbell cowbelcowbel"
Entrada de teste # 6: "bcelow"
Teste de saída # 6: "bcelowbcel"
Entrada de teste nº 7: "abcdefghijklmnopqrstuvwxyz"
Teste de saída 7: "abcdefghijklmnopqrstuvwxyzabcdefghijkl"
Entrada de teste nº 8: "cccowwwwbbeeeeelllll"
Teste de saída # 8: "cccowwwwbbeeeeelllllccco"
Entrada de teste nº 9: "be well, programming puzzles & code golf"
Teste de saída # 9: "be well, programming puzzles & code golfbe well, programming puzzles & c"
Entrada de teste nº 10: "lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. wow!"
Teste de saída # 10: "lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. wow!lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut lab"
Entrada de teste # 11:
"c-c-b-c
i have a cow, i have a bell.
uh! bell-cow!
i have a cow, i have a cowbell.
uh! cowbell-cow!
bell-cow, cowbell-cow.
uh! cow-cowbell-bell-cow.
cow-cowbell-bell-cow!
"
Resultado do teste # 11:
"c-c-b-c
i have a cow, i have a bell.
uh! bell-cow!
i have a cow, i have a cowbell.
uh! cowbell-cow!
bell-cow, cowbell-cow.
uh! cow-cowbell-bell-cow.
cow-cowbell-bell-cow!
c-c-b-c
i have a cow, i have a bell"
test case -> result
em um grande bloco de código pré-formatado. É muito mais agradável esteticamente e mais fácil copiar e colar.L
s na palavra, não é isso que o desafio pede.Respostas:
Pip ,
504238 bytesPasse a string como um argumento de linha de comando, citado se necessário. Experimente online!
Explicação
Vou explicar isso em duas partes: a função cowbell e o programa completo. Primeiro, aqui está a função que calcula a quantidade de cowbell em uma string:
{...}
define uma função. Muitos operadores Pip, quando aplicados a uma função, retornam outra função; por exemplo,-{a+1}
é o mesmo que{-(a+1)}
. Portanto, o acima é equivalente aque funciona da seguinte maneira:
Agora que temos isso, aqui está o programa completo:
fonte
cowbell cowbell cowbee
e a saída eracowbellcowbelcowbel
, mas eu poderia estar usando o errado IDE (novo para PIP)cowbell cowbell cowbeecowbell
( experimente online ). Você está usando o TIO ou uma cópia local?C,
511488474470463454Experimente online
Formato legível + explicação:
Alguns truques divertidos usados:
• Ao verificar os caracteres, digito
'w'
o caractere w de 3 bytes, mas os caracteres'c'
e'b'
eu podemos digitar seus valores ASCII 99 e 98, respectivamente, para salvar um byte de cada vez. (Edit: Graças a @Titus, eu sei fazer isso com todas as letras COWBELL usando apenas entrada maiúscula, que são todos os valores ASCII numéricos de 2 bytes)•
r=~-l/2
estár=(l-1)/2
usando bitshifts•
a[++i]
Estou obtendo o caractere no índice (i) e iterando o índice, tudo ao mesmo tempo. Eu apenas começoi
emi=-1
vez dei=0
(faço o mesmoz
e começoz=i
a salvar outro byte)fonte
c
) é sempre definido como 1 [...]". Ficaríamos felizes em ter sua declaração sobre o porquê de você pensar lá, porque isso parece estranho para alguns de nós.c,o,w,b,e
seja inicializado com o mesmo valor, em vez de 1? Como sua dica nº 2 parece não ser verdadeira, pelo menos para o IC, pelo menos. Você pode esclarecer? Pergunta SOPython 2,
125113112 bytesn
conta o número de chocalhos-12 bytes graças a @Rod
-1 byte graças a @Titus
fonte
[]
para a compreensão da lista quando é o único parâmetro, você também pode soltarenumerate
:min(s.count(c)/-~(c=='l')for c in"cowbel")
onde-~(n=='l')
é um caminho mais curto para escrever1+(n=='l')
>>
seria mais curto que/-~
?return
seria o momento, então?Perl 6 , 91 bytes
Pressupõe entrada em letras minúsculas.
Como funciona
Dentro do lambda, outro lambda para contar o número de chocalhos em uma string é definido da seguinte maneira:
O restante do código usa essa lambda interna
&c
para encontrar o resultado, assim:fonte
MATL ,
3837 bytes1 byte de desconto, graças à idéia do @ DLosc de usar a string de modelo em
lcowbe
vez decowbel
Os caracteres de entrada estão todos em minúsculas. Se a entrada contiver novas linhas, o caractere da nova linha precisará ser inserido como seu código ASCII concatenado com os caracteres normais (consulte a última entrada no link com todos os casos de teste).
Experimente online! Ou verifique todos os casos de teste .
fonte
JavaScript (ES6), 106
107 113 126 141Uma portabilidade para javascript da resposta Pip feita por @DLosc. Eu precisava de algum tempo para entender completamente, e é genial.
Edite -15 bytes seguindo a dica de @Titus, anexando diretamente caracteres à string de entrada
a
e evitando retorno antecipado (portanto, nãofor/if
)Editar 2 enumerando o valor 6 para a função Min salva outros 13 bytes
A edição 3 mudou a função c novamente. Eu pensei que o detalhado
length
esplit
seria muito demorado. Eu estava errado.Assumindo entrada em minúsculas
Menos golfe
Teste
fonte
k[x]++
isso falharia devido aundefined
. Mas tenho certeza de quefor(i=0;c(a)==c(a+=a[i++]);),a
funciona.>>!i
salva 3 bytes. Por que você não usac(a+=z)
?c(a+=z)
. Não na versão menos golfe , como é, você vê, menos golfe. O uso>>!i
salva 1 byte (na versão em golf). Obrigado novamenteUtilitários Bash + Unix, 184 bytes
Experimente online!
Graças a @AlbertRenshaw por jogar fora 2 bytes.
fonte
!=
JavaScript (ES6),
124114 bytesAgradecimentos a Neil por salvar alguns bytes
Como isso é bem diferente da resposta JavaScript já existente, e dediquei bastante tempo a isso, decidi criar uma resposta pessoalmente.
Uso
Saída
fonte
.sort()[0]
é uma ideia maravilhosa.eval
é mau. : DMath.min()
, mas isso custou muitos caracteres e achei que haveria uma maneira mais curta. E sim,eval
é muito bom para jogar golfe..sort()[0]
trabalhou, ele só iria custar 10 bytes, mas isso não acontece, e.sort((a,b)=>a-b)[0]
custa 20 bytes, masMath.min(...)
custa apenas 13.Oitava,
808797 bytesExperimente Online!
fonte
l
s para concluir o cowbell adicional. Por exemplo, na entradacowbell
, ele retorna incorretamentecowbellcowbel
e nãocowbellcowbell
. (Espero que você possa corrigi-lo-I como o algoritmo atípica!)CJam, 37
Experimente online
Se eu posso excluir os caracteres
"
e\
, então…35 bytes
Experimente online
Explicação
O código anexa sucessivamente cada caractere da string à string inicial (do original para o dobro), determina o número de campainhas para cada string (contando o número de ocorrências de cada caractere no "cowbel" e dividindo o caractere por 'l' por 2 e, em seguida, obtendo o mínimo), localiza a posição da primeira string em que o número de campainhas aumenta em 1, pega o prefixo correspondente da entrada e o coloca após a string de entrada.
Para incluir também a string original (sem nenhum caractere acrescentado), o código anexa um caractere neutro à string que está sendo iterada. A primeira versão precede um espaço e a segunda versão usa a representação de string, ou seja, a string entre aspas duplas.
fonte
PHP, 133 bytes
uma porta PHP da porta JavaScript do @ edc65 da resposta Pip do DLosc.
recebe entrada em minúscula do argumento da linha de comando. Corra com
-nr
.demolir
fonte