SNOBOL4, 437 430 bajtów
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
Niegolfowany (do tego dodałem monit; powyższy tylko czeka na wpisanie nazwy):
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
To pierwszy program SNOBOL, jaki kiedykolwiek napisałem.
SNOBOL jest językiem zorientowanym liniowo, takim jak FORTRAN, COBOL lub BASIC. Każdy wiersz składa się z opcjonalnej etykiety rozpoczynającej się w kolumnie 1, kodu linii, która może obejmować przypisania i dopasowanie do wzorca, oraz opcjonalnej gałęzi. Tak, linie kończą się (opcjonalnie) GOTO. Występują w dwóch formach:
:(TARGET)
Oddziały do oznakowania TARGET, natomiast
:S(SUCCESS) F(FAILURE)
Rozgałęzia się, SUCCESSjeśli dopasowanie wzorca się powiodło, lub w FAILUREinny sposób. Możesz także po prostu odnieść sukces i przejść do następnej linii w przypadku niepowodzenia lub odwrotnie.
Linie kontynuacji zaczynają się od a +lub .. Komentarze zaczynają się od *.
Jak to działa?
Czytaj w nazwie, konwertuj na małe litery. Ustaw nazwy B, F i M, zakładając, że zaczyna się od samogłoski. Następnie sprawdź, czy zaczyna się od rozpiętości spółgłosek. Jeśli nie, jesteśmy gotowi do pracy! Jeśli tak, usuń wiodące spółgłosek i ustaw nazwy B, F i M, zakładając, że nie zaczyna się na żadnej z tych liter. Na koniec sprawdź, czy zaczyna się od każdej z tych liter po kolei, w razie potrzeby poprawiając nazwy. Jesteśmy gotowi do gry w nazwę!
Przykładowy przebieg:
# $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
Uruchomiłem to na emulatorze mainframe Hercules S / 370 z wersją 6.0a Michigan Terminal System, używając SNOBOL4 w wersji 3.10 od 1 kwietnia 1973 roku zbudowanej dla MTS 1 maja 1975 roku, ale prawdopodobnie są łatwiejsze sposoby na uruchomienie SNOBOL4 na nowoczesny system. :)
Edycja: Usunąłem zbędną gałąź sukcesu, która była równoważna z upadkiem (nie zdawałem sobie sprawy, że mogę sam umieścić tylko gałąź awarii), która eliminuje niepotrzebną etykietę gałęzi i zmieniła bezwarunkowe goto w gałąź awarii w poprzedniej linii, dla oszczędności 7 bajtów.
Teraz, gdy TIO ma obsługę SNOBOL4, możesz
wypróbować online! Uwaga: pokazuje rozmiar jako 429 zamiast 430, ponieważ kiedy go wkleiłem, ostatni kanał został usunięty. Próbowałem zmienić linię kontynuacji (tę, która zaczyna się od +) na jedną linię, co nie było legalne w wersji na komputer mainframe, ponieważ linia była zbyt długa, i zadziałała i obniżyła ją do 427. Oczywiście CSNOBOL4 dopuszcza dłuższe linie. Zostawię jednak wynik na 430, ponieważ tyle bajtów był skrypt na moim komputerze, a poza tym SNOBOL jest dość niekonkurencyjny.
Yjest traktowany jako wokal,Yvespodobnie jakIveslubArnold.