SNOBOL4, 437 430 byte
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 (più ho aggiunto un prompt; quello sopra attende solo che venga digitato un nome):
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
Questo è il primo programma SNOBOL che abbia mai scritto.
SNOBOL è un linguaggio orientato alla linea, come FORTRAN, COBOL o BASIC. Ogni riga è composta da un'etichetta opzionale che inizia nella colonna 1, dal codice per la riga che può comportare assegnazioni e corrispondenza dei motivi e da un ramo opzionale. Sì, le righe terminano con GOTO (facoltativi). Vengono in due forme:
:(TARGET)
Rami da etichettare TARGET, mentre
:S(SUCCESS) F(FAILURE)
Si dirige verso SUCCESSse la corrispondenza del modello ha avuto esito positivo o in FAILUREaltro modo. Puoi anche ramificare il successo e passare alla riga successiva in caso di fallimento, o viceversa.
Le righe di continuazione iniziano con un +o .. I commenti iniziano con a *.
Come funziona?
Leggi in un nome, convertilo in minuscolo. Imposta i nomi B, F e M supponendo che inizi con una vocale. Quindi controlla se inizia con un arco di consonanti. Altrimenti, siamo pronti per partire! In tal caso, togli le principali consonanti e imposta i nomi B, F e M supponendo che non inizi con nessuna di quelle lettere. Infine, controlla se inizia con ciascuna di quelle lettere a turno, fissando i nomi secondo necessità. Quindi siamo pronti per giocare al gioco del nome!
Esecuzione di esempio:
# $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
L'ho eseguito sull'emulatore mainframe Hercules S / 370 che esegue la versione 6.0a del Michigan Terminal System utilizzando SNOBOL4 versione 3.10 dal 1 aprile 1973, costruita per MTS il 1 maggio 1975, ma probabilmente ci sono modi più semplici per eseguire SNOBOL4 su un sistema moderno. :)
Modifica: rimosso un ramo di successo ridondante che equivaleva a un fallthrough (non mi rendevo conto di poter mettere da solo un ramo di errore da solo) che elimina un'etichetta di ramo non necessaria e trasformava un goto incondizionato in un ramo di errore sulla riga precedente, per un risparmio di 7 byte.
Ora che TIO ha il supporto SNOBOL4 puoi
provarlo online! Nota: mostra le dimensioni come 429 anziché 430 perché quando l'ho incollato lì, l'alimentazione di linea finale è stata rimossa. Ho provato a cambiare la linea di continuazione (quella che inizia con +) in una singola linea, che non era legale nella versione mainframe perché la linea era troppo lunga e funzionava e la portava a 427. Ovviamente CSNOBOL4 consente linee più lunghe. Lascerò il mio punteggio a 430, però, perché questo è il numero di byte che lo script era sulla mia macchina e, inoltre, SNOBOL è piuttosto non competitivo.
Ysia gestito come una voce, quindiYvesè comeIvesoArnold.