【BAT】バッチファイルでFizzBuzz ※余剰計算なし
なんとなく、余剰計算しているのが気に入らなかったので、余剰計算なしのFizzBuzzというものを考えてみた。
余剰を使わないFizzBuzz・・・1nと3nと5nの数列を作ってマージしたらできそう。
— くんすと (@kunst1080) February 25, 2013
まとめたものをGistに上げました。
- 今回はワンライナーではありません
- 中間ファイルあり。
- サブルーチンを使用するためにBATファイルにしないといけませんでした(>_<)
- ぜんぶコマンドラインでやりたかったよぅ。。。
では、解説をば。
まず、1~100の数列を生成
for /L %i in (1,1,100) do @echo %i 4 %i>>Seq.txt
実行結果
1 4 1 2 4 2 3 4 3 ※中略 99 4 99 100 4 100
※わかりにくいかもしれないけど、2列目はあとで第二ソートキーとして使用します。
次に、3nの数列を生成
for /L %i in (3,3,100) do @echo %i 3 Fizz>>Fizz.txt
実行結果
3 3 Fizz 6 3 Fizz 9 3 Fizz ※中略 96 3 Fizz 99 3 Fizz
次に、5nの数列を生成
for /L %i in (5,5,100) do @echo %i 2 Buzz>>Buzz.txt
実行結果
5 2 Buzz 10 2 Buzz 15 2 Buzz ※中略 95 2 Buzz 100 2 Buzz
実は15nの数列も作らなきゃだった
for /L %i in (15,15,100) do @echo %i 1 FizzBuzz>>FizzBuzz.txt
実行結果
15 1 FizzBuzz 30 1 FizzBuzz 45 1 FizzBuzz 60 1 FizzBuzz 75 1 FizzBuzz 90 1 FizzBuzz
4つのファイルをマージしてソート
copy Seq.txt+Fizz.txt+Buzz.txt+FizzBuzz.txt merge.txt /B for /f "usebackq tokens=1,2,3" %a in ("merge.txt") do @(if %a lss 10 (echo 00%a %b %c) else if %a lss 100 (echo 0%a %b %c) else echo %a %b %c) >>merge.pass.txt sort merge.pass /O merge.pass.sort.txt
実行結果
001 4 1 002 4 2 003 3 Fizz 003 4 3 004 4 4 005 2 Buzz 005 4 5 ※中略 098 4 98 099 3 Fizz 099 4 99 100 2 Buzz 100 4 100
uniqして仕上げ
for /f "usebackq tokens=1,2,3" %a in ("merge.pass.sort.txt") do @( call :uniq %a %c) >>out.txt exit/b rem subroutine :uniq rem %1 … key rem %2 … data if not "%PREV%"=="%1" ( set PREV=%1 echo %2 ) exit /b
実行結果
1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 ※以下略
uniqコマンドを自作していれば、もう少し簡単に出来ます。
素のBATだけでやると、結構無理がある感じ。