X + Y = Z - tetapi di pangkalan mana?

20

Tantangan

Diberikan 3 angka X, Ydan Zpada dasarnya B, temukan Base di mana penambahan Xdan Yhasil Z. Masukan x = 20, Y = 12dan Z = 32dapat menghasilkan 5karena 20 + 12 = 32dalam basis 5.

  • Anda dapat berasumsi bahwa akan selalu ada pangkalan di mana tambahannya benar (ada kasus di mana tidak ada pangkalan, terima kasih kepada @ MasonWheeler dan @ Bukan Charles untuk beberapa contohnya).
  • Basis terendah yang mungkin adalah 1. Anda dapat menggunakan 1s atau 0s sebagai digit di unary, tetapi Anda mungkin tidak mencampurnya.

I / O

  • Digit nomor input akan berupa bilangan bulat non-negatif.
  • Anda dapat berasumsi bahwa angka-angka input berisi nol di depan, sehingga memiliki panjang spesifik (atau semua sama).
  • Anda dapat mengambil angka dalam format yang paling nyaman, asalkan angka itu tidak diproses terlebih dahulu. Ini termasuk format keseluruhan dari tiga angka input dan format digit masing-masing angka tersebut. Harap jelaskan format mana yang Anda gunakan.
  • Jika ada beberapa pangkalan yang memungkinkan, Anda dapat menampilkan semua atau hanya satu dari mereka.
  • Anda dapat mengasumsikan bahwa basis dan nomor input akan berada dalam batas angka bahasa Anda.

Aturan

  • Fungsi atau program lengkap diizinkan.
  • Aturan default untuk input / output.
  • Celah standar berlaku.
  • Ini adalah , sehingga byte-count terendah akan menang. Tiebreak adalah pengiriman sebelumnya.

Uji kasus

Format input di sini adalah daftar bilangan bulat untuk mewakili setiap angka. Tiga daftar dipisahkan oleh koma.
Perhatikan bahwa terkadang ada beberapa basis yang memungkinkan. Hanya satu solusi (acak) yang dihasilkan di sini.

[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, 0, 0, 1], [1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0 , 1], [1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0] -> 2
[1], [1], [1,1] -> 1

Anda dapat membuat test case tambahan dengan program Pyth ini . Masukkan basis pada baris pertama dan nilai desimal untuk Xdan Ypada dua baris berikut.
Anda juga dapat menggunakan program Pyth ini untuk membuat beberapa uji sekaligus dengan menggunakan nilai acak. Masukkan saja jumlah test case yang diinginkan pada input.

Selamat Coding!

Denker
sumber

Jawaban:

12

Jelly, 16 11 7 byte

_/N,‘FṀ

Pendekatan ini sangat didasarkan pada jawaban Oktaf @ beaker's .

Format input adalah Z, Y, X , dengan urutan digit little-endian, menggunakan digit 0 untuk unary.

Cobalah online! atau jalankan semua test case .

Bagaimana itu bekerja

Daripada secara bertahap menguji basis potensi, memecahkan ini jumlahnya banyak yang berkorespondensi ke array P: = X + Y - Z . Ini mengembalikan salah satu koefisien terbesar dari P ≠ 0 - yang harus menjadi root, karena setidaknya ada satu basis yang valid - atau digit tertinggi dari X , Y dan Z , bertambah 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
sumber
11

Pyth, 13 byte

f!-FiRTQheSsQ

Harapkan Z, diikuti oleh X dan Y.

Suite uji

Pada dasarnya, kami menguji setiap basis yang mungkin, mulai dari satu lebih dari digit terbesar. Tesnya adalah kita mengonversi masing-masing angka ke basis yang dimaksud, lalu melipat pengurangan ke angka-angka itu, dan secara logis meniadakan hasilnya.

isaacg
sumber
5
Jadi yang ini dianggap tidak menarik sebagai nol?
Dana Gugatan Monica
3
@ QPaysTaxes Saya kira Anda bermaksud tidak sadar, dan ya.
Mego
4
@Mego saya maksudkan unary, koreksi otomatis berarti apa pun yang diinginkannya.
Dana Gugatan Monica
10

Oktaf, 67 75 38 32 byte

Karena "mengulangi SEMUA hal" terlalu banyak bekerja.

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

Membutuhkan 0 padding untuk membuat array array dengan ukuran yang sama, misalnya:

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

Karena 0digunakan untuk padding, 1digunakan sebagai token untuk unary.

(Terima kasih kepada @DenkerAffe untuk klarifikasi dalam pertanyaan.)

Sampel dijalankan pada ideone .


Penjelasan Singkat:

Ambil kasing yang tidak membawa bagasi:

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

Dalam hal ini tidak ada batasan pada basis selama itu lebih besar daripada "digit" apa pun. Cukup ambil elemen maks z(as z >= x,y) dan tambahkan 1 (atau bilangan bulat positif).

Dalam hal carry-out (tanpa carry-in), kami telah melampaui basis di salah satu kolom dan perbedaan antara x+ydan zadalah basis:

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

Jika jumlah kolom kedua juga melebihi basis, membutuhkan carry-out serta carry-in, nilainya akan menjadi base+(-1). Kami akan memiliki kolom di suatu tempat di sebelah kanan dengan carry-out dan tidak ada carry-in yang memiliki nilai dasar yang benar (lebih besar).

gelas kimia
sumber
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

Contoh penggunaan: f [[3, 247],[7, 438],[11, 221]]-> 464.

Cukup coba semua basis b(di mana blebih besar dari maksimum digit). Pilih yang pertama di mana x+y==z.

Sunting: @xnatau menyimpan banyak byte dengan cara menyingkirkannya import Data.Digits.

nimi
sumber
1
Jika unDigits bmelakukan apa yang saya pikirkan, itu harus lebih pendek untuk diterapkan sebagai foldl(\x y->b*x+y)0atau setara foldl((+).(b*))0.
xnor
1
Itu lebih pendek untuk mengambil maximumsetelah merata: b<-[1+(maximum$id=<<l)..].
xnor
1
Atau, tes untuk maximumas b<-[1..],all(<b)$id=<<l.
xnor
Apakah ini berfungsi untuk input di mana basis 1 adalah satu-satunya solusi? Saya tidak dapat menjalankan ini dengan kompiler online yang saya temukan, jadi saya tidak dapat menguji diri saya.
Denker
@DenkerAffe: tidak harus angka ddari basis bnomor menjadi 0 <= d < b, sehingga untuk basis 1satu-satunya yang mungkin digit adalah 0? f [[0],[0],[0,0]]mengevaluasi ke 1.
nimi
8

MATL , 20 byte

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

Input dalam format (perhatikan kurung kurawal luar):

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

Ini berfungsi dalam versi saat ini (15.0.0) .

Cobalah online!

Penjelasan

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

MATL, 13 12 byte

--X>t~1G+hX>

Terjemahan dari jawaban Oktaf saya ke MATL. (Jawaban MATL pertama saya!)

  • Pesanan input adalah Z, X, Y(atau Z, Y, Xjika Anda suka, saya mudah)
  • Array input berlapis-nol dengan panjang yang sama
  • Tidak menarik sebagai 1

Cobalah online!

Penjelasan

--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
gelas kimia
sumber
3
unary sangat tidak menarik oleh AutoCorrect hari ini
Charlie