超絶プログラマーへの道
              @chiastolite




12年10月1日月曜日
スゴイ
        プログラマーに
         なりたい
12年10月1日月曜日
でもどうすれば?

12年10月1日月曜日
プログラム上達
         するためには?

12年10月1日月曜日
人のソースを
                読む

12年10月1日月曜日
でも

12年10月1日月曜日
まずは基礎を
               固めたい

12年10月1日月曜日
プログラマの
              基礎といえば?

12年10月1日月曜日
FizzBuzz問題

12年10月1日月曜日
なるほど
              わかりました

12年10月1日月曜日
これですね
12年10月1日月曜日
Reading
              Self-descriptive
                  FizzBuzz
                            @chiastolite




12年10月1日月曜日
Self-descriptive
                      FizzBuzz
              • Rubyを用いた超絶技巧プログラミング
               • http://www.slideshare.net/
                mametter/ruby-2012

              • 遠藤侑介さん(@mametter)作
               • Ruby2.0 リリースマネージャ& コミッター

12年10月1日月曜日
demo

12年10月1日月曜日
さっそくソースを
       読んでみましょう

12年10月1日月曜日
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日月曜日
なるほど

12年10月1日月曜日
わからん
12年10月1日月曜日
基礎謎知識

              • 自己複製
              • フォント圧縮
              • 実行可能なアスキーアート


12年10月1日月曜日
遠藤さんのスライド
        を参照します


12年10月1日月曜日
12年10月1日月曜日
12年10月1日月曜日
12年10月1日月曜日
つまり

              自己複製 をするプログラムを フォント
              圧縮 で得たビットパターン合わせて
              実行可能なアスキーアート として出力
              している




12年10月1日月曜日
何を言ってるのか
       わからねーと
        思うが(ry
12年10月1日月曜日
ソースコードに
          戻ります

12年10月1日月曜日
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日月曜日
読みやすく
               します

12年10月1日月曜日
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日月曜日
とりあえず
               1行ずつ
              読んでみる
12年10月1日月曜日
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日月曜日
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日月曜日
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日月曜日
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日月曜日
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日月曜日
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日月曜日
FizzBuzz判定…
             だと…!?

12年10月1日月曜日
FizzBuzz判定…
             だと…!?
              …なんであれで計算できるのか誰か教えてください
12年10月1日月曜日
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日月曜日
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日月曜日
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日月曜日
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日月曜日
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日月曜日
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日月曜日
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日月曜日
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日月曜日
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日月曜日
vに入る値
              • u.bytes.map{¦v¦ ... }
               • u= [1]
               • u= :>==;’ # fizz
               • u= ;<==?’ # buzz
               • u= :>==;<==?’ # fizzbuzz
12年10月1日月曜日
• [ 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日月曜日
• [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日月曜日
12年10月1日月曜日
              ?
12年10月1日月曜日
2 2 2 2 2 2 2 2 2 2 2 2 2 1 0 -1




12年10月1日月曜日
表示横幅の…
               だと…!?

12年10月1日月曜日
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日月曜日
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日月曜日
!x+32+v*3-y/5*44

   !n=2のとき


12年10月1日月曜日
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日月曜日
!
   "if0zgl11p0zghuhku744
   d8hzeg41qtfx7xs7twflr
   ".to_i(36)
   [x+32+v*3-y/5*44]

   !n=2のとき
12年10月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   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日月曜日
"if0zgl11p0zghuhku744
   d8hzeg41qtfx7xs7twflr
   ".to_i(36)
   [x+32+v*3-y/5*44]<1
   ? z*9:’*’*9

   !n=2のとき
12年10月1日月曜日
***************************
              ***************************
              ***************************
              ***************************
              ***************************
                                *********
                                *********
                                *********
                                *********
                                *********
              ***************************
              ***************************
              ***************************
              ***************************
              ***************************
              *********
              *********
              *********
              *********
              *********
              ***************************
              ***************************
              ***************************
              ***************************
              ***************************
12年10月1日月曜日
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日月曜日
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日月曜日
以上

12年10月1日月曜日
結論

12年10月1日月曜日
超絶プログラマーへ
        の道は険しい


12年10月1日月曜日

Reading Self-descriptive FizzBuzz

  • 1.
    超絶プログラマーへの道 @chiastolite 12年10月1日月曜日
  • 2.
    スゴイ プログラマーに なりたい 12年10月1日月曜日
  • 3.
  • 4.
    プログラム上達 するためには? 12年10月1日月曜日
  • 5.
    人のソースを 読む 12年10月1日月曜日
  • 6.
  • 7.
    まずは基礎を 固めたい 12年10月1日月曜日
  • 8.
    プログラマの 基礎といえば? 12年10月1日月曜日
  • 9.
  • 10.
    なるほど わかりました 12年10月1日月曜日
  • 11.
  • 12.
    Reading Self-descriptive FizzBuzz @chiastolite 12年10月1日月曜日
  • 13.
    Self-descriptive FizzBuzz • Rubyを用いた超絶技巧プログラミング • http://www.slideshare.net/ mametter/ruby-2012 • 遠藤侑介さん(@mametter)作 • Ruby2.0 リリースマネージャ& コミッター 12年10月1日月曜日
  • 14.
  • 15.
    さっそくソースを 読んでみましょう 12年10月1日月曜日
  • 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.
  • 18.
  • 19.
    基礎謎知識 • 自己複製 • フォント圧縮 • 実行可能なアスキーアート 12年10月1日月曜日
  • 20.
    遠藤さんのスライド を参照します 12年10月1日月曜日
  • 21.
  • 22.
  • 23.
  • 24.
    つまり 自己複製 をするプログラムを フォント 圧縮 で得たビットパターン合わせて 実行可能なアスキーアート として出力 している 12年10月1日月曜日
  • 25.
    何を言ってるのか わからねーと 思うが(ry 12年10月1日月曜日
  • 26.
    ソースコードに 戻ります 12年10月1日月曜日
  • 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.
    読みやすく します 12年10月1日月曜日
  • 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.
    とりあえず 1行ずつ 読んでみる 12年10月1日月曜日
  • 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.
    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.
    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.
    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.
    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.
    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.
    FizzBuzz判定… だと…!? 12年10月1日月曜日
  • 38.
    FizzBuzz判定… だと…!? …なんであれで計算できるのか誰か教えてください 12年10月1日月曜日
  • 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.
    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.
    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.
    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.
    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.
    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.
    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.
    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.
    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.
    vに入る値 • u.bytes.map{¦v¦ ... } • u= [1] • u= :>==;’ # fizz • u= ;<==?’ # buzz • u= :>==;<==?’ # fizzbuzz 12年10月1日月曜日
  • 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.
    • [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.
  • 52.
  • 53.
    2 2 22 2 2 2 2 2 2 2 2 2 1 0 -1 12年10月1日月曜日
  • 54.
    表示横幅の… だと…!? 12年10月1日月曜日
  • 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.
    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.
    !x+32+v*3-y/5*44 !n=2のとき 12年10月1日月曜日
  • 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.
    ! "if0zgl11p0zghuhku744 d8hzeg41qtfx7xs7twflr ".to_i(36) [x+32+v*3-y/5*44] !n=2のとき 12年10月1日月曜日
  • 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.
    "if0zgl11p0zghuhku744 d8hzeg41qtfx7xs7twflr ".to_i(36) [x+32+v*3-y/5*44]<1 ? z*9:’*’*9 !n=2のとき 12年10月1日月曜日
  • 62.
    *************************** *************************** *************************** *************************** *************************** ********* ********* ********* ********* ********* *************************** *************************** *************************** *************************** *************************** ********* ********* ********* ********* ********* *************************** *************************** *************************** *************************** *************************** 12年10月1日月曜日
  • 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.
    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.
  • 66.
  • 67.
    超絶プログラマーへ の道は険しい 12年10月1日月曜日