Network Mask v2

Network Mask v2 終了&公開。

C

トップ inaniwa さんの解 は、ffs() という関数だった。Find First Set bit かな?ビット位置を返す関数だ。前に、確か、見たことある関数だな。

GolfScript

yvl さんの解 (上)と私の解(下)は以下の通り。

~]7/{2%{2base~}%0-,n}%
n%{'.'%{~2base~}%0-,n}%

1B 差で負けた。後半は同じ。2進数にして 1 の数を数えるというものだ。前半が異なる。私のほうが素直なので簡単だ。まず、入力を行に分解して、次に、'.' で分解して、各 8 bit のアドレス項目を 2進数にする、というものだ。平凡な解。yvl さんの解は、

~         # 入力文字列を eval する。
]         # とりあえず全部を配列に入れる
7/        # 7 要素ずつまとめる
{2%...}%  # 0, 2, 4, 6 番目の要素を取り出す

というものだ。'~' で入力を eval するところがミソで、

"255.255.255.128"~  # ==> 255 255 255 255 255 255 128

となる。'.' はスタックトップを duplicate するオペレーターなので、直前の数値が duplicate され、7 つの数値がスタックに積まれることになる。各アドレスが、7 つの数値になるので、全アドレスを eval したあとは、それらを 7 つずつにまとめ、偶数番目の要素を取り出すと、結局、アドレスの 4 つの各コンポーネントからなる配列の配列が得られるという仕組み。う〜む。よく、思いつくな、こんなの。見事です。やっぱり、トップをとるには、平凡なロジックではだめだな。