X + Y = Z - pero ¿en qué base?

20

El reto

Dado 3 números X, Yy Zen base B, encuentra un Base en el que la suma de Xy Yrinde Z. Las entradas x = 20, Y = 12y Z = 32podrían ceder 5porque 20 + 12 = 32en 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

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 Xy Yen 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!

Denker
fuente

Respuestas:

12

Jalea, 16 11 7 bytes

_/N,‘FṀ

Este 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 .

_/N,‘FṀ  Main link. Argument: [Z, Y, X]

_/       Reduce by subtraction; yield Z - X - Y.
         This works since Z must have at least as many digits as X and Y.
  N      Negate to yield X + Y - Z.
    ‘    Yield [Z, Y, X], with all digits increments by 1.
   ,     Pair the results to the left and to the right.
     F   Flatten the resulting, nested list.
      Ṁ  Compute the maximum.
Dennis
fuente
11

Pyth, 13 bytes

f!-FiRTQheSsQ

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.

isaacg
fuente
55
Entonces, ¿este no es atractivo como ceros?
Fondo de la demanda de Mónica
3
@QPaysTaxes Supongo que querías decir unario, y sí.
Mego
44
@Mego quise decir unario, autocorrección significaba lo que quisiera significar.
Fondo de la demanda de Mónica
10

Octava, 67 75 38 32 bytes

Porque "recorrer todas las cosas" es demasiado trabajo.

@(x,y,z)max([m=max(x+y-z) z])+~m

Requiere 0 relleno para que las matrices de entrada tengan el mismo tamaño, por ejemplo:

[2, 158],[88],[3, 12]
becomes
[2, 158],[0, 88],[3, 12]

Como 0se usa para relleno, 1se 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:

   [ 8, 199]
 + [ 1,  34]
 -------------
     9, 233
 - [ 9, 233]
 -------------
     0,   0 --- no carries

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(as z >= 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+yy zes la base:

   [ 2, 140]
 + [21, 183]
--------------
    23, 323
 - [24, 100]
 -------------
    -1  223
     ^   ^------ base
     |---------- carry in

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).

cubilete
fuente
9

Haskell, 90 73 bytes

f l=[b|b<-[1..],all(<b)$id=<<l,[x,y,z]<-[foldl((+).(b*))0<$>l],x+y==z]!!0

Ejemplo de uso: f [[3, 247],[7, 438],[11, 221]]-> 464.

Simplemente pruebe todas las bases b(donde bes mayor que el máximo de los dígitos). Elige el primero donde x+y==z.

Editar: @xnor ahorró muchos bytes al deshacerse principalmente de import Data.Digits.

nimi
fuente
1
Si unDigits bhace lo que pienso, debería ser más corto de implementar como foldl(\x y->b*x+y)0o equivalente foldl((+).(b*))0.
xnor
1
Es más corto para tomar el maximumdespués de aplanamiento: b<-[1+(maximum$id=<<l)..].
xnor
1
O, la prueba de maximumcomo b<-[1..],all(<b)$id=<<l.
xnor
¿Funciona esto para la entrada donde la base 1 es la única solución? No puedo ejecutar esto con los compiladores en línea que encontré, así que no puedo ponerme a prueba.
Denker
@DenkerAffe: ¿no deberían ser los dígitos dde un bnúmero base 0 <= d < b, por lo que para la base 1el único dígito posible es 0? f [[0],[0],[0,0]]evalúa a 1.
nimi
8

MATL , 20 bytes

`GY:@XJZQ2:"wJZQ-]]J

La entrada está en el formato (tenga en cuenta las llaves exteriores):

{[4, 21, 25],[5, 1, 20],[9, 23, 17]}

Esto funciona en la versión actual (15.0.0) .

Pruébalo en línea!

Explicación

`        % do...while index
  G      %   push input. First time pushed nothing but asks for input implicitly
  Y:     %   unpack the cell array, pushing the three numeric arrays
  @      %   loop index: candidate base
  XJ     %   copy into clipboard J
  ZQ     %   evaluate polynomial: interpret third array in that base
  2:"    %   for loop: do this twice (subtract the other numbers from the third)
    w    %     swap, to process another array
    J    %     push base
    ZQ   %     evaluate polynomial: interpret array in that base
    -    %     subtract
  ]      %   end for loop. A result 0 indicates a solution has been found
]        % end do....while loop. Exit if top of stack is 0
J        % push found base. Implicitly display
Luis Mendo
fuente
8

MATL, 13 12 bytes

--X>t~1G+hX>

Traducción de mi respuesta Octave a MATL. (¡Mi primera respuesta MATL!)

  • El orden de entrada es Z, X, Y(o Z, Y, Xsi lo prefiere, soy fácil)
  • Las matrices de entrada están rellenadas con ceros a longitudes iguales
  • Toma poco atractivos como 1

Pruébalo en línea!

Explicación

--X>t~1G+hX>

--            % M = Z - X - Y
  X>          % P = max(M)
    t~        % Duplicate and negate
      1G      % Push 1st argument (Z) 
        +     % ~P + Z
         h    % Concatenate [P (~P + Z)]
          X>  % Return max
cubilete
fuente
3
unary es muy poco atractivo por AutoCorrect en estos días
Charlie