Kita dapat mempersingkat ini sedikit jika kita menganggap tumpukan hanya berisi dua argumen.
[[58-]s_dSb~dZ39*+dB3<_9+SadLbr0<fLaPc]sf
Sebagai program mandiri, kita hanya perlu 37 karakter:
?o[58-]s_[O~dZ39*+dB3<_9+rd0<xrP]dsxx
Alih-alih menggunakan [39+]sz9<z, kami hanya menggunakan Z39*+, yang akan menambah 39 untuk angka satu digit, dan 78 untuk angka dua digit. Alih-alih 113, kami menggunakan B3( ADjuga berfungsi).
dc -e'[sr[lr~rd0<x]dsxxk[39+]sa[58-]sb[d9<ad78<b48+anz0<p]dspxIP]sf' -e'351837066319 31 lfx'
atau:
dc -f base.dc -e '351837066319 31 lfx'
Penjelasan: Kami mengambil nomor dan berdasarkan tumpukan. srmenyimpan basis di register r. Fungsi rekursif [lr~rd0<x]dsxxmenguraikan angka TOSmenjadi digit-nya di pangkalan register r. Digit pertama selalu 0, dihapus dari stack by k(set precision, yang secara default adalah 0 juga, jadi itu setara dengan nop). Kemudian, fungsi rekursif [48+d57<ad122<banz0<p]dspxmenghasilkan setiap digit dalam ASCII, dengan bantuan fungsi a ( [39+]sa) dan b ( [58-]sb). IPmenampilkan baris baru. Fungsi disimpan dalam register f, dan dapat dipanggil oleh lfx.
Jika Anda memindahkan 48+ ke akhir, ia menyimpan dua (57 dan 122 keduanya menjatuhkan karakter). Juga sedikit pengawasan adalah bahwa sebagai suatu fungsi, Anda tidak dapat mengasumsikan tidak ada yang lain di stack, tetapi masalahnya akan dihapus jika Anda menggabungkan loop (yang juga akan menyimpan beberapa karakter).
Atau 53 + 46 = 99 karakter jika Anda bersedia untuk merutekan bagian lain dari program Anda melalui kiri bawah.
11p01-\>:11g%\11g/:#v_$>:1+!#v_:45+`!#v_:75*`!#v_ v
^ < ^, $# +"0" < +"'" <-":"<
Pertama tempatkan nomor yang akan dikonversi pada tumpukan, kemudian radix dan masukkan fungsi ini dari kiri atas ke kanan. Akan menampilkan string untuk Anda (karena Befunge tidak mendukung variabel string) dan pergi dari bawah $turun. Membutuhkan(1,1) sel untuk penyimpanan radix.
Misalnya untuk contoh yang diberikan dimasukkan 351837066319ke input dan jalankan:
BC_BASE_MAX didokumentasikan sebagai 16. Saya tidak tahu keajaiban apa yang membuat output tepat pada input sampel, tetapi output sampah (yaitu karakter non-alfanumerik) untuk sebagian besar pangkalan lainnya.
JB
@ JK: bc mana yang Anda gunakan? GNU bc harus bekerja. sysconf(_SC_BC_BASE_MAX)mengembalikan 99 pada sistem saya, 16 adalah minimum yang diperlukan.
ninjalj
@ JK: juga perhatikan bahwa revisi sebelumnya di mana buggy, saya baru saja membaca persyaratan pertanyaan.
ninjalj
bc 1.06. Sekarang Anda menyebutkannya, saya mendapatkan gambar dari halaman manual, tetapi salah membaca. 16 adalah batas basis input. Batas basis output adalah 999. Saya pertama kali mencoba pada versi sebelumnya, mari kita lihat lagi sekarang.
JB
1
Saya pikir ini menghasilkan huruf besar untuk basis 11-16 bukan huruf kecil. Anda dapat menyimpan beberapa di konversi dasar dengan menggunakan dcalih-alih bc.
at 0:00
, dang, sempurna.Jawaban:
Ruby 1,8 - 75 karakter, dengan rekursi.
Tanpa rekursi
(Keduanya didasarkan pada solusi Dogbert's 1.9.)
sumber
Python - 86
Kredit karena Hoa Long Tam untuk trik impor string
sumber
dc - 43 karakter
Kita dapat mempersingkat ini sedikit jika kita menganggap tumpukan hanya berisi dua argumen.
Sebagai program mandiri, kita hanya perlu 37 karakter:
Alih-alih menggunakan
[39+]sz9<z
, kami hanya menggunakanZ39*+
, yang akan menambah 39 untuk angka satu digit, dan 78 untuk angka dua digit. Alih-alih113
, kami menggunakanB3
(AD
juga berfungsi).sumber
Python,
9399EDIT : "atau '0'" ditambahkan untuk case string kosong
sumber
dc, 61 karakter
Jalankan sebagai:
atau:
Penjelasan: Kami mengambil nomor dan berdasarkan tumpukan.
sr
menyimpan basis di register r. Fungsi rekursif[lr~rd0<x]dsxx
menguraikan angkaTOS
menjadi digit-nya di pangkalanregister r
. Digit pertama selalu 0, dihapus dari stack byk
(set precision, yang secara default adalah 0 juga, jadi itu setara dengan nop). Kemudian, fungsi rekursif[48+d57<ad122<banz0<p]dspx
menghasilkan setiap digit dalam ASCII, dengan bantuan fungsi a ([39+]sa
) dan b ([58-]sb
).IP
menampilkan baris baru. Fungsi disimpan dalam registerf
, dan dapat dipanggil olehlfx
.sumber
Ruby -
727059 karakterTanpa rekursi, 70 karakter
Uji
sumber
Haskell, 109 karakter
sumber
Befunge - 53 x 2 = 106 karakter
Atau 53 + 46 = 99 karakter jika Anda bersedia untuk merutekan bagian lain dari program Anda melalui kiri bawah.
Pertama tempatkan nomor yang akan dikonversi pada tumpukan, kemudian radix dan masukkan fungsi ini dari kiri atas ke kanan. Akan menampilkan string untuk Anda (karena Befunge tidak mendukung variabel string) dan pergi dari bawah
$
turun. Membutuhkan(1,1)
sel untuk penyimpanan radix.Misalnya untuk contoh yang diberikan dimasukkan
351837066319
ke input dan jalankan:sumber
Golfscript - 32 karakter
sumber
Ruby 1.9 -
807468t = -> n, b {d = ? 0 ..? 9, ,? a ..? z, *? A ..? Z; s = ''; (s = d [n% b] + s; n / = b) sementara n> 0; s}
Dengan '0' untuk string kosong,
958982 karakter:Ruby 1.9 - sayangnya hanya bekerja hingga base 36:
sumber
]+[
dengan,
.Bash, 79 karakter
sumber
sysconf(_SC_BC_BASE_MAX)
mengembalikan 99 pada sistem saya, 16 adalah minimum yang diperlukan.dc
alih-alihbc
.