Umieść wiersz w zakręconym kodzie i wstrząśnij nim

10

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.

Hobby Calvina
źródło
„Napisz 5 programów, z których każdy wypisuje inną linię ...” czy to nie jest niemożliwe?
feersum
@feersum Linie są różne. Trzy z nich mają po prostu ten sam tekst.
Calvin's Hobbies
Co jeśli mam plik Java zawierający 5 klas, z których każda zawiera mainmetodę? Które następnie należy uruchomić podczas uruchamiania programu?
feersum
@feersum Cóż robi twój kompilator? Nie jestem pewien, co robi Java, gdy ma wiele klas w tym samym pliku main.
Calvin's Hobbies
2
Pamiętam ten sposób reklamy Coca-Coli, w której „wkładają wapno do coli” ...
Joe Z.

Odpowiedzi:

9

CJam, 120 prawidłowych permutacji, 334 299 290 bajtów

"She put the lime in the coconut, she drank them both up"N+
"Brother bought a coconut, he bought it for a dime"N+]$~
"She put the lime in the coconut, she drank them both up"N+
"His sister had another one, she paid it for a lime"N+]$~
"She put the lime in the coconut, she drank them both up"N+

Całkiem prosta logika:

  • Umieść każdą linię utworu w każdym z 5 programów
  • Zawiń wszystko na stosie w tablicy
  • Posortuj tablicę
  • Rozpakuj tablicę, aby następny program mógł korzystać z tej samej logiki
  • Na każdym kroku mamy częściowe teksty w tablicy. Na szczęście sortowanie tablicy daje prawidłową kolejność tekstów.

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 :)

Optymalizator
źródło
8

Preludium , 120 permutacji, 2045 2035 bajtów

9-9-9-9-9-9-9-9-9-5-97+993++09-9-9-9-9-9-9-1-8992++96+209-9-9-9-9-9-9-1-94+58992++09-9-9-9-9-9-9-1-92+95+199+409-9-9-9-9-9-9-1-58991++09-9-9-9-9-9-9-1-09-9-9-9-9-7-992++993++95+96+396+309-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-95+909-9-9-9-9-9-9-1-594+993+09-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-992++993++97+09-9-9-9-9-9-9-1-5809-4-                                                                          (9+9+9+9+9+9+9+9+9+9+6+!)
9-9-9-9-9-9-9-9-9-5-594+9409-9-9-9-9-9-9-1-109-9-9-9-9-9-9-1-99+96+609-9-9-9-9-9-9-1-992++909-9-9-9-9-9-9-1-992++87993++96+209-9-9-9-9-9-9-1-5809-9-9-9-9-9-9-1-09-9-9-9-9-7-992++993++95+96+396+309-9-9-9-9-9-9-1-109-9-9-9-9-9-9-1-992++87993++96+209-9-9-9-9-9-9-1-99+58992++96+99+09-9-9-3-                                             (9+9+9+9+9+9+9+9+9+9+6+!)
9-9-9-9-9-9-9-9-9-5-97+993++09-9-9-9-9-9-9-1-8992++96+209-9-9-9-9-9-9-1-94+58992++09-9-9-9-9-9-9-1-92+95+199+409-9-9-9-9-9-9-1-58991++09-9-9-9-9-9-9-1-09-9-9-9-9-7-992++993++95+96+396+309-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-95+909-9-9-9-9-9-9-1-594+993+09-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-992++993++97+09-9-9-9-9-9-9-1-5809-4-                                                 (9+9+9+9+9+9+9+9+9+9+6+!)
9-9-9-9-9-9-9-9-9-5-594+993+09-9-9-9-9-9-9-1-109-9-9-9-9-9-9-1-99+96+609-9-9-9-9-9-9-1-992++909-9-9-9-9-9-9-1-49197+09-9-9-9-9-9-9-1-58991++09-9-9-9-9-9-9-1-09-9-9-9-9-7-595+96+09-9-9-9-9-9-9-1-99+58992++96+95+109-9-9-9-9-9-9-1-41809-9-9-9-9-9-9-1-99+5992++991++9991++09-9-9-9-9-9-9-1-991++909-9-6-                                                           (9+9+9+9+9+9+9+9+9+9+6+!)
9-9-9-9-9-9-9-9-9-5-97+993++09-9-9-9-9-9-9-1-8992++96+209-9-9-9-9-9-9-1-94+58992++09-9-9-9-9-9-9-1-92+95+199+409-9-9-9-9-9-9-1-58991++09-9-9-9-9-9-9-1-09-9-9-9-9-7-992++993++95+96+396+309-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-95+909-9-9-9-9-9-9-1-594+993+09-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-992++993++97+09-9-9-9-9-9-9-1-5809-4-                                                                                                   (9+9+9+9+9+9+9+9+9+9+6+!)

To 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

"push line 4"               print
"push line 1"print
"push line 3"          print
"push line 2"     print
"push line 5"                    print

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. 0Napotkasz 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:

"Brother bought a coconut, he bought it for a dime
"W%{i96-_0<{zLa*9/:,'-*'-+0\+}{La*9/:,_,'+*W<}?}%

Na koniec, dla zabawy, dlaczego uważam, że byłoby to bardzo krótkie, gdyby Prelude miał pojęcie ciągów znaków:

"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"N+!
"emid a rof ti thguob eh ,tunococ a thguob rehtorB"N+!
"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"N+!
"emil a rof ti diap ehs ,eno rehtona dah retsis siH"N+!
"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"N+!

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ę.

Martin Ender
źródło
7

Ruby, 120 prawidłowych permutacji, 430 bajtów

$*[1]='His sister had another one, she paid it for a lime';a||=at_exit{puts($*-[p])}
$*[0]='Brother bought a coconut, he bought it for a dime';a||=at_exit{puts($*)}
$*[2]='She put the lime in the coconut, she drank them both up';a||=at_exit{puts($*-[p])}
$*[3]='She put the lime in the coconut, she drank them both up';a||=at_exit{puts($*-[p])}
$*[4]='She put the lime in the coconut, she drank them both up';a||=at_exit{puts($*-[p])}

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.

histocrat
źródło
Pytanie brzmi: „5 programów jednowierszowych”. Czy to nie oznacza, że ​​każda linia powinna znajdować się w osobnym programie? Nie wszystko w jednym?
bacchusbeale
1
Tylko kwestia formatowania. Każda linia działa jak własny program.
histocrat
6

> <> , 120 permutacji, 703 bajtów

<    /a"emid a rof ti thguob eh ,tunococ a thguob rehtorB"0a.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"
<   / a"emil a rof ti diap ehs ,eno rehtona dah retsis siH"09.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"
<  /  a"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"08.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"
< /   a"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"07.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"
</    a"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"06.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"

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 wykonuje

"o;?=0l>\\\\\\/////"15p26p37p48p59p75p76p77p78p79p7ap8ap9apaapbapcapdap

Jest to seria pinstrukcji (put), które umieszczają znaki, dopóki tablica nie będzie wyglądać tak:

<    /<lyrics1>0a.#.!50<blah>
<   / <lyrics2>09.#.!50<blah>
<  /  <lyrics3>08.#.!50<blah>
< /   <lyrics4>07.#.!50<blah>
</    <lyrics5>06.#.!50<blah>
 /     \
  /    \
   /   \
    /  \
     / \
       >l0=?;o

#.!50Następnie program ponownie przełącza przepływ programu z powrotem na prawo, przed przejściem do wiersza 5. Oto, co następuje:

  • Podążając za /lustrem na linii 5 znajduje się tekst 5, który jest wypychany na stos. Następnie teleportujemy się do linii 6.
  • Podążając za /lustrem na linii 6 znajduje się tekst 4, który jest wypychany na stos. Następnie teleportujemy się do linii 7.
  • Podążając za /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!

Sp3000
źródło