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

An error occurred while retrieving the Tweet. It might have been deleted.

まとめたものをGistに上げました。

  • 今回はワンライナーではありません
  • 中間ファイルあり。
  • サブルーチンを使用するためにBATファイルにしないといけませんでした(>_<)
  • ぜんぶコマンドラインでやりたかったよぅ。。。
では、解説をば。
まず、1~100の数列を生成

1
2
3
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

1
2
3
4
5
次に、3nの数列を生成
```dosbatch
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

1
2
3
4
5
次に、5nの数列を生成
```dosbatch
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

1
2
3
4
5
実は15nの数列も作らなきゃだった
```dosbatch
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

1
2
3
4
5
6
7
4つのファイルをマージしてソート
```dosbatch
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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
uniqして仕上げ
```dosbatch
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だけでやると、結構無理がある感じ。