時間をかけて解くFizzBuzz
       kchinda@aiming-inc.com
FizzBuzz
遊び方

 プレイヤーは円状に座る。

 最初のプレイヤーは「1」と数字を発言する。

 次のプレイヤーは直前のプレイヤーの次の数字を発言していく。

 ただし、

      3で割り切れる場合は 「Fizz」

      5で割り切れる場合は 「Buzz」

      両者で割り切れる場合は 「Fizz Buzz」

 を数の代わりに発言しなければならない。

 発言を間違えた者や、ためらった者は脱落となる。

                                http://ja.wikipedia.org/wiki/Fizz_Buzz
FizzBuzz


 1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz,
 Buzz, 11, Fizz,13,14, FizzBuzz, 16, 17,
 Fizz, 19, Buzz...
FizzBuzz


 色々な FizzBuzz を書いてみる
FizzBuzz コード例
 if 文
 def if_function n
   if n % 15 == 0
     'FizzBuzz'
   elsif n % 3 == 0
     'Fizz'
   elsif n % 5 == 0
     'Buzz'
   else
     n
   end
 end
FizzBuzz コード例
 case 文
 def case_function n
   case n % 15
   when 0
     'FizzBuzz'
   when 3, 6, 9, 12
     'Fizz'
   when 5, 10
     'Buzz'
   else
     n
   end
 end
FizzBuzz コード例
 3項演算子
 def ternary_function n
   n % 15 == 0 ? ‘FizzBuzz’ :
     n % 3 == 0 ? ’Fizz’ :
       n % 5 == 0 ? ‘Buzz’ : n
 end
FizzBuzz コード例
 map

 def map_function
   (1..100).map{|n|(s=(n%3<1 ? 'Fizz' :
 '') + (n%5<1 ?'Buzz':''))=~/^$/ ? n:s}
 end
FizzBuzz コード例
 ヒアドキュメント

 def here_document n
   ret="#{["Fizz"][n%3]}#{["Buzz"][n%5]}"
   ret.empty? ? n : ret
 end
FizzBuzz コード例
 http://golf.shinh.org/p.rb?FizzBuzz
 ruby での最短は 50 byte
FizzBuzz
 色々な FizzBuzz を書いてみる

  短すぎるコードは難解過ぎる

  テクニックを知らないと無理


  短いコードを追求する必要はない
シンプルな FizzBuzz !?
def silly_function n
  case n
  when 1; 1
  when 2; 2
  when 3; 'Fizz'
  when 4; 4
  when 5; 'Buzz'
  when 6; 'Fizz'
  when 7; 7
  when 8; 8
  when 9; 'Fizz'
  when 10; 'Buzz'
  # ...
  end
end
シンプルな FizzBuzz !?
def silly_function
  puts ‘1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11
Fizz 13 14 FuzzBuzz 16 17 Fizz ...’
end
ちょっとは考えよう.
誰が?
コンピュータが.
ここから本題.
進化的アルゴリズム
計算機に考えてもらおう

 ニューラルネットワーク

 遺伝的アルゴリズム

 強化学習

 etc.
GA(遺伝的アルゴリズム)
 生物の遺伝のメカニズムを学習に応用

 遺伝子

 染色体

 交

 突然変異

 選択・淘汰
GA(遺伝的アルゴリズム)

 アルゴリズムの流れ




         http://www.jepoc.or.jp/tecinfo/tec00048.htm
GA(遺伝的アルゴリズム)


 GA で文章を生成してみる

 ‘I am a Genius.’
GA(遺伝的アルゴリズム)



      demo
GA(遺伝的アルゴリズム)




 FizzBuzz 問題は解ける?
GA(遺伝的アルゴリズム)

生成された文字列が,その言語によって

 解析可能

 かつ,実行可能

 かつ,正しい結果を出力する

    ハードルが高い!!!
GP(遺伝的プログラミング)

 GA でのDNA配列を木構造で表現

 プログラムとして解釈可能




         T. Segaran, 集合知プログラミング, p.274
GP(遺伝的プログラミング)
 生成された文字列が,その言語に
 よって

  解析可能 clear!

  かつ,実行可能 clear!

  かつ,正しい結果を出力する
GP(遺伝的プログラミング)
  パラメータ・条件

   各世代の個体数: 100

   突然変異確率: 0.1

   選択戦略: エリート戦略

   最大世代数: 100,000 世代

   使用できるオペレータ: +, -, *, %, if, >

   使用できるオペランド: 1..10 の整数, ‘Fizz’, ‘Buzz’

   教師信号(適応度の算出): 1<n<50 までの結果
GP(遺伝的プログラミング)
 結果
 if ( 5 - 4 ) > n % ( 9 + ( 7 - 1 ) )
   'Fizz' + 'Buzz'
 else
   if (9 % 8) > n % 5
      'Fizz' * 1
   else
      if (7 - 6) > n % (10 % 7)
        'Buzz'
      else
        n
      end
   end             収束時の世代数: 19,473 世代目
 end               (3回のうち,2回は収束せず)
GP(遺伝的プログラミング)




  ちなみに
GP(遺伝的プログラミング)


 コード量

  5 classes
  203 lines
GP(遺伝的プログラミング)
 かかった時間

 コーディング

  GA: 1 時間弱

  GPへの改良: 1.5 時間

 実行時間

  一回につき,5 時間 とか 2 時間 とか
結論



     FizzBuzz 問題くらい
     自分の頭で考えよう

時間をかけて解く FizzBuzz