euler

8重ループでも十分速い

なんだかイライラしたので、心を落ち着けるためのProject Euler。31問目。イギリスのコインには、2ペンスとか20ペンスという偶数のものがあるらしく、いろいろ組み合わせて、ちょうど2ポインド(200ペンス)になるコインの組み合わせの数は? という問題。最…

ペンスを再帰で数える

Project Eulerの31問目、コインを組み合わせて2ポインドを作るというやつは、再帰を使えばスッキリ書ける。Pythonで書かれたほかの参加者の回答を見てなるほどなぁと思ったので、Rubyでも書いてみた。動的計画法よりも、再帰のほうがスッキリしやすいような…

間違った約分でも正解になる分数

Project Euler 33。49/98という分数で、間違って9を消す「約分」をしてしまっても、「4/8」となり、実は結果は正しい。こういう変な分数を、分子・分母が2ケタのものについて自明なものを除いて全部探せ。というような問題。「65/26→5/2」というのがちょっと…

Rubyのmapは面倒な気が

オイラープロジェクト32問目。a*b=cで、a、b、cをつなげた数字が123456789のすべてを1つずつ含む組み合わせを求める。 def pandigital? (n) n.split(//).sort.join.to_i == 123456789 end result = [] (1..10000).each do |i| (1..10000).each do |j| break …

フィボナッチ文字列

オイラープロジェクト230問目。数値の加算の代わりに、文字列の結合によるフィボナッチ文字列というような感じの問題。 (ns euler (:use clojure.contrib.str-utils)) (def str-a "1415926535") (def str-b "8979323846") ; (def str-a "1415926535897932384…

Clojureのマルチメソッド

Project Euler Problem 36 は、10進数表現でも2進数表現でも回文になっている(585、1001001001)のよう数字を100万以下で求めるというもの。Clojureのマルチメソッドでやってみた。オブジェクト指向のポリフォーフィズムみたいなもので、もうちょっと柔軟なも…

100点以下の残りスコアのときのダーツの上がり手順

オイラープロジェクト109問目は、ダーツの計算問題。むかし夜な夜な投げていたので懐かしい。100以下の残りスコアのとき、ダブル・アウトで上がれる得点の組み合わせはいくつあるか。Clojureで書いてみた。 (def all-shots (conj (for [r (range 1 4) t (ran…

プロジェクトオイラー35問目

プロジェクトオイラー35問目。123、231、312みたいにグルグル回した数字がすべて素数であるものを100万以下のものについて求めよ。 (defn prime? [n] (cond (> 2 n) false (== 2 n) true (even? n) false (not-any? zero? (map #(rem n %) (range 3 (inc (Ma…

プロジェクトオイラー27、29問目

Clojureでやってみるプロジェクトオイラーの29問目と27問目。29問目は「How many distinct terms are in the sequence generated by a^b for 2 ≤ a ≤ 100 and 2 ≤ b ≤ 100?」というもの。 (println (count (distinct (for [a (range 2 101) b (range 2 101)]…

プロジェクトオイラー28問目

プロジェクトオイラーの28問目。 21 22 23 24 25 20 7 8 9 10 19 6 1 2 11 18 5 4 3 12 17 16 15 14 13という5×5のスパイラルがあったとき、[1]、[3 5 7 9]、[13 17 21 25]という各サイズの正方形の角にある数字の合計は101。では、1001×1001のスパイラルの…

ユークリッド互除法って速いのかしら

Project Euler 108問目。nが与えられたとき、 1/x + 1/y = 1/nを満たす、x、yのユニークな組み合わせ数を調べる。初めて組み合わせ数が1000を超えるnはいくつか?RubyのComparableみたいなものを使ってみたかったこともあって、分数クラスを作ってブルートフ…

関数型っぽくフィボナッチ

ブログの間が空きすぎたときの、オイラープロジェクト。25問目。フィボナッチ数列で初めて1000桁を超えるのはいくつ目か、という問題。普通にクラスを作ってメモ化。 class Fib def initialize @memo = {} end def calc(n) @memo[n] ||= begin (n <= 2) ? 1:…

Project Euler 23

Project Euler 23。何となくCでやってみたけど、やっぱりRubyのような抽象度の高い言語に比べると面倒だ。 #include <stdio.h> #include <stdlib.h> #define NUM 10000 #define LIMIT 28123 int isabundant(int n) { int sum = 0, ptr = 0; for (int i = 1; i <= n / 2; i++) { </stdlib.h></stdio.h>…

Project Euler 19

Project Euler 19。月初めのツイタチが日曜日の月は、20世紀中にいくつあるか。こんな課題をRubyでやるのに意味があるのかって話もあるけど、ライブラリの使い方を地道に試すのも言語習得の大事なステップ? こういうの、使ってないとすぐに忘れる。 require…

Project Euler 24

Project Euler 24は組み合わせの問題。Rubyを使うとワンライナーになって、反則といえるほどトリビアルになってしまう。 (0..9).to_a.permutation.to_a[1_000_000 - 1].join

Project Euler 44

Project Euler 44はpentagonal numbersの問題。思い切り力技、かつ抽象度が高い感じ。コードは短く、ほぼ問題文をそのまま書いただけと分かりやすいけど、とにかく遅い。7、8分かかってやっと答えが出た。直感的に最初に出てくるペアが最小だと思って、実際…

Project Euler 22

Project Euler 22はアルファベットの名前を足し算するような問題。mapとかinjectとか、実は読みづらいんじゃないかという気がしつつ。 while line = gets names = line.chomp.split(/,/).map{|name| name.gsub(/\"/,'')} end total = 0 def c2v(c) c.ord - "…

Project Euler 21

思い出したようにProject EulerのProblem 21。aとb、2つの数があるとき、これらの約数の合計が等しく、a!=bであるとき、aとbの組み合わせをamicable numbers(友愛数)と呼ぶ。10000以下のamicable numbersの合計を求めよ。例えば220と284はamicable numbers。…