Komputer tidak akan pernah merasakan kue yang menyegarkan

11

Terinspirasi oleh github.com/JackToaster/Reassuring-Parable-Generator , pada gilirannya terinspirasi oleh xkcd.com/1263 . Kata-kata yang mungkin berasal dari meyakinkan.cfg dari repositori itu.

Setelah melihat reassuring.cfg (gunakan komit ke-12) disarankan untuk melihat tata bahasa yang cocok dengan keluaran (Outputnya adalah daftar semua string yang cocok dengan tata bahasa).

Tugas: Program Anda harus menampilkan semua 7968 baris case-sensitive dari teks persis yang terkandung dalam pastebin pastebin.com/2SNAJ1VH . Salinan pastebin disimpan di Wayback Machine

Berikut adalah contoh dari 33 garis motivasi dari 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.

Aturan tantangan:

  • Output baris dapat dipesan dengan cara apa pun yang Anda inginkan, tetapi 7968 semuanya harus disertakan.
  • Outputnya harus sebagai string datar tunggal, bukan sebagai daftar string.
  • Program Anda seharusnya tidak menerima input atau input kosong yang tidak digunakan.
  • Program Anda tidak boleh mengambil data dari sumber daring apa pun.
  • Satu baris tambahan baru adalah opsional.

Ini , jadi kode terpendek menang.

fireflame241
sumber
Terkait
James
4
No computer {can} {action}.diulang dua kali, dan Computers {cannot_present}menghasilkan frasa seperti "Komputer tidak mampu". Disengaja?
darrylyeo
Setiap kesalahan nyata dalam pastebin harus dimasukkan dalam output untuk semua program (kami tidak dapat mengubah spesifikasi untuk program yang lalu). The meyakinkan.cfg hanya tata bahasa sampel yang setidaknya cukup akurat.
fireflame241
Untuk bersaing dalam Id ini harus menulis parser untuk input hanya untuk daftar lol unik.
Magic Gurita Guci
Sebagai referensi, tautan TIO ke solusi Bubblegum terlalu panjang untuk dijawab. Kode sumbernya adalah 23270 byte.
musicman523

Jawaban:

7

Zsh , 765 byte

Ini mungkin hal pertama yang pernah saya tulis dalam zsh, tetapi ia memiliki fitur yang sangat nyaman untuk dapat mengubah array ke penjepit ekspansi (meskipun itu tidak senyaman seharusnya ... ). Jalankan dengan zsh -P(dihitung sebagai +1 byte), yang menyala 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

Cobalah online!

Anders Kaseorg
sumber
4

JavaScript (ES6), 1234 1091 byte

Itu jumlah byte yang bagus untuk memulai! Saatnya bermain golf dengan tali besar itu.

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

Kurang 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())


Bagaimana?

(Ini adalah salah satu golf favorit saya sepanjang masa!)

Tata bahasa disimpan dalam array G, yang mengevaluasi hal ini:

[["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"]]

Fadalah fungsi yang memisahkan string oleh pembatas |dan beralih melalui itu. Sejauh ini bagus.

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

Sekarang apa yang terjadi dengan fungsi batin ini?

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=[]
)

Pertama kita inisialisasi array A. Kemudian kami menemukan semua digit dalam string yang diteruskan sdan membangun sub-program: Menggunakan setiap digit n, kami menghasilkan for- ofloop yang berulang melalui entri di G[n](disimpan sebagai properti F, karena fungsi dalam JavaScript juga objek). Loop kemudian ditambahkan satu demi satu.

Misalnya, sub-program yang dihasilkan untuk s="1 2 3"mulai seperti ini:

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

Pada setiap iterasi, sub-program menggantikan setiap digit sdengan penggantian yang sesuai, disimpan F[n], dan hasilnya didorong ke A. Sub-program ini adalah evaled dan Adikembalikan secara implisit.

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

Dengan menggunakan F, sisa program hanya membangun sisa tata bahasa dari aturan produksi yang sudah ada; penggantian hanya didefinisikan oleh indeks satu digit di G.

Darrylyeo
sumber
Yang bagus! Tapi ini sepertinya macet jika fungsinya tidak dipanggil f. Jadi, f=harus ditambahkan ke jumlah byte.
Arnauld
(Saya pikir ini bisa diperbaiki dengan menggunakan kembali, Fbukan f.)
Arnauld
@Arnauld Tangkapan yang bagus.
darrylyeo
4

PHP, 877 byte

Ah itu tadi menyenangkan!

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.
";

Silakan mencoba menggali satu byte lagi jika Anda bisa.

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

penjelasan

Outputnya dapat dibagi menjadi 48 chunks masing-masing dari 166 baris. Dalam setiap chunk, setiap baris dimulai dengan satu Computers|A computer|No computerdiikuti oleh salah satu dari 14 kemampuan negatif (untuk Computersdan A computer) atau 9 positif (untuk No computer).
Saya menyandikan potongan-potongan ini menjadi masing-masing 6 bit, (3 mata pelajaran berbeda -> 2 bit lebih rendah; tombol berbagi topi positif dan negatif -> 4 bit atas), dan (mungkin jelas) menambahkan 65 untuk menggunakan nilai-nilai sebagai kode ASCII.

Dalam potongan ini, 8 kata kerja / kombinasi kata sifat untuk 11 makanan yang berbeda dan 13 kombinasi berbeda untuk 6 seni yang berbeda, selalu dalam urutan yang sama; jadi mereka hanya bisa dilewati, menggunakan kata kerja / kata sifat kunci untuk menentukan apakah saya harus daftar makanan atau minuman di loop berikutnya.

Satu bagian rumit tetap ada: Beberapa topi memerlukan bentuk kata kerja gerund; dan beberapa kata kerja kehilangan edalam transformasi. Indeks cap memberi tahu apakah perlu atau tidak.
(dan terima kasih atas urutan bit dalam pengkodean, saya cukup menggunakan karakter ASCII untuk perbandingan).
Tapi bagaimana caranya? Setelah juggling dengan regex untuk sementara waktu, saya hanya meletakkan di 1mana eharus diganti ingdan di 0mana ingharus ditambahkan dan biarkan strtrmelakukan pekerjaan.

Begitulah kisah versi yang tidak diserang di atas. (1199 byte dikemas)


The golf terdiri terutama dalam 3 langkah:

  1. Urutan karakter yang paling banyak digunakan disimpan ke variabel.
  2. strtrdiperluas ke semuanya kecuali subjek untuk memindahkan variabel strtr.
  3. Sebagian besar urutan dipindahkan dari variabel ke strtr.

Kata ke-19,, tastdigantikan dengan huruf kapital untuk menghilangkan beberapa tanda kutip.


Saya ingin tahu apa yang akan terjadi jika saya juga mengkodekan kombinasi kata kerja / kata sifat.
Mungkin aku bisa mengalahkan Zsh; tetapi saya tidak yakin apakah saya cukup ingin mencoba.

Titus
sumber
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

Output melebihi batasan TIO. Saya ingin menggunakan %`tahapan untuk menghindari semua $%'¶$%`tetapi untuk beberapa alasan yang tidak melakukan apa yang saya inginkan. Sunting: Disimpan 57 byte berkat @ fireflame241.

Neil
sumber
Masih ada ruang untuk kompresi: ingdan `Ito` masing-masing digunakan beberapa kali. Setiap panggilan ke 1,, 2dan 5 didahului dan diikuti oleh spasi, sehingga ini dapat dimasukkan ke dalam substitusi. Demikian pula, 6dan 7selalu diikuti oleh titik. 3tampaknya hanya digunakan sekali.
fireflame241
@ fireflame241 Saya tidak bisa memodifikasi angka karena mereka perlu mengulangi substitusi mereka beberapa kali tetapi terima kasih untuk ide-ide lain!
Neil
0

Bubblegum , 23353 byte

Ya. Sebagian besar tidak akan cocok dengan jawaban jadi ... Baik kode dan tautan TIO ada dalam pasta.

Kode (hexdump kode)

TIO link (output melebihi batasan TIO)

benar-benar manusiawi
sumber