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 selecionei1,2,3
na minha resposta, e há alguma confusão sobre isso.Respostas:
Limpo ,
231... 162 bytesDefine a função
@
, obtendo três seInt
dando umInt
.Operadores mapeiam como
1 -> A, 0 -> B, -1 -> C
.Experimente online!
A função
$
dobra uma lambda sobre os dígitos[0..26]
, em uma lista de dígitos ternários. Ele usa o cabeçalho da lista que gera para manter uma diferença total atual do número necessário (e é por isso que é seguido antes de retornar) esign(2*t/3^p)
para determinar o dígito atual a ser produzido. O truque de sinal é equivalente aif(abs(2*t)<3^p)0(sign t)
.fonte
$n
(eu acho). Você poderia adicionar uma explicação para isso?Geléia , 39 bytes
Um programa completo com dois argumentos
[x,y]
, ez
... onde
z
é{A:-1, B:0, C:1}
que imprime o resultado
Experimente online! Nota: o método golfed torna lento - esta versão alterada é mais rápida (registros em 3, tetos e incrementos antes de cada produto cartesiano)
Quão?
fonte
R ,
190172151 bytesExperimente online!
Calcula todas as combinações de trits e seleciona a correta. Na verdade, ele gera um erro de memória
27
, já que3^27
é um número um tanto grande, mas teoricamente funcionaria. O link TIO possui apenas11
suporte a trit inteiro; Não tenho certeza em que ponto o tempo limite deve exceder ou os erros de memória primeiro e não quero que Dennis fique bravo comigo por abusar do TIO!resposta antiga, 170 bytes
Este deve funcionar para todas as entradas, embora com apenas números inteiros de 32 bits, exista a possibilidade de imprecisão, pois o R as converterá automaticamente
double
.Experimente online!
Toma
-1
paraA
,0
deB
e1
paraC
.Portos a abordagem nesta resposta para converter em ternário equilibrado, embora, como é garantido que não tenha mais de 27 trits equilibrados, ele é otimizado para isso.
R , 160 bytes
Experimente online!
Esta versão terminará extremamente lentamente. O bogoort da conversão de base, essa função seleciona aleatoriamente trits até que de alguma forma magicamente (
3^-54
chance disso ocorra) encontre os trits corretos paraa
eb
, e depois faça a operação necessária. Isso basicamente nunca termina.fonte
z
é restrito a{-1, 0, 1}
.z
mapa para uma dessas três operações ternárias cada: [...]z
é ou-1
,0
ou1
, e acho que esses são os "valores dez
" que estão sendo mencionados.switch(z,...)
aswitch(z+2,...)
por isso seria uma mudança trivial, independentemente.Geléia , 47 bytes
Experimente online!
Programa completo.
-1
=C
,0
=A
,1
=B
Argumento 1:
[x, y]
Argumento 3:
z
fonte
x
ey
ternário balanceado é permitido: "x e y podem ser de -3812798742493 a 3812798742493, inclusive. O primeiro passo é converter x e y de decimal em ternário balanceado".