指定された基数を持つ文字列への整数


13

2から62までの基数が与えられた場合、整数を数値表現に変換する最短関数を記述します。例:

to_string(351837066319, 31) => "codegolf"

2
この例から、小文字が最初に来る、つまり、ベース62の数字が0-9、az、AZの順であるということを収集しますか?
sepp2k

はい、正確に、それだけです。
ミシエルデマーレ

at 0:00、ダン、完璧。
ザカリー

回答:


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

dc-43文字

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

スタックに2つの引数のみが含まれると仮定すると、これを少し短くすることができます。

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

スタンドアロンプ​​ログラムとして必要なのは37文字のみです。

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

を使用する代わりに[39+]sz9<z、単純にを使用しますZ39*+。これにより、1桁の数字に39、2桁の数字に78が加算されます。の代わりに113、使用しますB3AD動作します)。


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'

編集:空の文字列の場合は「または「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にベースを保存します。再帰関数は、数値をbaseの数字に[lr~rd0<x]dsxx分解します。最初の桁は常に0で、スタックから削除されます(精度を設定します。デフォルトでは0なので、nopと同等です)。次に、関数a()およびb()を使用して、再帰関数はASCIIで各桁を出力します。改行を出力します。この関数はレジスタに保存され、によって呼び出すことができます。TOSregister rk[48+d57<ad122<banz0<p]dspx[39+]sa[58-]sbIPflfx


1
48+を最後まで移動すると、2つ保存されます(57と122の両方がキャラクターをドロップします)。また、マイナーな見落としは、関数として、スタック上に他に何もないと仮定することはできませんが、ループをマージすると問題は解決されます(これにより、いくつかの文字が節約されます)。
ナブ

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

Ruby 1.9の- 、80 74 68

t =-> n、b {d = ?0 ..?9、?a ..?z、*?A ..?Z; s = '';(s = d [n%b] + s; n / = b)while 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

1

バッシュ、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

@JB:また、バグがある以前の改訂版では、質問の要件をざっと目撃しただけでした。
ninjalj

bc 1.06。さて、あなたはそれについて言及します、私はマンページから図を得ましたが、それを誤解しました。16は入力ベースの制限です。出力ベースの制限は999です。最初に以前のバージョンを試してみましたが、今もう一度見てみましょう。
JB

1
これは、小文字ではなく11〜16のベースの大文字を出力すると思います。のdc代わりにを使用することにより、ベースコンバージョンでいくつかを節約できますbc
ナブ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.