sequence関係のユーティリティ関数で自分がよく知らないものをまとめておく。
昔はindexedっていうそのまんまな関数があったけど、1.3くらいからなくなっていた。今はmap-indexedっていう関数を使う。よく使うのはこんな感じの使い方。
(map-indexed #(vector %1 %2) ["a" "b" "c" "d" "e"])
; ([0 "a"] [1 "b"] [2 "c"] [3 "d"] [4 "e"])この記事は、lispリーダーマクロアドベントカレンダー の4日目の記事です。 タイトルにある通り、Clojure でのリー ダーマクロについて取り扱います(対象とする Clojure のバージョンは 1.4)。
この記事は、変態アドベントカレンダー 6日目の記事です。前日は はがねのつるぎさん でした。
このアドベントカレンダーは、意識もスキルも高い変態勇者がハイテクを駆使してかくもの、と思ってらっしゃる方にはちょっと申し訳ありません。若干変態度もハイテク度も低めで肩透かしを食らうことになりますが、しばしお付き合いください。
今日のネタは、私自身の日々の切実な課題である、Excel文書と戦うための準備、といったところです。
Excel ドキュメントにに対する不満
| ;;; Project Euler Problem 1 | |
| ;;; http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%201 | |
| ;;; | |
| ;;; 10未満の自然数のうち、3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり、 これらの合計は 23 になる。 | |
| ;;; 同じようにして、1,000 未満の 3 か 5 の倍数になっている数字の合計を求めよ。 | |
| ;;; 3 もしくは 5の倍数の場合 true、そうでない場合 false を返す filter 判定用関数 | |
| (defn fizz-or-buzz? | |
| "3か5で割り切れるならtrue、そうでないならfalseを返す。" | |
| [n] |
| (defn fib | |
| "Returns the nth Fibonacci number." | |
| ^long | |
| [n] | |
| (-> (* 0.5 (inc (Math/sqrt 5))) ; golden ratio | |
| (Math/pow n) | |
| (/ (Math/sqrt 5)) | |
| (+ 0.5) | |
| Math/floor | |
| long)) |
| (apply + (filter #(or (zero? (mod % 3)) (zero? (mod % 5))) (range 1000))) |
| ;;; Project Euler Problem 3 | |
| ;;; http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%203 | |
| (use 'clojure.test) | |
| (defn prime? | |
| [n] | |
| (if (= 1 n) | |
| false | |
| (every? (complement #(zero? (rem n %))) |
| (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)))) |
| ;; 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) |
| ;; 去年最初に解いたとき答え | |
| ;; | |
| ;; "Elapsed time: 106406.52058 msecs" | |
| ;; 今やっても時間が1分40秒もかかってしまうので、だめー。 | |
| ;; 考えかた | |
| ;; ある数Nが素数であるかどうかは、√N以下の素数に割りきれるものがあるかどうかで判定します。 | |
| ;; そのためには、そこまでに発見した素数を保持する必要があります。 | |
| ;; あとは、2以上の数について、素数であるかどうかでフィルターします。 |