Kredit untuk gagasan tantangan masuk ke @AndrewPiliser. Proposal aslinya di kotak pasir ditinggalkan dan karena dia tidak aktif di sini selama beberapa bulan, saya telah mengambil alih tantangan.
Terner seimbang adalah sistem angka non-standar. Ini seperti ternary di mana angka kenaikan nilainya dengan faktor 3 ketika Anda melangkah lebih jauh ke kiri - begitu100
juga9
dan1001
28.
Namun, alih-alih memiliki nilai 0, 1 dan 2, angka-angka tersebut memiliki nilai -1, 0, dan 1 . (Anda masih dapat menggunakan ini untuk mengekspresikan bilangan bulat apa pun.)
Untuk tantangan ini, makna digit +1
akan ditulis sebagai +
, -1
akan ditulis sebagai -
, dan 0
adil 0
. Terner seimbang tidak menggunakan -
simbol di depan angka untuk meniadakannya seperti sistem angka lainnya - lihat contoh.
Tugas Anda adalah menulis program lengkap yang mengambil bilangan bulat bertanda desimal 32-bit sebagai input dan mengubahnya menjadi ternary berimbang. Tidak ada fungsi konversi basis bawaan dalam bentuk apa pun yang diizinkan (Mathematica mungkin memiliki satu ...). Input dapat berupa input standar, argumen baris perintah, dll.
Angka nol terdepan mungkin ada dalam input tetapi tidak dalam output, kecuali inputnya 0
, dalam hal ini output juga seharusnya 0
.
Contohnya
Ini adalah konversi dari terner seimbang ke desimal; Anda harus mengonversi dengan cara lain.
+0- = 1*3^2 + 0*3^1 + -1*3^0 = 9 + 0 + -1 = 8
+-0+ = 1*3^3 + -1*3^2 + 0*3^1 + 1*3^0 = 27 + -9 + 0 + 1 = 19
-+++ = -1*3^3 + 1*3^2 + 1*3^1 + 1*3^0 = -27 + 9 + 3 + 1 = -14
sumber
Jawaban:
Python 2: 58 karakter
Menghasilkan digit terner seimbang per digit dari akhir. Digit terakhir diberikan oleh residu
n%3
makhluk-1
,0
atau+1
. Kami kemudian menghapus digit terakhir dan membaginya dengan 3 menggunakan pembagian lantai Pythonn=(n+1)/3
. Kemudian, kami melanjutkan secara rekursif dengan digit terakhir yang baru hingga angkanya 0.Kasing khusus diperlukan agar input
0
memberi0
daripada string kosong.Spesifikasi tidak mengizinkan ini, tetapi jika seseorang dapat menulis fungsi alih-alih sebuah program dan menghasilkan string kosong untuk 0, solusi char 40 akan dimungkinkan.
sumber
n*"."and
dalam kasus fungsi saja. Jugaprint s or 0
berfungsi lebih baik: Ps or 0
. Saya sudah mencoban*"."and
, tetapi gagal ketikan<0
.CJam, 24 byte
Saya datang dengan ini secara independen dan saya pikir ini, kemungkinan besar, satu-satunya cara untuk menangani ini.
Secara algoritmik, mirip dengan jawaban xnor.
Cobalah online di sini
Cara kerjanya :
sumber
JavaScript (E6) 68
Program lengkap, seperti yang diminta, dengan I / O via popup. Inti adalah fungsi R, 49 byte.
Tidak jauh berbeda dengan solusi rekursif lainnya, kurasa. Manfaatkan konversi otomatis antara string dan angka untuk menghindari kasus khusus untuk "0"
Uji di konsol FireFox / FireBug, hanya menggunakan fungsi R
Keluaran
sumber
d=(n%3+3)%3
kapand=n%3
menghasilkan nilai yang samad
?Pyth,
712423Ini adalah solusi rekursif, berdasarkan fungsi rekursif 40 karakter @ xnor.
y
membangun terner baanced dari input, dengan menemukan digit terakhir menggunakan mod mod 3, dan kemudian menggunakan fakta bahwa sisa digit sama dengan terner seimbang untuk (n + 1) / 3, menggunakan pembagian lantai. Kemudian, ia memanggil fungsi, mengembalikan hasilnya, atau 0 jika inputnya 0.Coba di sini.
sumber
Mathematica -
157154146128Versi golf:
Dan dengan lekukan untuk keterbacaan:
Pemakaian:
Keluaran:
Banyak terima kasih kepada Martin Büttner dalam mengurangi jumlah karakter.
sumber
Mathematica, 54 karakter
Mirip dengan rekursi xnor
Simbol Unicode digunakan untuk menggantikan
Floor
,Part
,!=
Keluaran
Disimpan
f
untuk singkat dan ditulis tanpa memetikan unicode Anda tidak dapat melihatsumber
GNU sed, 236 byte
Cobalah online!
Penjelasan
Bagian pertama dari kode (kurang dari baris pertama) menerjemahkan desimal ke unary dan langsung berasal dari " Tips untuk bermain golf dalam sed ." Kemudian itu menerjemahkan unary ke terary seimbang satu trit pada satu waktu, yang saya akan menunjukkan dengan bekerja contoh secara manual.
Sebelum hasil akhir, terner angka
-
,0
dan+
diwakili oleh!
,:
dan+
masing-masing.Untuk hasil yang menarik, kita mulai dengan
-48
, yang telah dikonversi menjadi unary (dengan-
utuh). Untuk menghitung trit pertama (paling kanan), kita harus menghitung sisa 48 ÷ 3. Kita dapat melakukan ini dengan mengganti111
s dengan3
s:48 ÷ 3 tidak memiliki sisa, jadi tidak ada
1
yang tersisa, dan kami tahu trit pertama kami adalah:
(untuk 0), jadi kami menggantinya:Sekarang kita memiliki "tempat" kita, jadi kita tahu sisanya
3
mewakili tempat bertiga. Agar matematika tetap berfungsi, kita harus membaginya dengan 3, yaitu ganti dengan1
s:Mari kita periksa matematika kita: Kita memiliki 16 (unary
1111111111111111
) di tempat bertiga dan nol (:
) di tempat itu. Itu 3✕16 + 1✕0 = 48. Sejauh ini bagus.Sekarang kita mulai lagi. Ganti
111
s dengan3
s:Kali ini sisanya adalah
1
, jadi kami taruh+
di tempat bertiga dan ganti yang tersisa3
dengan1
s:Waktu cek kewarasan: Kami memiliki 5 (tidak sama
11111
) di tempat sembilan, 1 (+
) di tempat bertiga, dan 0 (:
) di tempat yang: 9✕5 + 3✕1 + 1✕0 = 48. Hebat! Sekali lagi kita ganti111
s dengan3
s:Kali ini sisanya adalah 2 (
11
). Itu membutuhkan dua trits (+!
), yang berarti kita memiliki carry. Sama seperti dalam aritmatika desimal itu berarti kita mengambil digit paling kanan dan menambahkan sisanya ke kolom di sebelah kiri. Dalam sistem kami, itu berarti kami menempatkan!
di tempat sembilan dan menambahkan tiga di sebelah kirinya, lalu mengganti semua3
dengan1
s untuk mewakili tempat ke-27:Sekarang kami tidak memiliki 3 angka yang tersisa, jadi kami dapat mengganti sisa digit yang belum diketahui dengan trits yang sesuai. Dua (
11
) adalah+!
:Dalam kode aktual ini dilakukan dalam dua langkah,
s/1/+/
dany/1:/!0/
, untuk menghemat byte. Langkah kedua juga menggantikan:
s dengan0
s, jadi ia melakukan ini:Sekarang kami memeriksa apakah kami memiliki angka negatif. Kami melakukannya, jadi kami harus menyingkirkan tanda dan kemudian membalikkan masing-masing tanda:
Akhirnya, kami ganti
!
s dengan-
s:Itu dia!
sumber
Stax , 17 byte
Jalankan dan debug itu
Jawaban terpendek sejauh ini, tetapi harus mudah dikalahkan oleh beberapa bahasa golf. Algoritma ini sama dengan jawaban Python @ xnor.
Setara ASCII:
sumber
JavaScript
108102 (ES6, tidak ada panggilan rekursif)Entri asli pada 108
Tidak semewah jawaban @ edc65 ... Saya menghargai bantuan yang mengurangi ini ...
sumber
Clojure, 242 byte
Apakah ini jawaban Clojure terpanjang sejauh ini?
Tidak digabungkan (dengan komentar):
sumber
8 ,
179171167 karakterIni adalah program lengkap di 8 yang mengambil bilangan bulat bertanda desimal sebagai input dan mengubahnya menjadi ternary berimbang
Uji
Pertama kali program meminta nomor untuk dikonversi (sesuai kebutuhan). Kemudian, dimungkinkan untuk menggunakan kata
f
untuk mengonversi angka lebih banyak seperti pada baris berikut:Keluaran
Penjelasan kode
Ini adalah kode untuk penanganan input. Inti dari kode ada di dalam kata
f
. Jauh dari lapangan golf, saya akan menggunakan kata itu>bt
sebagai gantif
. Ini dia versi ungolfed darif
(dengan komentar):sumber
Java,
327269 karakterPercobaan pertama saya dalam kode golf. Saya tidak tahu bahasa yang benar-benar singkat, jadi inilah solusi di Jawa. Saya menghargai saran untuk lebih mempersingkatnya.
Coba di sini: http://ideone.com/fxlBBb
EDIT
Digantikan
BufferedReader
olehScanner
, memungkinkan saya menghapusthrows
klausa, tetapi harus mengubah impor (+2 karakter). DigantiInteger
olehint
. Sayangnya, program tidak dapat dikompilasi jika tidak adaString[] h
dimain
.sumber
Scanner
bukanBufferedReader
. Juga,String[] h
danthrows java.lang.Exception
mungkin tidak perlu, dan Anda mungkin menyimpan beberapa byte lagi dengan menggunakanint
alih-alihInteger
.JavaScript (ES6), 51 byte
Ulangi karakter. Pertama, kalikan total sebelumnya 3 kali sebelumnya, lalu jika isNaN (karakter) benar, ubah string (karakter + "1") menjadi angka dan tambahkan, jika tidak nol.
sumber
Stax , 14 byte
Jalankan dan debug itu
sumber
05AB1E , 20 byte
Cobalah online!
sumber
APL (NARS), 26 karakter, 52 byte
uji:
mungkin bisa lebih sedikit jika ⊥ digunakan tetapi dilarang ...
sumber