時間をかけて解く FizzBuzz
-
Upload
kazuyuki-chinda -
Category
Technology
-
view
120 -
download
2
description
Transcript of 時間をかけて解く FizzBuzz
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 endend
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
FizzBuzz コード例3項演算子def ternary_function n n % 15 == 0 ? ‘FizzBuzz’ : n % 3 == 0 ? ’Fizz’ : n % 5 == 0 ? ‘Buzz’ : nend
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 : retend
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' # ... endend
シンプルな FizzBuzz !?def silly_function puts ‘1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11Fizz 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 end
収束時の世代数: 19,473 世代目(3回のうち,2回は収束せず)
GP(遺伝的プログラミング)
ちなみに
GP(遺伝的プログラミング)
コード量
5 classes203 lines
GP(遺伝的プログラミング)かかった時間
コーディング
GA: 1 時間弱
GPへの改良: 1.5 時間
実行時間
一回につき,5 時間 とか 2 時間 とか
結論
FizzBuzz 問題くらい自分の頭で考えよう