SNOBOL4, 437 430 octets
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
Non golfé (en plus j'ai ajouté une invite; celle ci-dessus n'attend qu'un nom à taper):
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
Ceci est le premier programme SNOBOL que j'ai jamais écrit.
SNOBOL est un langage orienté ligne, comme FORTRAN, COBOL ou BASIC. Chaque ligne se compose d'une étiquette facultative commençant dans la colonne 1, du code de la ligne qui peut impliquer des affectations et une correspondance de modèle, et d'une branche facultative. Oui, les lignes se terminent par (facultatif) GOTO. Ils se présentent sous deux formes:
:(TARGET)
Branches à étiqueter TARGET, tout en
:S(SUCCESS) F(FAILURE)
Se branche sur SUCCESSsi la correspondance de modèle a réussi, ou FAILUREautrement. Vous pouvez également vous contenter du succès et passer à la ligne suivante en cas d'échec, ou vice versa.
Les lignes de suite commencent par un +ou .. Les commentaires commencent par un *.
Comment ça marche?
Lisez un nom, convertissez-le en minuscules. Configurez les noms B, F et M en supposant que cela commence par une voyelle. Vérifiez ensuite si cela commence par une série de consonnes. Sinon, nous sommes prêts à partir! Si c'est le cas, supprimez les consonnes principales et définissez les noms B, F et M en supposant que cela ne commence par aucune de ces lettres. Enfin, vérifiez si cela commence par chacune de ces lettres à tour de rôle, en fixant les noms au besoin. Ensuite, nous sommes prêts à jouer au jeu des noms!
Exemple d'exécution:
# $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
J'ai exécuté cela sur l' émulateur de mainframe Hercules S / 370 exécutant la version 6.0a du Michigan Terminal System en utilisant SNOBOL4 version 3.10 à partir du 1er avril 1973, conçu pour MTS le 1er mai 1975, mais il existe probablement des moyens plus faciles d'exécuter SNOBOL4 sur un système moderne. :)
Edit: Suppression d'une branche de réussite redondante équivalente à une solution de remplacement (je ne savais pas que je pouvais mettre une branche de défaillance seule) qui élimine une étiquette de branche inutile et a transformé un goto inconditionnel en une branche de défaillance sur la ligne précédente, pour une économie de 7 octets.
Maintenant que TIO est compatible SNOBOL4, vous pouvez l'
essayer en ligne! Remarque: la taille est 429 au lieu de 430, car lorsque je l'ai collée ici, le saut de ligne final a été supprimé. J'ai essayé de changer la ligne de continuation (celle commençant par +) en une seule ligne, ce qui n'était pas légal sur la version mainframe car la ligne était trop longue, et cela a fonctionné et l'a ramenée à 427. Évidemment, CSNOBOL4 autorise des lignes plus longues. Je vais laisser mon score à 430, cependant, car c'est le nombre d'octets du script sur ma machine, et en plus, SNOBOL est assez non compétitif.
Yc'est traité comme une voix,Yvesc'est commeIvesouArnold.