人気ブログランキング | 話題のタグを見る
- 北の空からみなみへ -
exblog staff

<< 砂場遊び(1行FizzBuzz... cmd.exe 砂場遊び /3... >>
砂場遊び(1行FizzBuzz)
2018年 03月 08日
へっぽこ腕試しに、やってみた。(手元にwindowsマシンがないのでアイデアを練ること1日。コード作業に試行錯誤で数時間)
環境文字指定の自己参照、と、文字切り出し位置を変数で指定するのに for 文で変数を作ればできそうというアイデアで挑戦。
cmd/q/v:on/c "for /L %A in (1,1,100) do (set/a I=%A%3,Z=%A%5>nul&(for %B in (!I!) do set I=!I:~%B,1!)&for %B in (!Z!) do set Z=!Z:~%B,1!)&set $= &(if defined I set $=!$!Fizz)&(if defined Z set $=!$!Buzz)&set $=!$:~1!&(if not defined $ set $=%A)&echo !$!"
254 byte
実行結果
砂場遊び(1行FizzBuzz)_c0062295_19155944.gif

私にはこれが限界だったが、さすがはプロの方は更に100Byteほども小さく仕上げていた。(コードは他人様のですので実行結果だけ表示)
砂場遊び(1行FizzBuzz)_c0062295_19234540.gif

FizzBuzz問題についての、Wikipediaの解説



剰余を用いないとか、最初はどうやるの?と思ったが、自分の出力結果リストを見て納得。
(時間が3点だけの時計と、5点の時計と、同時に回して・・・ということは、15点時計を考えればOKか)
つまりは、計算させるんじゃなくてリストを用意して当てはめるという発想。

むかーし、coreアーキテクチャになる前の Pentium時代に、Pentium FDIV バグと呼ばれる問題が明らかになったことで知ったが、計算をさせるのではなくリストに当てはめる(日本の九九丸暗記はまさしくこれ)という手法は、ずるそうに思えて有効なのでした。
その結果、以下のワンライナーで解決したのでした。←嘘です、バグってました!
cmd/q/v:on/c "for /L %0 in (1,1,8) do for %A in (1 2 i 4 u i 7 8 i u B i D E z) do if %A==i (echo.Fizz) else if %A==u (echo.Buzz) else if %A==z (echo.FizzBuzz) else set/a $=%0*0x%A&echo."
187 byte
プロには及ばないし、カウントが100を超えてしまってるなんちゃって作品だが、十分に自己満足はできなのでした(笑)←勘違いのぬか喜びでした!

入浴中にふと思いついたのでさらに2段階の手入れをしてみる。
これが可能なのは、16進数にするのが英小文字でも許容されていればの話。←ここも大いに勘違い!
(例によって手元には実証できるPCがない)→ やはりこけた

cmd/q/v:on/c "for /L %0 in (1,1,8) do for %A in (1 2 Fi 4 Bu Fi 7 8 Fi Bu b Fi d e FizzBu) do if %A gtr f (echo.%Azz) else set/a $=%0*0x%A&echo."

150byte

さらに短くする方策としては、方言(?)として、BizzBuzz と言うやり方なら次に書くように手直せそう。

cmd/q/v:on/c "for /L %0 in (1,1,8) do for %A in (1 2 i 4 u i 7 8 i u b i d e izzBu) do if %A gtr f (echo.B%Azz) else set/a $=%0*0x%A&echo."
これで 145Byteかな?

検証したらスクリーンショットを貼っておきます。(今度はバグしないように w)←あはは!!完璧にバグってました!

バグってましたので後始末の投稿が続きます(泣
by bucmacoto | 2018-03-08 00:47 | &Tips;&code; | Comments(0)
名前
URL
削除用パスワード
<< 砂場遊び(1行FizzBuzz... cmd.exe 砂場遊び /3... >>
<< 砂場遊び(1行FizzBuzz... cmd.exe 砂場遊び /3... >>