Преобразователь номера базового здания профессора

12

Сумасшедший преподаватель математики хочет закодировать все свои исследования, используя систему, гарантирующую, что ее найдут даже самые хитрые конкуренты!

С этой целью профессор решил изменить базу не только числа, которое они пишут, но и каждой отдельной цифры в этом номере, в соответствии с тем, в каком месте находится цифра (считая справа, начиная с 1). Например:

Число 0 имеет одну цифру, поэтому оно представлено в базе 1: 0

Число 1 будет иметь одну цифру в базовой десятке, но в системе нашего профессора это недействительно. Первое место зарезервировано только для базовой цифры 1! Это означает, что его нужно перенести на второе место, где разрешено основание 2: 10

Число 2 требует написания как минимум основы 3: 100

Но теперь число 3 можно записать, изменив цифру во втором месте: 110

и 4 как так: 200

Вот еще несколько примеров, которые помогут вам понять:

5: 210

6: 1000

7: 1010

8: 1100

9: 1110

10: 1200

11: 1210

12: 2000

13: 2010

14: 2100

15: 2110

16: 2200

17: 2210

18: 3000

Используя эту систему, заметки профессора не будут иметь никакого смысла ни для кого, кроме них, и они могут наконец захватить мир !!!! Спи спокойно ночью.

Конечно, метод кодирования должен быть как можно более неясным.


Ваша задача - написать 10 фрагментов кода, каждый из которых представляет одну из 10 основных цифр.

0 1 2 3 4 5 6 7 8 9

который при объединении в порядке числа, подлежащего преобразованию, произведет число, записанное в дьявольской системе нумерации профессора (метод вывода может быть на ваш выбор, но должен быть удобочитаемым числом, используя только цифры 0-9)

Например, если мои фрагменты:

0 = обезьяна 1 = пример, 2 = код, 3 = гольф и 9 = тест

тогда

19 = EXAMPLETEST -> 3010

20 = кодовый ключ -> 3100

21 = кодовый пример -> 3110

22 = КОДЕКС -> 3200

23 = CODEGOLF -> 3210

Не нужно рассматривать входные числа с более чем 10 цифрами или отрицательными числами, хотя, если вы захотите написать код для дополнительных цифр, вы получите дополнительные баллы. Это кодовый гольф, поэтому самый короткий ответ (используя объединенные байтовые суммы всех фрагментов) выигрывает, и стандартные лазейки не допускаются.

ДОБАВЛЕНИЕ: Прежде чем кто-либо начнет понимать, является ли 0 правильным представлением 0 в базе 1, я хотел бы напомнить вам, что этот профессор псих. Живи с этим.

Джо Блоггс
источник
1
Примечание: система профессора также известна как система факторных чисел .
ETHproductions
Это также OEIS A124252
user41805
@ETHproductions Я никогда не говорил, что кодировка профессора хорошая .
Джо Блоггс
@KritixiLithos Спасибо за это! Я искал это, чтобы использовать в качестве подтверждения.
Джо Блоггс
4
Кстати, добро пожаловать в PPCG :-)
ETHproductions

Ответы:

1

Mathematica (среда REPL), всего 858 байт

Вот 86-байтовый фрагмент кода для цифры 9:

1;ValueQ@a||(a=0;b=3);a=10a+9;b++;FromDigits[a~IntegerDigits~MixedRadix@Range[b,1,-1]]

Фрагменты кода для цифр от 1 до 8 идентичны, за исключением того, что цифра 9 заменена соответствующей цифрой. Фрагмент кода для цифры 0 идентичен, за исключением того, что +9просто удаляется.

a~IntegerDigits~MixedRadix@Range[b,1,-1]вычисляет список цифр факториальной системы чисел a, если их количество bне меньше, чем количество цифр; FromDigitsпреобразует этот список цифр в обычное целое число-10 для целей вывода. (Если какой-либо из элементов списка превышает 9, происходит нечто забавное.)

В среде REPL Mathematica вычисления могут заканчиваться точкой с запятой для подавления вывода; поэтому будет отображаться только последний вывод в цепочке, разделенной точкой с запятой. Мы рекурсивно определяем целое число, aобозначаемое фрагментами, а также ограничение bчисла необходимых цифр факториальной системы. Команда ValueQ@a||(a=0;b=3)инициализирует эти переменные, если они неинициализированы (то есть в первом фрагменте), и в противном случае оставляет их в покое; затем a=10a+9;b++проводит рекурсию. И, наконец, исходное значение 1;предназначено для склеивания фрагментов: оно умножает промежуточные вычисления на 1 (что мы никогда не видим).

Грег Мартин
источник
Мне нравится злоупотребление точкой с запятой.
Джо
0

Goruby, 790 810 980

Вот вторая попытка, основанная на том факте, что в практически любой оболочке печать возврата каретки ("\ r") без перевода строки ("\ n") перезапишет ранее напечатанную строку, в конечном итоге гарантируя, что будет напечатан только последний бит (то есть, конечный результат) показан.

Это должно быть запущено в оболочке, например ruby name_of_file.rb.

Это работает для положительных чисел неограниченной длины.

Код представляет собой десять копий фрагмента ниже, с Xзаменой (вверху) цифрами от 0 до 9, по одной на фрагмент.

->*t{n,d,o="X#{t}".toi,0,''
dw{n,r=n.dm d+=1;o.pr r.ts;n>0}
$>.fu
pr"\r",o
o}

То есть фрагмент, представляющий (например) 8, будет выглядеть так:

->*t{n,d,o="8#{t}".toi,0,''
dw{n,r=n.dm d+=1;o.pr r.ts;n>0}
$>.fu
pr"\r",o
o}

Задача гласит, что фрагменты должны быть «объединены» для создания представления многозначного числа, поэтому, чтобы добавить цифру к числу, просто поместите ее в квадратные скобки в конце числа. Таким образом, число 103 (в десятичном виде) будет:

->*t{n,d,o="1#{t}".toi,0,''
dw{n,r=n.dm d+=1;o.pr r.ts;n>0}
$>.fu
pr"\r",o
o}[->*t{n,d,o="0#{t}".toi,0,''
dw{n,r=n.dm d+=1;o.pr r.ts;n>0}
$>.fu
pr"\r",o
o}[->*t{n,d,o="8#{t}".toi,0,''
dw{n,r=n.dm d+=1;o.pr r.ts;n>0}
$>.fu
pr"\r",o
o}[]]]
Tutleman
источник
Вы имеете в виду число 108.
user75200