El reto
Dado 3 números X
, Y
y Z
en base B
, encuentra un B
ase en el que la suma de X
y Y
rinde Z
. Las entradas x = 20
, Y = 12
y Z = 32
podrían ceder 5
porque 20 + 12 = 32
en la base 5.
- Puede suponer que siempre habrá una base en la que la adición sea correcta (hay casos en los que no existe una base, gracias a @ MasonWheeler y @ Not that Charles por algunos ejemplos de eso).
- La base más baja posible es 1. Puede usar 1s o 0s como dígitos en unario, pero no puede mezclarlos.
I / O
- Los dígitos de los números de entrada serán enteros no negativos.
- Puede suponer que los números de entrada contienen ceros iniciales, por lo que tienen una longitud específica (o la misma).
- Puede tomar los números en el formato más conveniente, siempre que no esté preprocesado. Esto incluye el formato general de los tres números de entrada y el formato de los dígitos de cada uno de esos números. Deje en claro qué formato utiliza.
- Si hay varias bases posibles, puede generar todas o solo una de ellas.
- Puede suponer que la base y los números de entrada estarán dentro de los límites numéricos de su idioma.
Reglas
- Función o programa completo permitido.
- Reglas predeterminadas para entrada / salida.
- Se aplican lagunas estándar .
- Este es el código de golf , por lo que gana el conteo de bytes más bajo. Tiebreaker es una presentación anterior.
Casos de prueba
El formato de entrada aquí es una lista de enteros para representar cada número. Las tres listas están separadas por comas.
Tenga en cuenta que a veces hay varias bases posibles. Aquí solo se emite una solución (aleatoria).
[12, 103], [4, 101], [16, 204] -> 349 [4, 21, 25], [5, 1, 20], [9, 23, 17] -> 28 [16, 11], [25, 94], [41, 105] -> 147 [2, 140], [21, 183], [24, 100] -> 223 [8, 157], [1, 28], [9, 185] -> 227 [2, 158], [88], [3, 12] -> 234 [8, 199], [1, 34], [9, 233] -> 408 [3, 247], [7, 438], [11, 221] -> 464 [3, 122], [3, 2], [6, 124] -> 480 [6, 328], [3, 31], [9, 359] -> 465 [2, 1, 0, 0, 0, 0], [1, 2, 0, 0, 1, 0, 1, 0], [1, 2, 2, 1, 1, 0, 1, 0] - > 3 [16, 105], [16, 120], [33, 84] -> 141 [15, 60], [9, 30], [24, 90] -> 268 [2, 0], [1, 2], [3, 2] -> 5 [1, 3, 3, 7], [1, 2, 3], [1, 4, 6, 0] -> 10 [0], [1, 12, 8], [1, 12, 8] -> 16 [1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1], [1, 0, 0, 1, 0, 1, 1, 1, 0, 0 , 1], [1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0] -> 2 [1], [1], [1,1] -> 1
Puede generar casos de prueba adicionales con este programa Pyth . Ingrese una base en la primera línea y los valores decimales para X
y Y
en las siguientes dos líneas.
También puede usar este programa Pyth para crear múltiples casos de prueba a la vez utilizando valores aleatorios. Simplemente ingrese la cantidad deseada de casos de prueba en la entrada.
¡Feliz codificación!
Respuestas:
Jalea,
16117 bytesEste enfoque se basa en gran medida en la respuesta Octave de @ beaker .
El formato de entrada es Z, Y, X , con orden de dígitos little-endian, utilizando el dígito 0 para unario.
Pruébalo en línea! o ejecutar todos los casos de prueba .
Cómo funciona
En lugar de forma incremental prueba bases potenciales, esto resuelve el polinomio que corresponde a la matriz P: = X + Y - Z . Esto devuelve el coeficiente más grande de P ≠ 0 , que debe ser una raíz, ya que hay al menos una base válida, o el dígito más alto de X , Y y Z , incrementado en 1 .
fuente
Pyth, 13 bytes
Espera Z, seguido de X e Y.
Banco de pruebas
Esencialmente, probamos cada base posible, comenzando en uno más que el dígito más grande. La prueba es que convertimos cada número a la base en cuestión, luego plegamos la resta sobre los números y negamos lógicamente el resultado.
fuente
Octava,
67753832 bytesPorque "recorrer todas las cosas" es demasiado trabajo.
Requiere 0 relleno para que las matrices de entrada tengan el mismo tamaño, por ejemplo:
Como
0
se usa para relleno,1
se usa como token para unario.(Gracias a @DenkerAffe por aclarar la pregunta).
Ejecución de muestra en ideone .
Breve explicación:
Tome un caso que no involucra acarreos:
En este caso no hay restricciones en la base siempre que sea mayor que cualquier "dígito". Simplemente tome el elemento máximo de
z
(asz >= x,y
) y agregue 1 (o cualquier número entero positivo).En el caso de un arrastre (sin arrastre), hemos excedido la base en una de las columnas y la diferencia entre
x+y
yz
es la base:Si la suma de la segunda columna también excediera la base, requiriendo un traspaso y el traspaso, su valor sería
base+(-1)
. Habremos tenido una columna en algún lugar a la derecha con un arrastre y ningún arrastre que tenga el valor base correcto (mayor).fuente
Haskell,
9073 bytesEjemplo de uso:
f [[3, 247],[7, 438],[11, 221]]
->464
.Simplemente pruebe todas las bases
b
(dondeb
es mayor que el máximo de los dígitos). Elige el primero dondex+y==z
.Editar: @xnor ahorró muchos bytes al deshacerse principalmente de
import Data.Digits
.fuente
unDigits b
hace lo que pienso, debería ser más corto de implementar comofoldl(\x y->b*x+y)0
o equivalentefoldl((+).(b*))0
.maximum
después de aplanamiento:b<-[1+(maximum$id=<<l)..]
.maximum
comob<-[1..],all(<b)$id=<<l
.d
de unb
número base0 <= d < b
, por lo que para la base1
el único dígito posible es0
?f [[0],[0],[0,0]]
evalúa a1
.MATL , 20 bytes
La entrada está en el formato (tenga en cuenta las llaves exteriores):
Esto funciona en la versión actual (15.0.0) .
Pruébalo en línea!
Explicación
fuente
MATL,
1312 bytesTraducción de mi respuesta Octave a MATL. (¡Mi primera respuesta MATL!)
Z, X, Y
(oZ, Y, X
si lo prefiere, soy fácil)Pruébalo en línea!
Explicación
fuente