Комп'ютери ніколи не будуть скуштувати освіжаюче печиво


11

Натхненний github.com/JackToaster/Reassuring-Parable-Generator , в свою чергу натхненний xkcd.com/1263 . Можливі слова отримані з reassuring.cfg цього сховища.

Подивившись на reassuring.cfg (скористайтеся 12-м комітом) пропонується побачити, що граматика відповідає результатам (Вихід - це список усіх рядків, що відповідають граматиці).

Завдання: Ваша програма повинна виводити всі 7968 чутливих до регістру точного тексту, що міститься в пастбіні pastebin.com/2SNAJ1VH . Копія пастабіну зберігається в машині Wayback

Ось зразок з 33 мотивуючих ліній з пастина:

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.

Правила виклику:

  • Виведення рядків може бути впорядковано будь-яким потрібним способом, але всі 7968 повинні бути включені.
  • Вихід повинен бути як один плоский рядок, а не як список рядків.
  • Ваша програма не повинна приймати жодних даних або порожніх невикористаних даних.
  • Ваша програма може не отримувати дані з будь-якого інтернет-джерела.
  • Одинарна нова строка не є обов'язковою.

Це , тому найкоротший код виграє.



4
No computer {can} {action}.повторюється двічі і Computers {cannot_present}видає фрази типу "Комп'ютери не здатні". Навмисне?
darrylyeo

Будь-які явні помилки в пастібі повинні бути включені у висновок для всіх програм (ми не можемо змінювати специфікації для минулих програм). Reassuring.cfg - це лише зразок граматики, який принаймні досить точний.
fireflame241

Щоб змагатись у цьому Id, треба написати аналізатор для введення лише для того, щоб перелічити uniques lol.
Чарівна восьминога урна

Для довідки, посилання TIO на рішення Bubblegum занадто довге, щоб ставити відповідь. Вихідний код - 23270 байт.
musicman523

Відповіді:


7

Zsh , 765 байт

Це може бути першим, що я коли-небудь писав в zsh, але він має неймовірно зручну особливість - можливість перетворювати масиви в розширення дужок (хоча це не так зручно, як це повинно бути… ). Запуск з zsh -P(рахується як 1 байт), який увімкнено 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

Спробуйте в Інтернеті!


4

JavaScript (ES6), 1234 1091 байт

Це приємний підрахунок байтів для початку! Час покататися на величезній струні.

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

Менше гольфу:

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


Як?

(Це, безумовно, один з моїх найулюбленіших гольфів усіх часів!)

Граматика зберігається в масиві G, який оцінює:

[["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це функція, яка розбиває рядок на роздільник |і повторює через нього. Все йде нормально.

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

Спочатку ми ініціалізуємо масив A. Потім ми знаходимо все цифри в переданої рядку sі створити підпрограму: Використовуючи кожну цифру n, ми створюємо for- ofцикл , який перебирає записи в G[n](зберігаються як властивості F, так як функції в JavaScript також є об'єкти). Потім петлі додаються одна за одною.

Наприклад, згенерована підпрограма для s="1 2 3"запуску працює так:

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

Під час кожної ітерації підпрограма замінює кожну цифру sвідповідною заміною, зберігається в ній F[n], і результат висувається на A. Підпрограма evalредагується і Aнеявно повертається.

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

Використовуючи F, решта програми просто будує залишки граматики з правил виробництва, які вже існують; заміни просто визначаються одноцифровим індексом у G.


Хороший! Але це здається збоєм, якщо функція не викликається f. Отже, f=слід додати кількість байтів.
Арнольд

(Я думаю, що це можна виправити шляхом повторного використання Fзамість f.)
Арнольд

@Arnauld Хороший улов.
darrylyeo

4

PHP, 877 байт

Ах, це було весело!

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

Сміливо спробуйте викопати ще один байт, якщо зможете.

неозорий

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

пояснення

Вихід можна розділити на 48 фрагментів по 166 рядків кожен. У кожному фрагменті кожен рядок починається з одного з Computers|A computer|No computerнаступних з 14 з негативних (для Computersі A computer) або 9 позитивних (для No computer) можливостей.
Я кодував ці шматки до 6 біт кожна (3 різних предмета -> нижній 2 біт; позитивні та негативні кришки обміну кришками -> верхні 4 біти), і (можливо, очевидно) додав 65 для використання значень як ASCII-кодів.

У цих фрагментах 8 комбінацій дієслів / прикметник для 11 різних продуктів харчування та 13 різних комбінацій для 6 різних видів мистецтва, завжди в одному порядку; тож їх можна просто пропустити, використовуючи дієслово / прикметниковий ключ, щоб визначити, чим я маю перелічити продукти харчування та напої в наступній петлі.

Залишилася одна складна частина: Деякі з кепки потребують дієслова у формі дієслова; а деякі дієслова втрачають eперетворення. Індекс ковпака каже, що це потрібно чи ні.
(і завдяки порядку бітів в кодуванні я можу просто використовувати символ ASCII для порівняння).
Але як? Після деякого часу жонглюючи реджексами, я просто поклав місце, 1де eтреба замінити, ingа 0де ingпотрібно додати і дозволити strtrвиконувати роботу.

Ось історія невольфівської версії вище. (Упаковано 1199 байт)


Гольф складався головним чином в 3 етапі:

  1. Більшість використовуваних послідовностей символів зберігалися у змінних.
  2. strtrбуло розширено на все, крім теми, щоб перемістити змінні в strtr.
  3. Більшість послідовностей були переміщені зі змінних до strtr.

19-е слово, tastбуло замінено великою літерою, щоб позбутися пари лапок.


Цікаво, що буде, якби я також кодував сполучення дієслова / прикметників.
Можливо, я міг бити Зш; але я не впевнений, чи достатньо мені цікаво спробувати.


1

Сітківка, 1249 1192 байт


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

Вихід перевищує обмеження TIO. Я хотів використовувати %`етапи, щоб уникнути всього, $%'¶$%`але чомусь це не робить те, що я хочу. Редагувати: збережено 57 байт завдяки @ fireflame241.


Існує ще деякий простір для стиснення: ingі `Ito` використовуються кілька разів. Кожному виклику до 1, 2та 5 передує пробіл, після якого пробіл може бути поміщений. Так само 6і 7завжди супроводжується періодом. 3Здається, використовується лише один раз.
fireflame241

@ fireflame241 Я не можу змінити цифри, оскільки їм потрібно повторити заміну кілька разів, але дякую за інші ідеї!
Ніл

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.