Lógica ternaria equilibrada
Ternario es normalmente otro nombre para la base 3, es decir, cada dígito es 0
, 1
o 2
, y cada lugar vale 3 veces más que el siguiente lugar.
El ternario equilibrado es una modificación del ternario que utiliza dígitos de -1
, 0
y 1
. Esto tiene la ventaja de no necesitar una señal. Cada lugar todavía vale 3 veces más que el siguiente. Los primeros números enteros positivos son, por lo tanto [1]
, [1, -1]
, [1, 0]
, [1, 1]
, [1, -1, -1]
mientras que los primeros son números enteros negativos [-1]
, [-1, 1]
, [-1, 0]
, [-1, -1]
, [-1, 1, 1]
.
Tienes tres entradas x, y, z
. z
es o bien -1
, 0
, o 1
, mientras que x
y y
puede ser desde -3812798742493
a 3812798742493
inclusive.
El primer paso es convertir x
y y
de decimal a ternario equilibrado. Esto debería darte 27 trits (dígitos digitales). Luego tiene que combinar los trits desde x
y y
en pares usando una operación ternaria y luego convertir el resultado a decimal.
Puede elegir qué valores de z
mapear a una de estas tres operaciones ternarias cada uno:
A
: Dado dos trits, si cualquiera es cero, entonces el resultado es cero; de lo contrario, el resultado es -1 si son diferentes o 1 si son iguales.B
: Dados dos trits, si uno es cero, entonces el resultado es el otro trit, de lo contrario el resultado es cero si son diferentes o la negación si son iguales.C
: Dados dos trits, el resultado es cero si son diferentes o su valor si son iguales.
Ejemplo. Supongamos que x
es 29
y y
es 15
. En ternario equilibrado, estos se convierten en [1, 0, 1, -1]
y [1, -1, -1, 0]
. (Los 23 trits cero restantes se han omitido por brevedad). Después de cada una de las operaciones respectivas se convierten en A
: [1, 0, -1, 0]
, B
: [-1, -1, 0, -1]
, C
: [1, 0, 0, 0]
. Convertidos a decimales los resultados son 24
, -37
y 27
respectivamente. Pruebe la siguiente implementación de referencia para obtener más ejemplos:
La implementación de referencia sigue los pasos anteriores, pero, por supuesto, puede utilizar cualquier algoritmo que produzca los mismos resultados.
Este es el código de golf , por lo que gana el programa o la función más corta que no viole ninguna laguna estándar.
z
tiene que ser uno de-1,0,1
los tres valores consistentes o distintos? He seleccionado1,2,3
en mi respuesta, y hay algo de confusión al respecto.Respuestas:
Limpio ,
231... 162 bytesDefine la función
@
, tomando tresInt
sy dando unInt
.Los operadores mapean como
1 -> A, 0 -> B, -1 -> C
.Pruébalo en línea!
La función
$
pliega una lambda sobre los lugares de los dígitos[0..26]
, en una lista de dígitos ternarios. Utiliza el encabezado de la lista que produce para mantener una diferencia total actual del número requerido (por lo que se sigue antes de regresar), ysign(2*t/3^p)
para determinar el dígito actual a ceder. El truco del signo es equivalente aif(abs(2*t)<3^p)0(sign t)
.fuente
$n
(creo). ¿Podría agregar una explicación para eso?Jalea , 39 bytes
Un programa completo que toma dos argumentos
[x,y]
, yz
... ¿dónde
z
está el{A:-1, B:0, C:1}
que imprime el resultado?
Pruébalo en línea! Nota: el método de golf lo hace lento: esta versión alterada es más rápida (registra 3, techos e incrementos antes de cada producto cartesiano)
¿Cómo?
fuente
R ,
190172151 bytesPruébalo en línea!
Calcula todas las combinaciones de trits y selecciona la correcta. Realmente arrojará un error de memoria
27
, ya que3^27
es un número algo grande, pero en teoría funcionaría. El enlace TIO solo es11
compatible con trit integer; No estoy seguro de en qué momento se agota el tiempo o los errores de memoria primero, ¡y no quiero que Dennis se enoje conmigo por abusar de TIO!respuesta anterior, 170 bytes
Este debería funcionar para todas las entradas, aunque con solo enteros de 32 bits, existe la posibilidad de imprecisión ya que R los convertirá automáticamente
double
.Pruébalo en línea!
Toma
-1
paraA
,0
paraB
y1
paraC
.Transmite el enfoque de esta respuesta para la conversión a ternario equilibrado, aunque dado que tenemos la garantía de no tener más de 27 trits equilibrados, está optimizado para eso.
R , 160 bytes
Pruébalo en línea!
Esta versión terminará extremadamente lentamente. El bogosort de la conversión de base, esta función selecciona aleatoriamente los trits hasta que de alguna manera mágica (
3^-54
posibilidad de que ocurra) encuentre los trits correctos paraa
yb
, y luego realice la operación requerida. Esto básicamente nunca terminará.fuente
z
está restringido a{-1, 0, 1}
.z
mapa para una de estas tres operaciones ternarias cada uno: [...]z
es o bien-1
,0
o1
, y creo que esos son los "valores dez
" hacía referencia.switch(z,...)
porswitch(z+2,...)
lo que sería un cambio trivial independientemente.Jalea , 47 bytes
Pruébalo en línea!
Programa completo
-1
=C
,0
=A
,1
=B
Argumento 1:
[x, y]
Argumento 3:
z
fuente
x
yy
en ternario balanceado: "x e y pueden ser de -3812798742493 a 3812798742493 inclusive. El primer paso es convertir x e y de decimal a ternario balanceado".