Перетворити між збалансованими базами!


13

Збалансовані основи:

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

З цього моменту врівноважені основи бази bможуть бути представлені як balb- настільки збалансована основа 4 = bal4.

У визначенні на цей виклик, діапазон чисел в збалансованій основі бази bвід -(k - 1)до b - k, де

k = ceil(b/2)

Приклади діапазону цифр у різних збалансованих базах:

bal10:
  k = ceil(10/2) = 5
  range = -(5 - 1) to 10 - 5 = -4 to 5
        = -4, -3, -2, -1, 0, 1, 2, 3, 4, 5
bal5:
  k = ceil(5/2) = 3
  range = -(3 - 1) to 5 - 3 = -2 to 2
        = -2, -1, 0, 1, 2

Представлення чисел у збалансованих базах в основному таке ж, як у звичайних основ. Наприклад, представлення числа 27(база 10) до bal4(збалансована основа 4) є 2 -1 -1, тому що

  2 -1 -1 (bal4)
= 2 * 4^2 + -1 * 4 + -1 * 1
= 32 + (-4) + (-1)
= 27 (base 10)

Завдання:

Ваше завдання задано три входи:

  • число для перетворення ( n)
    • цей вхід може бути гнучким, див. "Гнучкість вводу / виводу"
  • база, яка nзараз знаходиться у ( b)
  • база, яка nповинна бути перетворена в ( c)

Де 2 < b, c < 1,000.

Повернути число в збалансованому базовому cподанні n. Вихід також може бути гнучким.

Програма / функція повинна визначати довжину nвід самого входу.

Гнучкість вводу / виводу:

Ваш вхід nі вихід можуть бути представлені наступними способами:

  • визначення вашої мови масиву
  • рядок з будь-яким символом як роздільник (наприклад, пробіли, коми)

Приклади:

Зауважте, що вони використовують масив Python як nі вихід. Ви можете використовувати все, що відповідає вашій мові, доки воно не відповідає гнучкості "I / O Flexibility".

[2, -1, -1] 4 7 = [1, -3, -1]
[1, 2, 3, 4] 9 5 = [1, 2, 2, -1, 2]
[10, -9, 10] 20 5 = [1, 1, 1, -2, 1, 0]

Це , тому найкоротший код у байтах виграє!


У вашій першій відповіді 4 не є юридичною бальною цифрою; Я вважаю, що відповідь повинна бути [1, -3, -1]. І я отримую різні відповіді для другого тестового випадку ([1,2,2, -1,2]) і третього тестового випадку ([1,1,0, -2,1,0]) також ...?
Грег Мартін

@GregMartin Ах, ну, я вирахував це вручну, тож, мабуть, виникнуть деякі проблеми. Дякуємо, що помітили! Чи можете ви двічі перевірити свої рішення, про всяк випадок?
clismique

@GregMartin @ Qwerp-Derp Третій тестовий випадок[1,1,1,-2,1,0]
ngenisis

Відповіді:


2

Математика, 85 байт

#~FromDigits~#2~IntegerDigits~#3//.{p___,a_:0,b_,q___}/;b>⌊#3/2⌋:>{p,a+1,b-#3,q}&

Пояснення

#~FromDigits~#2

Перетворення #1(1 мається на увазі - введення 1, список цифр) у цілу базу #2(вхід 2).

... ~IntegerDigits~#3

Перетворіть отримане ціле число в базу #3(вхід 3), створивши список цифр.

... //.{p___,a_:0,b_,q___}/;b>⌊#3/2⌋:>{p,a+1,b-#3,q}

Неодноразово замінюйте список цифр; якщо цифра більша за підлогу ( #3/ 2), віднімайте #3від неї і додайте 1до цифри зліва. Якщо зліва немає нічого, вставте a 0і додайте 1.


Зазвичай рекомендується трохи поговорити про своє рішення та пояснити це людям, які, можливо, не знають Mathematica.
Атако

@ATaco Додано пояснення!
JungHwan Min

Я цим трохи загадкований. Я ніколи не бачив додаткових шаблонів, які використовуються ніде, крім визначень функцій. Зовнішнє вам не потрібно, {...}оскільки існує лише одне правило заміни.
ngenisis

1
@JungHwanMin Щоправда, я думаю, що мене бентежить, як це впливає на матч p___. Чи вважає це найкоротшим, p___за яким йде a_,b_або b_, або він перевіряє весь шаблон, що вимагає кожного з необов'язкових шаблонів, а потім поступово скидає необов'язкові шаблони, поки не знайде збіг (або якийсь третій варіант)?
ngenisis

1
@ngenisis Я вважаю, що я помилявся в попередньому коментарі (видалено), спостерігаючи результат FixedPointList[k=#3;#/.{p___,a_:0,b_,q___}/;b>⌊k/2⌋:>{p,a+1,b-k,q}&, #~FromDigits~#2~IntegerDigits~#3]&. {p___,a_,b_,q___}спочатку відповідає (для всіх можливих p), а потім {p___,b_,q___}відповідає. Друга заміна застосовується лише тоді, коли вона bзнаходиться на початку, тому що якщо bв середині є внутрішня частина, яка задовольняє умові, {p___,a_,b_,q___}вона відповідатиме їй.
JungHwan Min

1

Perl 6 , 121 байт

->\n,\b,\c{sub f{sum [R,](@^n)Z*($^b X**0..*)}
first {f(b,n)==f c,$_},map {[$_-($_>floor c/2)*c for .base(c).comb]},0..*}

Повільне рішення грубої сили.

Як це працює:

  • map {[ .base(c).comb]}, 0..*- Створіть в основі ледачу нескінченну послідовність натуральних чисел c, кожне число представлене як масив цифр.
  • $_ - ($_ > floor c/2) * c- Перетворіть його, віднімаючи cз кожної цифри, що перевищує підлогу (c / 2).
  • first { f(b, n) == f(c, $_) }, ...- Отримайте перший масив цієї послідовності, який при інтерпретації як базове cчисло дорівнює вхідному масиву, nінтерпретованому як базове bчисло.
  • sub f { sum [R,](@^n) Z* ($^b X** 0..*) }- Хелперна функція, яка перетворює масив @^nу число в основі $^b, беручи суму продуктів, отриманих шляхом блискавки перевернутого масиву з послідовністю повноважень бази.

1

JavaScript (ES6), 89 байт

(n,b,c,g=(n,d=n%c,e=d+d<c)=>[...(n=n/c+!e|0)?g(n):[],e?d:d-c])=>g(n.reduce((r,d)=>r*b+d))

100 байт працює для негативних значень n.

(n,b,c,g=(n,d=(n%c+c)%c)=>[...(n-=d,n/=c,d+d<c||(d-=c,++n),n?g(n):[]),d])=>g(n.reduce((r,d)=>r*b+d))

0

Математика, 118 114 байт

IntegerDigits[#3~FromDigits~#2,k=⌊#/2⌋;#]//.{{a_,x___}/;a>k:>{1,a-#,x},{x___,a_,b_,y___}/;b>k:>{x,a+1,b-#,y}}&

і є 3-байтовими символами U+230Aі U+230B, відповідно. Перетворює #3в базу 10з бази #2, потім перетворює на базу #(тому порядок аргументів повертається з прикладів). Якщо будь-яка цифра перевищує максимально дозволену цифру k=⌊#/2⌋, зменшіть її #та збільшить наступну цифру вгору (можливо, знадобиться попередньо 1). Продовжуйте робити це, поки всі цифри не перевищують k.

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