Фон
Многие эзотерические языки программирования не имеют чисел, встроенных в литералы, поэтому их нужно вычислять во время выполнения; и во многих из этих случаев представление чисел может быть довольно интересным. У нас уже была проблема с представлением чисел для Underload. Эта задача заключается в представлении чисел в модульном SNUSP . (Обратите внимание, что вам не нужно изучать SNUSP, чтобы выполнить эту задачу - вся необходимая информация находится в спецификации - но вы можете найти интересный фон).
Задание
Для этой задачи модульный номер SNUSP представляет собой строку, образованную из символов @
, +
и =
, за исключением того, что последний символ представляет собой #
, и что предпоследний символ должен быть +
или =
(он не может быть@
). Например, действительные числа включают @+#
, ==#
и @@+@=#
; примеры недопустимых чисел включают в себя +=
, @@#
и +?+#
.
Значение модульного номера SNUSP вычисляется рекурсивно следующим образом:
#
имеет значение 0 (это базовый случай).- Если номер имеет форму
=x
, для любой строкиx
его значение равно значениюx
. - Если номер имеет форму
+x
, для любой строкиx
его значение равно значениюx
плюс 1. - Если число имеет форму
@cx
, для любого отдельного символаc
и любой строкиx
, его значение равно значениюx
плюс значениеcx
.
Для этой задачи вы должны написать программу, которая принимает неотрицательное целое число в качестве входных данных и выводит строку, которая является наименьшим возможным модульным номером SNUSP, который имеет значение, равное входному значению.
Разъяснения
- Вполне возможно, что будет несколько строк с одним и тем же значением, и, в частности, для некоторых целых чисел будет найден самый короткий модульный номер SNUSP с этим значением. В таком случае вы можете вывести любое число, участвующее в игре.
- Нет никаких ограничений на алгоритм, который вы используете, чтобы найти число; например, перебор строк и их оценка - это легальная тактика, но мы делаем что-то более умное, чтобы уменьшить пространство поиска.
- Как обычно на PPCG, ваша заявка может быть либо полной программой, либо функцией (выберите более лаконичный язык).
- Это не проблема обработки входных и выходных форматов, поэтому вы можете использовать любые разумные средства для ввода неотрицательного целого числа и вывода строки. Существует полное руководство по мета , но наиболее часто используемые легальные методы включают аргументы / возвраты функций, аргументы командной строки и стандартный ввод / стандартный вывод.
Контрольные примеры
Вот кратчайшие представления первых нескольких чисел:
- 0 :
#
- 1 :
+#
- 2 :
++#
- 3 :
+++#
или@++#
- 4 :
++++#
или+@++#
или@=++#
- 5 :
@+++#
или@@++#
- 6 :
+@+++#
или+@@++#
или@=+++#
или@=@++#
или@@=++#
- 7 :
@++++#
или@+@++#
- 8 :
@@+++#
или@@@++#
- 9 :
+@@+++#
или+@@@++#
или@+++++#
или@++@++#
или@+@=++#
или@@=+++#
или@@=@++#
- 10 :
@=@+++#
или@=@@++#
или@@@=++#
( это довольно важный тест для проверки , так как все возможные ответы включают=
) - 11 :
@+@+++#
или@+@@++#
или@@++++#
или@@+@++#
- 12 :
+@+@+++#
или+@+@@++#
или+@@++++#
или+@@+@++#
или@=+@+++#
или@=+@@++#
или@=@=+++#
или@=@=@++#
или@=@@=++#
или@@=++++#
или@@=+@++#
или или@@=@=++#
- 13 :
@@@+++#
или@@@@++#
- 14 :
+@@@+++#
или+@@@@++#
или@=@++++#
или@=@+@++#
или@@+++++#
или@@++@++#
или@@+@=++#
- 15 :
@+@++++#
или@+@+@++#
или@@=@+++#
или@@=@@++#
или@@@=+++#
или@@@=@++#
В качестве тестового примера большего, выходной сигнал от входа 40 должно быть @@@=@@+++#
, @@@=@@@++#
, @@@@=@+++#
или @@@@=@@++#
.
Состояние победы
Что касается соревнования по коду-гольфу , то победителем считается самая короткая запись, измеряемая в байтах.
=
оптимально будет происходить только так@=
, верно?Ответы:
Oracle SQL 11.2,
341262 байтаСтарая версия
: 1 число для представления в модульном SNUSP
Без гольфа:
Сначала создайте представление с 3 строками, по одной на каждый символ, используемый для представления чисел, минус #, который используется только в конце строки:
Затем рекурсивное представление n генерирует каждую возможную строку с этими 3 символами, объединяет их в # и оценивает их.
Параметры:
s: модульное представление SNUSP оцениваемого числа
v: десятичное значение s, вычисленное на предыдущей итерации
p: v, вычисленное на итерации i-2
c: следующий символ для объединения в s
i: только длина s нужно было избавиться от двух ДЛИН () для игры в гольф
Если последний символ +, то добавьте 1.
Если он равен @, добавьте значение итерации i-2.
Иначе символ будет либо #, либо =. v инициализируется с 0 в части инициализации рекурсивного представления, поэтому новый v равен предыдущему v в любом случае.
Каждая строка, возможная с 3 символами, вычисляется, эта часть гарантирует, что запрос не выполняется до большого сокращения.
Поскольку правила построения строк не существует, обязательно возникнут дубликаты. Находясь в рекурсивном представлении, Oracle интерпретирует эти дубликаты как циклы и выдает ошибку, если случай явно не решен.
Возвращает первое модульное представление SNUSP, которое оценивается как десятичное число, введенное в качестве параметра: 1
В моих тестах эта первая строка всегда является одним из самых коротких представлений.
В случае, если ваша база данных не будет действовать таким же образом, то последнее предложение следует заменить на
источник
JavaScript (ES6), 100 байт
Простой грубый алгоритм поиска в ширину.
источник
t<n
вt-n
могли бы работать ...Pyth, 41 байт
Тестирование
Как это работает:
Есть две части. Рекурсивная функция, которая вычисляет значение выражения SNUSP без трейлинга
#
и процедуры грубой силы.Evalutaion:
Грубая сила:
источник
CJam, 58
Грубая сила, с небольшим вдохновением от ответа Нейла. Попробуйте онлайн
Эффективная версия, 107
Попробуйте онлайн
Это использует динамическое программирование.
источник
Haskell ,
8986 байтовРЕДАКТИРОВАТЬ:
Еще одно решение грубой силы, которое во многом вдохновило ответ Нейла. (Хотя это работало больше как Pyth Исаака, прежде чем гольф представил
l
.)Попробуйте онлайн!
f
является основной функцией, которая принимает целое число и возвращает строку.l
является бесконечным списком кортежей(a,b,s)
,s
сначала кратчайших представлений , вместе с их значениемa
и значениемb
представления с обрезанным первым символом. (как другие также отметили / заметили, рассматривать последний как 0 для безвредно#
.)l
отличные от первого, генерируются рекурсивно с пониманием списка.d
это символ, к которому нужноs
добавить префикс для создания нового представления в списке, а «c» - это соответствующий приращениеa
.источник