Дано целое положительное число n > 2
. Мы конвертируем его в массив следующим образом:
- Если оно равно
2
возвращать пустой массив - В противном случае создайте массив всех
n
простых факторов, отсортированных по возрастанию, затем каждый элемент замените своим индексом в последовательности простых чисел и, наконец, преобразуйте каждый элемент в массив.
Например, давайте преобразовать число 46
в массив. Во-первых, преобразуйте его в массив основных факторов:
[2, 23]
Число 23
- это 9
простое число, поэтому замените его 2
на пустой массив и 23
на [9]
. Массив теперь становится:
[[], [9]]
Главными факторами 9
являются, 3
а 3
, значит:
[[], [3, 3]]
Сделайте то же самое для обоих 3
:
[[], [[2], [2]]]
И наконец:
[[], [[[]], [[]]]]
Теперь, чтобы закодировать его, мы просто заменяем каждую открытую скобку на 1
и каждую закрывающую скобку 0
, затем удаляем все конечные нули и сбрасываем один 1
с конца. Это наше двоичное число. Используя приведенный выше пример:
[ ] [ [ [ ] ] [ [ ] ] ]
| | | | | | | | | | | |
| | | | | | | | | | | |
V V V V V V V V V V V V
1 0 1 1 1 0 0 1 1 0 0 0
Теперь просто отбросьте последние три нуля и последний 1
. Номер становится 10111001
который есть185
в десятичной системе . Это ожидаемый результат. Обратите внимание, что в преобразование массива в двоичные скобки основного массива не включены.
вход
Целое положительное число n
больше чем 2
.
Выход
Закодированное целое число n
.
Правила и формат ввода-вывода
- Стандартные правила применяются.
- Входные данные могут быть строкой или числом (но в случае строки они должны быть в базе 10).
- Вывод может быть строкой или числом (но в случае строки это должно быть в базе 10).
- Это код-гольф , выигрывает самый короткий ответ в байтах!
Контрольные примеры
Больше тестов по запросу.
3 ---> 1
4 ---> 2
5 ---> 3
6 ---> 5
7 ---> 6
8 ---> 10
9 ---> 25
10 ---> 11
10000 ---> 179189987
10001 ---> 944359
10002 ---> 183722
10003 ---> 216499
10004 ---> 2863321
10005 ---> 27030299
10006 ---> 93754
10007 ---> 223005
10008 ---> 1402478
2
так как представления не обязаны обрабатывать его.Ответы:
Шелуха ,
3531302926252422201915 байт-7 байт благодаря @Zgarb!
Сохранено лишние 4 байта, косвенно, благодаря Zgarb
Попробуйте онлайн!
Explaination
источник
φ
, с фиксированной точкой лямбда!`:0:1
может быть`Jḋ2
.Желе ,
22 2019 байт-1 спасибо Эрику Аутгольферу (хвостовые нули с обеих сторон
t
, а не справаœr
)Монадическая ссылка, принимающая целое число больше 2 и возвращающая целое число больше 0 (2 также возвращает 0 в соответствии с исходной спецификацией).
Попробуйте онлайн!
Как?
Это почти точно повторяет данное описание, просто с некоторыми порядковыми манипуляциями для создания двоичного массива ...
источник
Python 2 ,
212177 байтПопробуйте онлайн!
Недостаток простых встроенных функций действительно вредит количеству байтов, и это приводит к превышению времени на TIO с большими простыми числами. Использование XNOR «s проверка простоты.
Python 2 + gmpy2 , 175 байт
Попробуйте онлайн!
Эта версия не работает в более длительных тестовых случаях (т. Е. 10000 - 10008).
источник
Mathematica,
125119 байтИспользует немного другой подход; преобразует простые индексы в
{1, index, 0}
, а 2 в{1, 0}
.Попробуйте на Wolfram Sandbox
Использование:
источник
Желе , 35 байт
Попробуйте онлайн!
источник
J,
747366 байтПопробуйте онлайн!
Это настоящий беспорядок, который, безусловно, нуждается в дальнейшей игре в гольф (например, удаление явного определения функции). Я думаю, что бокс, которым я занимался, - это, в частности, то, что поднимает bytecount, так как я действительно не знаю, что я там делаю (было много проб и ошибок). Кроме того, я почти уверен, что есть некоторые встроенные модули, о которых я забыл (например, я чувствую, что,
_2,~_1,
вероятно, имеет встроенные модули ).Объяснение (без золота)
преамбула
Расслабьтесь, потому что это не будет коротким объяснением. По иронии судьбы, лаконичный язык сочетается с многословным человеком.
Я буду разбивать это на несколько функций
encode
кодирует целое число, используя _1 и _2 вместо [и]convert
преобразует список _1 и _2 в список 1 и 0drop
отбрасывает последние 1 и завершающие нулиdecode
конвертирует из двоичного списка в числоЯ буду идти через образец вызова для 46, который выражается в формате ungolfed сделано
шифровать
Здесь есть много чего объяснить.
Обратите внимание, что явное определение функции
3 : '[function]'
оценивает функцию, как если бы она была в REPL с правильным аргументом, заменяющим каждый экземплярy
(это означает, что я могу избежать необходимости использовать caps ([:
), atops (@
) и ats (@:
) за счет несколько байтов).Вот как это выглядит для каждой последовательной итерации на входе 46
В этой функции используется invalid (
::
) для вложения значений в «скобки» (здесь используются скобки -1 и -2). По сути, каждый раз, когда мы разлагаем и преобразуем в индексы простых чисел, добавляется _1 и добавляется _2, которые действуют как скобки. Когда функция вызывается для этих элементов, она просто возвращает их как есть, такq:
как при попытке факторизации отрицательного числа произойдет ошибка. Это также повезло , чтоq:
это не ошибка при попытке факторизовать 1 , а вместо этого возвращает пустой массив (по желанию).Конвертировать
Конвертировать намного проще. Он просто удаляет весь бокс, а также первый элемент, а затем преобразует все в 1 и 0 (просто добавив 2)
Капля
Это переворачивает список, находит первое и затем сбрасывает все значения до этого, затем снова переворачивает список.
раскодировать
Декодирование - это встроенная функция,
#.
которая берет список из 1 и 0 и преобразует его в двоичное число.источник
Сетчатка ,
244227225 байтПопробуйте онлайн!
Это прямой подход к алгоритму, продемонстрированному в вопросе. Генерация первичного индекса является экспоненциальной сложностью, поэтому время ожидания для больших входных данных будет превышено
Объяснение:
источник
Haskell ,
162160155 байтовПопробуйте онлайн!
Объяснение:
r=zip[1..][x|x<-[2..],all((>0).mod x)[2..x-1]]
определяет бесконечный список наборов простых чисел и их индексов:[(1,2),(2,3),(3,5),(4,7),(5,11),(6,13), ...]
.Функция
(%)
берет этот списокr
и числоn
и преобразует число в представление обращенного массива факторов. Это делается пошагово,r
пока мы не найдем простое число, которое делитn
. Затем мы рекурсивно определяем представление индекса этого простого числа и заключаем его в0
и1
и добавляем представлениеn
это простое число.Для
n=46
этого получается список,[0,0,0,1,1,0,0,1,1,1,0,1]
из которого затем удаляются ведущие нули (snd.span(<1)
) и следующий1
(tail
). Затем список преобразуется в десятичное число с помощью поэлементного умножения с перечнем полномочий два и суммирования полученного списка:sum.zipWith((*).(2^))[0..]
.источник
JavaScript, 289 байт
Байты - это сумма кода JavaScript без разрывов строк после запятых (которые вставляются только для лучшего форматирования и удобочитаемости) (256 байтов) и дополнительные символы для переключения командной строки, что требуется при использовании Chrome (33 байта).
И более длинная, лучше читаемая версия:
Несколько кратких объяснений:
f
является чисто функциональным алгоритмом хвостовой рекурсивной факторизацииc
подсчитывает, в каком местеr
простое числоp
встречается в последовательности простых чисел и возвращает либо[]
(еслиp=2
иr=1
), либо факторизирует и далее обрабатываетr
с помощью рекурсии.h
это небольшая вспомогательная функция, которая, к сожалению, необходима, так какmap
вызывает предоставленную функциюnumberOfCurrentElement
в качестве второго иwholeArray
третьего аргумента, таким образом переопределяя значения по умолчанию, предоставленные,c
если мы передадим эту функцию напрямую (мне потребовалось некоторое время, чтобы разобраться с этой ловушкой; заменаh
по определению будет на несколько байт длиннее).s
преобразует сгенерированный массив в строку. Мы используемblank
вместо того,0
чтобы мы могли использоватьtrim()
вo
.o
является функцией, которая вызывается с входным значением,i
которое возвращает выходные данные. Он генерирует двоичное строковое представление, требуемое спецификацией, и преобразует его в (десятичное) число.Изменить: Chrome должен быть запущен
chrome --js-flags="--harmony-tailcalls"
для включения оптимизации хвостовой рекурсии (см. Https://v8project.blogspot.de/2016/04/es6-es7-and-beyond.html ). Это также требует использования строгого режима.Следующий тест показывает, что вычисление немного медленное для некоторых значений (самое длинное - более шести секунд для
10007
моего компьютера). Интересно, что без оптимизации хвостовой рекурсии вычисление выполняется намного быстрее (примерно в 5 раз), когда нет переполнения стека.источник
тинилисп , 209 байт
Последняя строка - безымянная функция, которая вычисляет указанную кодировку. Попробуйте онлайн!
Версия для игры в гольф
Вот код, который у меня был до того, как я начал играть в гольф:
источник
05AB1E , 18 байт
Попробуйте онлайн!
Объяснение:
источник