Tantangan
Diberikan 3 angka X
, Y
dan Z
pada dasarnya B
, temukan B
ase di mana penambahan X
dan Y
hasil Z
. Masukan x = 20
, Y = 12
dan Z = 32
dapat menghasilkan 5
karena 20 + 12 = 32
dalam 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 kode-golf , 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 X
dan Y
pada 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!
Jawaban:
Jelly,
16117 bytePendekatan 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 .
sumber
Pyth, 13 byte
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.
sumber
Oktaf,
67753832 byteKarena "mengulangi SEMUA hal" terlalu banyak bekerja.
Membutuhkan 0 padding untuk membuat array array dengan ukuran yang sama, misalnya:
Karena
0
digunakan untuk padding,1
digunakan sebagai token untuk unary.(Terima kasih kepada @DenkerAffe untuk klarifikasi dalam pertanyaan.)
Sampel dijalankan pada ideone .
Penjelasan Singkat:
Ambil kasing yang tidak membawa bagasi:
Dalam hal ini tidak ada batasan pada basis selama itu lebih besar daripada "digit" apa pun. Cukup ambil elemen maks
z
(asz >= 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+y
danz
adalah basis: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).sumber
Haskell,
9073 byteContoh penggunaan:
f [[3, 247],[7, 438],[11, 221]]
->464
.Cukup coba semua basis
b
(di manab
lebih besar dari maksimum digit). Pilih yang pertama di manax+y==z
.Sunting: @xnatau menyimpan banyak byte dengan cara menyingkirkannya
import Data.Digits
.sumber
unDigits b
melakukan apa yang saya pikirkan, itu harus lebih pendek untuk diterapkan sebagaifoldl(\x y->b*x+y)0
atau setarafoldl((+).(b*))0
.maximum
setelah merata:b<-[1+(maximum$id=<<l)..]
.maximum
asb<-[1..],all(<b)$id=<<l
.d
dari basisb
nomor menjadi0 <= d < b
, sehingga untuk basis1
satu-satunya yang mungkin digit adalah0
?f [[0],[0],[0,0]]
mengevaluasi ke1
.MATL , 20 byte
Input dalam format (perhatikan kurung kurawal luar):
Ini berfungsi dalam versi saat ini (15.0.0) .
Cobalah online!
Penjelasan
sumber
MATL,
1312 byteTerjemahan dari jawaban Oktaf saya ke MATL. (Jawaban MATL pertama saya!)
Z, X, Y
(atauZ, Y, X
jika Anda suka, saya mudah)Cobalah online!
Penjelasan
sumber