#clojure 入門者向け勉強会 #mitori_clj 第二週担当分
Project Euler Problem 10
2,000,000 未満の素数の総和を求めよ. とのことです.
結果を出すために手に入るリソースを有効活用するという考えのもとでは --この問題自体の解答を述べている
(use 'clojure.test) | |
;; ピタゴラス数チェック | |
(defn pythagorean? | |
[a b c] | |
(= (* c c) (+ (* a a) (* b b)))) | |
(is (pythagorean? 3 4 5)) | |
;; 合計が a+b+c かつ 0 < a < b < c になるような組の列挙 |
;;;A palindromic number reads the same both ways. | |
;;;The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 99. | |
;;;Find the largest palindrome made from the product of two 3-digit numbers. | |
;;;左右どちらから読んでも同じ値になる数を回文数という。 2桁の数の積で表される回文数のうち、 | |
;;;最大のものは 9009 = 91 × 99 である。 | |
;;;では、3桁の数の積で表される回文数のうち最大のものはいくらになるか。 | |
(ns projecteuler.problem-4 | |
(:require [clojure.string :as str]) |
;; 初めて解いたときのものです。 | |
;; 約数の和を求めるために、素因数分解してそれを利用してます。 | |
;; 思いつきをそのまま実装しちゃってる感じです。 | |
;; Problem 21 : 2011/5/5 | |
;;"Elapsed time: 1260.253748 msecs" | |
;; prime list | |
;; まずは素数列を作ってしまいます。 |
;;; Project Euler #8 | |
;;; http://projecteuler.net/problem=8 | |
;;; http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%208 | |
(use 'clojure.test) | |
(def input | |
(str | |
"73167176531330624919225119674426574742355349194934" | |
"96983520312774506326239578318016984801869478851843" |
;; 去年最初に解いたときのやつ。 | |
;; 「hotpo」というのは half or tripple plus one のアクロニムで、昔読んでいた(日経)サイエンス誌の連載で | |
;; これが紹介されたときの名前で、英語版Wikipediaには載っていました。 | |
;; 今動かしてみたら、なぜかスタックオーバーフローになってしまう。 | |
;; 1.2だと動くのかなぁ。と思ってやってみたら動く!! | |
;; なんでだろう。 スタックの深さが1.2の方が大きいのかなぁ。 | |
;; 実行すると、 50秒くらいかかります。 | |
;; "Elapsed time: 48273.476472 msecs" |
(ns tnoda.projecteuler.problem-5 | |
(:import org.apache.commons.math.util.MathUtils) ; [org.apache.commons/commons-math "2.2"] | |
(:use clojure.test)) | |
(defn- solver* | |
[n] | |
(reduce (fn [^long x ^long y] (MathUtils/lcm x y)) (range 1 (inc n)))) | |
(def solver (partial solver* 20)) |
;; 去年最初に解いたとき答え | |
;; | |
;; "Elapsed time: 106406.52058 msecs" | |
;; 今やっても時間が1分40秒もかかってしまうので、だめー。 | |
;; 考えかた | |
;; ある数Nが素数であるかどうかは、√N以下の素数に割りきれるものがあるかどうかで判定します。 | |
;; そのためには、そこまでに発見した素数を保持する必要があります。 | |
;; あとは、2以上の数について、素数であるかどうかでフィルターします。 |
;; seq-end-inclusive を割れそうな数の候補 | |
(defn denominators [seq-end-inclusive] | |
(for [d (range 2 (+ seq-end-inclusive 1)) | |
:while (<= (* d d) seq-end-inclusive) | |
] | |
d)) | |
;; end-inclusive 以下の素数列をエラトステネスの篩で | |
(defn gen-primes [end-inclusive] | |
(reduce (fn [primes d] (filter #(or (= %1 d) |
(use 'clojure.set) | |
(defn n-multiples [n end] (set (range 0 end n))) | |
(defn solve [] | |
(apply + (union (n-multiples 3 1000) | |
(n-multiples 5 1000)))) |
#clojure 入門者向け勉強会 #mitori_clj 第二週担当分
Project Euler Problem 10
2,000,000 未満の素数の総和を求めよ. とのことです.
結果を出すために手に入るリソースを有効活用するという考えのもとでは --この問題自体の解答を述べている