鳳鳴は祖父の俳号

日記 メモ そんなの

逆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