Napisz program, aby zagrać w grę nazw .
Wejście
Twój program powinien w jakikolwiek sposób zaakceptować jedną nazwę jako dane wejściowe od użytkownika (np. Odczytane ze standardowego wejścia lub jako argument wiersza poleceń). Możesz założyć, że nazwa jest pojedynczym słowem składającym się z dużej litery, po której następuje jedna lub więcej małych liter.
Wynik
Twój program musi wydrukować wierszyk dla podanego imienia, jak wyjaśniono w utworze, wypełniając następujący szablon:
(X), (X), bo-b(Y)
Banana-fana fo-f(Y)
Fee-fi-mo-m(Y)
(X)!
Oto (X)
oryginalna nazwa, która (Y)
jest pisana małymi literami po usunięciu początkowych spółgłosek.
Jest jednak jeden wyjątek. Jeśli oryginalna nazwa zaczyna się od m
, f
lub b
powinna być zapisana bez tej litery w odpowiednim wierszu. Np. Jeśli nazwa była Bob
, wiersz „b” powinien kończyć się bo-ob
. Zauważ, że w tym przypadku wszelkie inne spółgłoski są przechowywane, więc na Fred
to fo-red
, nie fo-ed
.
Przykłady
Shirley:
Shirley, Shirley, bo-birley
Banana-fana fo-firley
Fee-fi-mo-mirley
Shirley!
Arnold:
Arnold, Arnold, bo-barnold
Banana-fana fo-farnold
Fee-fi-mo-marnold
Arnold!
Kok:
Bob, Bob, bo-ob
Banana-fana fo-fob
Fee-fi-mo-mob
Bob!
Fred:
Fred, Fred, bo-bed
Banana-fana fo-red
Fee-fi-mo-med
Fred!
Punktacja
Najkrótszy kod wygrywa.
Y
jest traktowany jako wokal,Yves
podobnie jakIves
lubArnold
.Y
jako samogłoskę tylko wtedy, gdy następuje po niej spółgłoska. To powinno obejmować przynajmniej te przypadki.Odpowiedzi:
vi,
118115Kod zawiera 5 znaków kontrolnych, które umieściłem w nawiasach. Każdy liczy się jako pojedynczy znak w stosunku do liczby znaków.
EDYCJA: Przeniesienie pierwszego łączenia (J) na później i zmiana wklejania przed (P) na wklejanie po (p) pozwoliło mi zaoszczędzić 1 znak. Poza tym nie uchwycenie o- w wyrażeniu regularnym uratowało mi 2 kolejne znaki.
źródło
SNOBOL4,
437430 bajtówNiegolfowany (do tego dodałem monit; powyższy tylko czeka na wpisanie nazwy):
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:
Oddziały do oznakowania
TARGET
, natomiastRozgałęzia się,
SUCCESS
jeśli dopasowanie wzorca się powiodło, lub wFAILURE
inny 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:
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.źródło
N = TRIM(INPUT)
mogą byćN =TRIM(INPUT)
.J , 149 znaków
źródło
JavaScript, 115 bajtów
Wyjaśnienie:
ta funkcja zwraca nazwę bez początkowych spółgłosek
Następnie reszta jest funkcją zwracającą ciąg pełny ciąg.
Edycja: od 119 do 115 bajtów dzięki @Martin Ender
źródło
/[aeiou]\w*/i
.JavaScript, <s>119</s> 115 bytes
w nagłówku, aby dać ludziom wskazówkę, że pierwotnie była dłuższa wersja, jeśli są zainteresowani.Clojure , 292 znaków po zminimalizowaniu
Oto pierwsza próba, prawie pozytywna, że mogę ją dalej rozwinąć:
Uczę się clojure i pomyślałem, że fajnie byłoby spróbować. Oto moje rozumowanie:
źródło
Scala 281
Zamieniłem (X) i (Y) we wzorze na
#
i012
.S
jest tylko nową nazwąString
ia(b,c,d)
jest skrótową definicjąb.replaceAll(c,d)
Wywołanie testowe:
I bez golfa:
źródło
Python 3,
148145142 bajtówTak, wiem, że jest trochę późno, ale ...
Używa nowych ciągów F do sformatowania wynikowego ciągu.
Niestety nie sądzę, że TIO obsługuje ciągi F.
Stara wersja
Zaoszczędź 3 bajty dzięki @officialaimm
źródło
Sed, 162 bajty
Nie wiedziałem zbyt dobrze, zanim to zrobiłem. Wiem to dużo lepiej. Pierwszy sed w potoku powiela nazwę trzy razy, więc staje się „Bob \ nBob \ nBob \ nBob” zamiast po prostu „Bob”. Następny sed wykonuje ciężkie podnoszenie.
Oczekuje wkładu na standardowe wejście
echo Name |sed ...
Nie golfowany:
Kilka notatek. Pierwsze cztery dopasowania, 1s, 2s, 3s, 4s, przekształcają wyjście w coś niezupełnie poprawnego. Bob stał się bo-bbobem, Fred stał się fo-fredem, a Mike stał się niemal podobny. Kay stałaby się mo-mkay, dobrze?
Następnie musimy zastąpić albo bo-bbob bo-ob, albo bo-bkay bo-bay. Aby to zrobić, możemy użyć funkcji, w której dokonujemy podstawienia s ///, a następnie rozgałęzić, jeśli się powiedzie, przeskakując nad drugim, który teraz chcemy pominąć. Ale jeśli to przeoczy, chcemy spaść przez gałąź i dokonać następnej zmiany.
Wykonuje to polecenie t [label], rozgałęziając się tylko wtedy, gdy pasowało poprzednie s ///. Ale na początku skryptu zrobiłem już jeden s /// dla każdej linii (wiodącymi liczbami w 1s, 2s itp. Są adresy; oznaczają one, że polecenie jest wykonywane tylko wtedy, gdy adres się zgadza). Bez względu na to, w jakiej linii się znajdujemy, 1, 2, 3 lub 4, co najmniej jeden s /// jest zgodny. (Próbowałem to zrobić na odwrót, masując nazwy, a następnie dodając „Banana-etc.” Później, ale utknąłem w ten sposób, a próba zrobienia tego wszystkiego naraz spowodowałaby powtórzenie.) Na szczęście flaga może zostać wyczyszczone przez przyjęcie gałęzi, więc robimy to za pomocą „tx;: x”. tx rozgałęzia się do etykiety x, a: x jest etykietą x.
Uff! To oczyszcza podniebienie dla dwóch ostatnich zmian. Próbujemy jednego, a jeśli się powiedzie, rozgałęziamy się nad drugim, w przeciwnym razie robimy drugi. Tak czy inaczej, kończymy na etykiecie: z, a bufor wzorców zawiera jedną linię tekstów, które są drukowane na standardowe wyjście.
Dzięki za nakłonienie mnie do spędzenia wystarczająco dużo czasu ze stroną man sed i instrukcją Texinfo, aby w końcu zrozumieć, jak to zrobić więcej niż sed s / foo / bar /
źródło
|
i wszystkich. Może powinienem nazwać to bash / sed lub policzyć inaczej? Nie wiem Jestem zadowolony z tego, co jest, ale daj mi znać, czy powinien być inny w stosunku do standardów PPCG.Python, 161
Właśnie zdałem sobie sprawę, że mój kod zawodzi ...
- Nie usuwa początkowych stałych.
- Nie zarządza biznesem „bo-ob”.
To najdalej, co mam, może ktoś to dokończy.
źródło
Groovy, 146
źródło
R, 189 znaków
Ale z jeszcze jedną postacią możesz wprowadzić wiele nazwisk za jednym razem:
źródło
Pyth , 111 bajtów SBCS
Zestaw testowy
Kod używa znaków niedrukowalnych i jako taki nie wyświetla się poprawnie na Stack Exchange. Podany link zawiera te znaki i jest poprawną wersją programu.
źródło
Pyton
źródło