Сумасшедшие, но рациональные основы


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 каждый ввод должен заканчиваться новой строкой.

Реализация ответа @ Bubbler's Python 2 . К счастью, этот интерпретатор Aheui написан на Python, поэтому мы можем использовать тот же трюк.


4
о_О что на земле этот язык ... D:
HyperNeutrino

3

05AB1E , 11 10 байт

[D_#²‰`,³*

Попробуйте онлайн!

Берет integer,numerator of base и denominator of baseнравятся все ответы. Поскольку интерпретатор 05AB1E написан на языке Python (?), Трюк с ответом Bubbler's Python 2 можно использовать и в 05AB1E.

объяснение

[D_ # ² ‰ `, ³ *
[ Бесконечная петля
 D_ # Если число равно 0, выйти из цикла (неявный ввод
                                         в первой итерации)
     ² Получить числитель базы
      Mod Divmod
       `Вставить все элементы в стек
        Распечатать остаток
         ³ Получить знаменатель базы
          * Умножьте это.

Таким образом, программа работает примерно так же, как этот код Python:

i1, i2, i3 = вход ()
стек = []
пока 1:
 стек = (стек или [i1])
 stack + = [stack [-1]]
 если не стек [-1]: перерыв
 стек + = [i2]
 stack = stack [: - 2] + [divmod (stack [-2], стек [-1])]
 stack = stack [: - 1] + список (stack [-1])
 стек печати [-1]
 stack = stack [: - 1]
 стек + = [i3]
 stack = stack [: - 2] + [stack [-2] * stack [-1]]

11> 10 Спасибо, Нил


Я думаю, что вы можете использовать _вместо 0Qздесь.
Нил

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