保证寓言


27

这里有很多人可能是XKCD的狂热读者。因此,我想我会挑战你们做梅根可以轻松完成的事情:制作一个脚本,生成有关计算机永远无法做的数千个令人放心的寓言。

XKCD#1263

你的剧本

  • 可以用任何语言写
  • 必须代码编码
  • 必须输入stdin将要吐出的寓言数量(使用或等同于您的语言)(您可以假设此数量不会超过MAX_INT或等同)。
  • 将输出许多随机生成的寓言。

寓言如下

  • 以。。开始 'Computers will never '
  • 接下来,您可以自由选择16个独特的英语动词之一来优化程序,但必须包括code-golfunderstand
  • 接下来,是16个唯一的英语名词之一,您可以再次自由选择以优化程序,但必须包括a saladan octopus
  • 接下来,您可以自由选择16个独特的英语子句之一来优化程序,但必须包括for funafter lunch
  • 以换行符(\n或等效字符)结尾

因此,例如,如果输入为2,则有效输出为

Computers will never code-golf a salad for lunch
Computers will never hug a tree in vain

程序大小以字节为单位,而不是以字符为单位(因此,无Unicode乱码)。不允许出现标准漏洞

这是我的第一个挑战,因此,如果我应该进行一些明显的更改,请发表评论。

编辑:我正在考虑从字节数中减去字典大小,以鼓励字典“压缩”。我将从未来的答案中看出这是否遥不可及;如果是这样,您可以指望奖金。


4
您可能需要添加大小以字节为单位,并且不允许出现标准漏洞
matsjoyce 2014年

我们是否可以自己选择其余的14个动词/名词/从句?
Optimizer

@Optimizer“ ...,您可以自由选择以优化程序...”
Martin Ender 2014年

5
我支持减去字典大小,以防止使用超短但完全未知的单词(如此处)。
Falko 2014年

2
@matsjoyce:默认计数为字节。具有标准漏洞的关键是不必提及它们。
丹尼斯

Answers:


6

CJam,238 232(或209)个字节

ri{'C"!fmQ$h/q6fW*LC*hBd11(kA>.TfqJ0++#<>A]XThJkY b~os;vMg_D-}zYX%_,PozNxe5_8`}$H;2IUZ]&$c+m~HJ*|!n\A^:W-*O\"V-/8Kg ,_b(N#M/1Zh6*%\#t22'#|\"BJN=Za2_.R"32f-96b28b" -"'{,W%+f=)/(\[G/~["for ""after "]\m*\(a\"a "f{\+}+\]{mr0=}%S*N}*

这使用了已经发布的答案中的许多动词/名词/从句,但其中一些也是新的。我已经将字符转换为基本字符,以减少一些额外的字节。

基本的转换字符串可以再打24个字节(以获得209字节的解决方案;请注意,您必须考虑字符计数而不是字节计数,因为所有字符的ASCII码都小于255,但是站点仍然认为某些字符具有unicode ),但我希望该字符串仅包含可打印的ASCII字符。

仅供参考,这是209字节的版本:

ri{'C"9óßÂ/ÃC eG?dcÅoø£gaC#Yä©Ï¡áq¶hm)ð­aâ%ØNo=óÏrbÁz´¾;q·u¬&ñ*±äô©@6W±U¹¥¢)·«Åx¶óV¬¬dhja¼ ª\"r[çË74Äãгî,ó3gÈ$AïL"32f-222b28b" -"'{,W%+f=)/(\[G/~["for ""after "]\m*\(a\"a "f{\+}+\]{mr0=}%S*N}*

采取从STDIN打印的行数,例如:

12

输出:

Computers will never code-golf an octopus for fun
Computers will never code-golf a bag after za
Computers will never eat a hem after tip
Computers will never eat an octopus for tip
Computers will never get a fax for you
Computers will never dry a gym for za
Computers will never get a guy for tip
Computers will never do a pen for fun
Computers will never see a bar after you
Computers will never tax a pen for ex
Computers will never get a hem for lunch
Computers will never win a pen for ex

在这里在线尝试


19

这是一个稍微不同的方法:

Python,第368个308 297字节

编辑,这次我实际上打了高尔夫球。减少了60个字符。

from random import*
from en import*
C=choice
v=["code-golf","understand","go","do"]
n=["salad","octopus","fun","lunch"]
for f,l in("verbs",v),("nouns",n):exec"l.append(str(C(wordnet.all_"+f+"()))[:-4]);"*12
exec'print"Computers will never",C(v),noun.article(C(n)),C(("for","after")),C(n);'*input()

这是我最引以为豪的高尔夫技巧:

for f,l in("all_verbs",v),("all_nouns",n):

我什至不知道python可以做到这一点!这是一个更简单的解释:

for (a, b) in ((0, 1), (1, 2), (2, 3)):

将a和b分配给0和1,然后分配给1和2,然后分配给2和3。


它使用NodeBox的语言库生成动词/名词/从句的列表,然后从中随机选择。

这个库对于生成随机单词(因此为368个字节)而言并不是那么好,但是这种方法的好处是您可以使用它获得一些相当随机的保证寓言。这就是我的意思。

Computers will never attempt a syria for synchronization.
Computers will never understand a salad for change of mind.
Computers will never brim an electric company for synchronization.
Computers will never pivot a dusk for fun.
Computers will never bedaze an electric company for genus osmerus.
Computers will never brim a salad for vital principle.
Computers will never attempt an erythroxylum after lunch.
Computers will never understand an uuq for water birch.
Computers will never brim an ictiobus for change of mind.
Computers will never brim an ictiobus for 17.
Computers will never lie in an octopus for change of mind.
Computers will never happen upon a toothpowder for water birch.
Computers will never typeset an electric company for change of mind.
Computers will never brim a french oceania after lunch.
Computers will never bring out an ictiobus for glossodia.
Computers will never bedazzle an animal fancier for ash cake.
Computers will never attempt a dusk for genus osmerus.
Computers will never understand an animal fancier for genus osmerus.
Computers will never accredit a prickly pear cactus for 17.
Computers will never typeset an erythroxylum for water birch.

但是,嘿,我认为其他人的程序不会说出这样的话:“计算机永远不会使灰烬的动物爱好者眼花bed乱。”

这是一个非高尔夫版本(574字节):

import random
import en

v = ["code-golf", "understand"]#list of verbs
n = ["a salad", "an octopus"]#list of nouns
c = ["for fun", "after lunch"]#list of clauses
for i in range(14):
    v.append(str(random.choice(en.wordnet.all_verbs()))[:-4])
    n.append(en.noun.article(str(random.choice(en.wordnet.all_nouns()))[:-4]))
    c.append("for "+str(random.choice(en.wordnet.all_verbs()))[:-4])

N=input("Enter the number of reassuring phrases you want: ")
for i in range(N):
    print "Computers will never"+' '+random.choice(v)+' '+random.choice(n)+' '+random.choice(c )+'.' 

最后但绝对并非最不重要的一点是,这是我最喜欢的一些令人放心的寓言,我预计在未来10-15年内它将成为非常流行的流行语。

Computers will never move around a methenamine for godwin austen.
Computers will never conk an adzuki bean for bitterwood tree.
Computers will never jaywalk a cross-dresser for fun.
Computers will never hyperbolize an accessory after the fact for norfolk island pine.
Computers will never dissolve a salad for earth wax.
Computers will never acetylise an incontrovertibility for dictatorship.
Computers will never reciprocate a strizostedion vitreum glaucum for commelinaceae.
Computers will never goose an action replay for star chamber.
Computers will never veto a bottom lurkers for jackboot.
Computers will never reciprocate a visual cortex for oleaginousness.
Computers will never baptise a special relativity after lunch.
Computers will never understand a gipsywort for citrus tangelo.
Computers will never get it a brand-name drug for electronic computer.
Computers will never deforest a paperboy after lunch.
Computers will never bundle up a nazi for repurchase.
Computers will never elapse a bernhard riemann for counterproposal.

和我个人的最爱:

Computers will never romanticise a cockatoo parrot for cross-fertilization.

6
我当然可以放心,计算机永远不会捆绑纳粹进行回购……
Sanchises 2014年

没有去了这一个用细齿梳或做任何事,但除非我错了from random import choice as C可能是from random import*;C=choice
undergroundmonorail

也两次,你必须for i in ' '*(something)让你可以平凡扑救之间取出的两个字节的空间in' '
undergroundmonorail

是的,我敢肯定,这可以进一步进行下去。我没有花很多精力来压缩它。我想我真的很想压缩它,我需要找到一个更适合于随机单词选择的库。
DJMcMayhem

6

JavaScript ES6,331 336字节

n=prompt(a='')
r=s=>s+Math.random()*16>>0
p=q=>'OctopusSaladCutCueBatJamKidPenDogFanHemDotTaxSowDyeDigCode-golfUnderstandLunchFunMeYouUsItAdsPaZaMenTwoIceJamWarRumWax'.match(/[A-Z][^A-Z]+/g)[q].toLowerCase()
while(n-->0)y=r(0),z=r(18),a+=`Computers will never ${p(r(2))} a${y?'':'n'} ${p(y)} ${z<18?'afte':'fo'}r ${p(z)}
`
alert(a)

我选择了既可作为动词又可作为名词的单词,以缩短列表的长度,但请告知是否不允许这样做。在上面使用Stack Snippets(该代码已格式化为使用ES5)或在http://jsfiddle.net/5eq4knp3/2/上进行尝试。这是示例输出:

Computers will never hem a cut for ads
Computers will never dot a pen after lunch
Computers will never code-golf a bat for free
Computers will never sow a dog for me
Computers will never cut an octopus for fun

za到底是什么?!
Beta Decay

3
@BetaDecay lang语披萨。
NinjaBearMonkey

1
@MarkGabriel这是一个函数,该函数返回0到16之间的一个随机数,带有偏移量s以跳过列表中语音的其他部分。这两个波浪号是按位NOT运算符,它们只是作为一种较短的方法Math.floor()
NinjaBearMonkey 2014年

1
@MarkGabriel这就是ECMAScript 6表示函数的方式。r=s=>12与相同function r(s){return 12},只是更短。另请参阅MDN上的文档。
NinjaBearMonkey 2014年

1
@MarkGabriel有关Comeplte的深入答案,请参见SO的~~(“双波浪号”)在Java脚本中的作用是什么?什么F = A =>平均在Javascript? ~~有点像Math.floor(但对负数的行为不同),并且=>是带有bound的ES6样式的函数定义this
Apsillers 2014年

5

蟒蛇- 390 385 383

from pylab import*
S=str.split
n=input()
while n:n-=1;i,j,k=randint(0,16,3);print"Computers will never",S("buy cut dry eat fax get pay rob see sue tax tow wax win code-golf understand")[i],"a"+"n"*(j<1),S("octopus salad bag bar bee bow boy bra dad fax gym guy hat man mom pet")[j],"for "*(k>2)+S("after lunch,naked,ever,fun,me,you,us,tip,gas,cash,air,oil,beer,love,food,dope",",")[k]

随机示例输出:

Computers will never pay an octopus for oil
Computers will never cut a bra for beer
Computers will never eat a bee for us
Computers will never rob a pet for you
Computers will never tax a pet for tip
Computers will never buy a salad for cash
Computers will never sue a boy naked
Computers will never see a bar for you
Computers will never wax a bra for beer
Computers will never sue an octopus for us

嗯... 离子不是动词。
约翰·德沃夏克

@JanDvorak:糟糕!解决了!
法尔科2014年

2
为什么不使用简短的动词?说,缝...
John Dvorak 2014年

@JanDvorak:是的,我替换了它。但是,我不知道多远,我会打高尔夫球的内容,因为有许多更短的话一个可以使用。但是结果将是无聊的。
法尔科2014年

1
很不错的感觉,可以在一个列表中同时包含“ for + ...”和副词(裸)。这就是我所希望的-我非常放心,我的计算机永远不会脱衣服。
桑契斯2014年

2

Perl-366

@w="Code-golfUnderstandBeDoTieSeeSawEatCutCapSitSetHateZapSipLoveSaladOctopusSeaBeeCatDogHatBatJobManLapCapRapMapDotAnt0fun1that1noon1work0good0sure0reason0nothing0you1you1lunch1all0me0nowToday1me"=~s/\d/("For ","After ")[$&]/reg=~/([A-Z][^A-Z]+)/g;print"Computers will never ".lc"$w[rand 16] a".$w[16+rand 16]=~s/^[AO]?/(n)[!$&]." $&"/re." $w[32+rand 16]
"for 1..<>

这是一个测试:

$ perl ./parables.pl <<<3
Computers will never do an ant after noon
Computers will never do a lap after all
Computers will never love an octopus for sure

1

CJam,353个 317 301字节

为了公平起见,我使用Falko的单词表,以便打高尔夫球的唯一区别在于语言而不是内容(如果人们也开始打高尔夫,则可能会更改单词表)。

"Computers will never ""buy
cut
dry
eat
fax
get
pay
rob
see
sue
tax
tow
wax
win
code-golf
understand"N/[" an octopus"" a ""salad
bag
bar
bee
bow
boy
bra
dad
fax
gym
guy
hat
man
mom
pet"{N/\f{\+}~]}:F~S["after lunch""naked""ever""for ""fun
me
you
us
tip
gas
cash
air
oil
beer
love
food
dope"Fm*m*m*mr0=

您没有读取N次打印输入。
Optimizer

@Optimizer哦,我完全忽略了这一点。马上修复。
Martin Ender 2014年

0

NetLogo,396

我还使用了Falko的单词表,但有两个例外(它们不会更改程序的长度)。

to f let a["after lunch""ever""alone"]type(word"Computers will never "one-of["buy""cut""dry""eat""fax""get""pay""rob""see""sue""tax""tow""wax""win""code-golf""understand"]" a"one-of["n ocotpus"" salad"" bag"" bar"" bee"" bow"" boy"" bun"" dad"" fax"" gym"" guy"" hat"" man"" mom"" pet"]" "one-of fput word"for "one-of["fun""me""you""us""tip""gas""cash""air""oil""beer""love""food""dope"]a"\n")end

根据定义“程序”的方式,您可以删除前五个字符和最后三个字符,因此得分为388。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.