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
Sin golf (además, agregué un mensaje; el de arriba solo espera a que se escriba un nombre):
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 es el primer programa SNOBOL que he escrito.
SNOBOL es un lenguaje orientado a líneas, como FORTRAN, COBOL o BASIC. Cada línea consta de una etiqueta opcional que comienza en la columna 1, el código de la línea que puede implicar asignaciones y coincidencia de patrones, y una rama opcional. Sí, las líneas terminan con GOTO (opcionales). Vienen en dos formas:
:(TARGET)
Ramas para etiquetar TARGET, mientras
:S(SUCCESS) F(FAILURE)
Se bifurca SUCCESSsi la coincidencia de patrón tuvo éxito o FAILUREno. También puede simplemente ramificarse en el éxito y pasar a la siguiente línea en caso de falla, o viceversa.
Las líneas de continuación comienzan con a +o .. Los comentarios comienzan con a *.
¿Como funciona?
Leer en un nombre, convertirlo a minúsculas. Configure los nombres B, F y M, suponiendo que comience con una vocal. Luego verifique si comienza con un intervalo de consonantes. Si no, ¡estamos listos para partir! Si es así, elimine las consonantes iniciales y configure los nombres B, F y M, suponiendo que no comience con ninguna de esas letras. Finalmente, verifique si comienza con cada una de esas letras, arreglando los nombres según sea necesario. ¡Entonces estamos listos para jugar el juego de los nombres!
Ejecución de muestra:
# $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
Ejecuté esto en el emulador de mainframe Hercules S / 370 que ejecuta la versión 6.0a del Sistema de terminales de Michigan utilizando SNOBOL4 versión 3.10 del 1 de abril de 1973 creado para MTS el 1 de mayo de 1975, pero probablemente haya formas más fáciles de ejecutar SNOBOL4 en un sistema moderno :)
Editar: se eliminó una rama de éxito redundante que era equivalente a una falla (no me di cuenta de que podía poner solo una rama de falla por sí misma) que elimina una etiqueta de rama innecesaria, y convirtió un goto incondicional en una rama de falla en la línea anterior, para un ahorro de 7 bytes.
Ahora que TIO tiene soporte SNOBOL4, ¡puede
probarlo en línea! Nota: Muestra el tamaño como 429 en lugar de 430 porque cuando lo pegué allí, se eliminó el avance de línea final. Traté de cambiar la línea de continuación (la que comienza con +) a una sola línea, que no era legal en la versión de mainframe porque la línea era demasiado larga, y funcionó y la redujo a 427. Obviamente CSNOBOL4 permite líneas más largas. Sin embargo, voy a dejar mi puntaje en 430, porque esa es la cantidad de bytes que tenía el script en mi máquina, y además, SNOBOL es bastante poco competitivo.
Yse maneja como una voz, asíYveses comoIvesoArnold.