Basis seimbang:
Basis seimbang pada dasarnya sama dengan basis normal, kecuali bahwa digit bisa positif atau negatif, sedangkan dalam basis normal digit hanya bisa positif.
Dari sini, basis basa yang seimbang b
dapat direpresentasikan sebagai balb
- basa yang seimbang 4 = bal4
.
Dalam definisi tantangan ini, rentang angka dalam basis basis yang seimbang b
adalah dari -(k - 1)
ke b - k
, di mana
k = ceil(b/2)
Contoh rentang angka di berbagai basis seimbang:
bal10:
k = ceil(10/2) = 5
range = -(5 - 1) to 10 - 5 = -4 to 5
= -4, -3, -2, -1, 0, 1, 2, 3, 4, 5
bal5:
k = ceil(5/2) = 3
range = -(3 - 1) to 5 - 3 = -2 to 2
= -2, -1, 0, 1, 2
Representasi angka dalam basis seimbang pada dasarnya sama dengan basis normal. Misalnya, representasi angka 27
(basis 10) ke bal4
(basis seimbang 4) adalah 2 -1 -1
, karena
2 -1 -1 (bal4)
= 2 * 4^2 + -1 * 4 + -1 * 1
= 32 + (-4) + (-1)
= 27 (base 10)
Tugas:
Tugas Anda adalah, diberi tiga input:
- nomor yang akan dikonversi (
n
)- input ini bisa fleksibel, lihat "Fleksibilitas I / O"
- basis yang
n
saat ini ada di (b
) - basis yang
n
akan dikonversi menjadi (c
)
Mana 2 < b, c < 1,000
.
Kembalikan angka dalam c
representasi basis seimbang n
. Outputnya juga bisa fleksibel.
Program / fungsi harus menentukan panjang dari n
input itu sendiri.
Fleksibilitas I / O:
Input n
dan output Anda dapat direpresentasikan dengan cara berikut:
- definisi bahasa Anda tentang sebuah array
- string, dengan karakter apa saja sebagai pemisah (mis. spasi, koma)
Contoh:
Perhatikan bahwa ini menggunakan array Python sebagai n
dan output. Anda dapat menggunakan apa pun yang cocok dengan bahasa Anda, asalkan sesuai dengan definisi "I / O Fleksibilitas".
[2, -1, -1] 4 7 = [1, -3, -1]
[1, 2, 3, 4] 9 5 = [1, 2, 2, -1, 2]
[10, -9, 10] 20 5 = [1, 1, 1, -2, 1, 0]
Ini adalah kode-golf , jadi kode terpendek dalam byte menang!
sumber
[1,1,1,-2,1,0]
Jawaban:
Mathematica, 85 byte
Penjelasan
Konversi
#1
(1 tersirat - input 1, daftar digit) menjadi basis integer#2
(input 2).Ubah integer yang dihasilkan menjadi basis
#3
(input 3), buat daftar digit.Berganti-ganti daftar digit; jika angka lebih besar dari lantai (
#3
/ 2), maka kurangi#3
dari itu dan tambahkan1
ke digit ke kiri. Jika tidak ada apa-apa di sebelah kiri, masukkan0
dan tambahkan1
.sumber
{...}
karena hanya ada satu aturan penggantian.p___
. Apakah ini menemukan yang terpendekp___
diikuti oleh salah satua_,b_
ataub_
, atau apakah itu memeriksa seluruh pola yang memerlukan masing-masing pola opsional dan kemudian secara progresif menjatuhkan pola-pola opsional sampai menemukan kecocokan (atau beberapa opsi ketiga)?FixedPointList[k=#3;#/.{p___,a_:0,b_,q___}/;b>⌊k/2⌋:>{p,a+1,b-k,q}&, #~FromDigits~#2~IntegerDigits~#3]&
.{p___,a_,b_,q___}
dicocokkan terlebih dahulu (untuk semua kemungkinanp
), dan kemudian{p___,b_,q___}
dicocokkan. Penggantian kedua hanya berlaku ketikab
berada di awal karena jika adab
di tengah yang memenuhi syarat,{p___,a_,b_,q___}
akan cocok dengan itu sebagai gantinya.Perl 6 , 121 byte
Solusi brute-force lambat.
Bagaimana itu bekerja:
map {[ .base(c).comb]}, 0..*
- Hasilkan urutan malas dari bilangan asli dalam basisc
, dengan masing-masing angka direpresentasikan sebagai array angka.$_ - ($_ > floor c/2) * c
- Transformasikan dengan mengurangic
dari setiap digit yang lebih besar dari lantai (c / 2).first { f(b, n) == f(c, $_) }, ...
- Dapatkan larik pertama dari urutan itu yang ketika ditafsirkan sebagaic
nomor basis , sama dengan array input yangn
ditafsirkan sebagai basisb
nomor .sub f { sum [R,](@^n) Z* ($^b X** 0..*) }
- Fungsi helper yang mengubah array@^n
menjadi angka dalam basis$^b
, dengan mengambil jumlah produk yang dihasilkan dengan cara zip array terbalik dengan urutan kekuatan basis.sumber
JavaScript (ES6), 89 byte
100 byte bekerja untuk nilai negatif dari
n
.sumber
Mathematica,
118114 byte⌊
dan⌋
adalah karakter 3-byteU+230A
danU+230B
, masing-masing. Konversi#3
ke basis10
dari basis#2
, lalu dikonversi ke basis#
(sehingga urutan argumen dibalik dari contoh). Jika ada digit yang lebih besar dari digit maksimum yang diizinkank=⌊#/2⌋
, kurangi digit itu dengan#
dan tambah digit berikutnya ke atas (mungkin perlu dituliskan sebelumnya1
). Terus lakukan ini sampai semua digit kurang darik
.sumber