Số nguyên cho chuỗi với cơ số đã cho


13

Viết hàm ngắn nhất để chuyển đổi một số nguyên thành biểu diễn số được đưa ra một cơ số giữa 2 và 62. ví dụ:

to_string(351837066319, 31) => "codegolf"

2
Từ ví dụ tôi thu thập được rằng các chữ cái viết thường xuất hiện trước, tức là các chữ số trong cơ sở 62 là 0-9, az, AZ theo thứ tự đó?
sepp2k

Vâng, chính xác, đó là nó.
Michiel de Mare

at 0:00, dang, hoàn hảo.
Zacharý

Câu trả lời:


4

Ruby 1.8 - 75 ký tự, có đệ quy.

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

Không có đệ quy

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}

(cả hai đều dựa trên giải pháp 1.9 của Dogbert.)


4

Con trăn - 86

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

Tín do Hoa Long Tâm cho thủ thuật nhập chuỗi


3

dc - 43 ký tự

[sb[58-]s_[lb~dZ39*+dB3<_9+rd0<xrP]dsxxk]sf

Chúng ta có thể rút ngắn điều này một chút nếu chúng ta giả sử ngăn xếp chỉ chứa hai đối số.

[[58-]s_dSb~dZ39*+dB3<_9+SadLbr0<fLaPc]sf

Là một chương trình độc lập, chúng tôi chỉ cần 37 ký tự:

?o[58-]s_[O~dZ39*+dB3<_9+rd0<xrP]dsxx

Thay vì sử dụng [39+]sz9<z, chúng tôi chỉ đơn giản sử dụng Z39*+, sẽ thêm 39 cho một số có một chữ số và 78 cho số có hai chữ số. Thay vì 113, chúng tôi sử dụng B3( ADcũng hoạt động).


3

Con trăn, 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 : "hoặc '0'" được thêm cho trường hợp chuỗi trống


Thất bại khi n = 0, trả về một chuỗi trống khi nó sẽ trả về '0'. Dù sao +1 cho thủ thuật chuỗi
Juan

2

dc, 61 ký tự

[sr[lr~rd0<x]dsxxk[39+]sa[58-]sb[d9<ad78<b48+anz0<p]dspxIP]sf

Chạy như:

dc -e'[sr[lr~rd0<x]dsxxk[39+]sa[58-]sb[d9<ad78<b48+anz0<p]dspxIP]sf' -e'351837066319 31 lfx'

hoặc là:

dc -f base.dc -e '351837066319 31 lfx'

Giải thích: Chúng tôi lấy số lượng và cơ sở trên ngăn xếp. srlưu cơ sở trong đăng ký r. Hàm đệ quy [lr~rd0<x]dsxxphân tách một số TOSthành các chữ số của nó trong cơ sở register r. Chữ số đầu tiên luôn là 0, được xóa khỏi ngăn xếp bằng cách k(đặt độ chính xác, theo mặc định là 0, do đó, nó tương đương với một nop). Sau đó, hàm đệ quy [48+d57<ad122<banz0<p]dspxxuất ra từng chữ số trong ASCII, với sự trợ giúp của các hàm a ( [39+]sa) và b ( [58-]sb). IPxuất ra một dòng mới. Các chức năng được lưu trữ trong đăng ký f, và có thể được gọi bởi lfx.


1
Nếu bạn di chuyển 48+ đến cuối, nó sẽ tiết kiệm được hai (57 và 122 cả hai thả một ký tự). Ngoài ra, một giám sát nhỏ là với chức năng, bạn không thể cho rằng không có gì khác trên ngăn xếp, nhưng vấn đề sẽ được loại bỏ nếu bạn hợp nhất các vòng lặp (cũng sẽ lưu một vài ký tự).
Nabb

2

Ruby - 72 70 59 ký tự

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

Không có đệ quy, 70 ký tự

f=->n,b{d=*?0..?9,*?a..?z,*?A..?Z;s=d[n%b];s=d[n%b]+s while(n/=b)>0;s}

Kiểm tra

irb(main):080:0> f[351837066319, 31]
=> "codegolf"
irb(main):081:0> f[0, 31]
=> "0"

1

Haskell, 109 ký tự

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

1

Befunge - 53 x 2 = 106 ký tự

Hoặc 53 + 46 = 99 ký tự nếu bạn sẵn sàng định tuyến các phần khác trong chương trình của mình qua góc dưới bên trái.

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

Đầu tiên, đặt số cần chuyển đổi trên ngăn xếp, sau đó là cơ số và nhập chức năng này từ trên cùng bên trái sang phải. Sẽ xuất chuỗi cho bạn (vì Befunge không hỗ trợ các biến chuỗi) và để lại từ dưới $xuống. Yêu cầu (1,1)tế bào để lưu trữ cơ số.

Ví dụ, ví dụ đã đưa 351837066319vào đầu vào và chạy:

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

1

Golfscript - 32 ký tự

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

1

Hồng ngọc 1.9 - 80 74 68

t = -> n, b {d = ? 0 ..? 9 , ? a ..? z, *? A ..? Z; s = ''; (s = d [n% b] + s; n / = b) trong khi n> 0; s}

Với '0' cho chuỗi trống, 95 89 82 ký tự:

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 - thật không may, chỉ hoạt động đến cơ sở 36:

t=->n,b{n.to_s(b)}

2
Bạn có thể thay thế ]+[bằng ,.
Nemo157

1

Bash, 79 ký tự

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

BC_BASE_MAX được ghi lại là 16. Tôi không biết phép màu nào tạo ra đầu ra ngay trên đầu vào mẫu, nhưng nó tạo ra rác (tức là các ký tự không phải là chữ cái) cho hầu hết các cơ sở khác.
JB

@JB: bạn đang sử dụng bc nào? GNU bc nên hoạt động. sysconf(_SC_BC_BASE_MAX)trả về 99 trên hệ thống của tôi, 16 là mức tối thiểu cần thiết.
ninjalj

@JB: cũng lưu ý rằng các phiên bản trước có lỗi, tôi vừa đọc lướt các yêu cầu câu hỏi.
ninjalj

bc 1,06. Bây giờ bạn đề cập đến nó, tôi đã nhận được con số từ trang web, nhưng đọc sai nó. 16 là giới hạn cơ sở đầu vào. Giới hạn cơ sở đầu ra là 999. Trước tiên tôi đã thử phiên bản cũ hơn, bây giờ hãy xem lại điều đó.
JB

1
Tôi nghĩ rằng cái này xuất ra chữ in hoa cho các cơ sở 11-16 thay vì chữ thường. Bạn có thể lưu một số ít ở chuyển đổi cơ sở bằng cách sử dụng dcthay vì bc.
Nabb
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.