Ваш друг пытается взломать хранилище, которое имеет своеобразную систему блокировки: для этого требуется определенное количество мягких ударов в определенном месте. Ваш друг обнаружил номер (который находится в диапазоне 1 ... 99999) и обладает гаджетом, который производит необходимые удары. Тем не менее, гаджет является интерпретатором Brainfuck! Таким образом, ваш друг должен кормить его программой Brainfuck, которая, очевидно, должна быть максимально короткой (ввод-вывод гаджета медленный).
Твоя задача - помочь ему! Напишите программу или подпрограмму на любом языке, которая принимает в качестве входных данных число N
и выводит программу Brainfuck, которая не принимает и выводит строку печатных символов ASCII (исключая пробельные символы - коды в диапазоне 33 ... 126) длины N
.
Пример: для ввода 10
вывод может быть
+++++++++++++++++++++++++++++++++..........
(но я уверен, что это может быть сокращено!)
Ваша оценка будет суммой длин ваших выходных данных для следующих значений N
(это случайные числа):
55
68
15
28
841
838
522
846
4898
9004
9363
3810
13230
67175
37231
44701
О, и вы будете передавать свой код (программу-генератор) своему другу через Twitter. Поэтому убедитесь, что это 140 символов или меньше!
PS Язык Brainfuck имеет много вариантов. Давайте предположим, что лента бесконечна в обоих направлениях (или «круглая и достаточно большая»), а ячейки имеют 32-битную емкость int (конечную и способны хранить числа до 99999). Кроме того, без упаковки: когда ячейка переполняется, машина самоуничтожается!
Ответы:
Python 2, оценка: 1021
Я только что понял, что этот конкурс довольно старый, но все же, так как я придумал лучшее решение, чем опубликованные, я также разместил его.
Вот скрипт Python размером 102 байта, который делает эту работу:
Идея состоит в том, чтобы использовать кодирование базы 5 для N (наилучшая база, по крайней мере, для текущих входов, которые, кстати, не кажутся очень «случайными», похоже, что они были произвольно выбраны OP), и написать общий алгоритм Брейнфука для декодировать число произвольной длины (число кодируется с каждой цифрой, увеличенной на единицу для определения конца преобразования). Я решил напечатать символ 35
#
, символ 36$
эквивалентен.Вы можете запустить следующий скрипт bash, чтобы получить результат:
С более продвинутой программой, которая заменяет кодирование умножением для небольших чисел и выбирает лучшую базу для кодирования каждого числа, я могу достичь 958 символов Brainfuck, но Python слишком многословен (и я довольно плохой / ленивый игрок в гольф) по порядку получить конвертер в 144 байта!
источник
BrainF ***, оценка: 193 313
Это не менее 140 символов (это 147, так близко !!), так что это не может победить, но я подумал, что это круто.
Печатает 43 знака плюс, затем
N
периоды. Не очень оптимальный.Если кто-то может помочь сократить это, я буду рад.
источник
J, Общая оценка = 1481
(Для моей предыдущей записи и объяснения проверьте историю изменений.)
Эта функция генерирует вложенные петли BF на основе цифр base10 входного номера. Проверка всех разумных оснований и выбор наименьшего кода BF улучшит счет с небольшим количеством.
Программы BF для тестового набора:
Вычисление баллов на тестовом наборе:
источник
Пиф, 1702
Восстановите числа, используя коэффициенты N + x.
источник
2
этого выводы++
. теперь, который ничего не печатает в BF.CJam,
5274108 байт, всего =130412441210Тестовый скрипт (медленный в онлайн-переводчике):
источник
Befunge-98, N + 41, всего = 193281
Я знаю, что это плохо, но я чувствовал, что хочу написать немного Befunge сегодня. Лучшая часть Befunge состоит в том, что программы даже менее понятны, чем настоящие языки гольфа, особенно когда они повторно используют код: D
Использует алгоритм, аналогичный ответу CJam Мартина Бюттнера :
источник
CJam, 40 + N, всего: 193265
Просто для начала, вот базовое решение. Он генерирует следующий код:
где
_
естьN
копии+
.Запустите генератор здесь.
источник
Befunge-93 - 24 + N, всего = 193009
При этом используется префикс
+++[>++++[>++++<-]<-]>>
для установки первого индекса ленты на «0» с 24 символами. Программа Befunge очень проста и выводит ее вместе с N '.' персонажи.источник