57
Euler with Erlang EGAWA Takashi (@t_egg) https://plus.google.com/u/0/+TakashiEGAWA/ 歌舞伎座 .tech#5 「すごい Erlang をゆかいに学ぶ会」 ライトニングトーク 2014. 10. 30

Kabukiza Erlang Lightning Talk - Euler with Erlang

Embed Size (px)

DESCRIPTION

Kabukiza Erlang Lightning Talk - Euler with Erlang http://kbkz.connpass.com/event/8926/ http://live.nicovideo.jp/gate/lv197716856

Citation preview

Page 1: Kabukiza Erlang Lightning Talk - Euler with Erlang

Euler with Erlang

EGAWA Takashi (@t_egg)https://plus.google.com/u/0/+TakashiEGAWA/

歌舞伎座.tech#5「すごいErlangをゆかいに学ぶ会」ライトニングトーク

2014. 10. 30

Page 2: Kabukiza Erlang Lightning Talk - Euler with Erlang

  シロート(趣味)ですためになる話やすごい話は出てきません

スライドが60枚あるため早口になります

ご理解下さい

Page 3: Kabukiza Erlang Lightning Talk - Euler with Erlang

質問です

Page 4: Kabukiza Erlang Lightning Talk - Euler with Erlang

Project Euler を 知っていますか?

Page 5: Kabukiza Erlang Lightning Talk - Euler with Erlang
Page 6: Kabukiza Erlang Lightning Talk - Euler with Erlang

Project Euler とは

計算問題をプログラムで   解いて遊ぶWEBサイト

Page 7: Kabukiza Erlang Lightning Talk - Euler with Erlang

わたしが

 Erlang を始めたきっかけ

Page 8: Kabukiza Erlang Lightning Talk - Euler with Erlang

ユーザーは

居住国と利用する言語を

申告する

Page 9: Kabukiza Erlang Lightning Talk - Euler with Erlang

Project Euler 利用言語ランキング

Page 10: Kabukiza Erlang Lightning Talk - Euler with Erlang

順位 言語 登録者数 比率

1 Python 30,998 24.6%2 C/C++ 30,664 24.3%

3 Java 20,290 16.1%

Project Euler 利用言語ランキング2014.10.28

Page 11: Kabukiza Erlang Lightning Talk - Euler with Erlang

順位 言語 登録者数 比率

1 Python 30,998 24.6%2 C/C++ 30,664 24.3%

3 Java 20,290 16.1%

22 Erlang 566 0.45%

Project Euler 利用言語ランキング2014.10.28

Page 12: Kabukiza Erlang Lightning Talk - Euler with Erlang

順位 言語 登録者数 比率

1 Python 30,998 24.6%2 C/C++ 30,664 24.3%

3 Java 20,290 16.1%

Project Euler 利用言語ランキング

22 Erlang 566 0.45%17 Pencil/Paper 778 0.61%

2014.10.28

Page 13: Kabukiza Erlang Lightning Talk - Euler with Erlang

順位 言語 登録者数 比率

1 Python 30,998 24.6%2 C/C++ 30,664 24.3%

3 Java 20,290 16.1%

Project Euler 利用言語ランキング

22 Erlang 566 0.45%17 Pencil/Paper 778 0.61%a

Page 14: Kabukiza Erlang Lightning Talk - Euler with Erlang

Erlang でやれば

天下を取ることも

可能なのでは...

Page 15: Kabukiza Erlang Lightning Talk - Euler with Erlang

というわけで細々と何年か続けまして

Page 16: Kabukiza Erlang Lightning Talk - Euler with Erlang

Erlang 世界ランク9位2014.10.28

Page 17: Kabukiza Erlang Lightning Talk - Euler with Erlang
Page 18: Kabukiza Erlang Lightning Talk - Euler with Erlang

どんな問題 なの?

ところで

Page 19: Kabukiza Erlang Lightning Talk - Euler with Erlang

どんな問題?フィボナッチ数列の項は前の2つの項の和である. 最初の2項を 1, 2 とすれば, 最初の10項は以下の通りである.

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

数列の項の値が400万以下の, 偶数値の項の総和を求めよ.Project Euler 日本語Wiki より

(http://odz.sakura.ne.jp/projecteuler/)

Page 20: Kabukiza Erlang Lightning Talk - Euler with Erlang

どんな問題?フィボナッチ数列の項は前の2つの項の和である. 最初の2項を 1, 2 とすれば, 最初の10項は以下の通りである.

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

数列の項の値が400万以下の, 偶数値の項の総和を求めよ.Project Euler 日本語Wiki より

(http://odz.sakura.ne.jp/projecteuler/)

fibseq(Max)  -­‐>  [1,2|  fibseq(Max,  1,  2)].fibseq(Max,  Arg1,  Arg2)  when  (Arg1  +  Arg2)  >  Max  -­‐>  [];fibseq(Max,  Arg1,  Arg2)  -­‐>     Num  =  Arg1  +  Arg2,   [Num  |  fibseq(Max,  Arg2,  Num)].  prob2()  -­‐>   Fibs  =  fibseq(4000000),   EvenFibs  =  [X  ||  X  <-­‐  Fibs,  X  rem  2  =:=  0],   lists:sum(EvenFibs).

Page 21: Kabukiza Erlang Lightning Talk - Euler with Erlang

どんな問題?585 = 1001001001 (2進) は10進でも2進でも回文数である.

100万未満で10進でも2進でも回文数になるような数の総和を求めよ.

(注: 先頭に0を含めて回文にすることは許されない.)Project Euler 日本語Wiki より

(http://odz.sakura.ne.jp/projecteuler/)

Page 22: Kabukiza Erlang Lightning Talk - Euler with Erlang

どんな問題?585 = 1001001001 (2進) は10進でも2進でも回文数である.

100万未満で10進でも2進でも回文数になるような数の総和を求めよ.

(注: 先頭に0を含めて回文にすることは許されない.)Project Euler 日本語Wiki より

(http://odz.sakura.ne.jp/projecteuler/)is_circle(N)  -­‐>   is_circle(N,10).is_circle(N,  Base)  -­‐>   T  =  integer_to_list(N,  Base),   T  =:=  lists:reverse(T).  n_if_true(N,  true)  -­‐>  N;n_if_true(_,  false)  -­‐>  0.  prob36()  -­‐>  prob36(1).prob36(1000000)  -­‐>  0;prob36(N)  -­‐>        n_if_true(N,  is_circle(N)  andalso  is_circle(N,  2))  +  prob36(N+1).

Page 23: Kabukiza Erlang Lightning Talk - Euler with Erlang

最初は適当でも

進んでいけたのですが

Page 24: Kabukiza Erlang Lightning Talk - Euler with Erlang

2つの課題に直面しました

Page 25: Kabukiza Erlang Lightning Talk - Euler with Erlang

その1

Page 26: Kabukiza Erlang Lightning Talk - Euler with Erlang

例)問題18以下の三角形を頂点から下まで移動するとき, その最大の和を求めよ.

7595 64

17 47 8218 35 87 10

20 04 82 47 6519 01 23 75 03 34

88 02 77 73 07 63 6799 65 04 28 06 16 70 92

41 41 26 56 83 40 80 70 3341 48 72 33 47 32 37 16 94 29

53 71 44 65 25 43 91 52 97 51 1470 11 33 28 77 73 17 78 39 68 17 57

91 71 52 38 17 14 91 43 58 50 27 29 4863 66 04 68 89 53 67 30 73 16 69 87 40 31

04 62 98 27 23 09 70 98 73 93 38 53 60 04 23

Page 27: Kabukiza Erlang Lightning Talk - Euler with Erlang

例)問題67以下の三角形を頂点から下まで移動するとき, その最大の和を求めよ.

7595 64

17 47 8218 35 87 10

20 04 82 47 6519 01 23 75 03 34

88 02 77 73 07 63 6799 65 04 28 06 16 70 92

41 41 26 56 83 40 80 70 3341 48 72 33 47 32 37 16 94 29

53 71 44 65 25 43 91 52 97 51 1470 11 33 28 77 73 17 78 39 68 17 57

91 71 52 38 17 14 91 43 58 50 27 29 4863 66 04 68 89 53 67 30 73 16 69 87 40 31

04 62 98 27 23 09 70 98 73 93 38 53 60 04 23・・・・・・・・・・・・・・・・・・・・・・・・

・・・・・・・・・・・・・・・・・・・・・・・・・・

100段目まで

Page 28: Kabukiza Erlang Lightning Talk - Euler with Erlang

Nがデカくなる傾向素数を使った問題なども、徐々に桁が増えていく

今までの方法で解けない

Page 29: Kabukiza Erlang Lightning Talk - Euler with Erlang

その2

Page 30: Kabukiza Erlang Lightning Talk - Euler with Erlang

倒すべき敵

Page 31: Kabukiza Erlang Lightning Talk - Euler with Erlang

そこで

Page 32: Kabukiza Erlang Lightning Talk - Euler with Erlang

勉強し始める

Page 33: Kabukiza Erlang Lightning Talk - Euler with Erlang

実にわかりやすい

Page 34: Kabukiza Erlang Lightning Talk - Euler with Erlang
Page 35: Kabukiza Erlang Lightning Talk - Euler with Erlang

おかげさまで

Page 36: Kabukiza Erlang Lightning Talk - Euler with Erlang

たとえば

ある正の整数nについて, [n + reverse(n)]が奇数のみで表されるようなnが存在する.

例えば, 36 + 63 = 99, 409 + 904 = 1313 のように. この性質を持つ数を, reversibleと呼ぶことにする. つまり, 36, 63, 409, 904はrevesibleである. 先頭の0はnでもreverse(n)でも許されない.

1000未満には120個のreversibleな数が存在する.

10億未満では,いくつのreversibleな数が存在するか.

Project Euler 日本語Wiki より (http://odz.sakura.ne.jp/projecteuler/)

Page 37: Kabukiza Erlang Lightning Talk - Euler with Erlang

%% 各桁をリストの各要素にばらす.digits_to_list(N) when is_integer(N) -> [X - $0 || X <- integer_to_list(N)]. %% 数値の各桁を反転させた数(何というのか)を得る.digits_reverse(N) -> list_to_integer(lists:reverse(integer_to_list(N))). %% 全ての桁が奇数か.is_all_odd(N) -> L = digits_to_list(N), length([X || X <- L, X =/= 0 andalso X rem 2 =/=0]) =:= length(L). prob145(Start, End) -> prob145(Start, End, 0).prob145(I, End, Sum) when I =:= End -> Sum;prob145(I, End, Sum) -> prob145(I-1, End, Sum + one_if_true(I rem 10 =/=0 andalso is_all_odd(I + digits_reverse(I)))).

なんか遅い

Page 38: Kabukiza Erlang Lightning Talk - Euler with Erlang

全ての解は一般のPCで

1分以内に求められるように作られている(らしい)

Page 39: Kabukiza Erlang Lightning Talk - Euler with Erlang

全ての解は一般のPCで

1分以内に求められるように作られている(らしい)

自分には無理ゲー過ぎる

Page 40: Kabukiza Erlang Lightning Talk - Euler with Erlang

そこで

spawn

Page 41: Kabukiza Erlang Lightning Talk - Euler with Erlang

Project Euler的spawnとは

Page 42: Kabukiza Erlang Lightning Talk - Euler with Erlang

Project Euler的spawnとは

Page 43: Kabukiza Erlang Lightning Talk - Euler with Erlang
Page 44: Kabukiza Erlang Lightning Talk - Euler with Erlang
Page 45: Kabukiza Erlang Lightning Talk - Euler with Erlang
Page 46: Kabukiza Erlang Lightning Talk - Euler with Erlang

寝る前に走らせ朝起きても終わっていなかった処理が数行書くだけで

10分で終わるようになる(こともある)

>  G  =  fun(Start,  End)  -­‐>  prob145(Start,  End)  end.>  K=1000000000  div  32.>  [spawn(fun()  -­‐>  G(K*X,  K*(X-­‐1)+1)  end)  ||  X  <-­‐  lists:seq(1,  32)].

Page 47: Kabukiza Erlang Lightning Talk - Euler with Erlang

spawn

isawesome

Page 48: Kabukiza Erlang Lightning Talk - Euler with Erlang

Erlang

isawesome

Page 49: Kabukiza Erlang Lightning Talk - Euler with Erlang

趣味が高じて

Page 50: Kabukiza Erlang Lightning Talk - Euler with Erlang

拙著

Page 51: Kabukiza Erlang Lightning Talk - Euler with Erlang

Androidの本なのに

サーバー連携部分で

Erlang とmochiweb の

インストールが必須

Page 52: Kabukiza Erlang Lightning Talk - Euler with Erlang

証拠(p.400)

Page 53: Kabukiza Erlang Lightning Talk - Euler with Erlang

とは言うものの

しばらく Erlang から

離れていましたが

Page 54: Kabukiza Erlang Lightning Talk - Euler with Erlang

最近これを読み始めて

復活しました

必読です

Page 55: Kabukiza Erlang Lightning Talk - Euler with Erlang

私は

本職の Erlang 使い

ではありませんが

これからも

自分なりに ひっそりと

Erlang 触れていこうと

思います

Page 56: Kabukiza Erlang Lightning Talk - Euler with Erlang

やらなければ何もできない

Page 57: Kabukiza Erlang Lightning Talk - Euler with Erlang

EOF