Lógica ternária equilibrada
Ternário é normalmente um outro nome para a base 3, ou seja, cada dígito é 0
, 1
ou 2
, e cada lugar vale 3 vezes mais do que o próximo lugar.
Ternário equilibrado é uma modificação do ternário que usa dígitos de -1
, 0
e 1
. Isso tem a vantagem de não precisar de um sinal. Cada local ainda vale 3 vezes mais que o próximo. Os primeiros números inteiros positivos são, portanto [1]
, [1, -1]
, [1, 0]
, [1, 1]
, [1, -1, -1]
enquanto os primeiros números inteiros negativos são [-1]
, [-1, 1]
, [-1, 0]
, [-1, -1]
, [-1, 1, 1]
.
Você tem três entradas x, y, z
. z
ou é -1
, 0
ou 1
, ao mesmo tempo x
e y
pode ser de -3812798742493
até 3812798742493
inclusiva.
O primeiro passo é converter x
e y
de decimal em ternário equilibrado. Isso deve fornecer 27 trits (dígitos iniciais). Você precisa combinar os trits de x
e y
em pares usando uma operação ternária e depois converter o resultado novamente em decimal.
Você pode escolher quais valores do z
mapa para uma dessas três operações ternárias cada:
A
: Dados dois trits, se um for zero, o resultado será zero; caso contrário, o resultado será -1 se forem diferentes ou 1 se forem iguais.B
: Dados dois trits, se um for zero, o resultado será o outro trit; caso contrário, o resultado será zero se forem diferentes ou a negação se forem iguais.C
: Dados dois trits, o resultado será zero se eles forem diferentes ou seu valor se forem iguais.
Exemplo. Suponha que x
seja 29
e y
seja 15
. No ternário equilibrado, eles se tornam [1, 0, 1, -1]
e [1, -1, -1, 0]
. (Os 23 trits zero restantes foram omitidos por questões de brevidade.) Após cada uma das respectivas operações, eles se tornam A
: [1, 0, -1, 0]
, B
: [-1, -1, 0, -1]
, C
: [1, 0, 0, 0]
. Volta convertido para decimal, os resultados são 24
, -37
e 27
respectivamente. Tente a seguinte implementação de referência para obter mais exemplos:
A implementação de referência segue as etapas fornecidas acima, mas você é livre para usar qualquer algoritmo que produz os mesmos resultados.
Isso é código-golfe , então o programa ou função mais curto que não viola nenhuma brecha padrão ganha!
z
tem que ser um dos -1,0,1
ou podemos escolher quaisquer três valores consistentes e distintas? Eu selecionei 1,2,3
na minha resposta, e há alguma confusão sobre isso.