Muchos lenguajes de programación proporcionan operadores para manipular los dígitos binarios (base-2) de los enteros. Aquí hay una forma de generalizar estos operadores a otras bases:
Vamos x y y ser números de un solo dígito en la base B . Definir el operador unario ~
y operadores binarios &
, |
y ^
tal que:
- ~ x = (B - 1) - x
- x & y = min (x, y)
- x | y = max (x, y)
- x ^ y = (x & ~ y) | (y & ~ x)
Tenga en cuenta que si B = 2, obtenemos los operadores NOT, AND, OR y XOR a nivel de bits.
Para B = 10, obtenemos la tabla "XOR decimal":
^ │ 0 1 2 3 4 5 6 7 8 9
──┼────────────────────
0 │ 0 1 2 3 4 5 6 7 8 9
1 │ 1 1 2 3 4 5 6 7 8 8
2 │ 2 2 2 3 4 5 6 7 7 7
3 │ 3 3 3 3 4 5 6 6 6 6
4 │ 4 4 4 4 4 5 5 5 5 5
5 │ 5 5 5 5 5 4 4 4 4 4
6 │ 6 6 6 6 5 4 3 3 3 3
7 │ 7 7 7 6 5 4 3 2 2 2
8 │ 8 8 7 6 5 4 3 2 1 1
9 │ 9 8 7 6 5 4 3 2 1 0
Para números de varios dígitos, aplique el operador de un solo dígito dígito por dígito. Por ejemplo, 12345 ^ 24680 = 24655, porque:
- 1 ^ 2 = 2
- 2 ^ 4 = 4
- 3 ^ 6 = 6
- 4 ^ 8 = 5
- 5 ^ 0 = 5
Si los operandos son de diferentes longitudes, rellene el más corto con ceros a la izquierda.
El reto
Escriba, en el menor número de bytes posible, un programa o función que tome como entrada dos enteros (que se puede suponer que están entre 0 y 999999999, inclusive) y genera el "XOR decimal" de los dos números como se definió anteriormente.
Casos de prueba
- 12345, 24680 → 24655
- 12345, 6789 → 16654
- 2019, 5779 → 5770
- 0, 999999999 → 999999999
- 0, 0 → 0
09
un resultado aceptable para una entrada de90, 99
?A^B^B=A
a^b=b^a
ya^b^b=a
para bases con un divisor primo imparRespuestas:
Jalea , 14 bytes
Pruébalo en línea!
Cuadrícula de todos los pares de un solo dígito
Un enlace monádico que toma una lista de dos enteros como argumento y devuelve un entero.
Explicación
Si una matriz de dígitos es aceptable entrada / salida:
Jalea , 12 bytes
Pruébalo en línea!
fuente
Pyth , 31 bytes
Pruébalo en línea!
fuente
Python 2 , 71 bytes
Pruébalo en línea!
fuente
Adelante (gforth) , 111 bytes
Pruébalo en línea!
Explicación del código
fuente
C # (compilador interactivo de Visual C #) , 75 bytes
Guardado 6 bytes gracias a @someone
Pruébalo en línea!
fuente
Zip
, no puede usarlo ya que trunca automáticamente la colección más larga a la longitud de la más cortaPHP ,
111109 bytesPruébalo en línea!
Pruebas: ¡ Pruébelo en línea!
Si llamamos a los dígitos, queremos XOR
$a
y$b
descubrí que:$a
es menos de 5,XOR = min(9-$a, max($a, $b))
$a
es igual o mayor que 5,XOR = min($a, max(9-$a, 9-$b))
Así que implementé esta lógica más un truco para manejar números con diferentes longitudes. Tomo cada formulario dígitos al final de los dos números de entrada (con índices negativos como
input[-1]
,input[-2]
, ...) y calcular el XOR y poner el resultado en el orden inverso en una cadena que se imprimirá al final. Como tomo dígitos del final de los números, los resultados de XOR deben agruparse en orden inverso. Cuando una de las entradas es más larga que la otra, el índice negativo en una entrada más corta da como resultado una cadena vacía que es igual a 0.fuente
Retina ,
8559 bytesPruébalo en línea! Toma la entrada como líneas separadas, pero el enlace es para probar una suite que reformatea la entrada separada por comas. Explicación:
Almohadilla izquierda con ceros ambas líneas a la misma longitud.
Ordene cada dígito por su índice de columna, luego elimine la nueva línea. Esto tiene el efecto de emparejar los dígitos juntos de la misma manera que lo haría una transposición.
Aplique por separado a cada par de dígitos, uniendo los resultados.
Duplicar el par.
Invierta el segundo dígito del primer par y el primer dígito del segundo, por lo que ahora tenemos
x ~y
en una línea y~x y
en la otra.Ordene los dígitos de cada línea en orden, de modo que el primer dígito sea ahora
x & ~y
o~x & y
según corresponda.Invertir ordenar las líneas.
Y extraiga el primer dígito, que es el resultado deseado.
fuente