SNOBOL4, 437 430 bytes
N = TRIM(INPUT)
D = REPLACE(N,'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
+'abcdefghijklmnopqrstuvwxyz')
B = "b" D
F = "f" D
M = "m" D
&ANCHOR = 1
D SPAN('bcdfghjklmnpqrstvwxyz') . I REM . R :F(Y)
B = "b" R
F = "f" R
M = "m" R
I "b" :S(U)
I "f" :S(V)
I "m" :S(W) F(Y)
U D "b" REM . B :(Y)
V D "f" REM . F :(Y)
W D "m" REM . M
Y OUTPUT = N ", " N ", bo-" B
OUTPUT = "Banana-fana fo-" F
OUTPUT = "Fee-fi-mo-" M
OUTPUT = N "!"
END
Ungolfed (mais eu adicionei um prompt; o acima apenas espera que um nome seja digitado):
OUTPUT = "Please enter your name."
Name = TRIM(INPUT)
UC = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
LC = 'abcdefghijklmnopqrstuvwxyz'
Low = REPLACE(Name, UC, LC)
BName = "b" Low
FName = "f" Low
MName = "m" Low
Consonants = SPAN('bcdfghjklmnpqrstvwxyz')
&ANCHOR = 1
Low Consonants . First REM . Rest :F(READY)
BName = "b" Rest
FName = "f" Rest
MName = "m" Rest
First "b" :S(BINIT)
First "f" :S(FINIT)
First "m" :S(MINIT) F(READY)
BINIT Low "b" REM . BName :(READY)
FINIT Low "f" REM . FName :(READY)
MINIT Low "m" REM . MName
READY OUTPUT = Name ", " Name ", bo-" BName
OUTPUT = "Banana-fana fo-" FName
OUTPUT = "Fee-fi-mo-" MName
OUTPUT = Name "!"
END
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:
:(TARGET)
Ramos para rotular TARGET, enquanto
:S(SUCCESS) F(FAILURE)
Ramifica para SUCCESSse a correspondência de padrões for bem-sucedida ou FAILUREnã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:
# $RUN *SNOBOL4 5=GOLF.SNO+*SOURCE* 6=*DUMMY*(1,28)+*SINK*(1,4)+*DUMMY*
# Execution begins 16:57:25
Snowman
Snowman, Snowman, bo-bowman
Banana-fana fo-fowman
Fee-fi-mo-mowman
Snowman!
# Execution terminated 16:57:30 T=0.013
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.
Yé tratado como vocal, assimYvescomo éIvesouArnold.