10進数と2 ** iの基数で表を印刷する


9

コンピュータはバイナリで生きています。すべてのプログラマーはバイナリーを知っています。

しかし、2**xベースは非実用的であるとしばしば無視されますが、それらはバイナリとの美しい関係を持っています。

そのような美しい関係の一例を示すために、19が私の証言になります。

19 10011 103 23 13 j
  • 19は10進数で、わかりやすくするために含まれています。

  • 10011は2進数で19です。

  • 103、base 4では、バイナリから次のように作成されます。

    • log2(4)== 2、2つ覚えておきましょう。
    • 2の倍数の長さになるようにパッド10011-> 010011
    • 2 x 2の数字を左から右に取り、2桁の2進数として扱います。

      • 01-> 1
      • 00-> 0
      • 11-> 3

    完了、base-4の10011は103です。

底が8の場合、log2(8)= 3と同じですが、3行3列です。

  • パッド010011
  • 010-> 2
  • 011-> 3

    23、完了

基数16の場合、log2(16)= 4と同じですが、4行4列です。

  • パッド00010011
  • 0001-> 1
  • 0011-> 3

    13、完了

仕事

入力として最大数を指定すると、テーブルを出力します

base-ten-i base-two-i base-four-i base-eight-i base-sixteen-i base-thirtytwo-i

for iは0からnまでの範囲です。2進数は、機能するために必要な最低限の縮図であるため、コードはできるだけ短くする必要があります。

制限とボーナス

  • Base-ten->バイナリおよびバイナリ-> Base-tenビルトインは、Base-a-> Base-bと同様に抜け穴と見なされます。

  • 2**i上記の関係を使用してすべての(for i> 2)基底を生成すると*0.6ボーナスが得られますが、一般的な基底変換(自分で作成)は許可されます。

テーブルの例

> 32
0 0 0 0 0 0
1 1 1 1 1 1
2 10 2 2 2 2
3 11 3 3 3 3
4 100 10 4 4 4
5 101 11 5 5 5
6 110 12 6 6 6
7 111 13 7 7 7
8 1000 20 10 8 8
9 1001 21 11 9 9
10 1010 22 12 a a
11 1011 23 13 b b
12 1100 30 14 c c
13 1101 31 15 d d
14 1110 32 16 e e
15 1111 33 17 f f
16 10000 100 20 10 g
17 10001 101 21 11 h
18 10010 102 22 12 i
19 10011 103 23 13 j
20 10100 110 24 14 k
21 10101 111 25 15 l
22 10110 112 26 16 m
23 10111 113 27 17 n
24 11000 120 30 18 o
25 11001 121 31 19 p
26 11010 122 32 1a q
27 11011 123 33 1b r
28 11100 130 34 1c s
29 11101 131 35 1d t
30 11110 132 36 1e u
31 11111 133 37 1f v
32 100000 200 40 20 10

4
「上記の関係を使用して2 ** i(i> 2の場合)のすべての基底を生成する必要がある」ため、反対投票されました。特定のアルゴリズムを必要とすることで、コードゴルフを面白くする多くのものが取り除かれます。アルゴリズムの選択を許可しながら、組み込みの基本変換関数を禁止できます。
XNOR

@xnorが私の方法を使用することで、ゴルファーにより多くの自由を与えるために、ボーナスを与えるだけです
Caridorc

1
私もボーナスのファンではありません。これは事実上、組み込みアルゴリズムまたはアルゴリズムのいずれかを使用する必要があり、他のアルゴリズムは実行できない場合があることを意味します。
xnor

@xnorビルトインは許可されていません。一般的なコンバーターは短くなるので、あなたが私の工夫された変換ルールを使用するならボーナスをあげます
Caridorc

回答:


2

CJam、54 * 0.6 = 32.4バイト

q~){_5,f{)L@{2md@+\}h(%/Wf%W%{{\2*+}*_9>{'W+}&}%S\}N}/

ここでテストしてください。

参考までに、ボーナスの対象とならない短いソリューションを次に示します(39バイト)。

q~){:X5{SLX{2I)#md_9>{'W+}&@+\}h;}fIN}/

私はチャレンジを更新しました。私の方法を使用した場合、0.6 *のボーナスを請求する可能性があります
Caridorc


0

PHP、232 230 233 217 * 0.6 = 130.2

ゴルフの言語を打ち負かす機会はないが、私は挑戦が好きだった。

for(;$d<=$n;$d++){echo'
',$d|0;for($k=$d,$b='';$k;$k>>=1)$b=($k&1).$b;for($w=1;$w<6;$w++,print" $z"|' 0')for($z='',$k=strlen($b);-$w<$k-=$w;$z=($e>9?chr($e+87):$e).$z)for($e=0,$y=1,$j=$w;$j--;$y*=2) $e+=$y*$b[$j+$k];}
  • 用法:プリペンド$n=32;または交換$nして32(または他の任意の非負の整数)。CLI経由で呼び出す
  • それが受け入れられない場合は$n$_GET[n](+ 6 / + 3.6)に置き換えて、ブラウザー
    またはcliのいずれかで呼び出します。php-cgi -f bases.php -n=32
  • ブラウザでテストするために改行<br>または先頭に追加<pre>する
  • 新しいバージョンのPHPでは、未定義の変数や初期化されていない文字列オフセットについて通知をスローする場合があります。
    E_NOTICEをerror_reporting(先頭に追加)から削除して、error_reporting(0);それらを抑制します。
  • 5.6でテスト済み

壊す:

for(;$d<=$n;$d++) // loop decimal $d from 0 to $n
{
    echo'
',$d|0; // print line break and decimal
    for($k=$d,$b='';$k;$k>>=1)$b=($k&1).$b; // convert $d to binary
    for($w=1;$w<6;$w++,
        print" $z"|' 0' // print number generated in inner loop (echo doesn´t work here)
    )
        for($z='',$k=strlen($b);-$w<$k-=$w; // loop from end by $w
            $z=($e>9?chr($e+87):$e).$z // prepend digit created in body
        )
            for($e=0,$y=1,$j=$w;$j--;$y*=2) $e+=$y*$b[$j+$k]; // convert chunk to 2**$w
}

主な編集:

  • インデックスマジックを使用して内部ループを改造しました->文字列全体で逆方向に動作するようになりました(パディング、バイナリの分割やコピーは不要です)
  • ループ本体の一部を頭に移動してブレースを削除
  • 改訂後の10進数の0の結果を修正するために7 4バイトを追加する必要がありました

非ボーナスバージョン、142バイト

for(;$d<=$n;$d++,print'
',$d|0)for($w=1;$w<6;$w++,print" $z"|' 0')for($k=$d,$y=1,$z='';$k&&$y<<=$w;$k>>=$w)$z=(9<($e=$k%$y)?chr($e+87):$e).$z;

PHPはPythonに勝っていますか?
6(3.6)バイトを追加してスニペットをプログラムにしたとしても、Pythonに勝っています(223 * 0.6 = 133.8または148非ボーナスvs 158)。すごい。


「未定義の変数:n:1」というエラーが表示さforれ、最外部のforループでキーワードの後にスペースを削除すると、1バイトを節約できると思います。
Yytsi 2016

@TuukkaX:使用法を参照:スニペットの前に$ nを定義する必要があります。そのバイトを見つけたが、ありがとう。そしてもう一つ:"\n"->物理的な改行。
タイタス

しかし、最初の0を出力するには3バイトを追加する必要がありました(変数を初期化するには5バイト)。
タイタス

0

Ruby、80バイト(非ボーナスバージョン)

m=ARGV[0].to_i;(0..m).each{|n|puts [10,2,4,8,16,32].map{|b|n.to_s(b)}.join(' ')}

0

python3 - 189、167、166の 150バイト

for i in range(int(input())+1):f=lambda b,n=i,c="0123456789abcdefghijklmnopqrstuv":n<b and c[n]or f(b,n//b)+c[n%b];print(i,f(2),f(4),f(8),f(16),f(32))

@ LeakyNunの助けを借りて16バイトを節約しました

ボーナスバージョン-296 * 0.6 = 177.6 279 * 0.6 = 167.4バイト

p=lambda b,c:"".join(str(int(b[i:i+c],2))for i in range(0,len(b),c))
z=lambda s:len(s)%2 and s or "0"+s
for i in range(int(input())+1):f=lambda n,b,c="0123456789abcdefghijklmnopqrstuv":n<b and c[n]or f(n//b,b)+c[n%b];v=f(i,2);d=z(v);print(i,v,p(d,2),p(d,3),p(d,4),p(d,5),f(i,32))

ボーナスバージョンのやや読みやすいバージョン。

p=lambda b,c:"".join(str(int(b[i:i+c],2))for i in range(0,len(b),c))
z=lambda s:len(s)%2 and s or "0"+s
for i in range(int(input())+1):
    f=lambda n,b,c="0123456789abcdefghijklmnopqrstuv":n<b and c[n] or f(n//b,b) + c[n%b]
    v=f(i,2)
    d=z(v)
    print(i,v,p(d,2),p(d,3),p(d,4),p(d,5),f(i,32))

私はボーナスが適用されないことをかなり確信しています。2 ** xを底とする数値を生成するためにバイナリを使用していません。
タイタス

@タイタスああ、私はそのときのボーナスが間違っていることを理解しました。バイト数を編集します。ありがとう!
Yytsi 2016

かなり"0123456789abcdefghijklmnopqrstuv"短いですfrom string import* digits+ascii_lowercase
Leaky Nun

@LeakyNunおっと。あなたが正しい。digits+ascii_lowercase:D と書くのがどれだけ短いかを考えただけです。ありがとう!
Yytsi

150バイト:for i in range(int(input())+1):f=lambda n=i,b,c="0123456789abcdefghijklmnopqrstuv":n<b and c[n]or f(n//b,b)+c[n%b];print(i,f(2),f(4),f(8),f(16),f(32))(1行)
Leaky Nun 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.