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 (und ich habe eine Eingabeaufforderung hinzugefügt; die obige wartet nur darauf, dass ein Name eingegeben wird):
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
Dies ist das erste SNOBOL-Programm, das ich jemals geschrieben habe.
SNOBOL ist eine zeilenorientierte Sprache wie FORTRAN, COBOL oder BASIC. Jede Zeile besteht aus einer optionalen Beschriftung ab Spalte 1, dem Code für die Zeile, der Zuweisungen und Musterabgleich beinhalten kann, und einem optionalen Zweig. Ja, Zeilen enden mit (optionalen) GOTOs. Sie kommen in zwei Formen:
:(TARGET)
Zweige zu beschriften TARGET, während
:S(SUCCESS) F(FAILURE)
Verzweigt zu, SUCCESSob die Musterübereinstimmung erfolgreich war oder FAILUREnicht. Sie können auch einfach nach Erfolg verzweigen und bei Misserfolg in die nächste Zeile wechseln oder umgekehrt.
Fortsetzungszeilen beginnen mit einem +oder .. Kommentare beginnen mit a *.
Wie funktioniert es?
Lesen Sie einen Namen ein und konvertieren Sie ihn in Kleinbuchstaben. Richten Sie die B-, F- und M-Namen so ein, dass sie mit einem Vokal beginnen. Überprüfen Sie dann, ob es mit einer Reihe von Konsonanten beginnt. Wenn nicht, sind wir bereit zu gehen! Wenn ja, entfernen Sie die führenden Konsonanten und richten Sie die B-, F- und M-Namen ein, vorausgesetzt, sie beginnen nicht mit einem dieser Buchstaben. Überprüfen Sie abschließend, ob es nacheinander mit jedem dieser Buchstaben beginnt, und korrigieren Sie die Namen nach Bedarf. Dann sind wir bereit, das Namensspiel zu spielen!
Probelauf:
# $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
Ich habe dies auf dem Hercules S / 370-Mainframe-Emulator ausgeführt, auf dem die Version 6.0a des Michigan Terminal Systems mit SNOBOL4 Version 3.10 vom 1. April 1973 ausgeführt wurde, die am 1. Mai 1975 für MTS erstellt wurde, aber es gibt wahrscheinlich einfachere Möglichkeiten, SNOBOL4 auf einem auszuführen modernes System. :) :)
Bearbeiten: Ein redundanter Erfolgszweig wurde entfernt, der einem Durchfall entspricht (ich wusste nicht, dass ich nur einen Fehlerzweig selbst einfügen kann), wodurch ein nicht benötigtes Zweigetikett entfernt wird, und ein bedingungsloser Goto in einen Fehlerzweig in der vorherigen Zeile umgewandelt. für eine Einsparung von 7 Bytes.
Jetzt, da TIO SNOBOL4 unterstützt, können Sie es online ausprobieren
! Hinweis: Die Größe wird als 429 anstatt als 430 angezeigt, da beim Einfügen dort der endgültige Zeilenvorschub entfernt wurde. Ich habe versucht, die Fortsetzungszeile (die mit beginnt +) in eine einzelne Zeile zu ändern , was in der Mainframe-Version nicht zulässig war, da die Zeile zu lang war, und es hat funktioniert und sie auf 427 reduziert. Offensichtlich erlaubt CSNOBOL4 längere Zeilen. Ich werde meine Punktzahl jedoch bei 430 belassen, da das Skript so viele Bytes auf meinem Computer hatte und SNOBOL außerdem nicht wettbewerbsfähig ist.
Yes wird als Gesang behandelt, alsoYvesist es wieIvesoderArnold.