Сбалансированные базы:
Сбалансированные основания, по существу, такие же, как нормальные основания, за исключением того, что цифры могут быть положительными или отрицательными, в то время как в нормальных основаниях цифры могут быть только положительными.
С этого момента сбалансированные основания базы 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
и вывод. Вы можете использовать любой язык, который соответствует вашему языку, если он соответствует определению «Гибкость ввода / вывода».
[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]
Это код-гольф , поэтому выигрывает самый короткий код в байтах!
источник
[1,1,1,-2,1,0]
Ответы:
Mathematica, 85 байт
объяснение
Преобразовать
#1
(подразумевается 1 - ввод 1, список цифр) в целочисленную базу#2
(ввод 2).Преобразуйте полученное целое число в основание
#3
(вход 3), создав список цифр.Повторно заменить список цифр; если цифра больше, чем пол (
#3
/ 2), вычтите#3
ее и добавьте1
к цифре слева. Если слева ничего нет, вставьте0
и добавьте1
.источник
{...}
так как есть только одно правило замены.p___
. Находит ли это самое короткое,p___
сопровождаемое либоa_,b_
илиb_
, либо проверяет весь шаблон, требующий каждого из дополнительных шаблонов, и затем постепенно отбрасывает дополнительные шаблоны, пока не найдет совпадение (или какой-либо третий вариант)?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
в середине есть a , удовлетворяющее условию, оно{p___,a_,b_,q___}
будет соответствовать ей.Perl 6 , 121 байт
Медленное перебор.
Как это устроено:
map {[ .base(c).comb]}, 0..*
- Создать ленивую бесконечную последовательность натуральных чисел в базеc
, где каждое число представлено в виде массива цифр.$_ - ($_ > floor c/2) * c
- Преобразуйте его, вычитаяc
из каждой цифры больше пола (с / 2).first { f(b, n) == f(c, $_) }, ...
- Получить первый массив этой последовательности, который при интерпретации как базовоеc
число равен входному массиву,n
интерпретированному как базовоеb
число.sub f { sum [R,](@^n) Z* ($^b X** 0..*) }
- Вспомогательная функция, которая превращает массив@^n
в число в базе$^b
, взяв сумму произведенных произведений, сжав реверсированный массив с последовательностью степеней базы.источник
JavaScript (ES6), 89 байт
100 байтов работает для отрицательных значений
n
.источник
Mathematica,
118114 байт⌊
и⌋
являются 3-байтовыми символамиU+230A
иU+230B
, соответственно. Преобразует#3
в базу10
из базы#2
, затем преобразует в базу#
(поэтому порядок аргументов обратный из примеров). Если какая-либо цифра превышает максимально допустимую цифруk=⌊#/2⌋
, уменьшите эту цифру#
и увеличьте следующую цифру (возможно, потребуется добавить перед ней1
). Продолжайте делать это, пока все цифры не станут меньшеk
.источник