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 つの各コンポーネントからなる配列の配列が得られるという仕組み。う〜む。よく、思いつくな、こんなの。見事です。やっぱり、トップをとるには、平凡なロジックではだめだな。