Это очень просто: ваша программа или функция должна сгенерировать следующий текст:
Elizabeth obnoxiously quoted (just too rowdy for my peace): "THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG," giving me a look.
Хорошая печать
Вы можете написать программу или функцию , которая возвращает вывод в виде строки или печатать его в STDOUT (или ближайшую альтернативу). При желании вы можете включить один завершающий символ новой строки в вывод.
счет
Количество байтов в вашем коде, умноженное на количество уникальных байтов в вашем коде
Самый низкий балл побеждает.
Например, ответ «мозговая шутка» или «пробел» имеет здесь огромное преимущество, так как множитель будет очень низким (8 и 3 соответственно). Однако, как правило, написание программ на этих языках дает гораздо более длинный код, который может свести на нет это преимущество.
Стандартные лазейки, которые больше не смешны , запрещены .
code-challenge
string
kolmogorov-complexity
durron597
источник
источник
bytecount~Log(X,unique)
, с некоторой константой X для этой задачи. Таким образом, уникальная константа. Вычисление этой оценки (log2) даетpython2_mbomb007 728, python2_carpetpython 744, ruby 756, Fish 825, Insomnia 1148, cjam 1277, whitespace 1484, brainfuck 3546
. Так что, кроме ответа «Ответы:
Бессонница , 575 байт * 4 = 2300
Использует 4 символа
dye=
.Решение 1b (не опубликовано): 783 байта * 3 = 2349
Использует только 3 символа
ey=
.Решение 1: 826 байт * 3 = 2478
Только использует 3 -х символов:
yo~
. Программа используется для генерации этого.В настоящее время все программы используют только инструкции 0, 1, 2, 6. Другими словами, они манипулируют битами в одном байте и распечатывают результат.
источник
CJam,
266281456 байт *14127 уникально =372433723192Попробуйте онлайн.
объяснение
Стратегия, которую я использовал, состоит в том, чтобы обрабатывать каждый символ в строке как цифру от 123 и кодировать ее как десятичное число в программе. Затем программа преобразует это число обратно в базу 123 и отображает каждую цифру базы 123 обратно в символ. Поскольку трудно объяснить, почему программа находится в ее текущем состоянии, я объясню каждую ее версию.
Вот как выглядел конец программы в первой версии:
Это реализует стратегию самым простым способом. Число, обычно кодируемое в базе 10, преобразуется обратно в базу 123, и каждая цифра базы 123 отображается обратно в символ. Но при этом используются 4 уникальных нецифровых символа, и возможность избавиться от любого из них, вероятно, будет стоить такого же размера из-за необходимости использовать менее простой код.
Во- первых, я понял , что я мог бы избавиться от
b
и от:
операторов, создавая их во время выполнения , как их значения символов ASCII преобразуются обратно в символ (с уже настоящимc
оператором) и оценивать их с~
оператором. Оказалось, что это немного сложно сделать с:
оператором, так как он должен быть проанализирован вместе со следующимc
оператором. Я решил это путем создания символов,:
аc
затем создания и вычисления символа+
, который объединяет первые два символа в строку,:c
которую затем можно правильно оценить.Во-вторых, я понял, что у
~
оператора, который я только что представил, был новый удобный перегруженный вариант: когда ему присваивается число, он производит побитовое дополнение. Используя это два раза подряд после числа, я мог ввести разрыв токена в источнике без результирующего вычислительного эффекта, что позволило бы мне заменить пробелы, используемые для разделения чисел~~
.Конечный результат - это еще 15 байт кода в конце, но эта стоимость значительно перевешивается за счет исключения двух уникальных символов из 14. Вот сравнение конца первой версии с концом второй версии:
Использовать меньше двух операторов, которые я использовал, было бы невозможно, но я все же хотел меньше уникальных символов. Поэтому следующим шагом было исключить цифры. Изменив кодировку числа таким образом, чтобы каждая десятичная цифра была действительно цифрой от 5 до 5, я мог бы потенциально исключить цифры 6-9. Прежде чем что-либо удалять из конца пргорама, это выглядело так:
Как упомянуто ранее, устранение места легко. Но
b
,:
иc
не было бы так легко, так как их коды символов98
,58
и99
, соответственно. Все они содержали цифры, помеченные для исключения, поэтому мне пришлось искать способы вывести их все. И единственными полезными числовыми операторами со значениями символов, не содержащими 5-9, были декремент, приращение, умножение и сложение.Для
98
, я сначала использовал100~~40c~40c~
, который уменьшает100
вдвое. Но потом я понял, что мог бы использовать~
оператор еще раз, поскольку побитовое дополнение позволяет мне получать отрицательные числа, которые при добавлении позволяют имитировать вычитание. Так что я тогда использовал100~~1~43c~
, который добавляет100
и-2
и на 2 байта меньше. Ибо58
я использовал44~~14~~43c~
, что добавляет44
и14
. И для99
, я использовал100~~40c~
, который уменьшает100
.Конечный результат довольно большой и запутанный, но стоимость значительно большего числа и кода обработки была немного перевешена большим преимуществом исключения 5 уникальных символов из 12. Вот сравнение окончательного завершения программы до исключений и после вылеты:
источник
98
,58
и99
) по - прежнему вне диапазона. И увеличение базы только уменьшает общий размер программы на 8-10%, что недостаточно, чтобы компенсировать 10-15% баллов, полученных за счет нового уникального персонажа. Повторное включениеb
оператора также не стоит.floor(log_b(x)+1)
, и он будет содержатьb
разные символы. Так что счетb*floor(log_b(x)+1)
. x заданное большое число, и если вы построите это для b, вы обнаружите, что минимум в значительной степени равен b = 3. Т.е. длина уменьшается немного, когда вы используете более высокие основания (log), но размер кодировки увеличивается линейно, так что это того не стоит. Сделал простую пробелную программу, но получил всего 4134 баллов.Пробелы,
1157937 байт * 3 уникальных =34712811По популярному (?) Запросу я публикую свое решение для пробелов.
Чтобы уменьшить необходимый код, я жестко закодировал всю строку как одно двоичное число (7 бит на каждый байт). Простой цикл извлекает символы и печатает их.
Исходный код на filebin.ca.
ПРИМЕЧАНИЕ . Спецификации допускают произвольные большие целые числа , но интерпретатор языка Haskell на официальной странице ограничен 20 битами. Используйте, например, этот интерпретатор ruby в github / hostilefork / whitespaces.
Скрипт ruby для создания программы пробелов (l = WHITESPACE, t = TAB, u = NEWLINE, все, что после // игнорируется, записывает в файл
prog.h
):Для иллюстрации, программа для пробелов в удобочитаемой форме. Ниже приведен простой скрипт для преобразования его в настоящую пробелную программу.
По сути, строка для вывода представляет собой длинное целое число, и вам нужно уменьшить его счет.
Таким образом, я искал язык только с 0/1, но не нашел ни одного, а потом вспомнил, что есть пробелы, и попробовал его. В пробеле вы можете ввести двоичные числа с 0 и 1 напрямую.
Старый код, хуже оценка, но интереснее
Старый код в filebin .
Сценарий ruby, который я использовал для создания программы (l = WHITESPACE, t = TAB, u = NEWLINE, все после
//
игнорирования записывает в файлprog.h
):Для иллюстрации, программа для пробелов в удобочитаемой форме. Ниже приведен простой скрипт для преобразования его в настоящую пробелную программу.
Сама эта программа для пробелов довольно проста, но есть три оптимизации игры в гольф:
lul
для клонирования стека, когда есть повторяющийся символltl
для клонирования n-й записи стека, если она короче, чем прямое нажатие на символПростой скрипт ruby для преобразования моего читаемого человеком кода в реальную программу (чтение файла
prog.h
и запись в файлprog.ws
):источник
Ruby 144 байта * 39 уникальных = 5616
Иногда самое простое - лучшее.
источник
Brainfuck, 1264 байта * 7 уникальных = 8848
Да, это ужасная оценка.
источник
+.
уверенностью, что это будет немного меньше, хотя.+
и.
я получаю 15018 * 2 =30,036
.> <> (Рыба) - 578 байт * 8 уникальных = 4624
Моя оценка не так конкурентоспособна, как я надеялся, но я подумал, что это решение было достаточно интересным для публикации.
объяснение
Первый раздел кода представляет собой длинную строку из цифр 0-4, которые представляют 3-значное базовое 5 представление для каждого символа в строке. В оставшемся коде используется
p
оператор Fish, который позволяет редактировать исходный код программы во время ее работы. Используя этот оператор, я смог сгенерировать код Фиша, необходимый для преобразования базовых 5 символов обратно в базовые 10 и их вывода, а затем поместить этот код обратно в исходный код в начале файла до того, как интерпретатор достигнет конца линии и обернуты вокруг. Когда интерпретатор достигает конца строки, код был изменен так:Когда код оборачивается и попадает в
v
оператор, он переходит ко второй строке, попадает в>
оператор и переходит к циклу, каждый раз преобразуя кодирование base 5 обратно в значение ascii base 10, а затем выводит это значение. Когда в стеке больше нет значений,?
оператор переходит к;
и программа завершается.источник
7 , 273 байта × 7 уникальных байтов = 1911, неконкурентоспособен (языковые испытания после даты)
Попробуйте онлайн!
К сожалению, это старая проблема, а это значит, что я не смогу победить на одном из своих новейших языков. Тем не менее, язык был создан без знания задачи (я просто случайно наткнулся на него в «связанных вопросах»), но, тем не менее, оказалось, что он идеально подходит.
7 программ на PPCG обычно отправляются в упакованном формате, упаковывая восемь команд в три байта (язык имеет двенадцать команд, но в исходном файле может быть только восемь, то есть достаточно трех бит). Тем не менее, язык также поддерживает восьмеричный формат, в котором каждая команда записана в виде цифры ASCII, и это то, что я здесь использовал, это означает, что используются только семь различных байтов (
6
команда не требуется в программе, которая просто печатает простая строка).Программа очень проста; он состоит из двух элементов стека: длинная строка, которая просто дословно печатается, a
7
для разделения элементов (к сожалению, это неизбежно), и403
который является простым способом печати постоянной строки в 7 (40
экранирует второй элемент стека, перемещая его в вершина стека, затем3
печатает его и удаляет старый первый элемент стека, то есть403
сам).Итак, как я получил строку длиной 269 байт? 7 поддерживает несколько форматов ввода / вывода, и одним из его форматов является US-TTY , набор символов (в частности, вариант Baudot), который широко использовался до изобретения ASCII. (В
5
начале второго элемента стека, т. Е. В начале программы, указывается кодировка строки; остальное - само содержимое строки.) Это пятибитный набор символов и команды0
для5
может безопасно храниться в строках, будучи последовательно неэкранированным (так что выход из него один раз точно воспроизведет оригинал), поэтому язык использует пары команд (36 опций) для кодирования символов US-TTY (32 опции, причем 4 используется для директивы к самому 7-му переводчику). Конечно, есть более 32 уникальных символов, которые люди могут захотеть вывести (и более 32 символов появляются в строке), поэтому два символа являются «кодами сдвига», которые переключаются между четырьмя наборами символов (прописными буквами, строчными буквами , цифры и пользовательское «расширение цифр», которое 7 использует для оставшихся символов ASCII, которых нет в других наборах символов, однако все символы в строке «изначально» в US-TTY, поэтому подробности расширение не имело значения). Вот'Я считаю десять смен, добавленных к 124 символам ввода, довольно незначительное соотношение. Таким образом, возможность использовать только чуть более двух байтов ввода на символ ввода, умноженный на 7 уникальных байтов, означает, что оценка по этой задаче невероятно хороша. (Я полагаю, что язык, который был разработан специально для этой задачи, использовал бы некое сжатие строк, а не ранее существовавший набор символов, но хотя Baudot и US-TTY не были предназначены для игры в гольф, они все еще довольно лаконичны .)
источник
Python 2
163147145143 байта *353635 уникально =5705529252205005Это, вероятно, примерно так же хорошо, как я собираюсь получить это.
Редактирование:
.capitalize()
в пользу использованияE
.'
вместо обратной косой черты экранирующих кавычек.+
и некоторые пробелы для использования запятых вprint
утверждении.источник
Python 2,
14508 11700 11088 10164 9486 9746 7860145 байтов * 36 уникальных = 5220Я увидел название и подумал, что это довольно интересный вызов для довольно многословного Python. Это мои заметки, когда я решил эту проблему.
Моя первая попытка уменьшила число уникальных игроков до 31:
Я думал, что мог сделать лучше. При использовании
map
уникальности дошло до 26:Примерно в это же время я заметил в тексте вопроса, что оценка была
uniques * bytes
не просто уникальной! Это означало, что мои оценки за вышеупомянутые были 14508 и 11700. Не очень конкурентоспособны. Поэтому я теперь уменьшаю байты, сохраняя текст в виде шестнадцатеричной строки:Размер был уменьшен, но больше уникальных персонажей. Но если бы я использовал упакованную двузначную десятичную строку со смещением 32:
Это имеет такое же количество байтов, но сохраняет 3 уникальных.
Я вынашиваю новый план. Если я упаковываю длинное целое число Python с 7-битными символами, я могу извлечь каждое из них, сдвинув:
Ну, это уменьшило счет до 9486. Интересный эксперимент, но далеко не достаточно хороший. А что если я избавлюсь от имен функций и буду использовать форматирование строк?
У меня сейчас только 22 уникальности, но счет не улучшается.
Хорошо, что если я выбрал очевидный путь и просто напечатал строку:
Оценка 7860. Я должен был сделать это первым. Но я бы так много не узнал.
Я думаю, я мог бы уменьшить уникальность на 26, если бы я динамически создавал заглавные буквы, так что:
Я думаю, что Python не станет намного лучше, чем 5220. Задача минимизации уникальных символов в Python, безусловно, была поучительной.
Обновление: mbomb007 имеет лучшее решение Python, набрав 5005. Хорошая работа.
источник
> <> (Рыба) - 138 байт * 65 уникально = 8970
Простой маршрут, т.е. Hello World:
Ну, для моего первого набега на> <> это было проблемой. Я думаю, что вижу некоторые улучшения, но было весело учиться :)
Или сделать его слишком сложным - 1567 байт * 27 уникальных = 42309
источник
r
стек в обратном порядке :) Также вы можете переместить финалo
в пустое пространство в начале второй строки.f f + 2 + o
столько раз в сложной?05AB1E , 380 байт * 11 символов = 4180 баллов
Это потенциально не конкурирует
Попробуйте онлайн!
Выдвигает основание 5 представления символов ASCII, объединенных вместе.
Разбивает на части по 3, преобразует обратно в десятичную.
Преобразует ASCII целое число обратно в символ.
Присоединяется обратно вместе.
источник
Perl 6, 139 байт * 36 уникальных = 5004
источник
Java 8, 141 байт * 64 уникальных символа = 9,024
141 байт, 64 уникальных символа. Подходы, отличные от простого «возврата строки», увеличивают количество байтов, не сильно экономя на используемых символах.
источник
Perl 5 , 137 байт * 35 уникальных = 4795
Попробуйте онлайн!
источник
Tcl , 345 байтов, 345 x 13 = 4485
Попробуйте онлайн!
Tcl , 337 байт, 337 x 15 = 5055
Попробуйте онлайн!
Tcl , 329 байт, 329 x 16 = 5264
Попробуйте онлайн!
Tcl , 333 байта, 333 x 16 = 5328
Попробуйте онлайн!
Tcl , 148 байтов, 148 x 37 = 5476
Попробуйте онлайн!
Tcl , 277 байтов, 277 x 21 = 5817
Попробуйте онлайн!
Tcl , 371 байт, 371 x 16 = 5936
Попробуйте онлайн!
Tcl , 401 байт, 401 x 16 = 6416
Попробуйте онлайн!
Tcl , 403 байта, 403 x 16 = 6448
Попробуйте онлайн!
Tcl , 433 байта, 433 x 15 = 6495
Попробуйте онлайн!
Tcl , 473 байта, 473 x 14 = 6622
Попробуйте онлайн!
Tcl , 133 байта, 133 x 60 = 7980
Попробуйте онлайн!
источник