Обнадеживающие притчи

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

Размер программы исчисляется в байтах, а не в символах (поэтому нет юникода). Стандартные лазейки не допускаются.

Это мой первый вызов, поэтому, если я сделаю некоторые очевидные изменения, пожалуйста, прокомментируйте.

Изменить: я собираюсь вычесть размер словаря из числа байтов, чтобы поощрить словарь «сжатие». Из будущих ответов я увижу, возможно ли это удаленно; если это так, вы можете рассчитывать на бонус.

Sanchises
источник
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

Вот немного другой подход:

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.

Но, эй, я не думаю, что чья-то еще программа создаст поговорку: «Компьютеры никогда не ослепят любителя животных за пепел».

Вот негольфированная версия (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.
DJMcMayhem
источник
6
Я, конечно, нахожу обнадеживающим, что компьютеры никогда не будут
связывать
я еще не обошел это с мелкозубой расческой или чем-то еще, но если я не ошибаюсь, это from random import choice as Cможет бытьfrom random import*;C=choice
подземный
также дважды у вас есть, for i in ' '*(something)чтобы вы могли тривиально сэкономить два байта от удаления пробела между inи' '
подземный
Да, я уверен, что это может быть дальше в гольфе. Я не приложил много усилий, чтобы сжать его. Я думаю о том, что я действительно хотел сжать это, мне нужно было найти библиотеку, более подходящую для случайного выбора слов.
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
NinjaBearMonkey
источник
Что на земле такое зэ ?!
бета-распад
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: Оооо ... Исправлено!
Фалько
2
Почему бы не использовать более короткий глагол? Скажите, шейте ...
Джон Дворак
@JanDvorak: Да, я заменил его. Тем не менее, я не уверен, насколько далеко я буду играть в гольф, поскольку есть много даже более коротких слов, которые можно использовать. Но результат будет ооочень скучным.
Фалько
1
Приятно, что в список добавлены как «за +», так и наречия (голые). Это то, на что я надеялся - я нахожу очень обнадеживающим, что мой компьютер никогда не разденется.
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..<>

Вот тест:

$ 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
источник
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 раз.
Оптимизатор
@ Оптимизатор О, я полностью пропустил это. Исправление в секунду.
Мартин Эндер
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.

Ypnypn
источник