Tulis fungsi terpendek untuk mengubah bilangan bulat menjadi representasi numerik yang diberikan radix antara 2 dan 62. misalnya:
to_string(351837066319, 31) => "codegolf"
at 0:00, dang, sempurna.
Tulis fungsi terpendek untuk mengubah bilangan bulat menjadi representasi numerik yang diberikan radix antara 2 dan 62. misalnya:
to_string(351837066319, 31) => "codegolf"
at 0:00, dang, sempurna.
Jawaban:
f=proc{|n,b|(n<b ? "":f[n/b,b])+([*'0'..'9']+[*'a'..'z']+[*'A'..'Z'])[n%b]}
f=proc{|n,b|d=[*'0'..'9']+[*'a'..'z']+[*'A'..'Z'];s=d[n%b];s=d[n%b]+s while(n/=b)>0;s}
(Keduanya didasarkan pada solusi Dogbert's 1.9.)
[sb[58-]s_[lb~dZ39*+dB3<_9+rd0<xrP]dsxxk]sf
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).
from string import *
d=digits+letters
def t(n,b):
s=''
while n>0:s=d[n%b]+s;n/=b
return s or '0'
EDIT : "atau '0'" ditambahkan untuk case string kosong
[sr[lr~rd0<x]dsxxk[39+]sa[58-]sb[d9<ad78<b48+anz0<p]dspxIP]sf
Jalankan sebagai:
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.
f=->n,b{(n<b ? "":f[n/b,b])+[*?0..?9,*?a..?z,*?A..?Z][n%b]}
f=->n,b{d=*?0..?9,*?a..?z,*?A..?Z;s=d[n%b];s=d[n%b]+s while(n/=b)>0;s}
Uji
irb(main):080:0> f[351837066319, 31]
=> "codegolf"
irb(main):081:0> f[0, 31]
=> "0"
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:
&56*1+ 11p01-\>:11g%\11g/:#v_$>:1+!#v_:45+`!#v_:75*`!#v_ v
^ < ^, $# +"0" < +"'" <-":"<
@
t = -> 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, 95 89 82 karakter:
t=->n,b,s=''{d=*?0..?9,*?a..?z,*?A..?Z;(s=d[n%b]+s;n/=b)while n>0;s.empty?? ?0: s}
Ruby 1.9 - sayangnya hanya bekerja hingga base 36:
t=->n,b{n.to_s(b)}
]+[dengan ,.
f(){
dc<<<$2o$1p|perl -pe"y/A-Z/a-z/;s/ \d+/chr$&+($&<10?48:$&<36?87:29)/ge"
}
sysconf(_SC_BC_BASE_MAX)mengembalikan 99 pada sistem saya, 16 adalah minimum yang diperlukan.
dcalih-alih bc.