今日は@kuchitama さんがプログラミングコンテストをテーマにプレゼンしてました。
いろいろなプログラミングの腕試しの場を紹介してくださったのですが、個人的にその中のProject Eulerが面白そうだと思いました。日本語訳も充実していてとっつきやすいので、ちょっとずつ進めて自分のgistを充実させようと。
その中のproblem2 について、こんなコードを書きました。
ちなみに問題はこちら
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* http://projecteuler.net/problem=2 | |
* http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%202 | |
*/ | |
val fib: List[Int] => List[Int] = {xs => | |
xs match { | |
case Nil => throw new IllegalArgumentException | |
case i::Nil => throw new IllegalArgumentException | |
case _ => { | |
val nextNum = xs.head + xs.tail.head | |
if (nextNum >= 4000000) { | |
xs | |
} else { | |
fib(nextNum :: xs) | |
} | |
} | |
} | |
} | |
fib(List(2, 1)).filter(_ % 2 == 0).sum |
なんか、力業感があるなー、と思いながらそれをTwitterでつぶやいて数分。
@xuwei_k さんがForkしてくださいました。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* http://projecteuler.net/problem=2 | |
* http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%202 | |
*/ | |
val fib: List[Int] => List[Int] = { | |
case Nil | _ :: Nil => throw new IllegalArgumentException | |
case xs @ (a :: b :: tail) => { | |
val nextNum = a + b | |
if (nextNum >= 4000000) { | |
xs | |
} else { | |
fib(nextNum :: xs) | |
} | |
} | |
} | |
fib(List(2, 1)).filter(_ % 2 == 0).sum |
あー。そうかー。matchの"@"とか知識としては知ってたけど、それを使えるほど手に馴染んでなかったー、など面白い気づきがありました。
いやー、ソーシャルコーディングって楽しいですねー。
仕事でもペアプロなどをしていますが、他の人の意見を聞いて吸収していくというのは、本当に楽しいです。
0 件のコメント:
コメントを投稿