Escreva um programa para jogar o nome do jogo .
Entrada
Seu programa deve aceitar um único nome como entrada do usuário de alguma forma (por exemplo, ler da entrada padrão ou como um argumento da linha de comando). Você pode assumir que o nome é uma única palavra que consiste em uma letra maiúscula seguida por uma ou mais letras minúsculas.
Resultado
Seu programa deve imprimir a rima para o nome fornecido, conforme explicado na música, preenchendo o seguinte modelo:
(X), (X), bo-b(Y)
Banana-fana fo-f(Y)
Fee-fi-mo-m(Y)
(X)!
Aqui, (X)
é o nome original e (Y)
é o nome em letras minúsculas, com as consoantes iniciais removidas.
Há uma exceção, no entanto. Se o nome original começar com m
, f
ou b
, ele deve ser escrito sem essa letra na linha correspondente. Por exemplo, se o nome era Bob
, a linha "b" deve terminar com bo-ob
. Note-se que, neste caso, quaisquer outras consoantes são mantidos, então para Fred
que é fo-red
, não fo-ed
.
Exemplos
Shirley:
Shirley, Shirley, bo-birley
Banana-fana fo-firley
Fee-fi-mo-mirley
Shirley!
Arnold:
Arnold, Arnold, bo-barnold
Banana-fana fo-farnold
Fee-fi-mo-marnold
Arnold!
Prumo:
Bob, Bob, bo-ob
Banana-fana fo-fob
Fee-fi-mo-mob
Bob!
Fred:
Fred, Fred, bo-bed
Banana-fana fo-red
Fee-fi-mo-med
Fred!
Pontuação
O menor código vence.
Y
é tratado como vocal, assimYves
como éIves
ouArnold
.Y
uma vogal se for seguida por uma consoante. Isso deve cobrir esses casos pelo menos.Respostas:
vi,
118115O código inclui 5 caracteres de controle, que coloquei entre colchetes. Cada um conta apenas como um único caractere na contagem de caracteres.
EDIT: Mover a primeira junção (J) para mais tarde e alterar a pasta antes (P) para uma pasta após (p) me salvou 1 caractere. Além disso, não capturar o o no regex me salvou mais 2 caracteres.
fonte
SNOBOL4,
437430 bytesUngolfed (mais eu adicionei um prompt; o acima apenas espera que um nome seja digitado):
Este é o primeiro programa SNOBOL que eu já escrevi.
SNOBOL é uma linguagem orientada a linhas, como FORTRAN, COBOL ou BASIC. Cada linha consiste em um rótulo opcional começando na coluna 1, o código da linha que pode envolver atribuições e correspondência de padrões e uma ramificação opcional. Sim, as linhas terminam com GOTOs (opcionais). Eles vêm em duas formas:
Ramos para rotular
TARGET
, enquantoRamifica para
SUCCESS
se a correspondência de padrões for bem-sucedida ouFAILURE
não. Você também pode simplesmente se ramificar no sucesso e passar para a próxima linha em caso de falha, ou vice-versa.As linhas de continuação começam com um
+
ou.
. Os comentários começam com a*
.Como funciona?
Leia um nome, converta-o para minúsculas. Configure os nomes B, F e M, assumindo que ele comece com uma vogal. Em seguida, verifique se começa com um período de consoantes. Caso contrário, estamos prontos para ir! Nesse caso, retire as consoantes principais e configure os nomes B, F e M, assumindo que não comece com nenhuma dessas letras. Por fim, verifique se começa com cada uma dessas letras, fixando os nomes conforme necessário. Então estamos prontos para jogar o nome do jogo!
Exemplo de execução:
Eu executei isso no emulador de mainframe Hercules S / 370 executando a versão 6.0a do Michigan Terminal System usando o SNOBOL4 versão 3.10 de 1 de abril de 1973 criado para o MTS em 1 de maio de 1975, mas provavelmente existem maneiras mais fáceis de executar o SNOBOL4 em um sistema moderno. :)
Edit: Removido um ramo de sucesso redundante que era equivalente a um avanço (eu não sabia que poderia colocar apenas um ramo de falha sozinho) que elimina um rótulo de ramo desnecessário e transformou um ir incondicional em um ramo de falha na linha anterior, para uma economia de 7 bytes.
Agora que o TIO tem suporte ao SNOBOL4, você pode experimentá-lo online! Nota: Mostra o tamanho 429 em vez de 430, porque quando o colei lá, o avanço de linha final foi removido. Tentei alterar a linha de continuação (a que começa com
+
) para uma única linha, o que não era legal na versão mainframe porque a linha era muito longa e funcionou e a reduziu para 427. Obviamente, o CSNOBOL4 permite linhas mais longas. No entanto, vou deixar minha pontuação em 430, porque é quantos bytes o script tinha na minha máquina e, além disso, o SNOBOL é bastante não competitivo.fonte
N = TRIM(INPUT)
podem ser assimN =TRIM(INPUT)
.J , 149 caracteres
fonte
Javascript, 115 bytes
Explicação:
esta função retorna o nome sem as consoantes iniciais
Em seguida, o resto é uma função retornando a sequência completa.
Editar: de 119 a 115 bytes graças a @Martin Ender
fonte
/[aeiou]\w*/i
.JavaScript, <s>119</s> 115 bytes
no cabeçalho, para dar às pessoas uma dica de que havia originalmente uma versão mais longa, se estiverem interessadas.Clojure , 292 caracteres após minimizar
Aqui está uma primeira tentativa, quase positiva de que eu possa entender melhor:
Estou apenas aprendendo clojure e pensei que seria divertido tentar. Aqui está o meu raciocínio:
fonte
Scala 281
Substituí (X) e (Y) no padrão por
#
e012
.S
é apenas um novo nome paraString
ea(b,c,d)
é uma definição abreviada deb.replaceAll(c,d)
Chamada de teste:
E não destruído:
fonte
Python 3,
148145142 bytesSim, eu sei que é um pouco tarde, mas ...
Ele usa as novas strings f para formatar a string resultante.
Acho que o TIO ainda não suporta f-strings, infelizmente.
Versão antiga
Guardado 3 bytes graças a @officialaimm
fonte
Sed, 162 bytes
Eu não sabia muito bem antes de fazer isso. Eu sei muito melhor agora. O primeiro sed no pipeline duplica o nome três vezes, tornando-se "Bob \ nBob \ nBob \ nBob" em vez de apenas "Bob". O próximo sed faz o trabalho pesado.
Espera entrada no stdin como
echo Name |sed ...
Ungolfed:
Algumas notas. As quatro primeiras correspondências, 1s, 2s, 3s, 4s, transformam a saída em algo não muito correto. Bob tornou-se bo-bbob, Fred tornou-se um fracassado, e Mike tornou-se mo-mmike. Kay se tornaria mo-mkay, mkay?
Então, precisamos substituir bo-bbob por bo-ob ou bo-bkay por bo-bay. Para fazer isso, podemos usar um recurso em que fazemos uma substituição s /// e, em seguida, ramificá-lo se for bem-sucedido, saltando sobre o segundo que agora queremos pular. Mas, se falhar, queremos passar pelo ramo e fazer a próxima substituição.
O comando t [label] faz isso, ramificando apenas se um s /// anterior corresponder. Mas, no início do script, eu já fiz um s /// para cada linha (os números iniciais em 1s, 2s etc. são endereços; eles significam que o comando só é executado se o endereço corresponder). Portanto, não importa em que linha estamos, 1, 2, 3 ou 4, pelo menos um s /// correspondeu. (Tentei fazer o contrário, massageando os nomes e adicionando o "Banana-etc." Depois, mas fiquei preso dessa maneira e tentar fazer tudo de uma vez causaria alguma repetição.) Felizmente, a bandeira pode ser limpo tomando um ramo, então fazemos isso com "tx;: x". tx ramifica para o rótulo x, e: x é o rótulo x.
Ufa! Isso limpa o paladar para as duas substituições finais. Tentamos um e, se conseguirmos, ramificamos sobre o outro, caso contrário, fazemos o segundo. De qualquer forma, acabamos no rótulo: z e o buffer do padrão contém uma linha de letra que é impressa em stdout.
Obrigado por me convencer a passar tempo suficiente com a página de manual do sed e o manual do Texinfo para finalmente entender como fazer mais do que sed s / foo / bar /
fonte
|
tudo. Talvez eu deva chamar isso de bash / sed ou conte de forma diferente? Eu não sei. Estou feliz com isso como está, mas deixe-me saber se deve ser diferente pelos padrões do PPCG.Python, 161
Acabei de perceber que meu código falha ...
- Não remove as constantes iniciais.
- Não gerencia o negócio de 'bo-ob'.
É o máximo que eu tenho, talvez alguém possa terminar.
fonte
Groovy, 146
fonte
R, 189 caracteres
Mas com apenas mais um caractere, você pode inserir muitos nomes de uma só vez:
fonte
Pitão , 111 bytes SBCS
Suíte de teste
O código usa caracteres não imprimíveis e, como tal, não é exibido corretamente no Stack Exchange. O link fornecido contém esses caracteres e é a versão correta do programa.
fonte
Pitão
fonte