逆fizzbuzz
ときどきの雑記帖経由で知った逆fizzbuzz問題。
紹介記事はこちらみたい。
逆FizzBuzz問題 (Inverse FizzBuzz) - 猫とC#について書くmatarilloの雑記
awkで書いてみた。
方針としては、なるべく頭を使わずにやる。fizz buzz...の並びは繰り返しパターンがあるが、充分な長さのパターンを用意しておき、それを最長一致検索、文字列の検索で引っ掛けて、その文字列の開始位置を表示すればよさそう。
fizz="F"、buzz="B"、fizzbuzz="Z"、その他="x"として文字列を生成し、それを検索するだけ。matchした位置がそのまま答えになる。
#! /usr/local/bin/gawk -f BEGIN{ S="" for (i=1;i<=100;i++) { t=i%5?i%3?"x":"F":i%3?"B":"Z"; S=S t # print t,i } } { l=NF gsub("fizzbuzz","Z") gsub("fizz","F") gsub("buzz","B") gsub(FS,"") # print $0 p=match(S,$0) if(p==0) { print "No match." } else { for(i=p;i<p+l;i++) print i } }
実行結果はこんな感じ。fizzでもbuzzでもfizzbuzzでもない所はxを入れてね。
fizz
3
buzz
5
fizz buzz
9
10
buzz fizz
5
6
fizz x buzz fizz
3
4
5
6
fizz x x fizz
6
7
8
9
fizz x x fizz buzz
6
7
8
9
10