Компьютеры никогда не попробуют освежающее печенье

11

Вдохновленный github.com/JackToaster/Reassuring-Parable-Generator , в свою очередь вдохновленный xkcd.com/1263 . Возможные слова получены из reassuring.cfg этого хранилища.

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

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

Вот образец 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 из них должны быть включены.
  • Вывод должен быть в виде единой плоской строки, а не в виде списка строк.
  • Ваша программа не должна принимать ввод или пустой неиспользуемый ввод.
  • Ваша программа не может получать данные из любого онлайн-источника.
  • Одиночный завершающий перевод строки не является обязательным.

Это , поэтому выигрывает самый короткий код.

fireflame241
источник
Связанные
Джеймс
4
No computer {can} {action}.повторяется дважды и Computers {cannot_present}выдает фразы типа «Компьютеры не способны». Преднамеренное?
darrylyeo
Любые очевидные ошибки в pastebin должны быть включены в вывод для всех программ (мы не можем изменить спецификации для предыдущих программ). Reassuring.cfg - это просто пример грамматики, который, по крайней мере, достаточно точен.
fireflame241
Чтобы конкурировать в этом Id, нужно написать парсер для ввода, просто чтобы перечислить уникальные lol.
Волшебная Осьминог Urn
Для справки, ссылка 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. Подпрограмма является evaled и 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.

darrylyeo
источник
Хороший! Но это, кажется, вылетает, если функция не вызывается 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.
";

Не стесняйтесь попробовать выкопать еще один байт, если можете.

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

объяснение

Вывод может быть разделен на 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было заменено заглавной буквой, чтобы избавиться от пары кавычек.


Интересно, что случилось бы, если бы я также закодировал комбинации глагол / прилагательное.
Может быть, я мог бы победить Zsh; но я не уверен, если мне интересно, достаточно ли попробовать.

Titus
источник
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 Я не могу изменить цифры, потому что им нужно повторить замену несколько раз, но спасибо за другие идеи!
Нил
0

Bubblegum , 23353 байт

Ага. Большая часть этого не подходит для ответа, так что ... и код, и ссылка на TIO вставлены.

Код (hexdump кода)

Ссылка TIO (выходная информация превышает ограничения TIO)

totallyhuman
источник