今回、超絶技巧プログラミングという素晴らしい本を読んだのでアスキーアートでFizzBuzzをしてみました。
四角の中に0x6d61という文字を書いています。結構見づらい…
eval(%w(1.upto(100)do|n|s=n;if(n%15==0);s="FizzBuzz
";e lsi f(n% 5== 0);s="Buz z";els if(n% 3==0
); s="F izz "; end ;puts(s);end ;;;; ;;;;;;;; ;;;;
;; ; ; ;;;; ;;;;; ;;;;; ;;;; ;;;;; ;;;;
;; ;;;; ;; ;; ;;;; ;;; ;;; ;;;; ;;;; ;;; ;;;;; ;;;;
;;; ;;; ;;;; ;;;; ;;;;;; ;;;;;; ;;;;;; ;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;)*"")
#解説
簡単にコードを解説していきます。まず%w
部分でfizzbuzzのメインコードを
配列に分解してます。%wは%w(wei wei wei)
と書くと[ "wei,"wei","wei"]に変換できます。
この仕組みのおかげでコードに空白を含めることが出来ます。次に*""
の部分で配列を再度結合して文字列にしています。
この段階での最終コードは以下になります。
"1.upto(100)do|n|s=n;if(n%15==0);s=\"FizzBuzz\";elsif(n%5==0);s=\"Buzz\";elsif(n%3==0);s=\"Fizz\";end;puts(s);end;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"
最後にこれをevalで実行しています。
このrubyプログラムを作成するために以下のコードを書きました。
ほぼ「超絶技巧プログラミング」のコードを参考にしています。
ascii = """
###################################################
### ### #### ### ######### ###### ##### ####
## #### ### ## ### ############ #### ######## ####
## # # #### ##### ##### #### ##### ####
## #### ## ## #### ### ### #### #### ### ##### ####
### ### #### #### ###### ###### ###### ####
###################################################
"""
puts ascii.length
code = <<'END'
1.upto(100) do |n|
s = n;
if(n%15==0);
s="FizzBuzz";
elsif(n%5==0);
s="Buzz";
elsif(n%3==0);
s="Fizz";
end;
puts(s);
end;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
END
p code.length
code = code.split.join
code = 'eval(%w(' + code + ')*"")'
code = ascii.gsub("#") { code.slice!(0,1)}
puts code
流れとしてはcodeを空白なしの一行にしevalを連結してアスキーアートの#をcodeで置き換えています。
注意する点はアスキーアートと実行したいコードの長さが一緒じゃなければいけないので上のコードでは
;でパディングしてます。
最後にpaizaのlinkをおいておきます。
FizzBuzz