くんすとの備忘録

IT系技術メモ

移転しました。

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

【cmd】コマンドプロンプトでFizzBuzz

オープンソースカンファレンス2013の、USP研究所のセッション(https://www.ospn.jp/osc2013-spring/modules/eguide/event.php?eid=55)に触発されまして。

ということで、書いていきます。
Windows7 64bitの、組み込みのコマンドだけを使用


まず、ただのリストを作成

for /L %n in (1,1,16) do @echo %n    

実行結果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16


とりえず3と5で割ってみる。

for /L %n in (1,1,16) do @set /a %n%3 && set/a %n%5 && echo  %n    

実行結果

11 1
22 2
03 3
14 4
20 5
01 6
12 7
23 8
04 9
10 10
21 11
02 12
13 13
24 14
00 15
11 16

※SET /a って、並べると変な動きするのね・・・

1桁目が %3 で、2桁目が %5 の値になってます。
コマンドプロンプトは、コマンド中に別のコマンドを書けないので、もう一工夫しないとFizzとBuzzを分けられません。
(1文字目を切り出して if して、2文字目を切り出して if して、、、みたいなのは非常に面倒)

むー・・・っと考えて、3か5で割り切れる値だけを抽出。

for /L %n in (1,1,16) do @set /a (10-%n%3)/10 && set/a (10-%n%5)/10 && echo  %n    

実行結果

00 1
00 2
10 3
00 4
01 5
10 6
00 7
00 8
10 9
01 10
00 11
10 12
00 13
00 14
11 15
00 16

そう、

となっています。


仕上げ。

for /f "usebackq tokens=1,2" %a in (`"for /L %n in (1,1,100) do @set /a (10-%n%3)/10 && set/a (10-%n%5)/10 && echo  %n && echo."`) do @(if %a==11 (echo FizzBuzz) else if %a==10 (echo Fizz) else if %a==01 (echo Buzz) else (echo %b))

実行結果

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
31
32

※以下略

完成!
コマンドプロンプトだけで頑張った割には、かなりスッキリした形かと。


Gistにも上げておきました。