Inserisci la linea nel codice che hai scelto e scuotilo tutto


10

Usando un linguaggio di programmazione scrivi 5 programmi a riga singola, ognuno dei quali produce una riga diversa del primo verso della canzone di Harry Nilsson del 1972 " Coconut " quando eseguito singolarmente:

Il fratello ha comprato una noce di cocco, l'ha comprata per un centesimo.
Sua sorella ne aveva un'altra, lei l'ha pagata per una calce.
Ha messo la calce nella noce di cocco, le ha bevute entrambe.
Ha messo la calce nella noce di cocco, le ha bevute entrambe
. metti la calce nella noce di cocco, le bevve entrambe

( testo completo )

Le ultime 3 righe hanno gli stessi testi, quindi potrebbero essere anche i tuoi ultimi 3 programmi.

Ci sono 5 fattoriali o 120 modi in cui questi 5 programmi a linea singola possono essere organizzati uno per riga in un singolo programma a 5 righe. Devi ottimizzare i tuoi programmi a riga singola in modo tale che per quante più di queste 120 combinazioni possibili il programma a 5 righe emetta l' intero verso nel suo giusto ordine , esattamente come appare sopra.

Esempio

La risposta più semplice avrebbe 5 istruzioni di stampa a riga singola, le ultime 3 identiche:

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

L'output per i programmi a 5 righe sarà il verso nel suo ordine corretto fintanto che le prime due linee singole saranno nella loro posizione corretta. Solo 6 delle 120 possibili disposizioni ci riescono.

punteggio

La presentazione con il maggior numero di casi funzionanti su tutte le 120 vittorie. Il tie breaker va al set di programmi con il conteggio cumulativo di byte più basso (newline non conteggiati). L'esempio ha 309 byte.

Dettagli

  • I tuoi programmi potrebbero non leggere il proprio codice sorgente. Né dovrebbero leggere altri file esterni o richiedere una connessione di rete.

  • Uscita su stdout o alternativa più vicina. È inoltre possibile eseguire l'output in un file con il nome desiderato.

  • I "programmi a linea singola" sono stringhe che contengono caratteri esclusi i terminatori di riga (probabilmente dovrai solo preoccuparti delle nuove righe).

  • Quando si compongono le linee singole in 5 linee, è necessario aggiungere esattamente 4 nuove linee, una tra ciascuna coppia adiacente di linee singole. Se lo desideri, puoi aggiungere una nuova riga finale.


"Scrivi 5 programmi che producono ciascuno una riga diversa ..." non è impossibile?
feersum

@feersum Le linee sono diverse. Tre di loro hanno lo stesso testo.
Hobby di Calvin il

Cosa succede se ho un file Java contenente 5 classi, ognuna con un mainmetodo? Quindi quale dovrebbe essere eseguito, quando si esegue il programma?
feersum

@feersum Bene, cosa fa il tuo compilatore? Non sono sicuro di cosa faccia Java quando hanno entrambe le classi nello stesso file main.
Calvin's Hobbies,

2
Il modo in cui ricordo questo è quell'annuncio della Coca-Cola in cui "mettono la calce nella Coca Cola" ...
Joe Z.

Risposte:


9

CJam, 120 permutazioni valide, 334 299 290 byte

"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+

Logica piuttosto semplice:

  • Inserisci ogni riga della canzone in ciascuno dei 5 programmi
  • Avvolgi tutto in pila in un array
  • Ordina l'array
  • Disimballare l'array in modo che il programma successivo possa utilizzare la stessa logica
  • In ogni passaggio, abbiamo i testi parziali in un array. Fortunatamente, l'ordinamento dell'array fornisce l'ordine corretto dei testi.

AGGIORNAMENTO : Si scopre che non è necessario il ciclo wrap-sort-unwrap dopo i 3 simili e che appare alla fine della canzone. Posso spiegare perché se non è così evidente :)


8

Preludio , 120 permutazioni, 2045 2035 byte

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+!)

Questo alla fine mi ha convinto che Prelude e CJam hanno bisogno di un figlio. Se non fosse per il set di istruzioni molto limitato di Prelude, questa presentazione sarebbe effettivamente molto competitiva, se non batterebbe CJam.

L'idea di base è la seguente

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

In Prelude, ogni riga è la sua "voce" con il suo stack, e queste voci sono eseguite in parallelo. Cioè, nel programma completo, ogni riga costruirà individualmente la stringa e la stampa alla fine. Ma a causa degli offset delle istruzioni di stampa, l'ordine delle righe non ha alcuna importanza per l'ordine dell'output, poiché l'esecuzione è da sinistra a destra, non dall'alto verso il basso.

Ora, perché le linee sono così lunghe? Prelude memorizza solo numeri nel proprio stack. Inoltre, può solo spingere un numero a una cifra alla volta, quindi numeri più grandi devono essere costruiti dall'addizione e dalla sottrazione (non c'è moltiplicazione né altra aritmetica). Quindi la maggior parte del codice sta semplicemente calcolando e spingendo i giusti codici di caratteri. Per accorciarlo un po ', li compenso di 96. Alla fine, per stampare, eseguo il ciclo fino a quando la pila è vuota (ovvero 0viene rilevata una a), aggiungo 96 a ciascun numero e stampalo.

Nota che le stringhe sono spinte al contrario, poiché sono stampate dall'ultimo al primo carattere.

Questo presuppone l'interprete Python con NUMERIC_OUTPUT = False(che è come la specifica definisce l'I / O).

Ho usato il seguente codice CJam per generare la costruzione della stringa:

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

Infine, solo per divertimento, perché penso che questo sarebbe davvero breve se Prelude avesse un concetto di stringhe:

"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+!

Ora le dichiarazioni di stampa !sono già nell'ordine giusto, quindi non avrei nemmeno bisogno di compensarle. Penso che inizierò a implementarlo qualche volta.


7

Rubino, 120 permutazioni valide, 430 byte

$*[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])}

Funziona in qualsiasi ordine o individualmente. Ogni riga modifica lo stato globale, quindi imposta un hook da eseguire alla fine del programma a meno che l'hook non sia già stato impostato.


La domanda dice "5 programmi a linea singola". Questo non significa che ogni riga dovrebbe essere in un programma separato? Non tutto in uno?
bacchusbeale,

1
Solo una questione di formattazione. Ogni riga funziona come un proprio programma.
istocrato

6

> <> , 120 permutazioni, 703 byte

<    /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"

La limitazione di una riga era piuttosto dura per un linguaggio 2D, quindi ho dovuto trovare un modo per sfruttare al meglio le .istruzioni di teletrasporto.

L'iniziale <fa scorrere il programma verso sinistra, avvolgendosi ed eseguendo

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

Questa è una serie di pistruzioni (put) che posizionano i caratteri fino a quando la scheda appare così:

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

Il #.!50programma quindi ribalta nuovamente a destra, prima di saltare alla linea 5. Quello che segue è questo:

  • Seguendo lo /specchio sulla riga 5 trova il testo 5, che viene inserito nello stack. Quindi ci teletrasportiamo alla linea 6.
  • Seguendo lo /specchio sulla linea 6 trova il testo 4, che viene inserito nello stack. Quindi ci teletrasportiamo alla linea 7.
  • Seguendo lo /specchio sulla linea 7 trova i testi 3 ...

Questo succede finché non spingiamo il testo 1, a quel punto ci teletrasportiamo alla linea 10. Questo è un ciclo per stampare l'intero stack fino a quando non è vuoto.

Se è presente solo una riga del programma, i \mirror fanno lo stesso lavoro dei teletrasporti su ciascuna riga dei testi.

Se il programma è criptato, allora la spiegazione sopra vale ancora, quindi il programma funziona per tutte le permutazioni!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.