LL Golf Hole 6 - 10進数を2進数に基数変換する

LL Golf Hole 6 にて LL Golf Hole 6 - 10進数を2進数に基数変換するというお題で出題されていますので、これを解いていきます。

多分、アルゴリズムの教科書のようなものに出ていると思いますが、そういったことをあまり勉強したこともないので、そういうものだと私は思っているのですが、以下のようなスクリプトになります。

#! /usr/bin/gawk -f
# dec2bin.awk

{
    print dec2bin($0);
}

# dec2bin - translate decimal to binary
function dec2bin(num,    rem, str) {

    while (num > 0) {
        rem = int(num % 2);

        if (rem == 1) {
            str = "1" str;
        } else {
            str = "0" str;
        }
        num = int(num / 2);
    }

    return str;
}

実行してみましょう。

$ echo 100 | gawk -f dec2bin.awk
1100100

と 2 進数に変換されます。

こういう数値計算は awk は決して得意とは言えません。 Unix であれば bc コマンドを用いることで解くことができますし、検算も行うことができます。

$ echo 'obase=2; 100' | bc
1100100

awk 版と同じ答えが出ていますので、awk 版は正しそうです。

一行野郎にしてみる

スクリプトが短いので一行野郎にしてみました。

$ echo 500 | gawk 'n=$0{while(n>0){s=int(n%2)?"1"s:"0"s;n=int(n/2)}}$0=s'
$ echo 500 | gawk 'n=$0{while(n>0){s=int(n%2)?1s:0s;n=int(n/2)}}$0=s'

修正しました (2009/02/25)

メールにて 2 の乗数になる場合に 1 が欠落しているというご指摘を受け、上記スクリプトを修正させていただきました。 ご指摘、ありがとうございます。 他にも間違えている箇所がありましたら hi_saito(at)yk.rim.or.jp 宛にメールでお知らせください。

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png