SlideShare a Scribd company logo
1 of 67
Download to read offline
超絶プログラマーへの道
              @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日月曜日

More Related Content

Similar to Reading Self-descriptive FizzBuzz

Ruby を用いた超絶技巧プログラミング(夏のプログラミングシンポジウム 2012)
Ruby を用いた超絶技巧プログラミング(夏のプログラミングシンポジウム 2012)Ruby を用いた超絶技巧プログラミング(夏のプログラミングシンポジウム 2012)
Ruby を用いた超絶技巧プログラミング(夏のプログラミングシンポジウム 2012)mametter
 
2012年10月27日 Hbstudy#38
2012年10月27日 Hbstudy#382012年10月27日 Hbstudy#38
2012年10月27日 Hbstudy#38Ryuichi Ueda
 
メンテできないコードをメンテする技術
メンテできないコードをメンテする技術メンテできないコードをメンテする技術
メンテできないコードをメンテする技術Tomoya Ishida
 
20130223 OSC Tokyo/Spring
20130223 OSC Tokyo/Spring20130223 OSC Tokyo/Spring
20130223 OSC Tokyo/SpringRyuichi Ueda
 
何もないところから数を作る
何もないところから数を作る何もないところから数を作る
何もないところから数を作るTaketo Sano
 
K010 appstat201201
K010 appstat201201K010 appstat201201
K010 appstat201201t2tarumi
 

Similar to Reading Self-descriptive FizzBuzz (6)

Ruby を用いた超絶技巧プログラミング(夏のプログラミングシンポジウム 2012)
Ruby を用いた超絶技巧プログラミング(夏のプログラミングシンポジウム 2012)Ruby を用いた超絶技巧プログラミング(夏のプログラミングシンポジウム 2012)
Ruby を用いた超絶技巧プログラミング(夏のプログラミングシンポジウム 2012)
 
2012年10月27日 Hbstudy#38
2012年10月27日 Hbstudy#382012年10月27日 Hbstudy#38
2012年10月27日 Hbstudy#38
 
メンテできないコードをメンテする技術
メンテできないコードをメンテする技術メンテできないコードをメンテする技術
メンテできないコードをメンテする技術
 
20130223 OSC Tokyo/Spring
20130223 OSC Tokyo/Spring20130223 OSC Tokyo/Spring
20130223 OSC Tokyo/Spring
 
何もないところから数を作る
何もないところから数を作る何もないところから数を作る
何もないところから数を作る
 
K010 appstat201201
K010 appstat201201K010 appstat201201
K010 appstat201201
 

Recently uploaded

Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 

Recently uploaded (12)

Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 

Reading Self-descriptive FizzBuzz

  • 1. 超絶プログラマーへの道 @chiastolite 12年10月1日月曜日
  • 2. スゴイ プログラマーに なりたい 12年10月1日月曜日
  • 4. プログラム上達 するためには? 12年10月1日月曜日
  • 5. 人のソースを 読む 12年10月1日月曜日
  • 7. まずは基礎を 固めたい 12年10月1日月曜日
  • 8. プログラマの 基礎といえば? 12年10月1日月曜日
  • 10. なるほど わかりました 12年10月1日月曜日
  • 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日月曜日
  • 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日月曜日
  • 19. 基礎謎知識 • 自己複製 • フォント圧縮 • 実行可能なアスキーアート 12年10月1日月曜日
  • 20. 遠藤さんのスライド を参照します 12年10月1日月曜日
  • 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日月曜日
  • 53. 2 2 2 2 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日月曜日
  • 67. 超絶プログラマーへ の道は険しい 12年10月1日月曜日