Successfully reported this slideshow.

More Related Content

Related Books

Free with a 14 day trial from Scribd

See all

Related Audiobooks

Free with a 14 day trial from Scribd

See all

Reading Self-descriptive FizzBuzz

  1. 1. 超絶プログラマーへの道 @chiastolite 12年10月1日月曜日
  2. 2. スゴイ プログラマーに なりたい 12年10月1日月曜日
  3. 3. でもどうすれば? 12年10月1日月曜日
  4. 4. プログラム上達 するためには? 12年10月1日月曜日
  5. 5. 人のソースを 読む 12年10月1日月曜日
  6. 6. でも 12年10月1日月曜日
  7. 7. まずは基礎を 固めたい 12年10月1日月曜日
  8. 8. プログラマの 基礎といえば? 12年10月1日月曜日
  9. 9. FizzBuzz問題 12年10月1日月曜日
  10. 10. なるほど わかりました 12年10月1日月曜日
  11. 11. これですね 12年10月1日月曜日
  12. 12. Reading Self-descriptive FizzBuzz @chiastolite 12年10月1日月曜日
  13. 13. Self-descriptive FizzBuzz • Rubyを用いた超絶技巧プログラミング • http://www.slideshare.net/ mametter/ruby-2012 • 遠藤侑介さん(@mametter)作 • Ruby2.0 リリースマネージャ& コミッター 12年10月1日月曜日
  14. 14. demo 12年10月1日月曜日
  15. 15. さっそくソースを 読んでみましょう 12年10月1日月曜日
  16. 16. eval(s=s= %w@proc{| n|z=32.ch r;k="[#{n +=1}]";u= ":>==;<==?"[m=n**4 %-15,m+13]||"#{$f= k}";d="Y.E.#{c=64. chr}*'')";$f||d<<z +k;t="eval(s=s=%w# {c+s=s[0, 334]}#$f# ";25.time s{|y|m=u. bytes.map {|v|t<<s; (0..[62-v ,2].min). map{|x|"i f0zgl11p0 zghuhku744d8hzeg41qtfx7xs7t wflr".to_i(36)[x+32+v*3-y/5 *44]<1?z*9:t.slice!(0,9)}<< z}.join.rstrip;y>23&&m[-9,9 ]=d;puts(m)}}[1]#pY.E.@*'') 12年10月1日月曜日
  17. 17. なるほど 12年10月1日月曜日
  18. 18. わからん 12年10月1日月曜日
  19. 19. 基礎謎知識 • 自己複製 • フォント圧縮 • 実行可能なアスキーアート 12年10月1日月曜日
  20. 20. 遠藤さんのスライド を参照します 12年10月1日月曜日
  21. 21. 12年10月1日月曜日
  22. 22. 12年10月1日月曜日
  23. 23. 12年10月1日月曜日
  24. 24. つまり 自己複製 をするプログラムを フォント 圧縮 で得たビットパターン合わせて 実行可能なアスキーアート として出力 している 12年10月1日月曜日
  25. 25. 何を言ってるのか わからねーと 思うが(ry 12年10月1日月曜日
  26. 26. ソースコードに 戻ります 12年10月1日月曜日
  27. 27. eval(s=s= %w@proc{| n|z=32.ch r;k="[#{n +=1}]";u= ":>==;<==?"[m=n**4 %-15,m+13]||"#{$f= k}";d="Y.E.#{c=64. chr}*'')";$f||d<<z +k;t="eval(s=s=%w# {c+s=s[0, 334]}#$f# ";25.time s{|y|m=u. bytes.map {|v|t<<s; (0..[62-v ,2].min). map{|x|"i f0zgl11p0 zghuhku744d8hzeg41qtfx7xs7t wflr".to_i(36)[x+32+v*3-y/5 *44]<1?z*9:t.slice!(0,9)}<< z}.join.rstrip;y>23&&m[-9,9 ]=d;puts(m)}}[1]#pY.E.@*'') 12年10月1日月曜日
  28. 28. 読みやすく します 12年10月1日月曜日
  29. 29. eval(s=s= %w@proc{|n| z=32.chr; k="[#{n+=1}]"; u=":>==;<==?"[m=n**4% -15,m+13]||"#{$f=k}"; d="Y.E.#{c=64.chr}*'')"; $f||d<<z+k; t="eval(s=s=%w#{c+s=s[0,334]}#$f#"; 25.times{|y| m=u.bytes.map{|v| t<<s; (0..[62-v,2].min).map{|x| "if0zgl11p0zghuhku744d8hzeg41qtfx7xs7twflr" .to_i(36)[x+32+v*3-y/5*44]<1?z*9:t.slice!(0,9)}<< z }.join.rstrip; y>23&&m[-9,9]=d; puts(m) } }[1]#pY.E.@*'') 12年10月1日月曜日
  30. 30. とりあえず 1行ずつ 読んでみる 12年10月1日月曜日
  31. 31. eval(s=s= #<= 自己複製用にソースをsに代入 %w@proc{|n| z=32.chr; k="[#{n+=1}]"; u=":>==;<==?"[m=n**4% -15,m+13]||"#{$f=k}"; d="Y.E.#{c=64.chr}*'')"; $f||d<<z+k; t="eval(s=s=%w#{c+s=s[0,334]}#$f#"; 25.times{|y| m=u.bytes.map{|v| t<<s; (0..[62-v,2].min).map{|x| "if0zgl11p0zghuhku744d8hzeg41qtfx7xs7twflr" .to_i(36)[x+32+v*3-y/5*44]<1?z*9:t.slice!(0,9)}<< z }.join.rstrip; y>23&&m[-9,9]=d; puts(m) } }[1]#pY.E.@*'') 12年10月1日月曜日
  32. 32. eval(s=s= #<= 自己複製用にソースをsに代入 %w@proc{|n| # <= eval で実行する用の文字列配列 @∼@ nには前回の数値 z=32.chr; k="[#{n+=1}]"; u=":>==;<==?"[m=n**4% -15,m+13]||"#{$f=k}"; d="Y.E.#{c=64.chr}*'')"; $f||d<<z+k; t="eval(s=s=%w#{c+s=s[0,334]}#$f#"; 25.times{|y| m=u.bytes.map{|v| t<<s; (0..[62-v,2].min).map{|x| "if0zgl11p0zghuhku744d8hzeg41qtfx7xs7twflr" .to_i(36)[x+32+v*3-y/5*44]<1?z*9:t.slice!(0,9)}<< z }.join.rstrip; y>23&&m[-9,9]=d; puts(m) } }[1]#pY.E.@*'') # <= * ‘’ は Array.join(‘’)の シンタックスシュガー 12年10月1日月曜日
  33. 33. eval(s=s= #<= 自己複製用にソースをsに代入 %w@proc{|n| # <= eval で実行する用の文字列配列 @∼@ nには前回の数値 z=32.chr; # <= 半角スペース(通常のはjoinで消えるため) k="[#{n+=1}]"; u=":>==;<==?"[m=n**4% -15,m+13]||"#{$f=k}"; d="Y.E.#{c=64.chr}*'')"; $f||d<<z+k; t="eval(s=s=%w#{c+s=s[0,334]}#$f#"; 25.times{|y| m=u.bytes.map{|v| t<<s; (0..[62-v,2].min).map{|x| "if0zgl11p0zghuhku744d8hzeg41qtfx7xs7twflr" .to_i(36)[x+32+v*3-y/5*44]<1?z*9:t.slice!(0,9)}<< z }.join.rstrip; y>23&&m[-9,9]=d; puts(m) } }[1]#pY.E.@*'') # <= * ‘’ は Array.join(’’)の シンタックスシュガー 12年10月1日月曜日
  34. 34. eval(s=s= #<= 自己複製用にソースをsに代入 %w@proc{|n| # <= eval で実行する用の文字列配列 @∼@ nには前回の数値 z=32.chr; # <= 半角スペース(通常のはjoinで消えるため) k="[#{n+=1}]"; # <= nをカウントアップ + 次回用の文字列生成 u=":>==;<==?"[m=n**4% -15,m+13]||"#{$f=k}"; d="Y.E.#{c=64.chr}*'')"; $f||d<<z+k; t="eval(s=s=%w#{c+s=s[0,334]}#$f#"; 25.times{|y| m=u.bytes.map{|v| t<<s; (0..[62-v,2].min).map{|x| "if0zgl11p0zghuhku744d8hzeg41qtfx7xs7twflr" .to_i(36)[x+32+v*3-y/5*44]<1?z*9:t.slice!(0,9)}<< z }.join.rstrip; y>23&&m[-9,9]=d; puts(m) } }[1]#pY.E.@*'') # <= * ‘’ は Array.join(’’)の シンタックスシュガー 12年10月1日月曜日
  35. 35. eval(s=s= #<= 自己複製用にソースをsに代入 %w@proc{|n| # <= eval で実行する用の文字列配列 @∼@ nには前回の数値 z=32.chr; # <= 半角スペース(通常のはjoinで消えるため) k="[#{n+=1}]"; # <= nをカウントアップ + 次回用の文字列生成 u=":>==;<==?"[m=n**4% -15,m+13]||"#{$f=k}"; #<= ???? d="Y.E.#{c=64.chr}*'')"; $f||d<<z+k; t="eval(s=s=%w#{c+s=s[0,334]}#$f#"; 25.times{|y| m=u.bytes.map{|v| t<<s; (0..[62-v,2].min).map{|x| "if0zgl11p0zghuhku744d8hzeg41qtfx7xs7twflr" .to_i(36)[x+32+v*3-y/5*44]<1?z*9:t.slice!(0,9)}<< z }.join.rstrip; y>23&&m[-9,9]=d; puts(m) } }[1]#pY.E.@*'') # <= * ‘’ は Array.join(’’)の シンタックスシュガー 12年10月1日月曜日
  36. 36. u=":>==;<==?"[m=n**4%-15,m+13]||"#{$f=k}" • n=1ならm=-14 • n=5ならm=-5 • u= [1] • u= ;<==? • n=2ならm=-14 • n=15ならm=-0 • u= [2] • u= >==;<==? • n=3ならm=-9 • u= :>== 12年10月1日月曜日
  37. 37. FizzBuzz判定… だと…!? 12年10月1日月曜日
  38. 38. FizzBuzz判定… だと…!? …なんであれで計算できるのか誰か教えてください 12年10月1日月曜日
  39. 39. eval(s=s= #<= 自己複製用にソースをsに代入 %w@proc{|n| # <= eval で実行する用の文字列配列 @∼@ nには前回の数値 z=32.chr; # <= 半角スペース(通常のはjoinで消えるため) k="[#{n+=1}]"; # <= nをカウントアップ + 次回用の文字列生成 u=":>==;<==?"[m=n**4% -15,m+13]||"#{$f=k}"; #<= FizzBuzzでした d="Y.E.#{c=64.chr}*'')"; $f||d<<z+k; t="eval(s=s=%w#{c+s=s[0,334]}#$f#"; 25.times{|y| m=u.bytes.map{|v| t<<s; (0..[62-v,2].min).map{|x| "if0zgl11p0zghuhku744d8hzeg41qtfx7xs7twflr" .to_i(36)[x+32+v*3-y/5*44]<1?z*9:t.slice!(0,9)}<< z }.join.rstrip; y>23&&m[-9,9]=d; puts(m) } }[1]#pY.E.@*'') # <= * ‘’ は Array.join(’’)の シンタックスシュガー 12年10月1日月曜日
  40. 40. eval(s=s= #<= 自己複製用にソースをsに代入 %w@proc{|n| # <= eval で実行する用の文字列配列 @∼@ nには前回の数値 z=32.chr; # <= 半角スペース(通常のはjoinで消えるため) k="[#{n+=1}]"; # <= nをカウントアップ + 次回用の文字列生成 u=":>==;<==?"[m=n**4% -15,m+13]||"#{$f=k}"; #<= FizzBuzzでした d="Y.E.#{c=64.chr}*'')"; #<= 署名(cは@) $f||d<<z+k; t="eval(s=s=%w#{c+s=s[0,334]}#$f#"; 25.times{|y| m=u.bytes.map{|v| t<<s; (0..[62-v,2].min).map{|x| "if0zgl11p0zghuhku744d8hzeg41qtfx7xs7twflr" .to_i(36)[x+32+v*3-y/5*44]<1?z*9:t.slice!(0,9)}<< z }.join.rstrip; y>23&&m[-9,9]=d; puts(m) } }[1]#pY.E.@*'') # <= * ‘’ は Array.join(’’)の シンタックスシュガー 12年10月1日月曜日
  41. 41. eval(s=s= #<= 自己複製用にソースをsに代入 %w@proc{|n| # <= eval で実行する用の文字列配列 @∼@ nには前回の数値 z=32.chr; # <= 半角スペース(通常のはjoinで消えるため) k="[#{n+=1}]"; # <= nをカウントアップ + 次回用の文字列生成 u=":>==;<==?"[m=n**4% -15,m+13]||"#{$f=k}"; #<= FizzBuzzでした d="Y.E.#{c=64.chr}*'')"; #<= 署名(cは@) $f||d<<z+k; # <= ‘Fizz’,‘Buzz’,‘FizzBuzz’の際は’[n]’を別表示するため t="eval(s=s=%w#{c+s=s[0,334]}#$f#"; 25.times{|y| m=u.bytes.map{|v| t<<s; (0..[62-v,2].min).map{|x| "if0zgl11p0zghuhku744d8hzeg41qtfx7xs7twflr" .to_i(36)[x+32+v*3-y/5*44]<1?z*9:t.slice!(0,9)}<< z }.join.rstrip; y>23&&m[-9,9]=d; puts(m) } }[1]#pY.E.@*'') # <= * ‘’ は Array.join(’’)の シンタックスシュガー 12年10月1日月曜日
  42. 42. eval(s=s= #<= 自己複製用にソースをsに代入 %w@proc{|n| # <= eval で実行する用の文字列配列 @∼@ nには前回の数値 z=32.chr; # <= 半角スペース(通常のはjoinで消えるため) k="[#{n+=1}]"; # <= nをカウントアップ + 次回用の文字列生成 u=":>==;<==?"[m=n**4% -15,m+13]||"#{$f=k}"; #<= FizzBuzzでした d="Y.E.#{c=64.chr}*'')"; #<= 署名(cは@) $f||d<<z+k; # <= ‘Fizz’,‘Buzz’,‘FizzBuzz’の際は’[n]’を別表示するため t="eval(s=s=%w#{c+s=s[0,334]}#$f#"; #<= evalつけて’[n]‘とかつけて 25.times{|y| m=u.bytes.map{|v| t<<s; (0..[62-v,2].min).map{|x| "if0zgl11p0zghuhku744d8hzeg41qtfx7xs7twflr" .to_i(36)[x+32+v*3-y/5*44]<1?z*9:t.slice!(0,9)}<< z }.join.rstrip; y>23&&m[-9,9]=d; puts(m) } }[1]#pY.E.@*'') # <= * ‘’ は Array.join(’’)の シンタックスシュガー 12年10月1日月曜日
  43. 43. s[0,334] eval(s=s=%w@proc{|n|z=32.chr;k="[#{n +=1}]";u=":>==;<==?"[m=n**4%-15,m +13]||"#{$f=k}";d="Y.E.#{c=64.chr}*'')";$f||d<<z +k;t="eval(s=s=%w#{c+s=s[0,334]}#$f#";25.times{|y| m=u.bytes.map{|v|t<<s;(0..[62-v,2].min).map{| x|"if0zgl11p0zghuhku744d8hzeg41qtfx7xs7twflr".to_i(36) [x+32+v*3-y/5*44]<1?z*9:t.slice!(0,9)} <<z}.join.rstrip;y>23&&m[-9,9]=d;puts(m)}} [1]#pY.E.@*'') ここ 12年10月1日月曜日
  44. 44. eval(s=s= #<= 自己複製用にソースをsに代入 %w@proc{|n| # <= eval で実行する用の文字列配列 @∼@ nには前回の数値 z=32.chr; # <= 半角スペース(通常のはjoinで消えるため) k="[#{n+=1}]"; # <= nをカウントアップ + 次回用の文字列生成 u=":>==;<==?"[m=n**4% -15,m+13]||"#{$f=k}"; #<= FizzBuzzでした d="Y.E.#{c=64.chr}*'')"; #<= 署名(cは@) $f||d<<z+k; # <= ‘Fizz’,‘Buzz’,‘FizzBuzz’の際は’[n]’を別表示するため t="eval(s=s=%w#{c+s=s[0,334]}#$f#"; #<= evalつけて’[n]‘とかつけて 25.times{|y| # <= 1行毎に表示 m=u.bytes.map{|v| t<<s; (0..[62-v,2].min).map{|x| "if0zgl11p0zghuhku744d8hzeg41qtfx7xs7twflr" .to_i(36)[x+32+v*3-y/5*44]<1?z*9:t.slice!(0,9)}<< z }.join.rstrip; y>23&&m[-9,9]=d; puts(m) } }[1]#pY.E.@*'') # <= * ‘’ は Array.join(’’)の シンタックスシュガー 12年10月1日月曜日
  45. 45. eval(s=s= #<= 自己複製用にソースをsに代入 %w@proc{|n| # <= eval で実行する用の文字列配列 @∼@ nには前回の数値 z=32.chr; # <= 半角スペース(通常のはjoinで消えるため) k="[#{n+=1}]"; # <= nをカウントアップ + 次回用の文字列生成 u=":>==;<==?"[m=n**4% -15,m+13]||"#{$f=k}"; #<= FizzBuzzでした d="Y.E.#{c=64.chr}*'')"; #<= 署名(cは@) $f||d<<z+k; # <= ‘Fizz’,‘Buzz’,‘FizzBuzz’の際は’[n]’を別表示するため t="eval(s=s=%w#{c+s=s[0,334]}#$f#"; #<= evalつけて’[n]‘とかつけて 25.times{|y| # <= 1行毎に表示 m=u.bytes.map{|v| <= 先頭の文字から表示 t<<s; (0..[62-v,2].min).map{|x| "if0zgl11p0zghuhku744d8hzeg41qtfx7xs7twflr" .to_i(36)[x+32+v*3-y/5*44]<1?z*9:t.slice!(0,9)}<< z }.join.rstrip; y>23&&m[-9,9]=d; puts(m) } }[1]#pY.E.@*'') # <= * ‘’ は Array.join(’’)の シンタックスシュガー 12年10月1日月曜日
  46. 46. eval(s=s= #<= 自己複製用にソースをsに代入 %w@proc{|n| # <= eval で実行する用の文字列配列 @∼@ nには前回の数値 z=32.chr; # <= 半角スペース(通常のはjoinで消えるため) k="[#{n+=1}]"; # <= nをカウントアップ + 次回用の文字列生成 u=":>==;<==?"[m=n**4% -15,m+13]||"#{$f=k}"; #<= FizzBuzzでした d="Y.E.#{c=64.chr}*'')"; #<= 署名(cは@) $f||d<<z+k; # <= ‘Fizz’,‘Buzz’,‘FizzBuzz’の際は’[n]’を別表示するため t="eval(s=s=%w#{c+s=s[0,334]}#$f#"; #<= evalつけて’[n]‘とかつけて 25.times{|y| # <= 1行毎に表示 m=u.bytes.map{|v| <= 先頭の文字から表示 t<<s; # <= 出力が可変長なので余裕を見て追加 (0..[62-v,2].min).map{|x| "if0zgl11p0zghuhku744d8hzeg41qtfx7xs7twflr" .to_i(36)[x+32+v*3-y/5*44]<1?z*9:t.slice!(0,9)}<< z }.join.rstrip; y>23&&m[-9,9]=d; puts(m) } }[1]#pY.E.@*'') # <= * ‘’ は Array.join(’’)の シンタックスシュガー 12年10月1日月曜日
  47. 47. eval(s=s= #<= 自己複製用にソースをsに代入 %w@proc{|n| # <= eval で実行する用の文字列配列 @∼@ nには前回の数値 z=32.chr; # <= 半角スペース(通常のはjoinで消えるため) k="[#{n+=1}]"; # <= nをカウントアップ + 次回用の文字列生成 u=":>==;<==?"[m=n**4% -15,m+13]||"#{$f=k}"; #<= FizzBuzzでした d="Y.E.#{c=64.chr}*'')"; #<= 署名(cは@) $f||d<<z+k; # <= ‘Fizz’,‘Buzz’,‘FizzBuzz’の際は’[n]’を別表示するため t="eval(s=s=%w#{c+s=s[0,334]}#$f#"; #<= evalつけて’[n]‘とかつけて 25.times{|y| # <= 1行毎に表示 m=u.bytes.map{|v| <= 先頭の文字から表示 t<<s; # <= 出力が可変長なので余裕を見て追加 (0..[62-v,2].min).map{|x| #<= ? "if0zgl11p0zghuhku744d8hzeg41qtfx7xs7twflr" .to_i(36)[x+32+v*3-y/5*44]<1?z*9:t.slice!(0,9)}<< z }.join.rstrip; y>23&&m[-9,9]=d; puts(m) } }[1]#pY.E.@*'') # <= * ‘’ は Array.join(’’)の シンタックスシュガー 12年10月1日月曜日
  48. 48. vに入る値 • u.bytes.map{¦v¦ ... } • u= [1] • u= :>==;’ # fizz • u= ;<==?’ # buzz • u= :>==;<==?’ # fizzbuzz 12年10月1日月曜日
  49. 49. • [ 0 , "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?"].map{¦v¦ v.bytes.to_a}.flatten • [48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63] 12年10月1日月曜日
  50. 50. • [48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63].map{¦v¦ [62-v,2].min} • [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0, -1] 12年10月1日月曜日
  51. 51. 12年10月1日月曜日 ?
  52. 52. 12年10月1日月曜日
  53. 53. 2 2 2 2 2 2 2 2 2 2 2 2 2 1 0 -1 12年10月1日月曜日
  54. 54. 表示横幅の… だと…!? 12年10月1日月曜日
  55. 55. eval(s=s= #<= 自己複製用にソースをsに代入 %w@proc{|n| # <= eval で実行する用の文字列配列 @∼@ nには前回の数値 z=32.chr; # <= 半角スペース(通常のはjoinで消えるため) k="[#{n+=1}]"; # <= nをカウントアップ + 次回用の文字列生成 u=":>==;<==?"[m=n**4% -15,m+13]||"#{$f=k}"; #<= FizzBuzzでした d="Y.E.#{c=64.chr}*'')"; #<= 署名(cは@) $f||d<<z+k; # <= ‘Fizz’,‘Buzz’,‘FizzBuzz’の際は’[n]’を別表示するため t="eval(s=s=%w#{c+s=s[0,334]}#$f#"; #<= evalつけて’[n]‘とかつけて 25.times{|y| # <= 1行毎に表示 m=u.bytes.map{|v| <= 先頭の文字から表示 t<<s; # <= 出力が可変長なので余裕を見て追加 (0..[62-v,2].min).map{|x| #<= 出力文字列の幅 "if0zgl11p0zghuhku744d8hzeg41qtfx7xs7twflr" .to_i(36)[x+32+v*3-y/5*44]<1?z*9:t.slice!(0,9)}<< z }.join.rstrip; y>23&&m[-9,9]=d; puts(m) } }[1]#pY.E.@*'') # <= * ‘’ は Array.join(’’)の シンタックスシュガー 12年10月1日月曜日
  56. 56. eval(s=s= #<= 自己複製用にソースをsに代入 %w@proc{|n| # <= eval で実行する用の文字列配列 @∼@ nには前回の数値 z=32.chr; # <= 半角スペース(通常のはjoinで消えるため) k="[#{n+=1}]"; # <= nをカウントアップ + 次回用の文字列生成 u=":>==;<==?"[m=n**4% -15,m+13]||"#{$f=k}"; #<= FizzBuzzでした d="Y.E.#{c=64.chr}*'')"; #<= 署名(cは@) $f||d<<z+k; # <= ‘Fizz’,‘Buzz’,‘FizzBuzz’の際は’[n]’を別表示するため t="eval(s=s=%w#{c+s=s[0,334]}#$f#"; #<= evalつけて’[n]‘とかつけて 25.times{|y| # <= 1行毎に表示 m=u.bytes.map{|v| <= 先頭の文字から表示 t<<s; # <= 出力が可変長なので余裕を見て追加 (0..[62-v,2].min).map{|x| #<= 出力文字列の幅 "if0zgl11p0zghuhku744d8hzeg41qtfx7xs7twflr" .to_i(36)[x+32+v*3-y/5*44]<1?z*9:t.slice!(0,9)}<< z # <= ビットパターンから空白にするかソースにするか }.join.rstrip; y>23&&m[-9,9]=d; puts(m) } }[1]#pY.E.@*'') # <= * ‘’ は Array.join(’’)の シンタックスシュガー 12年10月1日月曜日
  57. 57. !x+32+v*3-y/5*44 !n=2のとき 12年10月1日月曜日
  58. 58. 182 183 184 182 183 184 182 183 184 182 183 184 182 183 184 138 139 140 138 139 140 138 139 140 138 139 140 138 139 140 94 95 96 94 95 96 94 95 96 94 95 96 94 95 96 50 51 52 50 51 52 50 51 52 50 51 52 50 51 52 6 7 8 6 7 8 6 7 8 6 7 8 6 7 8 12年10月1日月曜日
  59. 59. ! "if0zgl11p0zghuhku744 d8hzeg41qtfx7xs7twflr ".to_i(36) [x+32+v*3-y/5*44] !n=2のとき 12年10月1日月曜日
  60. 60. 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12年10月1日月曜日
  61. 61. "if0zgl11p0zghuhku744 d8hzeg41qtfx7xs7twflr ".to_i(36) [x+32+v*3-y/5*44]<1 ? z*9:’*’*9 !n=2のとき 12年10月1日月曜日
  62. 62. *************************** *************************** *************************** *************************** *************************** ********* ********* ********* ********* ********* *************************** *************************** *************************** *************************** *************************** ********* ********* ********* ********* ********* *************************** *************************** *************************** *************************** *************************** 12年10月1日月曜日
  63. 63. eval(s=s= #<= 自己複製用にソースをsに代入 %w@proc{|n| # <= eval で実行する用の文字列配列 @∼@ nには前回の数値 z=32.chr; # <= 半角スペース(通常のはjoinで消えるため) k="[#{n+=1}]"; # <= nをカウントアップ + 次回用の文字列生成 u=":>==;<==?"[m=n**4% -15,m+13]||"#{$f=k}"; #<= FizzBuzzでした d="Y.E.#{c=64.chr}*'')"; #<= 署名(cは@) $f||d<<z+k; # <= ‘Fizz’,‘Buzz’,‘FizzBuzz’の際は’[n]’を別表示するため t="eval(s=s=%w#{c+s=s[0,334]}#$f#"; #<= evalつけて’[n]‘とかつけて 25.times{|y| # <= 1行毎に表示 m=u.bytes.map{|v| <= 先頭の文字から表示 t<<s; # <= 出力が可変長なので余裕を見て追加 (0..[62-v,2].min).map{|x| #<= 出力文字列の幅 "if0zgl11p0zghuhku744d8hzeg41qtfx7xs7twflr" .to_i(36)[x+32+v*3-y/5*44]<1?z*9:t.slice!(0,9)}<< z # <= ビットパターンから空白にするかソースにするか }.join.rstrip; y>23&&m[-9,9]=d; # <= 最終行なら署名を入れる puts(m) } }[1]#pY.E.@*'') # <= * ‘’ は Array.join(’’)の シンタックスシュガー 12年10月1日月曜日
  64. 64. eval(s=s= #<= 自己複製用にソースをsに代入 %w@proc{|n| # <= eval で実行する用の文字列配列 @∼@ nには前回の数値 z=32.chr; # <= 半角スペース(通常のはjoinで消えるため) k="[#{n+=1}]"; # <= nをカウントアップ + 次回用の文字列生成 u=":>==;<==?"[m=n**4% -15,m+13]||"#{$f=k}"; #<= FizzBuzzでした d="Y.E.#{c=64.chr}*'')"; #<= 署名(cは@) $f||d<<z+k; # <= ‘Fizz’,‘Buzz’,‘FizzBuzz’の際は’[n]’を別表示するため t="eval(s=s=%w#{c+s=s[0,334]}#$f#"; #<= evalつけて’[n]‘とかつけて 25.times{|y| # <= 1行毎に表示 m=u.bytes.map{|v| <= 先頭の文字から表示 t<<s; # <= 出力が可変長なので余裕を見て追加 (0..[62-v,2].min).map{|x| #<= 出力文字列の幅 "if0zgl11p0zghuhku744d8hzeg41qtfx7xs7twflr" .to_i(36)[x+32+v*3-y/5*44]<1?z*9:t.slice!(0,9)}<< z # <= ビットパターンから空白にするかソースにするか }.join.rstrip; y>23&&m[-9,9]=d; # <= 最終行なら署名を入れる puts(m) # <= 1行毎に出力 } }[1]#pY.E.@*'') # <= * ‘’ は Array.join(’’)の シンタックスシュガー 12年10月1日月曜日
  65. 65. 以上 12年10月1日月曜日
  66. 66. 結論 12年10月1日月曜日
  67. 67. 超絶プログラマーへ の道は険しい 12年10月1日月曜日

×