Search This Blog

FizzBuzz One-liner

.batでFizzBuzzワンライナー - Qiita

setlocal enabledelayedexpansion はbatなどで遅延展開を有効にするためのもの。
One-linerでは有効にならないっぽい。When you use setlocal outside of a script or batch file, it has no effect.

One-liner での遅延展開が必要な時は、cmd /v:on による遅延展開を有効にしたPromptを起動してから実行する。One-Linerとして書かれているものに setlocal enabledelayedexpansion が含まれていたとしても無意味なので、削除するといくらかは短くなる。

@echo off&setlocal enabledelayedexpansion&for /l %%i in (1,1,100) do (set echo=&set /a f=%%i%%3,b=%%i%%5&(if !f!==0 set echo=!echo!Fizz)&(if !b!==0 set echo=!echo!Buzz)&(if "!echo!"=="" set echo=%%i)&echo !echo!&if %%i==100 pause)
One-liner へ手直しする過程の誤植等、少し修正したもの。
for /l %i in (1,1,20) ^
do @(set echo=&set /a f=%i%3,b=%i%5>nul&(if !f!==0 set echo=!echo!Fizz)&(if !b!==0 set echo=!echo!Buzz)&(if "!echo!"=="" set echo=%i)&echo !echo!) 
-- 
                   
0!echo!             0!echo!FizzBuzz
1!echo!             1!echo!
2!echo!             2!echo!
3!echo!             3!echo!Fizz
4!echo!             4!echo!
0!echo!             0!echo!Buzz

--
cmd /v:off          cmd /v:on

これは15-20行目の出力を抜粋したもの。 


自分でも作ってみる

面白そうなので自分で作り直してみることにした。
5H考え続けた。その纏まらない頭から不意に、あれ? Test のつもりが上手く動いちゃった...がこぼれ落ちた。

for /l %i in (1,1,150) ^

do @(set /a t=%i%3,f=%i%5,c=t*f>nul& set s=!t!!f!& if !c! EQU 0 if !s! LSS 10 if !f! EQU 0 (echo %i: threefive) else (echo %i: three) else (echo %i: five) else (echo %i: ))

 do @(set /a t=%i%3,f=%i%5,c=t*f>nul& if !c!   ==0 if !f!   ==0  if !t! NEQ 0 (echo five) else (echo threefive) else (echo three) else (echo %i))

 do @(set /a t=%i%3,f=%i%5,c=t*f>nul& if !c! EQU 0 if !f! EQU 0  if !t! NEQ 0 (echo five) else (echo threefive) else (echo three) else (echo %i))

cmd /v:on /c "for /l %i in (1,1,50) do @(set /a t=%i%3,f=%i%5,c=t*f>nul&set s=!t!!f!& if !c! EQU 0 if !s! LSS 10 if !f! EQU 0 (echo %i: threefive) else (echo %i: three) else (echo %i: five) else (echo %i: ))"




do statement は手直しの逕路で3つある。

行末の^は、長たらしい One-liner のようなものを、複行で表記、入力するためのもの。
コマンドラインに次の行もまだコマンドは続くよと教えるためものらしい。

解析される時には、[==]と[EQU]、それと否定条件でどれくらい差になるだろうか。
If文のネストは、質問回数ということだから、そちらに流れる処理をどうすれば効率よくすることができるだろうか。
コマンドプロンプトを強制終了させるにはどうすればいいのか。
わかっていないことは多い。

プログラムというものだけに限るものでなないけれど、物事は要望を満たるということが重視されると思う。
プログラムで言えば、動くものならOKということ。
その中身がどうなっているかは、異常が起きなければ関心などなくていいもの。
あまりにこだわりというか作り込んだところで、使えるものであるなら利用者には気にならない。
だけどもその自分だけの満足感がたまらなく欲しいと思うから、作り込むということに没頭してしまう。
そういう葛藤をしつつも、比べると結局、中身そのものが差となる。
だから私は無駄と思われる程の時間を注ぎ込むようなことを選ぶのだと思う。そしてそんな私であっていいとも思う。
しかし、動くものを作るということを最優先に、そのようにしていかなくてはならないことだけは意識したい。

batとか、for文を調べ始めてから3日程度経つけれど、もうお腹いっぱいかな。
ある程度は頑張って調べたから、おおよそは作れるようになったと思う。
特殊とか複雑な何かはあれだけどね。