X + Y = Z - ma in quale base?


20

La sfida

Dato 3 numeri X, Ye Znella base di B, trovare Bun'ase in cui l'aggiunta di Xe Yrendimenti Z. Gli ingressi x = 20, Y = 12e Z = 32potrebbe produrre 5a causa 20 + 12 = 32della base 5.

  • Si può presumere che ci sarà sempre una base in cui l'aggiunta è corretta (ci sono casi in cui non esiste una base, grazie a @ MasonWheeler e @ Not That Charles per alcuni esempi).
  • La base più bassa possibile è 1. Puoi usare 1 o 0 come cifre in unario, ma non puoi mescolarli.

I / O

  • Le cifre dei numeri di input saranno numeri interi non negativi.
  • Si può presumere che i numeri di input contengano zeri iniziali, quindi hanno una lunghezza specifica (o comunque uguale).
  • Puoi prendere i numeri nel formato più conveniente, purché non sia preelaborato. Ciò include il formato complessivo dei tre numeri di input e il formato delle cifre di ciascuno di quei numeri. Si prega di chiarire quale formato si utilizza.
  • Se esistono più basi possibili, è possibile produrre tutte o solo una di esse.
  • Si può presumere che la base e i numeri di input rientrino nei limiti numerici della propria lingua.

Regole

Casi test

Il formato di input qui è un elenco di numeri interi per rappresentare ciascun numero. Le tre liste sono separate da virgole.
Si noti che a volte sono possibili più basi. Qui viene emessa una sola soluzione (casuale).

[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

Puoi generare ulteriori casi di test con questo programma Pyth . Immettere una base sulla prima riga e i valori decimali per Xe Ysulle due righe seguenti.
Inoltre puoi usare questo programma Pyth per creare più casi di test contemporaneamente usando valori casuali. Basta inserire la quantità desiderata di casi di test nell'input.

Buona programmazione!


Risposte:


12

Gelatina, 16 11 7 byte

_/N,‘FṀ

Questo approccio è fortemente basato sulla risposta Octave di @ beaker .

Il formato di input è Z, Y, X , con un ordine di cifre little-endian, usando la cifra 0 per unario.

Provalo online! o eseguire tutti i casi di test .

Come funziona

Piuttosto che incrementale test basi potenziali, ciò risolve il polinomio che corrisponde alla matrice P: = X + Y - Z . Ciò restituisce il coefficiente più grande di P ≠ 0 - che deve essere una radice, poiché esiste almeno una base valida - o la cifra più alta di X , Y e Z , incrementata di 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.

11

Pyth, 13 byte

f!-FiRTQheSsQ

Si aspetta Z, seguito da X e Y.

Suite di test

In sostanza, testiamo ogni base possibile, partendo da una cifra in più rispetto alla cifra più grande. Il test consiste nel convertire ogni numero nella base in questione, quindi piegare la sottrazione sui numeri e negare logicamente il risultato.


5
Quindi questo prende poco attraente come zero?
Finanzi la causa di Monica il

3
@QPaysTaxes Immagino che intendessi unario e sì.
Mego

4
@Mego intendevo unario, correzione automatica significava qualunque cosa volesse dire.
Finanzi la causa di Monica il

10

Ottava, 67 75 38 32 byte

Perché "loop over TUTTE le cose" è troppo lavoro.

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

Richiede 0 di riempimento per rendere le matrici di input della stessa dimensione, ad esempio:

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

Poiché 0viene utilizzato per il riempimento, 1viene utilizzato come token per unario.

(Grazie a @DenkerAffe per i chiarimenti sulla domanda.)

Esempio eseguito su ideone .


Breve spiegazione:

Prendi un caso che non comporta alcun trasporto:

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

In questo caso non ci sono restrizioni sulla base purché sia ​​maggiore di qualsiasi "cifra". Prendi semplicemente l'elemento max di z(as z >= x,y) e aggiungi 1 (o qualsiasi numero intero positivo).

Nel caso di un carry-out (senza carry-in), abbiamo superato la base in una delle colonne e la differenza tra x+yed zè la base:

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

Se anche la somma della seconda colonna superasse la base, richiedendo un carry-in oltre al carry-in, il suo valore sarebbe base+(-1). Avremo avuto una colonna da qualche parte a destra con un carry-out e nessun carry-in che abbia il valore di base (maggiore) corretto.


9

Haskell, 90 73 byte

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

Esempio di utilizzo: f [[3, 247],[7, 438],[11, 221]]-> 464.

Prova semplicemente tutte le basi b(dove bè maggiore del massimo delle cifre). Scegli il primo dove x+y==z.

Modifica: @xnor ha salvato molti byte eliminando principalmente il file import Data.Digits.


1
Se unDigits bfa quello che penso, dovrebbe essere più breve da implementare come foldl(\x y->b*x+y)0o in modo equivalente foldl((+).(b*))0.
xnor

1
E 'più breve per prendere il maximumdopo appiattimento: b<-[1+(maximum$id=<<l)..].
xnor

1
Oppure, il test per maximumas b<-[1..],all(<b)$id=<<l.
xnor

Funziona con input in cui la base 1 è l'unica soluzione? Non posso eseguirlo con i compilatori online che ho trovato, quindi non posso testare me stesso.
Denker,

@DenkerAffe: le cifre ddi un bnumero base non dovrebbero essere 0 <= d < b, quindi per base 1l'unica cifra possibile è 0? f [[0],[0],[0,0]]valuta 1.
nimi,

8

MATL , 20 byte

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

L'input è nel formato (notare le parentesi graffe esterne):

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

Funziona con la versione corrente (15.0.0) .

Provalo online!

Spiegazione

`        % 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

8

MATL, 13 12 byte

--X>t~1G+hX>

Traduzione della mia risposta Octave in MATL. (La mia prima risposta MATL!)

  • L'ordine di input è Z, X, Y(o Z, Y, Xse preferisci, sono facile)
  • Le matrici di input sono riempite di zero con uguale lunghezza
  • Prende unatactives come 1

Provalo online!

Spiegazione

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

3
unario è molto poco attraente per la correzione automatica in questi giorni
Charlie
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.