Перетворювач базових номерів професора


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 = GOLF і 9 = TEST

потім

19 = ПРИКЛАДНИЙ -> 3010

20 = КОДЕМОНКІЯ -> 3100

21 = CODEEXAMPLE -> 3110

22 = КОДЕКОД -> 3200

23 = КОДЕГОЛЬФ -> 3210

Не потрібно враховувати вхідні цифри, що містять більше 10 цифр або мінус, хоча якщо ви хочете написати код для додаткових цифр, ви отримаєте додаткові кудо. Це кодовий гольф, тому найкоротша відповідь (з використанням комбінованих байтових підсумків усіх фрагментів) виграє, а стандартні лазівки не допускаються.

ДОДАТОК: Перш ніж хтось почне працювати над тим, чи 0 є правильним поданням 0 у базі 1, я хотів би нагадати вам, що цей професор є горіховим. Живи з цим.


1
Примітка: Система професора відома також як система фактичних чисел .
ETHproductions

Це також OEIS A124252
user41805

@ETHproductions Я ніколи не казав, що кодування професора було хорошим .
Джо Блоггс

@KritixiLithos Дякую за це! Я шукав це для використання в якості підтвердження.
Joe Bloggs

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 (чого ми ніколи не бачимо).


Мені подобається зловживання крапкою з комою.
Joe Bloggs

0

Горуби, 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}[]]]

Ви маєте на увазі число 108.
користувач75200
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.