Una de las muchas características únicas del lenguaje de programación Malbolge es su OP
operador muy poco intuitivo , conocido como "op" en la documentación y el código fuente, pero conocido popularmente como el operador "loco". Según lo descrito por Ben Olmstead, el creador del lenguaje, en su documentación: " no busque el patrón, no está allí ".
op es un operador "tritwise": opera en los dígitos ternarios correspondientes de sus dos argumentos. Para cada trit (bit ternario), el resultado de op viene dado por la siguiente tabla de búsqueda:
a
op(a,b) 0 1 2
+-------
0 | 1 0 0
b 1 | 1 0 2
2 | 2 2 1
Por ejemplo, para calcular op(12345, 54321)
, primero escriba ambos números en ternario y luego busque cada par de trits en la tabla:
0121221020 (12345_3)
op 2202111220 (54321_3)
--------------
2202220211 (54616_3)
El último punto importante es que todos los valores en Malbolge tienen 10 trits de ancho, por lo que los valores de entrada deben rellenarse con ceros a un ancho de 10. (Por ejemplo, op(0, 0)
es 1111111111
ternario).
Su tarea es tomar dos enteros 0 ≤ a
, b
<59049 como entrada y generar el valor entero de op(a,b)
.
Casos de prueba (en el formato a b op(a,b)
):
0 0 29524
1 2 29525
59048 5 7
36905 2214 0
11355 1131 20650
12345 54321 54616
Aquí hay una implementación de referencia (copiada directamente del código fuente de Malbolge).
54616_3
no significa "esta otra cosa es el número decimal 54616, pero se representa como base tres". Significa "Leer54616
como base 3". Lo cual, por supuesto, no puede hacer (hay dígitos que Valve no puede contar allí). Probablemente todavía sería igual de claro si se deshiciera del_3
todo, y más preciso.Respuestas:
C (gcc) ,
999896 bytes19683
aL'䳣'
.108609
aL''
.Pruébalo en línea!
fuente
JavaScript (ES7), 56 bytes
Pruébalo en línea!
¿Cómo?
Dado y b en [ 0..2 ] , calculamos:una si [ 0..2 ]
Llevando a:
Elección de funciones
Hay varias otras posibles funciones candidatas del formulario:
Uno de los más cortos es:
Comentado
fuente
(1581093>>b%3*2+a%3*8&3)
ahorra un byte completo!a/3
yb/3
sin redondear. Eso fallaría por eso.k = 9 ... => ~k && ...
ak = 10 ... => k && ...
?for(k=9;k>=0;k--)
afor(k=10;k>=1;k--)
.05AB1E , 18 bytes
Código:
Utiliza la codificación 05AB1E . Pruébalo en línea!
Explicación del algoritmo
Por ejemplo, para las entradas 12345 y 54321 , estas se asignan a:
Lo que da la siguiente lista de enteros unidos:
Finalmente, después de asignar esta función en la lista de enteros unidos, tratamos esta lista resultante como un número representado en la base 3 y la convertimos de la base 3 a decimal.
Explicación del Código
fuente
3Tm+3Bø19sm74%3%3β
puede jugar al golf?R ,
6462 bytesPruébalo en línea!
¡Gracias a JAD por algunos trucos de golf de
magia negray -2 bytes!30801
, cuando se convierte en un entero ternario de 10 trits, es el1120020210
que simplemente agrega un cero final a la tabla de operaciones, cuando se leen las columnas. Luego convertimos los dígitos ternarios dea
yb
elementwise en un número entero y lo usamos como índice en los dígitos ternarios de30801
.fuente
x
usando[.*]
. Entonces todas las%any%
operaciones suceden. La parte divertida es que si ves30801%/%x%%3
comof=function(x)30801%/%x%%3
, esof(x[index]) == (f(x))[index]
. Salvar las llaves :)C (gcc) ,
747271 bytesPruébalo en línea!
Descompostura
La mesa de la verdad
Se puede considerar como una matriz de 3x3, donde a es la columna y b es la fila. Transformar eso en una lista unidimensional nos da 100102221. Para ahorrar espacio, evitamos listas y cadenas y lo convertimos en un número. Para hacer eso, cambiamos el orden y transformamos cada trit en un número de 2 bits. Pegarlos juntos y tenemos un número binario en el que podemos "indexar" desplazándonos hacia la derecha
2 * (b * 3 + a)
y enmascarando:Luego, masajeamos la expresión usando el poder de la precedencia de la operación para convertirnos en la abominación anterior.
3 ^ 9 = 19683, entonces ese es un buen límite de bucle. Como multiplicamos el contador por 3 cada vez, podemos escribir el límite como en su2e4
lugar. También nos ahorramos la molestia depow()
o similar.Pensándolo bien, comencemos en 3 ^ 10 y trabajemos hacia abajo con una división y prueba previa al bucle.
fuente
Haskell , 108 bytes
Pruébalo en línea!
fuente
APL (Dyalog) ,
4125 bytes9 bytes guardados gracias a @ Adám
Pruébalo en línea!
fuente
3⊥(b⊤6883)[3⊥⍉⎕⊤⍨3,b←9⍴3]
Jalea ,
2318 bytes-1 gracias a Erik the Outgolfer (reorganizar
3*⁵¤
a⁵3*
)Un enlace monádico que acepta una lista de dos enteros.
Pruébalo en línea! O ver un conjunto de pruebas .
⁹*%733%3
es un byte más largo queị⁽½Ṡb3¤
:(¿Cómo?
También 18:
⁵3*+b3ZḌ19*%74%3ḅ3
(usa una fórmula mágica después de obtener los trits en pares de convertir de la base diez y luego tomar 19 a esa potencia, módulo 74, módulo 3 para obtener los trits requeridos de la salida, que se encuentra usando una búsqueda en Python)fuente
y
0
s" incorporado)Python 2 ,
79656361 bytesGracias a Arnauld por su fórmula (-2 bytes).
Pruébalo en línea!
fuente
J , 37 bytes
Explicación:
Terminó siendo relativamente legible, tbh.
fuente
Python 2 ,
9087 bytesPruébalo en línea!
fuente
Carbón , 31 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Solución alternativa, también 31 bytes:
Pruébalo en línea! El enlace es a la versión detallada del código.
fuente
Ruby , 70 bytes
Pruébalo en línea!
Se descompone
a
yb
recursivamente hasta obtener 10 dígitos de cada uno.6883
da la mesa ternaria aplanada (invertida). Reconstruye de ternario a decimal multiplicando por3**(10-l)
.fuente
Cjam, 31 bytes
Pruébalo en línea!
fuente
J , 43 bytes
Ciertamente se puede jugar más al golf.
Explicación:
Pruébalo en línea!
fuente
Stax , 22 bytes
Ejecutar y depurarlo
fuente
Pyth
26 2524 bytesGuardado 1 byte, gracias a @ErikTheOutgolfer
Guarde otro byte, inspirado por la respuesta de @ JonathanAllan
La entrada es una lista de 2 elementos
[a,b]
. Pruébelo en línea aquí , o verifique todos los casos de prueba aquí .fuente
.T
puede serC
.K (ngn / k) ,
2522 bytesPruébalo en línea!
fuente
Japt ,
2423 bytesPoner la pelota en marcha en la carrera de Japt como idioma del mes . ¡Espero ser superado por esto!
Toma la entrada en orden inverso como una matriz de enteros (es decir,
[b,a]
).Intentalo
fuente
Perl 5
-p
, 102 bytesPruébalo en línea!
fuente
Wolfram Language (Mathematica) ,
757260 bytesPruébalo en línea!
versión sin golf:
Ambos
a
yb
se convierten en listas de diez trits, luego se usan por pares como un índice 2D en una tabla de búsqueda de números{1, 0, 0, 1, 0, 2, 2, 2, 1}
. El resultado se interpreta de nuevo como una lista de diez puntos y se convierte de nuevo a forma entera.La tabla de búsqueda está codificada como
IntegerDigits[6883,3]
, que es corta porque estamos reciclando elIntegerDigits
símbolo.fuente