SlideShare uma empresa Scribd logo
1 de 67
Baixar para ler 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日月曜日

Mais conteúdo relacionado

Semelhante a 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
 

Último

Último (11)

NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 

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日月曜日