Parábolas tranquilizadoras

27

Muitas pessoas aqui provavelmente são leitores ávidos do XKCD. Então, acho que desafiaria vocês a fazer algo que Megan pode fazer facilmente: criar um script que gere milhares de parábolas tranquilizadoras sobre o que os computadores nunca podem fazer.

XKCD # 1263

Seu script

  • Pode ser escrito em qualquer idioma
  • Deve ter código de golfe
  • É necessário incluir uma entrada (no stdinidioma equivalente ou no seu idioma) no número de parábolas que ele cuspirá (você pode assumir que isso não excederá MAX_INTou equivalente).
  • Produzirá várias parábolas geradas aleatoriamente .

As parábolas são as seguintes

  • Começa com 'Computers will never '
  • A seguir, um dos 16 verbos em inglês exclusivos que você pode escolher livremente para otimizar seu programa, mas deve incluir code-golfe understand.
  • Em seguida, um dos 16 substantivos em inglês exclusivos que, novamente, você pode escolher livremente otimizar seu programa, mas deve incluir a salade an octopus.
  • A seguir, uma das 16 cláusulas exclusivas em inglês que você pode escolher livremente para otimizar seu programa, mas deve incluir for fune after lunch.
  • Termina com um caractere de nova linha ( \nou equivalente)

Assim, por exemplo, se a entrada for 2, uma saída válida seria

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

O tamanho do programa é contado em bytes, não em caracteres (portanto, sem rabiscos unicode). As brechas padrão não são permitidas.

Este é o meu primeiro desafio, por isso, se devo fazer algumas mudanças óbvias, comente.

Edit: Estou pensando em subtrair o tamanho do dicionário a partir da contagem de bytes, para incentivar a 'compactação' do dicionário. Vou ver nas respostas futuras se isso é remotamente viável; se for, você pode contar com um bônus.

Sanchises
fonte
4
Convém adicionar que o tamanho é contado em bytes e que brechas padrão não são permitidas.
matsjoyce
Podemos escolher os 14 verbos / substantivos / cláusulas restantes?
Optimizer
@Optimizer "... que você pode escolher livremente para otimizar seu programa ..."
Martin Ender
5
Eu suportaria subtrair o tamanho do dicionário para evitar o uso de palavras ultra curtas, mas completamente desconhecidas ( como aqui ).
Falko
2
@matsjoyce: Contar bytes é o padrão. O ponto de ter brechas padrão é que não é necessário mencioná-las.
Dennis

Respostas:

6

CJam, 238 232 (ou 209) bytes

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}*

Isso usa muitos verbos / substantivos / cláusulas de respostas já postadas, mas alguns também são novos. Tenho base convertido os caracteres para raspar alguns bytes extras.

A string convertida base pode ter 24 bytes a mais (para obter uma solução de 209 bytes ; observe que você deve considerar a contagem de caracteres em vez da contagem de bytes, pois todos os caracteres têm um código ASCII inferior a 255, mas o site ainda considera alguns com unicode ), mas queria que a sequência consistisse apenas caracteres ASCII imprimíveis.

Apenas para referência, aqui está a versão de 209 bytes:

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}*

Toma o número de linhas para imprimir a partir de STDIN, como:

12

Saída:

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

Experimente online aqui

Optimizer
fonte
19

Aqui está uma abordagem ligeiramente diferente:

Python, 368308297 bytes

EDIT, eu realmente joguei desta vez. Raspou 60 caracteres.

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

Aqui está o truque de golfe do qual mais me orgulho:

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

Eu nem sabia que python poderia fazer isso! Aqui está uma explicação mais simples:

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

atribui aeb a 0 e 1 e, em seguida, a 1 e 2 e, em seguida, a 2 e 3.


Isso usa a biblioteca de linguística do NodeBox para gerar uma lista de verbos / substantivos / cláusulas e, em seguida, seleciona-os aleatoriamente.

Essa biblioteca não é ótima para gerar palavras aleatórias (daí os 368 bytes), mas o interessante dessa abordagem é que você recebe algumas parábolas tranquilizadoras aleatórias. Aqui está o que eu quero dizer.

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.

Mas, ei, não acho que o programa de outra pessoa gere o ditado: "Os computadores nunca impressionarão um criador de animais por bolo de cinzas".

Aqui está uma versão não destruída (574 bytes):

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 )+'.' 

E, finalmente, mas definitivamente não menos importante, aqui estão algumas das minhas parábolas tranquilizadoras favoritas, que eu prevejo que se tornarão frases realmente populares nos próximos 10 a 15 anos.

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.

e meu favorito pessoal:

Computers will never romanticise a cockatoo parrot for cross-fertilization.
DJMcMayhem
fonte
6
Eu certamente encontrá-lo tranquilizando que os computadores nunca vai agrupar-se um nazi de recompra ...
Sanchises
ainda não passei por este com um pente fino ou algo assim, mas, a menos que eu esteja enganado, from random import choice as Cpode serfrom random import*;C=choice
undergroundmonorail
também duas vezes que você tem for i in ' '*(something)para que você possa trivialmente salvar dois bytes de remover o espaço entre ine' '
undergroundmonorail
Sim, tenho certeza de que isso pode ser ainda mais aprimorado. Não me esforcei muito para compactá-lo. Penso que realmente queria esmagá-lo, precisaria encontrar uma biblioteca mais adequada para a seleção aleatória de palavras.
DJMcMayhem
6

JavaScript ES6, 331 336 bytes

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)

Escolhi palavras que funcionam como verbos e substantivos para encurtar a lista, mas deixe-me saber se isso não é permitido. Experimente acima usando Snippets de pilha (o código foi formatado para usar o ES5) ou em http://jsfiddle.net/5eq4knp3/2/ . Aqui está um exemplo de saída:

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
NinjaBearMonkey
fonte
O que na Terra é um za ?!
Decay Beta
3
@BetaDecay Gíria para pizza.
NinjaBearMonkey
1
@ MarkGabriel É uma função que retorna um número aleatório entre 0 e 16 com deslocamento spara passar pelas outras partes do discurso na lista. Os dois tildes não são operadores bit a bit, e funcionam apenas como uma maneira mais curta de fazer Math.floor().
NinjaBearMonkey 27/10
1
@ MarkGabriel É assim que o ECMAScript 6 representa funções. r=s=>12é o mesmo que function r(s){return 12}, apenas mais curto. Veja também os documentos no MDN .
NinjaBearMonkey 27/10/2014
1
@MarkGabriel Para obter respostas detalhadas completas, consulte SO's O que ~~ (“double til”) faz em Javascript? e O que F = a => significa em Javascript? ~~é como um tipo Math.floor(mas se comporta de maneira diferente para números negativos) e =>é uma definição de função no estilo ES6 com um limite this.
Apsillers
5

Python - 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]

Exemplo aleatório de saída:

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
Falko
fonte
umm ... ion não é um verbo.
John Dvorak
@JanDvorak: Oooops ... Corrigido!
Falko
2
Por que não usar um verbo mais curto? Diga, costure ...
John Dvorak
@JanDvorak: Sim, eu substituí. No entanto, não sei até que ponto iria jogar o conteúdo, pois há muitas palavras ainda mais curtas que se poderia usar. Mas o resultado seria tão chato.
Falko
1
Toque agradável para incluir 'for + ...' e advérbios (nus) em uma lista. Era isso que eu esperava - acho muito reconfortante que meu computador nunca se despe.
Sanchises 27/10/10
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..<>

Aqui está um teste:

$ 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
core1024
fonte
1

CJam, 353 317 301 bytes

Estou usando a lista de palavras de Falko, para ser justo, para que a única diferença no golfe se deva aos idiomas e não ao conteúdo (eu poderia alterar a lista de palavras se as pessoas começarem a jogar também).

"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=
Martin Ender
fonte
Você não está lendo a entrada para imprimir N número de vezes.
Optimizer
@ Otimizador Oh, eu esqueci totalmente isso. Consertando em um segundo.
Martin Ender
0

NetLogo, 396

Também usei a lista de palavras de Falko, com duas exceções (que não alteram a duração do programa).

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

Dependendo de como você define "programa", é possível remover os cinco e os três primeiros caracteres, obtendo uma pontuação de 388.

Ypnypn
fonte