I computer non assaggeranno mai un cookie rinfrescante


11

Ispirato da github.com/JackToaster/Reassuring-Parable-Generator , a sua volta ispirato da xkcd.com/1263 . Le possibili parole derivano dal rassicurante.cfg di quel repository.

Dando un'occhiata a reassuring.cfg (usare il 12 ° commit) si suggerisce di vedere la grammatica corrispondente all'output (L'output è un elenco di tutte le stringhe corrispondenti alla grammatica).

Attività: il programma deve generare tutte le 7968 righe con distinzione tra maiuscole e minuscole del testo esatto contenuto in pastebin pastebin.com/2SNAJ1VH . Una copia del pastebin viene salvata nella Wayback Machine

Ecco un esempio di 33 linee motivanti dal pastebin:

Computers can't enjoy a salad.
Computers can't enjoy a cake.
Computers can't enjoy a ice cream cone.
Computers can't enjoy a meal.
Computers can't enjoy a drink.
Computers can't enjoy a steak.
Computers can't enjoy a chicken dinner.
Computers can't enjoy a piece of cake.
Computers can't enjoy a piece of pie.
Computers can't enjoy a cookie.
Computers can't enjoy a sandwich.
Computers can't taste a salad.
Computers can't taste a cake.
Computers can't taste a ice cream cone.
Computers can't taste a meal.
Computers can't taste a drink.
Computers can't taste a steak.
Computers can't taste a chicken dinner.
Computers can't taste a piece of cake.
Computers can't taste a piece of pie.
Computers can't taste a cookie.
Computers can't taste a sandwich.
Computers can't experience eating a salad.
Computers can't experience eating a cake.
Computers can't experience eating a ice cream cone.
Computers can't experience eating a meal.
Computers can't experience eating a drink.
Computers can't experience eating a steak.
Computers can't experience eating a chicken dinner.
Computers can't experience eating a piece of cake.
Computers can't experience eating a piece of pie.
Computers can't experience eating a cookie.
Computers can't experience eating a sandwich.

Regole della sfida:

  • L'output delle righe può essere ordinato nel modo desiderato, ma devono essere inclusi tutti i 7968.
  • L'output dovrebbe essere come una singola stringa piatta, non come un elenco di stringhe.
  • Il programma non dovrebbe accettare input o input vuoti non utilizzati.
  • Il tuo programma non può recuperare dati da alcuna fonte online.
  • Una nuova riga finale è facoltativa.

Questo è , quindi vince il codice più corto.



4
No computer {can} {action}.viene ripetuto due volte e Computers {cannot_present}produce frasi come "I computer non sono in grado di". Intenzionale?
darrylyeo,

Eventuali errori apparenti nel pastebin devono essere inclusi nell'output per tutti i programmi (non possiamo modificare le specifiche per i programmi precedenti). Il rassicurante.cfg è solo una grammatica di esempio che è almeno abbastanza accurata.
fireflame241

Per competere in questo ID è necessario scrivere un parser per l'input solo per elencare gli uniques lol.
Magic Octopus Urn

Per riferimento, il collegamento TIO alla soluzione Bubblegum è troppo lungo per fornire una risposta. Il codice sorgente è 23270 byte.
musicman523

Risposte:


7

Zsh , 765 byte

Questa potrebbe essere la prima cosa che abbia mai scritto in zsh, ma ha la caratteristica incredibilmente conveniente di essere in grado di convertire array in espansioni di controvento (anche se non è così conveniente come dovrebbe essere ... ). Esegui con zsh -P(conteggiato come +1 byte), che si accende RC_EXPAND_PARAM.

a=able\ to
b=" be $a"
d=wonderful
i=ing\ a
o=omputer
n="No c$o "
r=ever
p=capable\ of
u=will
w=$u\ n$r
x=experienc
e=(\ {{{enjoy,tast,$x'ing eat'}$i,tast$i\ {delicious,fresh,tasty,refreshing,$d}}\ {salad,cake,'ice cream cone',meal,drink,steak,chicken\ dinner,'piece of '{cake,pie},cookie,sandwich},{understand$i,{enjoy,$x}$i{,\ {beautiful,$d,{inspir,amaz}ing,superb}}}\ {son{net,g},poem,story,play,'piece of music'}}.)
f=(${e:s/cing/ce/:s/sting/ste/:s/ding/d/:s/ying/y})
l=($w won\'t$b {$w,n$r\ $u}{$b,' have the ability to'})
v=($l "won't $r$b")
k=({ca,wo}n\'t $l is{"n't ",\ un}$a)
c=(C$o\s A\ c$o)
printf %s\\n $c\ $k$f C$o's '$v$f $n{can,is\ $a,$u\ $r$b,"is $r going to",{can,$u}\ $r}$f{,} $c\ {is{\ in,"n't "}$p,"cannot $x"e}$e $n{{is,$u\ be}\ $p,"can $x"e}$e

Provalo online!


4

JavaScript (ES6), 1234 1091 byte

È un bel conteggio dei byte per iniziare! È ora di giocare a golf su quell'enorme corda.

f=

_=>(G=`beautiful|wonderful|inspiring|amazing|superb
sonnet|poem|story|play|song${p=`|piece of `}music
cake${p}cake${p}pie|salad|ice cream cone|meal|drink|steak|chicken dinner|cookie|sandwich
delicious|fresh|tasty|refreshing|wonderful
can|is ${a=`able to`}|is ever going to|can ever|will ever${b=` be `+a}|will ever
is ${C=`capable of`}|will be ${C}|can${E=` ${e=`experience`}
${w=`will never`}${b}|${w}${h=` have the ability to|never will`}${h}${b}|won't${b}|${w}|won't`} ever${b}
isn't ${C}|is in${C}|cannot${E}|can't|isn't ${a}|is un${a}`.split`
`.map(l=>l.split`|`),F=S=>[].concat(...S.split`|`.map(s=>eval(s.match(/\d/g).map(n=>`for(f[${n}]of G[${n}])`).join``+`A.push(s.replace(/\\d/g,n=>' '+f[n]));A`,A=[]))),G[9]=F(p=`enjoy a2|taste a2|${e} eating a2|taste a32|enjoy a1|${e} a1|enjoy a01|understand a1|${e} a01`),G[9]=F(p=`${e=`enjoy`} a2|taste a2|${e} eating a2|taste a32|enjoy a1|${e} a1|enjoy a01|understand a1|${e} a01`),G[0]=F(p.replace(/([^g])e? (a|e)/g,'$1ing $2')),F(`C${o=`omputer`}s89.|A c${o}89.|C${o}s69.|No c${o}49.|C${o}s70.|A c${o}70.|No c${o}50.|No c${o}49.`).join`
`)

document.write('<pre>'+f())

Meno golf:

f=

_=>(

G=`beautiful|wonderful|inspiring|amazing|superb
sonnet|poem|story|play|song${p=`|piece of `}music
cake${p}cake${p}pie|salad|ice cream cone|meal|drink|steak|chicken dinner|cookie|sandwich
delicious|fresh|tasty|refreshing|wonderful
can|is ${a=`able to`}|is ever going to|can ever|will ever${b=` be `+a}|will ever
is ${C=`capable of`}|will be ${C}|can${E=` ${e=`experience`}
${w=`will never`}${b}|${w}${h=` have the ability to|never will`}${h}${b}|won't${b}|${w}|won't`} ever${b}
isn't ${C}|is in${C}|cannot${E}|can't|isn't ${a}|is un${a}`.split`
`.map(l=>l.split`|`),

F=S=>[].concat(...S.split`|`.map(s=>eval(s.match(/\d/g).map(n=>`for(f[${n}]of G[${n}])`).join``+`A.push(s.replace(/\\d/g,n=>' '+f[n]));A`,A=[]))),

G[9]=F(p=`enjoy a2|taste a2|${e} eating a2|taste a32|enjoy a1|${e} a1|enjoy a01|understand a1|${e} a01`),
G[9]=F(p=`${e=`enjoy`} a2|taste a2|${e} eating a2|taste a32|enjoy a1|${e} a1|enjoy a01|understand a1|${e} a01`),

G[0]=F(p.replace(/([^g])e? (a|e)/g,'$1ing $2')),

F(`C${o=`omputer`}s89.|A c${o}89.|C${o}s69.|No c${o}49.|C${o}s70.|A c${o}70.|No c${o}50.|No c${o}49.`).join`
`

)

document.write('<pre>'+f())


Come?

(Questo è di gran lunga uno dei miei golf preferiti di tutti i tempi!)

La grammatica è memorizzata nell'array G, che valuta questo:

[["beautiful","wonderful","inspiring","amazing","superb"],
 ["sonnet","poem","story","play","song","piece of music"],
 ["salad","cake","ice cream cone","meal","drink","steak","chicken dinner","piece of cake","piece of pie","cookie","sandwich"],
 ["delicious","fresh","tasty","refreshing","wonderful"],
 ["is capable of","can experience","will be capable of"],
 ["can","is able to","is ever going to","can ever","will ever be able to","will ever"],
 ["will never be able to","will never have the ability to","never will have the ability to","never will be able to","won't ever be able to","will never","won't be able to"],
 ["is incapable of","isn't capable of","cannot experience"],
 ["can't","won't","will never","won't be able to","will never be able to","will never have the ability to","never will have the ability to","never will be able to","isn't able to","is unable to"]]

Fè una funzione che divide una stringa dal delimitatore |e scorre attraverso di essa. Fin qui tutto bene.

F=S=>[].concat(...S.split`|`.map( ... )),

Cosa sta succedendo con questa funzione interiore?

s=>eval(
    s.match(/\d/g).map(n=>`for(F[${n}]of G[${n}])`).join``+
    `A.push(s.replace(/\\d/g,n=>F[n]));A`,
    A=[]
)

Innanzitutto inizializziamo un array A. Quindi troviamo tutte le cifre nella stringa passata se costruiamo un sottoprogramma: Usando ciascuna cifra n, generiamo un ciclo for- ofche scorre tra le voci G[n](memorizzate come proprietà di F, poiché anche le funzioni in JavaScript sono oggetti). I loop vengono quindi aggiunti uno dopo l'altro.

Ad esempio, il sottoprogramma generato per s="1 2 3"inizia in questo modo:

for(F[1]of G[1])for(F[2]of G[2])for(F[3]of G[3])

Ad ogni iterazione, il sottoprogramma sostituisce ogni cifra scon la corrispondente sostituzione, memorizzata F[n]e il risultato viene trasferito a A. Il sottoprogramma viene modificato evaled Aè implicitamente restituito.

for(F[1]of G[1])for(F[2]of G[2])for(F[3]of G[3])A.push(s.replace(/\d/g,n=>F[n]));A

Usando F, il resto del programma costruisce semplicemente il resto della grammatica dalle regole di produzione già esistenti; le sostituzioni sono semplicemente definite da un indice a una cifra in G.


Ben fatto! Ma questo sembra andare in crash se la funzione non viene chiamata f. Quindi, f=dovrebbe essere aggiunto al conteggio dei byte.
Arnauld,

(Penso che questo possa essere risolto riutilizzando Finvece di f.)
Arnauld

@Arnauld Buona cattura.
darrylyeo,

4

PHP, 877 byte

Ah, è stato divertente!

for($p="piece of ";$c="AEIMQUY]aeBFJNRVZ^bfQUY]iIMCGKOSWmqunrvoswCGKOSW"[$m++];)foreach([409,T19,"71 eat59",T19delicious,T1916,T19Ty,T19re165,T1914,409,719,40912,40914,409105,409115,40913,understand09,71912,71914,719105,719115,71913]as$i=>$v)foreach($i<8?[salad,cake,"ice cream cone",meal,drink,steak,"chicken dinner",$p.cake,$p.pie,cookie,sandwich]:[sonnet,poem,story,play,song,$p.music]as$u)echo trim(strtr([C17s,"A c17","No c17"][$o=3&$d=ord($c)-65]." ".($o&2?[6,is3,"is 8 go5 to","6 8","2 8 be3","2 8",11=>"is 15","6 7e","2 be 15"]:["6't",$t="won't",$w="2 n8","$t be3","2 n8 be3",$w.$z=" have the ability to","n8 2$z","n8 2 be3","isn't3","is unable to","$t 8 be3","is in15","isn't 15","6not 7e"])[$d/4]." $v",($c>l?[ing,ing]:["",e])+[2=>will," able to",enjoy,ing,can,experienc,ever," a ",inspir,amaz,beautiful,superb,wonderful,"capable of",fresh,omputer,T=>tast]))," $u.
";

Sentiti libero di provare a scavare un altro byte se puoi.

ungolfed

while($c="AEIMQUY]aeBFJNRVZ^bfQUY]iIMCGKOSWmqunrvoswCGKOSW"[$p++])
    foreach(["enjoy0 a","tast1 a","experienc1 eating a","tast1 a delicious","tast1 a fresh","tast1 a tasty","tast1 a refreshing","tast1 a wonderful",
    "enjoy0 a","experienc1 a","enjoy0 a beautiful","enjoy0 a wonderful","enjoy0 a inspiring","enjoy0 a amazing","enjoy0 a superb",
    "understand0 a","experienc1 a beautiful","experienc1 a wonderful","experienc1 a inspiring","experienc1 a amazing","experienc1 a superb"]as$i=>$v)
        foreach($i<8
            ?[salad,cake,"ice cream cone",meal,drink,steak,"chicken dinner","piece of cake","piece of pie",cookie,sandwich]
            :[sonnet,poem,story,play,song,"piece of music"]
        as$u)
            echo[Computers,"A computer","No computer"][$o=3&$d=ord($c)-65]," ",
                ($o&2
                    ?[can,"is able to","is ever going to","can ever","will ever be able to","will ever",11=>"is capable of","can experience","will be capable of"]
                    :["can't","won't","will never","won't be able to","will never be able to","will never have the ability to","never will have the ability to","never will be able to","isn't able to","is unable to","won't ever be able to","is incapable of","isn't capable of","cannot experience"]
                )[$d/4]," ",
                strtr($v,$c>l?[ing,ing]:["",e]),
                " $u.\n"
            ;

spiegazione

L'output può essere suddiviso in 48 blocchi di 166 righe ciascuno. All'interno di ogni blocco, ogni riga inizia con una delle Computers|A computer|No computerseguite da una delle 14 capacità negative (per Computerse A computer) o 9 positive (per No computer).
Ho codificato questi blocchi a 6 bit ciascuno (3 soggetti diversi -> 2 bit inferiori; i tasti positivo e negativo condividono le chiavi -> 4 bit superiori) e (probabilmente ovvio) ho aggiunto 65 per utilizzare i valori come codici ASCII.

All'interno di questi blocchi, 8 combinazioni verbo / aggettivo per 11 cibi diversi e 13 combinazioni diverse per 6 arti diverse, sempre nello stesso ordine; così possono semplicemente essere ripetuti ciclicamente, usando il tasto verbo / aggettivo per determinare se devo elencare cibi o bevande nel ciclo successivo.

Rimase una parte difficile: alcuni dei tappi richiedono la forma gerundia del verbo; e alcuni dei verbi perdono enella trasformazione. L'indice di protezione indica se è necessario o meno.
(e grazie all'ordine dei bit nella codifica posso semplicemente usare il carattere ASCII per il confronto).
Ma come? Dopo aver giocato con regex per un po ', ho semplicemente messo un punto in 1cui edeve essere sostituito inge un punto in 0cui ingè necessario aggiungere e lasciare che strtrfaccia il lavoro.

Questa è la storia della versione ungolfed sopra. (1199 byte imballati)


Il golf consisteva principalmente in 3 passaggi:

  1. Le sequenze di caratteri più utilizzate sono state memorizzate in variabili.
  2. strtrè stato esteso a tutto tranne l'argomento per spostare le variabili in strtr.
  3. La maggior parte delle sequenze sono state spostate da variabili a strtr.

La diciannovesima parola è taststata sostituita da una lettera maiuscola per eliminare un paio di virgolette.


Mi chiedo cosa succederebbe se codificassi anche le combinazioni verbo / aggettivo.
Forse potrei battere Zsh; ma non sono sicuro di chiedermi abbastanza per provare.


1

Retina, 1249 1192 byte


CFs 1 5.¶A cF 1 5.¶C O nG beH 5.¶C O nGKtheJto 5.¶C nG OKtheJto 5.¶C nG O beH 5.¶C won't G beH 5.¶C O nG 5.¶C won't beH 5.¶nNo cF 3 5.¶C 2 6.¶A cF 2 6.¶nNo cF 4 6.¶nNo cF 3 5.
1
can't$%'¶$%`won't$%'¶$%`O nG$%'¶$%`won't beH$%'¶$%`O nG beH$%'¶$%`O nGKtheJto$%'¶$%`nG OKtheJto$%'¶$%`nG O beH$%'¶$%`isn'tH$%'¶$%`is unIto
2
is incapIof$%'¶$%`isn't capIof$%'¶$%`cannot De
3
can$%'¶$%`isH$%'¶$%`is G goQ to$%'¶$%`can G$%'¶$%`O G beH$%'¶$%`O G
4
is capIof$%'¶$%`can De$%'¶$%`O be capIof
5
E a 8$%'¶$%`Le a 8$%'¶$%`De eatQ a 8$%'¶$%`Le a 7 8$%'¶$%`E a 9$%'¶$%`De a 9$%'¶$%`E a B 9$%'¶$%`P a 9$%'¶$%`De a B 9
6
EQ a 8$%'¶$%`LQ a 8$%'¶$%`DQ eatQ a 8$%'¶$%`LQ a 7 8$%'¶$%`EQ a 9$%'¶$%`DQ a 9$%'¶$%`EQ a B 9$%'¶$%`PQ a 9$%'¶$%`DQ a B 9
7
delicious$%'¶$%`fresh$%'¶$%`Ly$%'¶$%`refreshQ$%'¶$%`wonderful
8
salad$%'¶$%`cake$%'¶$%`ice cream cone$%'¶$%`meal$%'¶$%`drink$%'¶$%`steak$%'¶$%`chicken dinner$%'¶$%`Mof cake$%'¶$%`Mof pie$%'¶$%`cookie$%'¶$%`sandwich
9
sonnet$%'¶$%`poem$%'¶$%`story$%'¶$%`play$%'¶$%`song$%'¶$%`Mof music
B
beautiful$%'¶$%`wonderful$%'¶$%`inspirQ$%'¶$%`amazQ$%'¶$%`superb
D
experienc
E
enjoy
F
omputer
G
ever
H
 Ito
I
able 
J
 ability 
K
 have 
L
tast
M
piece 
O
will
P
understand
Q
ing

L'output supera i limiti TIO. Volevo usare le %`fasi per evitare tutto, $%'¶$%`ma per qualche ragione che non fa quello che voglio. Modifica: salvato 57 byte grazie a @ fireflame241.


C'è ancora spazio per la compressione: inge "Ito" vengono usati più volte. Ogni chiamata a 1, 2ed 5 è preceduta e seguita da uno spazio, in modo che questi possano essere sostituiti. Allo stesso modo, 6e 7sono sempre seguiti da un punto. 3sembra essere usato una sola volta.
fireflame241

@ fireflame241 Non riesco a modificare le cifre perché devono ripetere più volte la sostituzione, ma grazie per le altre idee!
Neil,

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.