给定基数的字符串的整数


13

编写最短函数,将整数转换为数字表示形式(基数介于2到62之间)。例如:

to_string(351837066319, 31) => "codegolf"

2
从示例中,我收集到小写字母排在最前面,即以62为底的数字依次为0-9,az,AZ。
sepp2k 2011年

是的,就是这样。
米歇尔·德马雷

at 0:00,当,完美。
扎卡里

Answers:


4

dc-43个字符

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

如果我们假设堆栈仅包含两个参数,则可以将其缩短一点。

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

作为一个独立程序,我们只需要37个字符:

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

无需使用[39+]sz9<z,我们只需使用Z39*+,它将为单个数字增加39,为两个数字增加78。代替113,我们使用B3AD也可以)。


4

Ruby 1.8-75个字符,具有递归功能。

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}

(均基于Dogbert的1.9解决方案。)


4

的Python-86

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

归功于Hoa Long Tam的字符串导入技巧


3

蟒蛇,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'

编辑:“或” 0“添加为空的字符串大小写


当n = 0时失败,当应返回“ 0”时返回空字符串。无论如何+1为弦乐戏
胡安

2

dc,61个字符

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

运行方式:

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

要么:

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

说明:我们采用数字并基于堆栈。sr将基数保存在寄存器r中。递归函数[lr~rd0<x]dsxx将一个数字分解为TOSbase中的数字register r。第一个数字始终为0,通过k(设置精度,默认情况下也为0,因此等同于nop)从堆栈中删除。然后,递归函数[48+d57<ad122<banz0<p]dspx借助函数a([39+]sa)和b([58-]sb)输出ASCII中的每个数字。IP输出换行符。该函数存储在寄存器中f,并且可以由调用lfx


1
如果将48+移至末尾,则会保存两个(57和122都删除一个字符)。还有一个小小的疏忽是,作为一个函数,您不能假定堆栈上没有其他任何东西,但是如果您合并了循环(也可以节省一些字符),则可以消除问题。
Nabb 2011年

2

红宝石-72 70 59字符

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

没有递归,70个字符

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

测试

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

1

Haskell,109个字符

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个字符

如果愿意通过左下角路由程序的其他部分,则为53 + 46 = 99个字符。

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

首先将要转换的数字放在堆栈上,然后是基数,然后从左上角向右输入此函数。将为您输出字符串(因为Befunge不支持字符串变量),并从底部$向下移动。需要(1,1)用于基数存储的单元格。

例如,将给定的示例放入351837066319输入并运行:

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

1

Golfscript-32个字符

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

1

红宝石1.9 - 80 74 68

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

空字符串为“ 0”,为95 89 82个字符:

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-不幸的是,仅适用于基础36:

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

2
您可以替换]+[用的,
Nemo157 2011年

1

Bash,79个字符

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

BC_BASE_MAX被记录为16。我不知道是什么奇迹使输出正确地出现在样本输入上,但是它为大多数其他碱基输出了垃圾(即非字母数字字符)。
JB

@JB:您使用哪个BC?GNU bc应该工作。sysconf(_SC_BC_BASE_MAX)在我的系统上返回99,最低要求是16。
ninjalj 2011年

@JB:还请注意,以前的修订存在错误,我只是略过了问题要求。
ninjalj 2011年

公元前1.06。现在您提到了它,我从联机帮助页中得到了该图,但误读了它。16是输入基本限制。输出基数限制为999。我首先尝试了较早的版本,现在让我们再来看一次。
JB

1
我认为此代码以11-16为基数输出大写字母,而不是小写。您可以使用dc代替来节省一些基本转换费用bc
Nabb 2011年




-1

JavaScript 170字节

function f1(ni,nr){
let s1='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
let s2='';
while(ni>0){
s2=s1[ni%nr]+s2;
ni=Math.floor(ni/nr);
}
return s2;
}

这可以通过很多方式进行,例如删除空格,缩短变量名,删除无用的代码(如let)以及减少较长的字符串
Jo King

这个问题被标记为code-golf,因此您应该尝试尽可能缩短代码。我提到的内容可以进行一些快速打高尔夫球,使字节数达到125个字节,还有很多要缩短的地方
Jo King

@JoKing不,谢谢。
史蒂芬·彭妮
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.