Uspokajające przypowieści

27

Sporo osób tutaj jest prawdopodobnie zapalonymi czytelnikami XKCD. Myślę, że rzuciłbym wam wyzwanie, abyście zrobili coś, co Megan może łatwo zrobić: stworzyć skrypt, który generuje tysiące uspokajających przypowieści o tym, czego komputery nigdy nie mogą zrobić.

XKCD # 1263

Twój skrypt

  • Można pisać w dowolnym języku
  • Musi być golfem
  • Należy wziąć pod uwagę (on stdinlub odpowiednik w języku użytkownika) liczbę przypowieści, które wypluje (można założyć, że nie przekroczy ona MAX_INTlub nie jest równoważna).
  • Wygeneruje szereg losowo generowanych przypowieści.

Przypowieści są następujące

  • Zaczynać z 'Computers will never '
  • Następnie jeden z 16 unikalnych angielskich czasowników, które możesz dowolnie wybrać, aby zoptymalizować swój program, ale musi on zawierać code-golfi understand.
  • Następnie jeden z 16 unikalnych angielskich rzeczowników, które ponownie możesz swobodnie wybrać, aby zoptymalizować swój program, ale muszą zawierać a saladi an octopus.
  • Następnie jedna z 16 unikalnych angielskich klauzul, które możesz dowolnie wybrać w celu optymalizacji swojego programu, ale musi ona zawierać for funi after lunch.
  • Kończy się znakiem nowej linii ( \nlub równoważnym)

Na przykład, jeśli dane wejściowe to 2, prawidłowe dane wyjściowe to

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

Rozmiar programu jest liczony w bajtach, a nie w znakach (więc bez bełkotu w Unicode). Standardowe luki są niedozwolone.

To moje pierwsze wyzwanie, więc jeśli powinienem dokonać pewnych oczywistych zmian, proszę o komentarz.

Edycja: Rozważam odjęcie wielkości słownika od liczby bajtów, aby zachęcić do „kompresji” słownika. Zobaczę na podstawie przyszłych odpowiedzi, czy jest to wykonalne zdalnie; jeśli tak, możesz liczyć na bonus.

Sanchises
źródło
4
Możesz dodać, że rozmiar jest liczony w bajtach , a standardowe luki nie są dozwolone.
matsjoyce
Czy sami wybieramy pozostałe 14 czasowników / rzeczowników / klauzul?
Optymalizator
@Optimizer „... który możesz swobodnie wybrać, aby zoptymalizować swój program ...”
Martin Ender
5
Popierałbym odejmowanie rozmiaru słownika, aby zapobiec użyciu bardzo krótkich, ale całkowicie nieznanych słów ( jak tutaj ).
Falko
2
@matsjoyce: Liczenie bajtów jest wartością domyślną. Istotą standardowych luk jest to, że nie trzeba o nich wspominać.
Dennis

Odpowiedzi:

6

CJam, 238 232 (lub 209) bajtów

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

Wykorzystuje to wiele czasowników / rzeczowników / klauzul z już opublikowanych odpowiedzi, ale niektóre są również nowe. Mam podstawową konwersję znaków, aby zgolić dodatkowe bajty.

Bazowy ciąg znaków może być golfowany o 24 bajty więcej (aby uzyskać rozwiązanie 209 bajtów ; pamiętaj, że musisz wziąć pod uwagę liczbę znaków zamiast liczby bajtów, ponieważ wszystkie znaki mają kod ASCII mniejszy niż 255, ale strona nadal uważa, że ​​niektóre mają Unicode ), ale chciałem, aby ciąg składał się tylko z drukowalnych znaków ASCII.

Dla porównania, oto wersja 209 bajtów:

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

Pobiera liczbę wierszy do wydrukowania ze STDIN, takich jak:

12

Wydajność:

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

Wypróbuj online tutaj

Optymalizator
źródło
19

Oto nieco inne podejście:

Python, 368 308 297 bajtów

EDYCJA, tym razem grałem w golfa. Ogolono 60 znaków.

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

Oto sztuczka golfa, z której jestem najbardziej dumny:

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

Nawet nie wiedziałem, że Python może to zrobić! Oto prostsze wyjaśnienie:

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

przypisuje aib do 0 i 1, a następnie do 1 i 2, a następnie do 2 i 3.


Wykorzystuje bibliotekę lingwistyczną NodeBox do generowania listy czasowników / rzeczowników / klauzul, a następnie losowo wybiera z nich.

Ta biblioteka nie jest świetna do generowania losowych słów (stąd 368 bajtów), ale fajną rzeczą w tym podejściu jest to, że masz dość przypadkowe uspokajające przypowieści. Oto co mam na myśli.

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.

Ale hej, nie sądzę, aby ktokolwiek inny program wygenerował powiedzenie: „Komputery nigdy nie oczernią miłośnika zwierząt dla popiołu z ciasta”.

Oto wersja bez golfa (574 bajty):

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

I na koniec, ale zdecydowanie nie mniej ważne, oto niektóre z moich ulubionych uspokajających przypowieści, które, jak sądzę, staną się bardzo popularne w ciągu następnych 10-15 lat.

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.

i mój osobisty faworyt:

Computers will never romanticise a cockatoo parrot for cross-fertilization.
DJMcMayhem
źródło
6
Z pewnością uważam za uspokajające, że komputery nigdy nie będą
wiązać
jeszcze nie przejrzałem tego z grzebieniem o drobnych zębach lub czymkolwiek, ale chyba się mylę, from random import choice as Cmoże byćfrom random import*;C=choice
metro
także dwa razy masz, for i in ' '*(something)dzięki czemu możesz w trywialny sposób zaoszczędzić dwa bajty od usuwania odstępu między ini' '
undergroundmonorail
Tak, jestem pewien, że można to jeszcze pograć w golfa. Nie włożyłem dużo wysiłku w jego kompresję. Myślę, że naprawdę chciałem to ograniczyć, musiałbym znaleźć bibliotekę bardziej odpowiednią do losowego wybierania słów.
DJMcMayhem
6

JavaScript ES6, 331 336 bajtów

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)

Wybrałem słowa, które działają zarówno jako czasowniki, jak i rzeczowniki, aby skrócić listę, ale daj mi znać, jeśli nie jest to dozwolone. Wypróbuj to powyżej, używając fragmentów stosu (tam sformatowany kod do użycia ES5) lub na stronie http://jsfiddle.net/5eq4knp3/2/ . Oto przykładowy wynik:

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
źródło
Czym na ziemi jest za ?
Beta Decay
3
@BetaDecay Slang na pizzę.
NinjaBearMonkey
1
@MarkGabriel Jest to funkcja, która zwraca losową liczbę od 0 do 16 z przesunięciem, saby przeskoczyć obok innych części mowy na liście. Te dwa tyldy są bitowymi operatorami NOT i działają po prostu jako krótszy sposób Math.floor().
NinjaBearMonkey
1
@MarkGabriel W ten sposób ECMAScript 6 reprezentuje funkcje. r=s=>12jest taki sam jak function r(s){return 12}tylko krótszy. Zobacz także dokumenty w MDN .
NinjaBearMonkey
1
@MarkGabriel Aby uzyskać szczegółowe odpowiedzi, zobacz SO Co robi ~~ („double tilde”) w Javascript? i co oznacza F = a => w Javascript? ~~jest swego rodzaju Math.floor(ale zachowuje się inaczej w przypadku liczb ujemnych) i =>jest definicją funkcji w stylu ES6 z ograniczeniem 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]

Losowy przykładowy wynik:

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
źródło
umm ... ion nie jest czasownikiem.
John Dvorak
@JanDvorak: Oooops ... Naprawiono to!
Falko
2
Dlaczego nie użyć krótszego czasownika? Powiedz, szyj ...
John Dvorak
@JanDvorak: Tak, zastąpiłem to. Nie jestem jednak pewien, jak daleko bym zagrał w golfa, ponieważ istnieje wiele jeszcze krótszych słów, których można by użyć. Ale wynik byłby tak nudny.
Falko
1
Miły akcent, aby dołączyć zarówno „for + ...”, jak i przysłówki (nagie) na jednej liście. Właśnie na to liczyłem - uważam, że mój komputer nigdy się nie rozbiera.
Sanchises
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..<>

Oto test:

$ 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
rdzeń 1024
źródło
1

CJam, 353 317 301 bajtów

Używam listy słów Falko, dla uczciwości, tak więc jedyną różnicą w grze w golfa są języki, a nie treść (mogę zmienić listę słów, jeśli ludzie również zaczną grać w golfa).

"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
źródło
Nie czytasz danych wejściowych do drukowania N razy.
Optymalizator
@Optimizer Och, całkowicie to przeoczyłem. Naprawianie w sekundę.
Martin Ender
0

NetLogo, 396

Użyłem również listy słów Falko, z dwoma wyjątkami (które nie zmieniają długości programu).

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

W zależności od tego, jak zdefiniujesz „program”, możesz usunąć pierwsze pięć i trzy ostatnie znaki, co daje wynik 388.

Ypnypn
źródło