Сбалансированная троичная логика
Троичный обычно другое название для основания 3, то есть сказать, каждая цифра 0
, 1
или 2
, и каждое место стоит в 3 раза больше, чем на следующем месте.
Сбалансированный троичный является модификацией троичного, который использует цифры -1
, 0
и 1
. Это имеет то преимущество, что не нуждается в знаке. Каждое место по-прежнему стоит в 3 раза больше, чем следующее место. Первые несколько положительных целых чисел, следовательно [1]
, [1, -1]
, [1, 0]
, [1, 1]
, в [1, -1, -1]
то время как первые отрицательные целые числа [-1]
, [-1, 1]
, [-1, 0]
, [-1, -1]
, [-1, 1, 1]
.
У вас есть три входа x, y, z
. z
или -1
, 0
или 1
, в то время как x
и y
может быть от -3812798742493
до 3812798742493
включительно.
Первым делом нужно перевести x
и y
из десятичной в сбалансированную троичную форму. Это должно дать вам 27 тритов (терарных цифр). Затем вам нужно объединить триты из x
и y
в парах, используя троичную операцию, а затем преобразовать результат обратно в десятичную.
Вы можете выбрать, какие значения z
отображаются на одну из этих трех троичных операций каждая:
A
: Если дано два трита, если любой равен нулю, то результат равен нулю, в противном случае результат равен -1, если они разные, или 1, если они одинаковы.B
: Если дано два трита, если один из них равен нулю, то результатом является другой трит, в противном случае результат равен нулю, если они разные, или отрицание, если они одинаковы.C
: С учетом двух значений trit результат равен нулю, если они различны, или их значение, если они одинаковы.
Пример. Предположим, x
есть 29
и y
есть 15
. В сбалансированном троичном, они становятся [1, 0, 1, -1]
и [1, -1, -1, 0]
. (Остальные 23 нулевых тритов были опущены для краткости.) После каждой из соответствующих операций они становятся A
: [1, 0, -1, 0]
, B
: [-1, -1, 0, -1]
, C
: [1, 0, 0, 0]
. Преобразованы обратно в десятичные результаты 24
, -37
и, 27
соответственно. Попробуйте следующую справочную реализацию для большего количества примеров:
Эталонная реализация следует приведенным выше шагам, но вы, конечно, можете использовать любой алгоритм, который дает те же результаты.
Это код-гольф , поэтому выигрывает самая короткая программа или функция, которая не нарушает стандартные лазейки!
z
должен быть один из ,-1,0,1
или мы можем выбрать любые три последовательных и различных значений? Я выбрал1,2,3
в своем ответе, и есть некоторая путаница по этому поводу.Ответы:
Чисто ,
231... 162 байтаОпределяет функцию
@
, принимая триInt
с и даваяInt
.Операторы отображаются как
1 -> A, 0 -> B, -1 -> C
.Попробуйте онлайн!
Функция
$
складывает лямбду по[0..26]
разрядам цифр в список троичных цифр. Он использует заголовок списка, который он выводит, чтобы сохранить текущую итоговую разницу от требуемого числа (именно поэтому он повторяется до возврата) иsign(2*t/3^p)
определить текущую цифру для получения. Трюк со знаком эквивалентенif(abs(2*t)<3^p)0(sign t)
.источник
$n
(я думаю). Не могли бы вы добавить объяснение этому?Желе , 39 байт
Полная программа принимает два аргумента,
[x,y]
иz
... где
z
это ,{A:-1, B:0, C:1}
который печатает результат
Попробуйте онлайн! Примечание: метод игры в гольф делает его медленным - эта измененная версия быстрее (регистрирует на 3, потолки и приращения перед каждым декартовым произведением)
Как?
источник
R ,
190172151 байтПопробуйте онлайн!
Вычисляет все комбинации тритов и выбирает правильную. Это на самом деле вызовет ошибку памяти
27
, поскольку3^27
это довольно большое число, но теоретически это сработает. Ссылка TIO имеет только11
целочисленную поддержку trit; Я не уверен, в какой момент это время или ошибки памяти первыми, и я не хочу, чтобы Деннис разозлился на меня за злоупотребление TIO!старый ответ, 170 байт
Это должно работать для всех входных данных, хотя только с 32-разрядными целыми числами есть вероятность неточности, поскольку R автоматически преобразует их в
double
.Попробуйте онлайн!
Принимает
-1
заA
,0
заB
и1
заC
.В этом ответе переносится подход к преобразованию в сбалансированный троичный, хотя, поскольку у нас гарантировано не более 27 сбалансированных тритов, он оптимизирован для этого.
R 160 байт
Попробуйте онлайн!
Эта версия прекратит работу очень медленно. Богосорт базового преобразования, эта функция случайным образом выбирает триты, пока каким-то волшебным образом (
3^-54
вероятность того, что это произойдет) не найдет нужные триты дляa
иb
, а затем выполнит требуемую операцию. Это в основном никогда не закончится.источник
z
ограничен{-1, 0, 1}
.z
сопоставлять с одной из этих трех троичных операций каждая: [...]z
- это или-1
,0
или1
, и я думаю, что это «ценностиz
», на которые мы ссылаемся.switch(z,...)
наswitch(z+2,...)
так, что это было бы тривиальным изменением независимо.Желе , 47 байт
Попробуйте онлайн!
Полная программа.
-1
=C
,0
=A
,1
=B
Аргумент 1:
[x, y]
Аргумент 3:
z
источник
x
иy
в сбалансированной троичной форме разрешено: «x и y могут быть от -3812798742493 до 3812798742493 включительно. Первый шаг - преобразовать x и y из десятичной в сбалансированную троичную».