Logika ternary yang seimbang
Terner biasanya nama lain untuk basis 3, yang mengatakan, setiap digit adalah 0
, 1
atau 2
, dan setiap tempat bernilai 3 kali lebih banyak sebagai tempat berikutnya.
Terner seimbang adalah modifikasi terner yang menggunakan digit -1
, 0
dan 1
. Ini memiliki keuntungan karena tidak memerlukan tanda. Setiap tempat masih bernilai 3 kali lipat dari tempat berikutnya. Oleh karena itu beberapa bilangan bulat positif pertama adalah [1]
, [1, -1]
, [1, 0]
, [1, 1]
, [1, -1, -1]
sementara beberapa bilangan bulat negatif pertama yang [-1]
, [-1, 1]
, [-1, 0]
, [-1, -1]
, [-1, 1, 1]
.
Anda memiliki tiga input x, y, z
. z
adalah baik -1
, 0
atau 1
, sementara x
dan y
dapat dari -3812798742493
ke 3812798742493
inklusif.
Langkah pertama adalah mengubah x
dan y
dari desimal ke terner seimbang. Ini akan memberi Anda 27 trit (digit TeRnary). Anda kemudian harus menggabungkan trit dari x
dan y
berpasangan menggunakan operasi ternary dan kemudian mengubah hasilnya kembali ke desimal.
Anda dapat memilih nilai z
peta mana dari masing-masing dari tiga operasi ternary ini:
A
: Diberi dua trit, jika salah satu adalah nol, maka hasilnya adalah nol, jika tidak hasilnya adalah -1 jika mereka berbeda atau 1 jika mereka sama.B
: Diberi dua trit, jika salah satu adalah nol, maka hasilnya adalah trit yang lain, jika tidak hasilnya adalah nol jika mereka berbeda atau negasi jika mereka sama.C
: Diberikan dua trit, hasilnya adalah nol jika mereka berbeda atau nilainya jika mereka sama.
Contoh. Misalkan x
ada 29
dan y
ada 15
. Dalam terner yang seimbang, ini menjadi [1, 0, 1, -1]
dan [1, -1, -1, 0]
. (23 zero trit yang tersisa dihilangkan karena singkatnya.) Setelah masing-masing operasi, mereka menjadi A
: [1, 0, -1, 0]
, B
: [-1, -1, 0, -1]
, C
: [1, 0, 0, 0]
. Dikonversi kembali ke desimal hasilnya 24
, -37
dan 27
masing - masing. Coba implementasi referensi berikut untuk lebih banyak contoh:
Implementasi referensi mengikuti langkah-langkah yang diberikan di atas tetapi Anda tentu saja bebas menggunakan algoritma apa pun yang menghasilkan hasil yang sama.
Ini adalah kode-golf , jadi program atau fungsi terpendek yang tidak melanggar celah standar akan menang!
z
harus salah satu-1,0,1
atau dapatkah kita memilih tiga nilai yang konsisten dan berbeda? Saya telah memilih1,2,3
jawaban saya, dan ada beberapa kebingungan tentang itu.Jawaban:
Bersih ,
231... 162 byteMenentukan fungsi
@
, mengambil tigaInt
dan memberiInt
.Operator memetakan sebagai
1 -> A, 0 -> B, -1 -> C
.Cobalah online!
Fungsi ini
$
melipat lambda di atas tempat digit[0..26]
, menjadi daftar digit ternary. Ia menggunakan kepala dari daftar yang dihasilkannya untuk menjaga perbedaan total saat ini dari angka yang diperlukan (itulah sebabnya ia dibuntuti sebelum kembali), dansign(2*t/3^p)
untuk menentukan digit saat ini untuk menghasilkan. Trik tanda setara denganif(abs(2*t)<3^p)0(sign t)
.sumber
$n
(saya pikir). Bisakah Anda menambahkan penjelasan untuk itu?Jelly , 39 byte
Sebuah program penuh mengambil dua argumen,
[x,y]
danz
... mana
z
adalah{A:-1, B:0, C:1}
yang mencetak hasilnya
Cobalah online! Catatan: metode golf membuatnya lambat - versi yang diubah ini lebih cepat (log dengan 3, ceil, dan kenaikan sebelum setiap produk Cartesian)
Bagaimana?
sumber
R ,
190172151 byteCobalah online!
Hitung semua kombinasi trit dan pilih yang benar. Ini benar-benar akan menimbulkan kesalahan memori
27
, karena3^27
jumlahnya agak besar, tetapi secara teori akan berhasil. TIO link hanya memiliki11
dukungan bilangan trit; Saya tidak yakin pada titik berapa kali kesalahan memori habis, dan saya tidak ingin Dennis marah kepada saya karena menyalahgunakan TIO!jawaban lama, 170 byte
Yang ini harus bekerja untuk semua input, walaupun dengan hanya integer 32-bit, ada kemungkinan ketidaktepatan karena R akan secara otomatis mengubahnya
double
.Cobalah online!
Dibutuhkan
-1
untukA
,0
untukB
, dan1
untukC
.Port pendekatan dalam jawaban ini untuk mengkonversi ke terner seimbang, meskipun karena kami dijamin tidak memiliki lebih dari 27 trit seimbang, itu dioptimalkan untuk itu.
R , 160 byte
Cobalah online!
Versi ini akan berakhir sangat lambat. Bogosort dari konversi basis, fungsi ini secara acak mengambil trit sampai entah bagaimana secara ajaib (
3^-54
kemungkinan itu terjadi) menemukan trit yang tepat untuka
danb
, dan kemudian melakukan operasi yang diperlukan. Ini pada dasarnya tidak akan pernah selesai.sumber
z
dibatasi untuk{-1, 0, 1}
.z
peta ke salah satu dari tiga operasi ternary ini: [...]z
adalah salah satu-1
,,0
atau1
, dan saya pikir itu adalah "nilai-nilaiz
" yang dimaksud.switch(z,...)
denganswitch(z+2,...)
sehingga akan menjadi perubahan sepele terlepas.Jelly , 47 byte
Cobalah online!
Program lengkap.
-1
=C
,0
=A
,1
=B
Argumen 1:
[x, y]
Argumen 3:
z
sumber
x
dany
dalam terner seimbang diperbolehkan: "x dan y dapat dari -3812798742493 menjadi 3812798742493 inklusif. Langkah pertama adalah mengubah x dan y dari terner desimal ke seimbang."