世界のナベアツ問題をなでしこで解いてみた

流行の二周遅れが雑念雑記の標準速度である。

文字列で解く人を批判する人もゐるが、そもそも「3の倍数」ならともかく「3がつく数字」といふのは発想からして文字列的なのだから、無理に数字列的に考へるより自然ではないかと思った。

ちなみに、私がよくお世話になる日本語プログラム言語「なでしこ」では、次のやうに書けば良い。

●ナベアツ判定(対象)
#方法1 対象を文字列分解して反復し、もしそれが"3"ならば、真で戻る。
#方法2 対象の0から"3"を文字検索し、もしそれがいいえでなければ、真で戻る。
#方法3 もし対象が"*3*"に一致ならば、真で戻る。
 戻る(偽)

もし、ナベアツ判定("242532462")が真ならば
 「あほ〜」と言う。
違えば
 「あほじゃないよ〜」と言う。
終了。

方法3はワイルドカードを用ゐた検索で、正規表現とどちらが早いかは判らない。なほ、これらの記述は以下と等価である。

●ナベアツ判定(対象)
#方法1 文字列分解(対象)を反復、もし(_ = "3")ならば、戻る(1)。
#方法2 もし(文字検索(対象,0,"3"))ならば、戻る(1)。
#方法3 もし(一致(対象,"*3*"))ならば、戻る(1)。
 戻る(0)

もし(ナベアツ判定("24352462"))ならば
 言う("あほ〜")
違えば
 言う("あほじゃないよ〜")
終了

方法2の判定方法が若干違ふのは、「文字検索」が、見つかった場合はその場所、見つからなければ0を返すため。後の例では0以外のどの数字が出ても真偽値*1に変換され真になるが、先の例では出てきた値を真偽値に変換せずに「真(1)」であるかを比較するため、1以外の数字が返ってきた場合に偽となってしまふ。そこで、偽(0)以外(〜でなければ)といふ書き方をしてゐる。

ちなみに、句読点は「、」が行の継続、「。」が行の終了を意味するが、Perlと異なり書いても書かなくても良い。ちなみに、戻り値を指定しなかった場合の戻り値は最終代入変数「それ」「_」*2である。

*1:ブール値とも言ふ。

*2:Perlで言ふところの$_