くんすとの備忘録

IT系技術メモ

移転しました。

15秒後に自動的にリダイレクトします。

【BAT】バッチファイルでFizzBuzz ※余剰計算なし

なんとなく、余剰計算しているのが気に入らなかったので、余剰計算なしのFizzBuzzというものを考えてみた。


まとめたものを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だけでやると、結構無理がある感じ。