Successfully reported this slideshow.

時間をかけて解く FizzBuzz

3,526 views

Published on

2011-11-09, 社内LT大会@aiming-inc
2012-03-28, Shinjuku.rb #03 LT

Published in: Technology
  • Be the first to comment

時間をかけて解く FizzBuzz

  1. 1. 時間をかけて解くFizzBuzz kchinda@aiming-inc.com
  2. 2. FizzBuzz遊び方 プレイヤーは円状に座る。 最初のプレイヤーは「1」と数字を発言する。 次のプレイヤーは直前のプレイヤーの次の数字を発言していく。 ただし、 3で割り切れる場合は 「Fizz」 5で割り切れる場合は 「Buzz」 両者で割り切れる場合は 「Fizz Buzz」 を数の代わりに発言しなければならない。 発言を間違えた者や、ためらった者は脱落となる。 http://ja.wikipedia.org/wiki/Fizz_Buzz
  3. 3. FizzBuzz 1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz,13,14, FizzBuzz, 16, 17, Fizz, 19, Buzz...
  4. 4. FizzBuzz 色々な FizzBuzz を書いてみる
  5. 5. 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
  6. 6. 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
  7. 7. FizzBuzz コード例 3項演算子 def ternary_function n n % 15 == 0 ? ‘FizzBuzz’ : n % 3 == 0 ? ’Fizz’ : n % 5 == 0 ? ‘Buzz’ : n end
  8. 8. FizzBuzz コード例 map def map_function (1..100).map{|n|(s=(n%3<1 ? Fizz : ) + (n%5<1 ?Buzz:))=~/^$/ ? n:s} end
  9. 9. FizzBuzz コード例 ヒアドキュメント def here_document n ret="#{["Fizz"][n%3]}#{["Buzz"][n%5]}" ret.empty? ? n : ret end
  10. 10. FizzBuzz コード例 http://golf.shinh.org/p.rb?FizzBuzz ruby での最短は 50 byte
  11. 11. FizzBuzz 色々な FizzBuzz を書いてみる 短すぎるコードは難解過ぎる テクニックを知らないと無理 短いコードを追求する必要はない
  12. 12. シンプルな 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 # ... endend
  13. 13. シンプルな FizzBuzz !?def silly_function puts ‘1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11Fizz 13 14 FuzzBuzz 16 17 Fizz ...’end
  14. 14. ちょっとは考えよう.
  15. 15. 誰が?
  16. 16. コンピュータが.
  17. 17. ここから本題.
  18. 18. 進化的アルゴリズム計算機に考えてもらおう ニューラルネットワーク 遺伝的アルゴリズム 強化学習 etc.
  19. 19. GA(遺伝的アルゴリズム) 生物の遺伝のメカニズムを学習に応用 遺伝子 染色体 交 突然変異 選択・淘汰
  20. 20. GA(遺伝的アルゴリズム) アルゴリズムの流れ http://www.jepoc.or.jp/tecinfo/tec00048.htm
  21. 21. GA(遺伝的アルゴリズム) GA で文章を生成してみる ‘I am a Genius.’
  22. 22. GA(遺伝的アルゴリズム) demo
  23. 23. GA(遺伝的アルゴリズム) FizzBuzz 問題は解ける?
  24. 24. GA(遺伝的アルゴリズム)生成された文字列が,その言語によって 解析可能 かつ,実行可能 かつ,正しい結果を出力する ハードルが高い!!!
  25. 25. GP(遺伝的プログラミング) GA でのDNA配列を木構造で表現 プログラムとして解釈可能 T. Segaran, 集合知プログラミング, p.274
  26. 26. GP(遺伝的プログラミング) 生成された文字列が,その言語に よって 解析可能 clear! かつ,実行可能 clear! かつ,正しい結果を出力する
  27. 27. GP(遺伝的プログラミング) パラメータ・条件 各世代の個体数: 100 突然変異確率: 0.1 選択戦略: エリート戦略 最大世代数: 100,000 世代 使用できるオペレータ: +, -, *, %, if, > 使用できるオペランド: 1..10 の整数, ‘Fizz’, ‘Buzz’ 教師信号(適応度の算出): 1<n<50 までの結果
  28. 28. 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回は収束せず)
  29. 29. GP(遺伝的プログラミング) ちなみに
  30. 30. GP(遺伝的プログラミング) コード量 5 classes 203 lines
  31. 31. GP(遺伝的プログラミング) かかった時間 コーディング GA: 1 時間弱 GPへの改良: 1.5 時間 実行時間 一回につき,5 時間 とか 2 時間 とか
  32. 32. 結論 FizzBuzz 問題くらい 自分の頭で考えよう

×