Integer ke string dengan radix yang diberikan

13

Tulis fungsi terpendek untuk mengubah bilangan bulat menjadi representasi numerik yang diberikan radix antara 2 dan 62. misalnya:

to_string(351837066319, 31) => "codegolf"
Michiel de Mare
sumber
2
Dari contoh saya kumpulkan bahwa huruf kecil menjadi yang utama, yaitu digit pada basis 62 adalah 0-9, az, AZ dalam urutan itu?
sepp2k
Ya, persis, itu saja.
Michiel de Mare
at 0:00, dang, sempurna.
Zacharý

Jawaban:

4

Ruby 1,8 - 75 karakter, dengan rekursi.

f=proc{|n,b|(n<b ? "":f[n/b,b])+([*'0'..'9']+[*'a'..'z']+[*'A'..'Z'])[n%b]}

Tanpa rekursi

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.)

Michiel de Mare
sumber
4

Python - 86

from string import*
def t(n,r,s=''):
 while n:s=printable[n%r]+s;n/=r
 return s or'0'

Kredit karena Hoa Long Tam untuk trik impor string

Juan
sumber
3

dc - 43 karakter

[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).

Nabb
sumber
3

Python, 93 99

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

Hoa Long Tam
sumber
Gagal ketika n = 0, mengembalikan string kosong ketika seharusnya mengembalikan '0'. Pokoknya +1 untuk trik sulap
Juan
2

dc, 61 karakter

[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.

ninjalj
sumber
1
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).
Nabb
2

Ruby - 72 70 59 karakter

f=->n,b{(n<b ? "":f[n/b,b])+[*?0..?9,*?a..?z,*?A..?Z][n%b]}

Tanpa rekursi, 70 karakter

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"
Wile E. Coyote
sumber
1

Haskell, 109 karakter

m=divMod
d(0,x)b=[f x]
d(r,x)b=f x:d(m r b)b
f=(!!)$['0'..'9']++['a'..'z']++['A'..'Z']
s x b=reverse$d(m x b)b
sepp2k
sumber
1

Befunge - 53 x 2 = 106 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:

&56*1+    11p01-\>:11g%\11g/:#v_$>:1+!#v_:45+`!#v_:75*`!#v_   v
                 ^            <  ^,    $# +"0"  < +"'"   <-":"<
                                       @
Nemo157
sumber
1

Golfscript - 32 karakter

{base{.9>39*+.74>58*48--}%''+}:f
Nabb
sumber
1

Ruby 1.9 - 80 74 68

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)}
Michael Kohl
sumber
2
Anda dapat mengganti ]+[dengan ,.
Nemo157
1

Bash, 79 karakter

f(){
dc<<<$2o$1p|perl -pe"y/A-Z/a-z/;s/ \d+/chr$&+($&<10?48:$&<36?87:29)/ge"
}
ninjalj
sumber
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.
Nabb