Ричард Докинз в своей книге « Слепой часовщик» описывает программу «Ласка» . Алгоритм может быть описан следующим образом:
Начните со случайной строки из 28 символов. Допустимые символы - все буквы верхнего регистра и пробел.
Сделайте 100 копий этой строки, с вероятностью 5% на символ того персонажа, который будет заменен случайным символом.
Сравните каждую новую строку с целью «METHINKS IT LIKE A WEASEL», и дайте каждому счет в соответствии с количеством букв в строке, которые являются правильными и в правильном положении.
Если какая-либо из новых строк имеет идеальный результат (28), остановитесь.
Выберите строку с наибольшим количеством очков на шаге 3. Как вы решите ничью, зависит только от вас, но можно выбрать только одну строку. Возьмите выбранную строку и перейдите к шагу 2.
Победителем будет самый короткий фрагмент кода для получения правильного ответа при печати строки с наибольшим количеством очков каждого поколения в следующем формате:
Если бы люди могли помочь, проверяя ответы других людей, это было бы очень полезно!
Ответы:
APL (143)
Объяснение:
0{
...}⊃∘(C←27↑⎕A)¨?28/27
: установитьC
первые 27 заглавных букв. Их всего 26, поэтому 27-й элемент будет пробелом. Выберите 28 случайных предметов изC
. Это будет первым⍵
. Первое⍺
(поколение) будет0
.⍵≢T←'METHINKS IT IS LIKE A WEASEL
: установитьT
на строку'METHINKS IT IS LIKE A WEASEL'
. Пока⍵
не равноT
:{
...}¨100⍴⊂⍵
: сделать 100 копий⍵
. Для каждого из них ...9≠?28/20
: выберите 28 случайных чисел от 1 до 20. Создайте битовую маску, где каждое1
означает, что случайное число не равно9
. (Это означает 5% шанс0
).⍵{⍵:⍺⋄C[?27]}¨
: для каждой буквы в⍵
, если соответствующий бит был1
, сохраните эту букву, в противном случае замените ее случайно выбранным элементом изC
.c←
: сохранить 100 мутированных строк вc
.G←{+/⍵=T}¨c
: для каждого элемента вc
, вычислить оценку (количество символов, которые соответствуютT
) и сохранить оценки вG
.s←⌈/G
: найдите максимальный результат и сохраните его вs
.c←⊃c/⍨G=s
: выберите первый элемент,c
чей счет равенs
(максимум), и сохраните егоc
снова.⎕←(⍕⍺),':'c'-- score:',s
: вывести генерацию в заданном формате (⍺
текущее поколение,c
текущая лучшая строка,s
оценка)c∇⍨1+⍺
: Увеличить генерацию и снова запустить мутацию, используя вc
качестве входных данных текущую наилучшую строку ( ).источник
Mathematica -
238236225Пример вывода
источник
Python (273)
источник
К,
173167/
источник
Python: 282 символа без двоеточий
278 с:
источник
JavaScript,
277246(требуется поддержка функции стрелки; отступ добавлен только для удобства чтения)
Не стесняйтесь переходить
alert
на,console.log
если вы хотите более приятный опыт исполнения.Здесь есть несколько отличных деталей для гольфа:
Функция
c
возвращает случайный символ из строки алфавита" ABC..."
. Функция принимает аргумент для использования в качестве верхней границы для случайного выбора индекса. При генерации базовой строки мы используем27
, поэтому функция ведет себя нормально.Однако мы злоупотребляем этим поведением, запрашивая случайную верхнюю границу 540 дюймов
h = c(540) || h
. Только 5% времениc
фактически вернет строку (потому что 540 * .05 = 27); в другие 95% случаев случайно выбранный индекс выходит за пределы длины строки, поэтому функция возвращаетundefined
. Это значение Falsey вызывает каскад логического ИЛИc(540) || h
, поэтому используется исходноеmap
значениеh
(т. Е. Замена не происходит).Выполняется операция суммирования счета
f+=h=="METHINKS IT IS LIKE A WEASEL"[p]
, которая говорит «добавитьtrue
к,f
если текущийmap
символh
совпадает с символомp
th строки WEASEL». Номер плюс-логическое дополнение принуждает булев результат либо0
или1
, что означает , чтоf
увеличивается только тогда , когда есть совпадение со строкой целевой WEASEL.источник
v
заявили в коде? Это не упоминается где-либо еще там. Вы можете сохранить себе 2 символа.v
является аргументом функции стрелки , хранящейся вc
:c = (v => ...)
. Если вы хотите определить функцию стрелки без аргументов, она стоит два символа()=>...
вместо одногоv=>...
, поэтому лучше просто иметь неиспользуемый аргумент.k=s=[28]
и++
я понятия не имел!R (
245239238 символов)дает:
...
источник
0: ...
если при первом вызовеcat
вы увеличиваете ееc
до 1? (+1 тем не менее, так как я пытаюсь с часа, сделать что-то короче, а я все еще не могу :))ifelse(…,h(f,1),…)
заменяет все выбранные позиции одним и тем же случайным символом. Вы можете интерпретировать правила в этом направлении, но кажется, что их нужно сгибать, поэтому я бы хотя бы упомянул об этом. Во-вторых, вы заменяетеs=z
в1:100
цикле, поэтому вы делаете не 100 копий одной и той же строки, а иногда копии одной копии. Это похоже на нарушение правила для меня, а не просто нагибание его.С 256
Простые три цикла, инициализация, генерация новых строк из родителя и оценка, рассчитанная по той же инструкции. Это не очень читаемо даже с отступом.
С 252
Один цикл с одним массивом, содержащим все 101 строку.
Эта вторая версия нарушает правила, потому что она печатает строку с (эквивалент) шага 1, но это была либо та, либо не печатать последнюю строку. Я в тупик, как это исправить, не взорвавшись в размере. Я отправляю это так или иначе для вдохновения.
С 256
Другой подход, вместо создания массива для 101 строки, просто перегенерируйте строку 100 раз и используйте структурированное назначение для легкого копирования. Инициализация выполняется путем запуска счетчика «повторить 100 раз» в -1 и осторожного обращения со стратегически выбранным постинкрементом. Несмотря на совершенно другой подход, он заканчивается точно так же, как и с первой попытки - 256 символов.
источник
C # - 436
источник
Луа 5,1 (502)
Свернутая версия:
и более легкая для чтения версия (с комментариями!):
Если честно, хотя это точно не победит, я был просто рад найти и минимизировать достаточно короткое решение этой проблемы! (акцент на разумно): p
источник
SAS - 374
->
С переводом строки / отступом / комментариями:
источник
С
361331Не так хорошо, как решение Art, но вот моя (новичок) попытка решения C. 361 символов, если вы удалите переводы строк и вкладки.
Редактировать: избавился от вложенного цикла и использовал одномерный массив. Я надеялся, что это будет иметь большее значение, но это спасло мне только 30 символов. Вот код:
Редактировать: это оригинальный код, не для гольфа, для тех, кто заинтересован в том, чтобы узнать, как это было сделано. Код не выдает предупреждений при компиляции с GCC с включенными -Wall и C99. Может быть, вы новичок в гольф, как я, или новичок C, как я, или, может быть, вам просто любопытно. :) https://gist.github.com/cpx/97edbce4db3cb30c306a
источник
Scala,
347341337 символов:=>
источник
println("%2d: %s -- score: %d".format(i,a,s(a))
может измениться доprintln(f"$i%2d: $a%s -- score: ${s(a)}%d")
4 символов!def c=(' '+:('A'to'Z'))(r(27))
дает мнеerror: type mismatch; found : Int required: scala.collection.generic.CanBuildFrom[scala.collection.immutable.IndexedSeq[Char],Char,?]
PHP 442
Readbly:
источник
if\for
, это на 436. Вы также можете проверить$n>90
на другой символr()
иs()
функции. Вот изменения с комментариями: ideone.com/4ecZQc%s
всегда одинакова и%d
выровнена по левому краю, поэтому вы можете использовать следующее:printf("%2d: $s -- score: $l\n",$i);
Ява (632)
Ява такой многословный язык .. :(
источник
Python (
330321)Читаемая версия:
Пример вывода:
редактировать: удалены несколько символов на основе ответов AMK и Timtechs
источник
sum(1for c in range(28)if n[c]==t[c])
может быть сокращено доsum(n[c]==t[c] for c in range(28))
(-3 символа)import random as r
к ,from random import*
а затем удалить три экземпляраr.
S
? Задача требует начать со строки случайных символов.PHP (
381 397 323 319312):Читаемая версия:
Оптимизация кредитов (319):
Оптимизация кредитов (312):
источник
for
для$f=N;while($f--){
для 3 полукокса каждого. и для другого символа:$n=rand(0,26);[...]chr($n?$n+64:32)
Руби, 218
пример запуска
источник
Рубин -
225202203198 символовДо сих пор Руби недостаточно представлен в этой задаче, поэтому я решил попробовать! Улучшения приветствуются.
источник
1
но вопрос указывает0
. Если вы начнете с этим,g=-1
тогда все в порядке. Может быть, умнее, но я так и сделал. Ура, товарищ по RubyGolfer.puts"#{g+=1}: #{$.,s=(0..99).map{n=(r=0..27).map{|i|x=[' ',*?A..?Z].sample;rand<0.05?x:s[i]||=x};[r.count{|i|n[i]=='METHINKS IT IS LIKE A WEASEL'[i]},n*'']}.max;s} -- score: #$."until$.>27
Рубин,
206200199Первая строка просто причудливый способ определить
q=-2
,i=-1
иR=(0..27).to_a
. Вся работа выполняется во 2-й строке:источник
Japt v2.0a0,
112108 байтПопробуйте онлайн!
-4 байта благодаря @ETHproductions.
Распаковано и как это работает
источник
Japt
-R
, 94 байтаДругой подход, но с небольшим вдохновением от решения Bubbler .
Проверьте это (или попробуйте онлайн )
объяснение
Линия 1
Результат присваивается переменной
U
.Линия 2
Результат присваивается переменной
V
.Линия 3
Результат этой строки неявно соединяется с символами новой строки и выводом.
источник
Perl 5 , 219 байт
Попробуйте онлайн!
источник
Рубин - 410
Редактировать * В настоящее время происходит сбой (по какой-то причине [any] устанавливается в 0 (type => fixnum)). Тем не менее, фактический дизайн правильный, мне просто нужно найти ошибку, вызывающую это (это очень загадочно)
источник
Python 284
источник
JavaScript - 312
Выше уже есть более короткое решение JS, но оно использует экспериментальные функции указателя, поэтому я решил добавить другое решение, работающее в любой среде JS:
источник
Ява:
557534развернутый:
источник
PHP
429426421415красивая печать
В следующий раз мне понадобится менее многословный язык
источник
Python 2,7 - 319 байт
Конечно, он не самый маленький, но было весело программировать.
Использует рекурсивную функцию, поэтому она может достичь максимальной глубины рекурсии, если есть какая-то странная передача со строкой.
Огромное спасибо Sp3000 за помощь в игре в гольф.
источник
Юлия, 281 байт
Golfed:
Сам алгоритм не очень умный, но здесь есть несколько интересных моментов. Сочетание диапазона символов с другим характером, то индексировать в него:
['A':'Z',' '][rand(1:27,n)]
и взяв сумму массива булевых (общего, но я до сих пор люблю эту идею):sum(a.=="METHINKS IT IS LIKE A WEASEL".data)
. Рад, что попал под 300!Ungolfed:
источник