回答:
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ソリューションに基づいています。)
[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、使用しますB3(AD動作します)。
[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
または、プログラムの他の部分を左下からルーティングする場合は、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" < +"'" <-":"<
@
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)}
]+[とのを,。
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)私のシステムでは99を返しますが、最小値は16です。
dc代わりにを使用することにより、ベースコンバージョンでいくつかを節約できますbc。