Заспокійливі притчі


27

Мало хто тут, мабуть, завзятий читач XKCD. Отже, я думаю, що я закликаю вас, хлопці, зробити щось, що Меган може зробити легко: створити сценарій, який генерує тисячі переконливих притч про те, що комп'ютери ніколи не можуть зробити.

XKCD # 1263

Ваш сценарій

  • Можна писати будь-якою мовою
  • Повинно бути кодовим
  • Потрібно взяти вклад ( stdinабо на вашому мовному еквіваленті) про кількість притч, які вона виплюне (ви можете припустити, що це не перевищує MAX_INTабо еквівалент).
  • Виведе кількість випадково генерованих притч.

Притчі такі

  • Починає з 'Computers will never '
  • Далі - один з 16 унікальних англійських дієслів, які ви можете вільно вибрати для оптимізації програми, але повинні включати code-golfі understand.
  • Далі, одне з 16 унікальних англійських іменників, які знову ви можете вільно вибрати для оптимізації вашої програми, але повинні включати a saladі an octopus.
  • Далі, одне з 16 унікальних англійських пропозицій, які ви можете вільно вибрати для оптимізації програми, але повинні включати for funі after lunch.
  • Закінчується новим рядком ( \nабо еквівалентним) символом

Так, наприклад, якщо вхід є 2, був би дійсний вихід

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

Розмір програми підраховується в байтах, а не символах (так що немає однокольорових обмовок). Стандартні лазівки заборонені.

Це мій перший виклик, тому, якщо я маю внести явні зміни, будь ласка, прокоментуйте.

Редагувати: Я маю намір підкреслити розмір словника з числа байтів, щоб заохотити "стиснення" словника. Я побачу з майбутніх відповідей, чи це віддалено можливо; якщо це так, ви можете розраховувати на бонус.


4
Ви можете додати, що розмір рахується в байтах , а стандартні лазівки заборонені.
matsjoyce

Чи можемо ми самі обирати решту 14 дієслів / іменників / доданків?
Оптимізатор

@Optimizer "... який ви можете вільно вибрати, щоб оптимізувати свою програму ..."
Мартін Ендер

5
Я б підтримав віднімання розміру словника, щоб запобігти використанню ультракоротких, але абсолютно невідомих слів ( як тут ).
Фалько

2
@matsjoyce: за замовчуванням вважається підрахунок байтів. Суть стандартних лазів в тому, що згадувати їх не потрібно.
Денніс

Відповіді:


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

Ось дещо інший підхід:

Пітон, 368 308 297 байт

EDIT, я цього разу фактично гольфував. Поголений 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):

Я навіть не знав, що пітон може це зробити! Ось більш просте пояснення:

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.

Але гай, я не думаю, що будь-яка інша програма породжує приказку: "Комп'ютери ніколи не заплямують любителя тварин для попелу".

Ось неперевершена версія (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
Мені звичайно здається заспокійливим, що комп’ютери ніколи не
збиратимуть

я ще не перебирав цей з дрібнозубним гребінцем чи ще нічим, але, якщо я не помиляюся, from random import choice as Cмігfrom random import*;C=choice
підземний

також двічі у вас є, 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)

Я вибрав слова, які працюють як дієслова, так і іменники, щоб скоротити список, але дайте мені знати, якщо це не дозволено. Спробуйте вище, використовуючи фрагменти стека (код там відформатований для використання 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

Що на Землі - це за ?!
Бета-розпад

3
@BetaDecay Сленг для піци.
NinjaBearMonkey

1
@MarkGabriel Це функція, яка повертає випадкове число між 0 і 16 зі зміщенням, sщоб перейти через інші частини мови в списку. Два тильди бітові НЕ оператори, і вони просто функціонують як коротший спосіб зробити Math.floor().
NinjaBearMonkey

1
@MarkGabriel Ось як ECMAScript 6 представляє функції. r=s=>12те саме function r(s){return 12}, тільки коротше. Також дивіться документи на MDN .
NinjaBearMonkey

1
@MarkGabriel Для детальних відповідей comeplte дивіться в розділі SO Що робить ~~ ("подвійний тильд") у Javascript? і що означає F = a => у Javascript? ~~є на зразок Math.floor(але поводиться по-різному для від'ємних чисел) і =>є визначенням функції стилю ES6 із обмеженим числом this.
апспіллери

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: Oooops ... Виправлено!
Фалько

2
Чому б не використати коротший дієслово? Скажи, поший ...
Джон Дворак

@JanDvorak: Так, я його замінив. Однак я не впевнений, наскільки я б переграв вміст, оскільки є багато навіть коротших слів, які можна використати. Але результат був би настільки нудним.
Фалько

1
Приємний дотик до того, що в одному списку включено як "для + ...", так і прислівники (голі). Це те, на що я сподівався - мені здається дуже заспокійливим, що мій комп'ютер ніколи не буде роздягатися.
Санчіз

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 байт

Я використовую список слів Фалько, для справедливості, так що єдина різниця в гольфі - це через мови, а не вміст (я можу змінити список слів, якщо люди також почнуть гольфувати вміст).

"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 О, я це зовсім не помітив. Виправлення за секунду.
Мартін Ендер

0

NetLogo, 396

Я також використав список слів Фалько за двома винятками (які не змінюють тривалість програми).

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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.