Выберите цитату или фразу длиной ровно 5 слов, например Programming puzzles and code golf!
.
Напишите программу, которая при добавлении к себе n раз выводит первые n + 1 слова вашей фразы по порядку.
Например, если код вашей программы был MYPROG
и ваша фраза была Programming puzzles and code golf!
запущена ...
MYPROG
должен выводитьProgramming
MYPROGMYPROG
должен выводитьProgramming puzzles
MYPROGMYPROGMYPROG
должен выводитьProgramming puzzles and
MYPROGMYPROGMYPROGMYPROG
должен выводитьProgramming puzzles and code
MYPROGMYPROGMYPROGMYPROGMYPROG
должен выводитьProgramming puzzles and code golf!
Добавление более 4 раз не определено, ваша программа может делать что угодно.
правила
- Ваша фраза должна иметь грамматическое значение. В идеале это должно быть правильно написано с заглавной буквы и пунктуировано.
- Ваша фраза может быть любой длины, но ее энтропия, рассчитанная по адресу http://www.shannonentropy.netmark.pl/ , может быть не менее 3,5 .
(Вставьте фразу, нажмите « Рассчитать» и найдите последнюю букву H (X) .) - Ваша фраза может содержать только печатные символы ASCII (шестнадцатеричные от 20 до 7E). Ваш код может содержать только печатные ASCII и вкладки и новые строки.
- Ваша фраза должна содержать ровно 5 уникальных слов и 4 пробела. Все не пробелы считаются частями слов. Пробелы - это границы слова. Они могут не быть ведущими или отставать; должно быть одно, кроме последнего слова.
- Вывод также должен содержать один пробел между словами. Выходные данные на каждом добавляемом шаге могут содержать конечные пробелы, но не начальные пробелы.
- Вывод на стандартный вывод. Там нет ввода.
счет
Ваша оценка - это длина в байтах вашей исходной незаписанной программы. (например, MYPROG
баллы 6)
Поскольку это код-гольф, выигрывает самая низкая оценка.
code-golf
source-layout
Кальвин Хобби
источник
источник
Ответы:
CJam - 24
Попробуйте это на http://cjam.aditsu.net/
Объяснение:
Lm
удаляет буквы, содержащиеся в L (изначально "") из "TheguywasnotI"3<
принимает первые 3 буквы,]
собирает содержимое стека в массив,S*
присоединяется к массиву, используя пробел, поскольку разделитель:L
присваивает результирующую строку L (также оставляя ее в стеке )Старая версия (28 байт):
Объяснение:
S/
разбивает наW):W
интервалы пробела W (изначально W = -1)=
получает слово W]
собирает содержимое стека в массив,S*
присоединяется к массиву, используя пробел в качестве разделителяисточник
Пит (почетный ответ)
Змеи пробиваются вниз, выбегая сквозь синий цвет и возвращаясь через зеленый. Распечатывает «Фруктовые мухи как бананы».
Я использовал PietCreator, чтобы сделать это, но вы можете попробовать это здесь . Переработка программ Piet - это боль, поэтому я начал с размера 35x35 и продолжил в том же духе, то есть я использовал гораздо больше кодеков, чем мне было нужно.
Версии фактического размера
источник
> <> (42)
Рыба действительно величайший питомец. Некоторые люди держат жуков в качестве домашних животных из-за непонятного недостатка логики. Эта программа делает все возможное, чтобы рассуждать с такими людьми.
Обратите внимание, что в программе нет завершающего символа новой строки. Полный вывод инвертируется в первой строке; полная фраза "Что может сделать любая ошибка?" (энтропия 3.58418).
Полное объяснение:
Это одна из самых забавных> <> программ, которые я написал, так как это первая, которая использует рефлексию. Первая строка - это то, где находится программа.
!v
не работает, поскольку!
пропускает следующую инструкцию.'?od gub yna nac tahW;'
хранит полную фразу в стеке (она задом наперед, потому что каждая буква помещается в стек в том порядке, в котором она написана, поэтому ее нужно перевернуть, чтобы она удалялась).00p
Здесь начинается настоящее волшебство. Обратите внимание, что он не просто сохранил фразу, он также сохранил;
.00p
вставляет верхний символ в стек в программу в позиции (0, 0), поэтому теперь первый символ программы является;
.Конец
!
пропускает эту точку с запятой и перемещает курсор на негоv
, который направляет поток программы вниз.Начиная с этого момента, это всего лишь процедуры печати. Поскольку нет завершающего символа новой строки, последовательные добавления программы просто добавляют последние две строки, так как первая строка будет справа от
voo <
и, следовательно, никогда не будет выполнена.В конце курсор направляется в нижний левый угол программы и оборачивается обратно в верхний левый угол, где
;
был вставлен ранее, завершая программу.источник
"It is by a rope."
Ваша фраза повторяет символы, поэтому она имеет меньшую энтропию, чем могла бы.Python 66
Энтропия: 3.61635
Ouput:
Спасибо @JasonS и @grc за советы по сокращению части обнаружения переменных.
Обновление: посмотрите ответ Джейсона за злой трюк с циклическим переворотом, который уменьшил его до 55 байт. :)
источник
i=locals().get('i',-1)+1;
составляет -5 байтовi='i'in dir()and i+1
. Изменить: правила изменены.i='i'in dir()and i+1;print"Tfpcfhaialetgny"[i::5]+" ."[i>3],
Питон 3, 55 (бонус 67)
Вы имеете в виду, что это оборачивается?
Хорошо, некоторые пояснения по № 2 (спойлеры)
credits
это встроенный Python, который содержит текст, который я хотел бы использовать. Это специальный тип с форматированием,repr
так что вы можете просто набрать его в интерактивном интерпретаторе и увидеть хороший вывод, так что я долженstr()
это сделать. Я потратил немало времени на изучение встроенных функций для этого, и «Спасибо за поддержку разработки на Python», поскольку фраза была слишком хороша, чтобы ее упустить.Поскольку текста много и мне нужны только мои 5 слов, я хочу сохранить начальную и конечную позиции каждой подстроки. Это в байтах в начале.
bytes
объекты в python3 действуют как массивы целых чисел, когда вы используете над ними операции последовательности.Но код может содержать только печатные символы, поэтому мне нужно было найти смещение (49), которое сделало бы все мои значения положения печатными как символы.
«Спасибо» находится рядом с началом строки, в то время как другие слова ближе к концу, что означает, что мои значения положения были слишком далеко друг от друга, чтобы все находились в диапазоне для печати. Умножение строки на 2 делает еще одну копию «Спасибо», которая ближе к другим словам.
Взятие
[49:]
фрагмента строки на один байт источника меньше, чем добавление 49 к a и b.Конструкция используется во всех трех ответов
x=<value>;dostuff and increment;x
. Трейлингx
ничего не делает, но в сочетании со следующей копией кода он превращается вxx=<value>
элемент, предотвращающийx
перезапись счетчика.a,b,*q=q
это совершенно нормальная последовательность распаковки Python 3.источник
Python 2 (37)
После того, как Сара стала президентом ее местного отделения Менсы, она стала объектом романтического внимания со стороны мужчин, ищущих умного партнера. На каждом свидании Сара пыталась установить личную связь, но мужчины просто расспрашивали ее по сложным философским вопросам. Разочарованная тем, что никто не заботился о ее эмоциональной стороне, она воскликнула ...
Выход:
Энтропия это
H(x)=3.5
точно.Благодарю Джейсона С., ответ которого я в основном использовал оптом.
ii
Оберточный трюк замечательно.источник
print
пробелы, а не добавляет ихС - 65
Комментарий ругается :)
Из-за этого важны новые строки, и код должен быть добавлен следующим образом:
источник
CJam, 24 байта
Если запустить пять раз, он печатает Лиз была в порядке со мной . Пунктуация не включена, извините.
Как это работает
источник
Пиф , 32
Фраза: «Это веревкой».
Энтропия: 3,5
Как это работает:
p
означает печать с указанным разделителем.Первый аргумент
?kqZ4d
, дает разделитель.?kqZ4d
значитk if Z==4 else d
.k
есть''
, покаd
есть' '
.Второй аргумент, значение, которое должно быть напечатано, генерируется с помощью функции split (
P
) для space (d
) и индексации в этот список (@
) вZ
.И, наконец, значение
Z
, которое автоматически устанавливается в 0, увеличивается на 1 (~Z1
).источник
Гольфскрипт, 53
Это было весело.
Фраза: «Ты не утка». (что полностью верно; энтропия 3.5110854081804286)
Объяснение:
Стек будет запускаться как
''
при первом «запуске» (поскольку STDIN не предоставляется).'1'
К этому добавляется s, чтобы указать, сколько раз код был вставлен.Теперь, что происходит во втором запуске:
И так далее.
«Но, - подумаете вы, - как вы получаете 1, чтобы не выводить?» Ах, это забавная хакерская часть. Golfscript реализует
puts
(который вызывается, когда программа заканчивается) следующим образом:Я просто изменил это на
Так что
1
s подавляются из конечного результата.источник
J - 42 символа
Я мог бы пойти на более короткую фразу, но почему? Это не будет моим любимым.
Это работает из-за двойственности J-монады / диады: каждый глагол может быть вызван как монада - с одним аргументом справа - или как диада - с аргументом слева и другим справа.
Рассмотрим следующую сессию с J REPL:
Там
,
он рассматривается как диада, потому что он находится между двумя аргументами, и(#~1=6|#\)&.;:
является монадой, потому что у него нет левого аргумента. Так что, если бы у нас был глагол, который мог бы вести себя как в,
диадическом, а(#~1=6|#\)&.;:
когда монадическом, мы были бы установленыКак вы уже могли догадаться, такое соединение существует и выглядит так
:
. Monadicf :g
эквивалентенf
, и это эквивалентноg
когда двоичный. Это решает проблему.Примеры, которые вы можете попробовать сами в tryj.tk :
И да, природа инверсии
;:
делает так, чтобы не было завершающих пробелов.Использование в
It is by a rope.
качестве фразы дает 35 символа:(#~1=6|#\)&.;: :,'It is by a rope.'
. Нам не нужен завершающий пробел, как в моем предложении, по;:
непонятным причинам.источник
BBC Basic, 40
Включает в себя одну новую строку. Было бы 30, если бы ключевые слова могли рассматриваться как токенизированные вместо ASCII.
Я поймал мою подругу спящей с молочником, поэтому бросил ее и сплю с ее сестрой из мести.
As my ex do I!
(пять двухбуквенных «слов» с уникальными символами) энтропии было недостаточно, поэтому в конце я добавил изящный смайлик, чтобы энтропия достигла 3,5. В конце концов, в действительности у меня вполне нормальная жизнь, а не какой-то странный сюжет из сериала.Повторяя программу 5 раз, мы получаем
Выполняются только 5
READ
операторов, и первые 5 элементов данных считываются из первогоDATA
оператора. остальные данные являются избыточными. Выход:источник
Рубин, 50
Это использует его собственную длину, чтобы определить, сколько слов нужно напечатать. В противном случае его повторы игнорируются, заканчиваясь символом комментария
#
. Фраза заимствована у bitpwner : очень удобно иметь короткую фразу с одинаковым количеством букв в каждом слове.Поскольку каждое слово + окончание состоит из 4 символов, формула будет, например, для программы длиной 56:,
(File.size($0)/56)*4 - 1
но я могу разделить заранее,56/4 = 14
поэтомуFile.size($0)/14 - 1
, сохраняя несколько символов.50
не кратно4
, но12
достаточно близко для необходимого диапазона.источник
Чип , 165 + 3 = 168 байт
+3 за флаг
-w
«Я выиграл красный костюм» (3.5) (на самом деле я не выиграл ничего подобного) (... пока)
Обратите внимание на завершающий символ новой строки, поэтому конкатенированная копия появляется под существующим кодом.
Попробуйте онлайн! (оригинал)
Попробуйте онлайн! (оригинал плюс все четыре экземпляра)
Это немного запутанный беспорядок. Оказалось, что самым хитрым было условие завершения. (Моя первая итерация напечатала слово (слова), сопровождаемое бесконечным потоком нулевых байтов ...).
Как это работает
Первая фраза:
12 уникальных символов + 4 пробела = ровно 3,5 энтропии.
И код:
каждая копия печатает первое слово, а затем говорит копии ниже, чтобы напечатать следующее слово. Если есть только один экземпляр, второй копии нет, поэтому ничего, кроме первого слова, не печатается.
Если есть две копии, обе будут печатать первое слово одновременно (байты объединены в единицу, так что все в порядке), тогда только вторая копия напечатает второе слово.
Если присутствуют все пять копий, все напечатают первое слово, и т. Д., И т. Д., А пятая копия напечатает последнее слово самостоятельно.
Схема завершения прервет программу, как только все копии не будут активно печататься.
источник
Руби, 63
источник
Perl, 37
Подобно тому, что было у конкурирующих, но с использованием qw в perl, чтобы сохранить еще несколько символов.
источник
Длина сообщения Ребму + 27
Мы должны были пойти с "Мой IQ не я!" это было бы 43. Но я поддерживаю это сообщение:
Эквивалентный Ребол / Красный:
У Rebol есть 3 основных условия: IF, EITHER и UNLESS. UNLESS эквивалентно IF NOT, но может быть более ясным: «Всегда делайте следующее, ЕСЛИ БЫ это условие не выполняется».
В этом случае условие, которое мы проверяем, состоит в том, чтобы увидеть, было ли символу S присвоено значение в текущем контексте. Мы должны использовать кавычку на нем, потому что попытка использовать S без кавычек в условном выражении может оценить его и, возможно, вызвать ошибку. (
value?
по умолчанию его параметр не заключен в кавычки, потому что вы можете захотеть, чтобы проверяемый символ был в переменной, например,sym: 's
тогдаif value? sym [...]
фактически проверял бы, был ли определен S, а не SYM)Только первая вставка программы назначит последовательность строк S. Последовательные вставки возьмут строку из заголовка серии и передадут ее в PRINT / ONLY, которая напечатает аргумент без добавления перевода строки.
(Примечание: PRINT / ONLY - это рекомендуемый способ замены PRIN, который рассматривается в Rebol 3 и Red; замена печати в настоящее время тестируется в Rebmu.)
источник
AHK , 44 байта
Обратите внимание на новую строку в конце. Единственная умная вещь здесь состоит в том, что строка состоит из трехбуквенных слов, поэтому нам не нужно ничего разбивать. Вместо этого мы просто вытягиваем подстроку на основе
i
. Вывод на активный экран, как если бы он был набран на клавиатуре.источник
Javascript (53)
Я взял текст из aditsu, так как я не делаю с ним ничего особенного, так что выбранные слова не имеют никакого отношения к решению (за исключением количества байтов).
Есть ли
alert
рассчитывать в этом случае? Редактировать: чтение правил, вероятно, не так, как я не соединяю строки с пробелами. Я добавлю пробелы, чтобы сделать это справедливым.Также отметим, что дорогое
var
на самом деле актуально в данном случае.источник
var i|=0;
здесь не работает ???|=
или похожи сvar
. Безvar
, вы получитеReferenceError: i is not defined
.var i=i|0
расширяетсяvar i=undefined|0
, иundefined|0
, по- видимому0
.var i=i|0
эквивалентноvar i;i=i|0
. Вот почему вы не получите ошибку ссылки. Причина, по которой он будет установлен в 0 в первый раз, заключается в том, что сказал @ nyuszika7h.Perl, 43
56Я принимаю, что не могу победить в этом. Моя первоначальная попытка объясняет почему:
источник
Луа, 77
Довольно простое решение:
(Н (Х) = 4,23)
источник
Javascript, 138
(дополнительная новая строка добавлена только для удобства чтения)
Печать
I'll sleep when I'm dead
. Использует таймер, чтобы убедиться, что вывод печатается только один разисточник
Чистый Баш, 51 байт
H (X) = 3,59447
Это можно было бы отыграть немного больше, если выковать одну из более коротких фраз, но я счастлив придерживаться самой известной цитаты
ДекартаЛеннона. (Извините @Descartes, но все слова должны быть уникальными).Выход:
Заботится о вставке пробелов между словами, но без начальных и конечных пробелов.
Полагается на тот факт, что в bash неопределенные переменные, когда раскрываются как строки, имеют значение "", но при раскрытии арифметически имеют значение 0.
источник
!
теперь я исправил это с дополнительным - кажется, делает свое дело.PHP
8978 символовЭто немного многословно, и определенно не победит, но все равно было весело. Вот что я придумала
Фраза:
code golf is pretty fun
Энтропия = 3.82791
Код:
Golfed:
источник
Python3 - 122 байта
Откройте двери отсека для капсул [HAL]
Я полагаю, что зарабатываю этим ботаником. Если бы только вопрос позволил бы еще одно слово ...
Моя программа берет имя файла (p.py - основание) и проверяет, сколько раз повторяется базовое имя. Затем он берет фрагменты из строки
n
раз.n
быть числомp
s в имени файла.Преимущество регулярного выражения заключается в том, что программу можно называть как угодно, и она все равно будет работать (при условии изменения базового имени в коде): моя оригинальная программа называлась golfed.py.
источник
05AB1E , 21 байт (неконкурентный)
Попробуйте онлайн!
Область применения:
объяснение
источник
“€í€Ü€…‚¿‹·“
хе-хеStax , 24
Запустите и отладьте его
Цитата: Некоторые животные более равны.
источник
SmileBASIC, 54 байта
Я бы предпочел "Песок можно есть". но это не проходит тест энтропии как-то. Конечно, я мог бы выбрать более короткую фразу, но это скучно.
READ
Ключевое слово считывает значение изDATA
и сохраняет его в переменной. Повторное использованиеREAD
приведет к получению следующего элемента и так далее.источник
Pyth , 27 байт
Один , два , три , четыре раза и пять раз . После добавления начинается повторение фразы.
источник