時間をかけて解く FizzBuzz

32
時間をかけて解く FizzBuzz [email protected]

description

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

Transcript of 時間をかけて解く FizzBuzz

Page 2: 時間をかけて解く FizzBuzz

FizzBuzz遊び方

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

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

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

ただし、

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

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

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

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

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

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

Page 3: 時間をかけて解く FizzBuzz

FizzBuzz

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

Page 4: 時間をかけて解く FizzBuzz

FizzBuzz

色々な FizzBuzz を書いてみる

Page 5: 時間をかけて解く FizzBuzz

FizzBuzz コード例if 文def if_function n if n % 15 == 0 'FizzBuzz' elsif n % 3 == 0 'Fizz' elsif n % 5 == 0 'Buzz' else n endend

Page 6: 時間をかけて解く FizzBuzz

FizzBuzz コード例case 文def case_function n case n % 15 when 0 'FizzBuzz' when 3, 6, 9, 12 'Fizz' when 5, 10 'Buzz' else n endend

Page 7: 時間をかけて解く FizzBuzz

FizzBuzz コード例3項演算子def ternary_function n n % 15 == 0 ? ‘FizzBuzz’ : n % 3 == 0 ? ’Fizz’ : n % 5 == 0 ? ‘Buzz’ : nend

Page 8: 時間をかけて解く FizzBuzz

FizzBuzz コード例map

def map_function (1..100).map{|n|(s=(n%3<1 ? 'Fizz' : '') + (n%5<1 ?'Buzz':''))=~/^$/ ? n:s}end

Page 9: 時間をかけて解く FizzBuzz

FizzBuzz コード例ヒアドキュメント

def here_document n ret="#{["Fizz"][n%3]}#{["Buzz"][n%5]}" ret.empty? ? n : retend

Page 10: 時間をかけて解く FizzBuzz

FizzBuzz コード例http://golf.shinh.org/p.rb?FizzBuzz

ruby での最短は 50 byte

Page 11: 時間をかけて解く FizzBuzz

FizzBuzz色々な FizzBuzz を書いてみる

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

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

短いコードを追求する必要はない

Page 12: 時間をかけて解く 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' # ... endend

Page 13: 時間をかけて解く FizzBuzz

シンプルな FizzBuzz !?def silly_function puts ‘1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11Fizz 13 14 FuzzBuzz 16 17 Fizz ...’end

Page 14: 時間をかけて解く FizzBuzz

ちょっとは考えよう.

Page 15: 時間をかけて解く FizzBuzz

誰が?

Page 16: 時間をかけて解く FizzBuzz

コンピュータが.

Page 17: 時間をかけて解く FizzBuzz

ここから本題.

Page 18: 時間をかけて解く FizzBuzz

計算機に考えてもらおう

ニューラルネットワーク

遺伝的アルゴリズム

強化学習

etc.

進化的アルゴリズム

Page 19: 時間をかけて解く FizzBuzz

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

遺伝子

染色体

交叉

突然変異

選択・淘汰

Page 20: 時間をかけて解く FizzBuzz

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

アルゴリズムの流れ

http://www.jepoc.or.jp/tecinfo/tec00048.htm

Page 21: 時間をかけて解く FizzBuzz

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

GA で文章を生成してみる

‘I am a Genius.’

Page 22: 時間をかけて解く FizzBuzz

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

demo

Page 23: 時間をかけて解く FizzBuzz

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

FizzBuzz 問題は解ける?

Page 24: 時間をかけて解く FizzBuzz

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

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

解析可能

かつ,実行可能

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

ハードルが高い!!!

Page 25: 時間をかけて解く FizzBuzz

GP(遺伝的プログラミング)

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

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

T. Segaran, 集合知プログラミング, p.274

Page 26: 時間をかけて解く FizzBuzz

GP(遺伝的プログラミング)生成された文字列が,その言語によって

解析可能

かつ,実行可能

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

clear!

clear!

Page 27: 時間をかけて解く FizzBuzz

GP(遺伝的プログラミング)パラメータ・条件

各世代の個体数: 100

突然変異確率: 0.1

選択戦略: エリート戦略

最大世代数: 100,000 世代

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

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

教師信号(適応度の算出): 1<n<50 までの結果

Page 28: 時間をかけて解く FizzBuzz

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 end

収束時の世代数: 19,473 世代目(3回のうち,2回は収束せず)

Page 29: 時間をかけて解く FizzBuzz

GP(遺伝的プログラミング)

ちなみに

Page 30: 時間をかけて解く FizzBuzz

GP(遺伝的プログラミング)

コード量

5 classes203 lines

Page 31: 時間をかけて解く FizzBuzz

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

コーディング

GA: 1 時間弱

GPへの改良: 1.5 時間

実行時間

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

Page 32: 時間をかけて解く FizzBuzz

結論

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