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"
at 0:00, dang, hoàn hảo.
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"
at 0:00, dang, hoàn hảo.
Câu trả lời:
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}
(cả hai đều dựa trên giải pháp 1.9 của Dogbert.)
[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).
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
[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.
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" < +"'" <-":"<
@
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)}
]+[bằng ,.
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)trả về 99 trên hệ thống của tôi, 16 là mức tối thiểu cần thiết.
dcthay vì bc.