Używając jednego języka programowania, napisz 5 programów jednowierszowych, z których każdy wyprowadza inny wiersz pierwszego wiersza do utworu Harry'ego Nilssona „ Coconut ”, uruchamiany indywidualnie:
Brat kupił kokos, kupił go za bilon
Jego siostra miała inny, zapłaciła za wapno
Włożyła wapno do kokosa, wypiła je oboje
Włożyła wapno do kokosa, wypiła je oboje
Ona wrzuć wapno do kokosa, wypiła je oba
( pełne teksty )
Ostatnie 3 wiersze mają te same teksty, więc ostatnie 3 programy mogą być również.
Istnieje 5 silni lub 120 sposobów, w jakie 5 programów jednowierszowych można ułożyć po jednym w wierszu w jednym programie 5-liniowym. Musisz zoptymalizować programy jednowierszowe, tak aby dla jak największej liczby z tych 120 kombinacji program 5-liniowy wypisał cały wiersz we właściwej kolejności , dokładnie tak, jak pokazano powyżej.
Przykład
Najprostsza odpowiedź składałaby się z 5 instrukcji drukowania w jednym wierszu, a 3 ostatnie identyczne:
print('Brother bought a coconut, he bought it for a dime')
print('His sister had another one, she paid it for a lime')
print('She put the lime in the coconut, she drank them both up')
print('She put the lime in the coconut, she drank them both up')
print('She put the lime in the coconut, she drank them both up')
Dane wyjściowe do programów 5-liniowych będą wersetem w odpowiedniej kolejności, o ile pierwsze dwa pojedyncze wiersze znajdują się we właściwych miejscach. Tylko 6 ze 120 możliwych uzgodnień to osiąga.
Punktacja
Zgłoszenie zawierające najwięcej spraw roboczych ze wszystkich 120 wygranych. Łamacz remisów trafia do zestawu programów o najniższej skumulowanej liczbie bajtów ( znaki nowej linii nie są liczone). Przykład ma 309 bajtów.
Detale
Twoje programy mogą nie czytać własnego kodu źródłowego. Nie powinni też czytać innych plików zewnętrznych ani wymagać połączenia sieciowego.
Wyjście na standardowe wyjście lub najbliższą alternatywę. Możesz również wyprowadzać dane do pliku o wybranej nazwie.
„Programy jednowierszowe” to ciągi znaków, które zawierają dowolne znaki oprócz terminatorów linii (prawdopodobnie będziesz musiał się martwić o znaki nowej linii).
Podczas komponowania pojedynczych linii w 5 liniowych należy dodać dokładnie 4 nowe linie, po jednej między każdą sąsiednią parą pojedynczych linii. Możesz opcjonalnie dodać końcowy znak nowej linii.
źródło
main
metodę? Które następnie należy uruchomić podczas uruchamiania programu?main
.Odpowiedzi:
CJam, 120 prawidłowych permutacji,
334 299290 bajtówCałkiem prosta logika:
AKTUALIZACJA : Okazuje się, że nie potrzebujesz cyklu owijania i sortowania po 3 podobnych i pojawiających się na końcowych liniach utworu. Mogę wyjaśnić, dlaczego nie jest to takie oczywiste :)
źródło
Preludium , 120 permutacji,
20452035 bajtówTo ostatecznie przekonało mnie, że Prelude i CJam potrzebują dziecka. Gdyby nie bardzo ograniczony zestaw instrukcji Preludium, to przesłanie byłoby w rzeczywistości bardzo konkurencyjne, gdyby nawet nie pokonało CJam.
Podstawowa idea jest następująca
W Preludium każda linia ma własny „głos” z własnym stosem, a głosy te są wykonywane równolegle. Oznacza to, że w pełnym programie każda linia po prostu indywidualnie konstruuje ciąg i drukuje go na końcu. Jednak ze względu na przesunięcia instrukcji print kolejność wierszy nie ma żadnego znaczenia dla kolejności wydruków, ponieważ wykonywanie odbywa się od lewej do prawej, a nie od góry do dołu.
Dlaczego linie są tak długie? Prelude przechowuje tylko liczby na swoim stosie. Co więcej, może wypychać tylko jedną cyfrę na raz, więc większe liczby muszą być konstruowane na podstawie dodawania i odejmowania (nie ma ani mnożenia, ani innej arytmetyki). Zatem największą częścią kodu jest po prostu obliczanie i wypychanie odpowiednich kodów znaków. Aby to nieco skrócić, kompensuję je
96
. Na koniec, aby wydrukować, zapętlam, aż stos będzie pusty (tj.0
Napotkasz a), dodaj 96 do każdej liczby i wydrukuj ją.Zauważ, że ciągi są wypychane w odwrotnej kolejności, ponieważ są drukowane od ostatniego do pierwszego znaku.
Zakłada się, że interpreter języka Python jest
NUMERIC_OUTPUT = False
(tak jak specyfikacja definiuje We / Wy).Użyłem następującego kodu CJam do wygenerowania konstrukcji ciągu:
Na koniec, dla zabawy, dlaczego uważam, że byłoby to bardzo krótkie, gdyby Prelude miał pojęcie ciągów znaków:
Teraz wyciągi drukowane
!
są już w odpowiedniej kolejności, więc nie musiałbym ich nawet kompensować. Myślę, że zajmę się tym trochę.źródło
Ruby, 120 prawidłowych permutacji, 430 bajtów
Działa w dowolnej kolejności lub indywidualnie. Każda linia modyfikuje stan globalny, a następnie ustawia hak do wykonania na końcu programu, chyba że hak został już ustawiony.
źródło
> <> , 120 permutacji, 703 bajtów
Ograniczenie do jednej linijki było dość trudne dla języka 2D, więc musiałem znaleźć sposób na jak najlepsze wykorzystanie
.
instrukcji teleportacji.Inicjał
<
powoduje, że program płynie w lewo, owija się i wykonujeJest to seria
p
instrukcji (put), które umieszczają znaki, dopóki tablica nie będzie wyglądać tak:#.!50
Następnie program ponownie przełącza przepływ programu z powrotem na prawo, przed przejściem do wiersza 5. Oto, co następuje:/
lustrem na linii 5 znajduje się tekst 5, który jest wypychany na stos. Następnie teleportujemy się do linii 6./
lustrem na linii 6 znajduje się tekst 4, który jest wypychany na stos. Następnie teleportujemy się do linii 7./
lustrem na linii 7 znajduje słowa 3 ...Dzieje się tak, dopóki nie wypchniemy tekstu 1, w którym to momencie teleportujemy się do linii 10. Jest to pętla do wydrukowania całego stosu, aż będzie pusty.
Jeśli obecna jest tylko jedna linia programu,
\
lustra wykonują tę samą pracę, co teleportacja na każdej linii lirycznej.Jeśli program jest zakodowany, wówczas powyższe wyjaśnienie nadal obowiązuje, więc program działa dla wszystkich permutacji!
źródło