【cmd】コマンドプロンプトでFizzBuzz
オープンソースカンファレンス2013の、USP研究所のセッション(https://www.ospn.jp/osc2013-spring/modules/eguide/event.php?eid=55)に触発されまして。
シェル芸が流行ってるみたいだから、コマンドプロンプト芸やるは #osc2013tk
— くんすと (@kunst1080) February 23, 2013
ということで、書いていきます。
※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にも上げておきました。