Божевільні, але раціональні основи


11

У нас багато проблем на основі 10, бази 2, бази 36 або навіть бази -10 , але як бути з усіма іншими раціональними основами?

Завдання

З огляду на ціле число в базі 10 та раціональну базу, поверніть ціле число в цій базі (як масив, рядок тощо).

Процес

Важко уявити собі раціональну базу, тому давайте візуалізуємо її за допомогою Exploding Dots :

Розглянемо цю анімацію, виразивши 17 в базі 3:

введіть тут опис зображення

Кожна крапка являє собою одиницю, а поля - цифри: правий край - це місце, середній - 3 ^ 1 місце, а лівий край - 3 ^ 2 місце.

Ми можемо почати з 17 точок у своєму місці. Однак, це база 3, тому місця, яких належить, має бути менше 3. Тому ми «вибухаємо» 3 крапки і створюємо крапку в коробці зліва. Ми повторюємо це, поки не виявимося в стабільному положенні без крапок, що розгортаються (тобто 3 крапки в одному полі).

Отже 17 в базі 10 - це 122 в базі 3.


Дробова основа аналогічна вибуху деякої кількості крапок на більш ніж одну крапку. База 3/2 вибухає 3 крапки, щоб створити 2.

Вираження 17 в базі 3/2:

введіть тут опис зображення

Отже 17 в базі 10 дорівнює 21012 в базі 3/2.


Негативні основи працюють аналогічно, але ми повинні слідкувати за знаками (використовуючи так звані антиточки, рівні -1; представлені відкритим колом).

Вираження 17 в базовій -3:

введіть тут опис зображення

Зауважте, є додаткові вибухи, щоб зробити знак усіх коробок однаковим (ігноруючи нулі).

Таким чином, 17 в базі 10 становить 212 в базі -3.

Негативні раціональні основи працюють аналогічно, у поєднанні вищевказаних випадків.

Правила

  • Немає стандартних лазівки
  • Знак кожної "цифри" у висновку повинен бути однаковим (або нульовим).
  • Абсолютне значення всіх цифр повинно бути менше абсолютного значення чисельника основи.
  • Можна припустити, що абсолютна величина бази більша за 1.
  • Можна припустити, що раціональна основа знаходиться у найменшій зниженій формі.
  • Ви можете взяти числівник та знаменник основи окремо у вводі.
  • Якщо число має кілька представлень, ви можете вивести будь-яке з них. (наприклад, 12 в базі 10 може бути, {-2, -8}а {1, 9, 2}в базі -10)

Тестові приклади:

Формат: {in, base} -> result

{7, 4/3}        ->  {3, 3}
{-42, -2}       ->  {1, 0, 1, 0, 1, 0}
{-112, -7/3}    ->  {-6, -5, 0, -1, 0}
{1234, 9/2}     ->  {2, 3, 6, 4, 1}
{60043, -37/3}  ->  {-33, -14, -22, -8}

Оскільки деякі входи можуть мати кілька представлень, я рекомендую протестувати вихід, використовуючи цей фрагмент Mathematica на TIO.

Це , тому подання з найменшими підрахунками байтів на кожній мові виграють!


Для отримання додаткової інформації про вибухи крапок відвідайте веб-сайт глобального математичного проекту ! У них купа класних математичних речей!


Відповіді:


6

Python 2 , 42 39 байт

n,a,b=input()
while n:print n%a;n=n/a*b

Спробуйте в Інтернеті!

Дякуємо @xnor, що знайшов коротшу форму.

Застаріла версія (42 байти):

f=lambda n,a,b:n and[n%a]+f(n/a*b,a,b)or[]

Спробуйте в Інтернеті!

Параметри: введення, чисельник (зі знаком) та знаменник.

Повертає масив, перший із найнижчих цифр.

Це просто працює, тому що поділ і модуль в Python слідує знаменнику знаменника, тому нам не потрібно чітко піклуватися про ті самі знаки.

Вихід з тестового випадку:

f(7, 4, 3)       == [3, 3]
f(-42, -2, 1)    == [0, -1, -1, -1, -1, -1, -1]
f(-112, -7, 3)   == [0, -1, 0, -5, -6]
f(1234, 9, 2)    == [1, 4, 6, 3, 2]
f(60043, -37, 3) == [-8, -22, -14, -33]

4
Незвичайно виглядає, що програма коротша .
xnor

@xnor Спасибі, я завжди забуваю таким чином щось написати ...
Bubbler

4

Ахей (езотоп) , 91 байт

벙수벙섞벙석
희빠챠쌳뻐삭빠빠싻싸삯라망밣밭따맣사나삮빠싸사땨

Спробуйте в Інтернеті!

Приймає integer, numerator of baseі denominator of base.

Через обмеження перекладача TIO кожен вхід повинен закінчуватися новим рядком.

Реалізація відповіді Python 2 @ Bubbler . На щастя, цей перекладач Aheui написаний на Python, тому ми можемо використовувати ту саму хитрість.


4
o_O що на землі ця мова ... D:
HyperNeutrino

3

05AB1E , 11 10 байт

[D_#²‰`,³*

Спробуйте в Інтернеті!

Бере integer, numerator of baseі denominator of baseяк і всі відповіді. Оскільки інтерпретатор 05AB1E написаний на Python (?), Трюк відповідей Pybhon 2 Bubbler може бути використаний і в 05AB1E.

Пояснення

[D_ # ² ‰ `, ³ *
[Нескінченна петля
 D_ # Якщо число дорівнює 0, вийдіть з циклу виходу (неявний ввід
                                         у першій ітерації)
     ² Отримайте чисельник основи
      ‰ Divmod
       `Вставте всі елементи в стек
        , Друк залишку
         ³ Отримайте знаменник основи
          * Помножте його.

Отже програма працює приблизно так само, як і цей код Python:

i1, i2, i3 = вхід ()
стек = []
поки 1:
 стек = (стек або [i1])
 стек + = [стек [-1]]
 якщо не стек [-1]: перерва
 стек + = [i2]
 stack = stack [: - 2] + [divmod (стек [-2], стек [-1])]
 стек = стек [: - 1] + список (стек [-1])
 стек друку [-1]
 стек = стек [: - 1]
 стек + = [i3]
 стек = стек [: - 2] + [стек [-2] * стек [-1]]

11> 10 Дякую Нілу


Я думаю , що ви можете використовувати _замість 0Qтут.
Ніл

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