コンピューターがさわやかなクッキーを味わうことはありません


11

github.com/JackToaster/Reassuring-Parable-Generatorに触発され、次にxkcd.com/1263に触発されました。考えられる単語は、そのリポジトリのreassuring.cfgから派生しています。

reassuring.cfgを見て(12回目のコミットを使用)、出力が一致する文法を確認することをお勧めします(出力は、文法に一致するすべての文字列のリストです)。

タスク:プログラムは、pastebin pastebin.com/2SNAJ1VHに含まれる正確なテキストの大文字小文字を区別するすべての7968行を出力する必要があります。pastebinのコピーが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を含める必要があります。
  • 出力は、文字列のリストではなく、単一のフラットな文字列である必要があります。
  • プログラムは、入力を受け入れないか、空の未使用入力を受け入れる必要があります。
  • プログラムは、オンラインソースからデータを取得できません。
  • 単一の末尾の改行はオプションです。

これはなので、最短のコードが優先されます。



4
No computer {can} {action}.が2回繰り返され、Computers {cannot_present}「コンピュータは対応できません」などのフレーズが生成されます。意図的ですか?
-darrylyeo

pastebinの明らかな間違いは、すべてのプログラムの出力に含める必要があります(過去のプログラムの仕様を変更することはできません)。reassuring.cfgは、少なくとも非常に正確な単なるサンプル文法です。
fireflame241

このIDで競争するには、一意のlolをリストするために、入力用のパーサーを記述する必要があります。
魔法のタコUr

参考までに、BubblegumソリューションへのTIO リンクは長すぎて答えを出すことができません。ソースコードは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())


どうやって?

(これは、これまでで最もお気に入りのゴルフの1つです!)

文法は配列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]FJavaScriptの関数はオブジェクトでもあるため、のプロパティとして格納されます)。ループは次々に追加されます。

たとえば、生成されたサブプログラム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すると、プログラムの残りの部分は、既に存在するプロダクションルールから残りの文法を構築するだけです。置換は、単に1桁のインデックスで定義されGます。


良いですね!しかし、関数が呼び出されない場合、これはクラッシュするようfです。したがって、f=バイトカウントに追加する必要があります。
アーナルド

(これFf。の代わりに再利用することで修正できると思います。)
Arnauld

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

可能であれば、もう1バイト掘り下げてみてください。

食べない

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

説明

出力は、それぞれ166行の48チャンクに分割できます。各チャンク内で、各行Computers|A computer|No computerは、14の負(ComputersおよびA computer)または9の正()のいずれかのNo computer機能の1つで始まります。
これらのチャンクをそれぞれ6ビットにエンコードし(3つの異なるサブジェクト->下位2ビット。正と負のキャップはキーを共有->上位4ビット)、(おそらく明らか)値をASCIIコードとして使用するために65を追加しました。

これらのチャンク内で、11の異なる食品の8つの動詞/形容詞の組み合わせと6つの異なる芸術の13の異なる組み合わせが常に同じ順序で。動詞/形容詞キーを使用して、次のループで食べ物や飲み物をリストする必要があるかどうかを判断するために、単純にループすることができます。

トリッキーな部分が1つ残っていました。大文字の一部には動詞の動名詞の形が必要です。そして、動詞のいくつかはe、変換で負けます。capインデックスは、それが必要かどうかを示します。
(エンコードのビットの順序のおかげで、単にASCII文字を使用して比較できます)。
しかし、どのように?しばらくの間、正規表現でジャグリングした後、私は簡単に言えば1どこeで交換する必要があるing0どこing追加する必要があるとlet strtr仕事をします。

それが、上記の非ゴルフバージョンの物語です。(1199バイトパック)


ゴルフは 3つの段階で主に構成され:

  1. 使用されるほとんどの文字シーケンスは変数に保存されました。
  2. strtr変数をに移動するために、サブジェクトを除くすべてに拡張されましたstrtr
  3. ほとんどのシーケンスは変数からに移動されましたstrtr

19番目の単語、tastは、いくつかの引用符を取り除くために大文字に置き換えられました。


動詞/形容詞の組み合わせもエンコードするとどうなるでしょうか。
たぶん私はZshを倒すことができました。しかし、試してみるのに十分なのかどうかはわかりません。


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の制限を超えています。%`ステージを使用してすべてを回避したかったのです$%'¶$%`が、何らかの理由でそれが望んでいたことをしません。編集:@ fireflame241のおかげで57バイトを保存しました。


まだ圧縮の余地があります:ingそして、 `Ito`はそれぞれ数回使用されます。呼び出すたびに12とは、5 これらが置換に入れることができるので、スペースが先行し、続いています。同様に、6andの7後には常にピリオドが続きます。3一度だけ使用されるようです。
fireflame241

@ fireflame241置換を数回繰り返す必要があるため、数字を変更できませんが、他のアイデアに感謝します!
ニール

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.