Skip to content

Instantly share code, notes, and snippets.

@tnoda
Forked from ponkore/hoge.clj
Created July 14, 2012 16:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tnoda/3111930 to your computer and use it in GitHub Desktop.
Save tnoda/3111930 to your computer and use it in GitHub Desktop.
RubyにおけるシーケンスはObject#repeatに任せなさい!を Clojure でやってみた
;;; http://melborne.github.com/2012/07/12/object-repeat-take-care-of-sequence/
;;; を Clojure でやってみた。
;;; 9.、10. は挫折www
;;; 1. 初項1、公差2の等差数列の最初の20項を求めなさい。
(take 20 (iterate #(+ % 2) 1))
;;; => (1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39)
;;; 2. 初項3、公比2の等比数列の最初の20項を求めなさい。
(take 20 (iterate #(* % 2) 3))
;;; => (3 6 12 24 48 96 192 384 768 1536 3072 6144 12288 24576 49152 98304 196608 393216 786432 1572864)
;;; 3. 1で求めた等差数列がその第1階差数列となるような数列を求めなさい。
(map second (take 20 (iterate (fn [[x y]] [(+ x 2) (+ x y)]) [1 1])))
;;; => (1 2 5 10 17 26 37 50 65 82 101 122 145 170 197 226 257 290 325 362)
;;; 4. フィボナッチ数列の最初の20項を求めなさい。
(map first (take 20 (iterate (fn [[a b]] [b (+ a b)]) [0 1])))
;;; => (0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181)
;;; 5. トリボナッチ数列の最初の20項を求めなさい。
(map first (take 20 (iterate (fn [[a b c]] [b c (+ a b c)]) [0 1 1])))
;;; => (0 1 1 2 4 7 13 24 44 81 149 274 504 927 1705 3136 5768 10609 19513 35890)
;;; 6. ニュートン法を使って5の平方根を求めなさい。
(let [a 5
eps 0.001]
(second
(first
(drop-while (fn [[a b]] (> (Math/abs (- a b)) eps))
(partition 2 1 (iterate (fn [x] (/ (+ x (/ a x)) 2)) 1.0))))))
;;; => 2.236067977499978
;;; 7. Aから始まるExcelの列名ラベルを60個生成しなさい。
(defn foo[n]
(let [h (if (< n 26) "" (char (+ (dec (/ n 26)) (int \A))))
l (char (+ (mod n 26) (int \A)))]
(str h l)))
(map foo (range 60))
;;; => ("A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z" "AA" "AB" "AC" "AD" "AE" "AF" "AG" "AH" "AI" "AJ" "AK" "AL" "AM" "AN" "AO" "AP" "AQ" "AR" "AS" "AT" "AU" "AV" "AW" "AX" "AY" "AZ" "BA" "BB" "BC" "BD" "BE" "BF" "BG" "BH")
;;; 8. 2進数10110011を10進変換しなさい(String#to_iを使ってはいけない)。
(reduce + (map #(* %1 %2) (iterate #(* % 2) 1) (map #(if (= % \1) 1 0) (reverse (seq "10110011")))))
;;; => 179
;;; 9. ランダムなブール値の並び20項を生成しなさい。但し、trueが連続してはいけない。
(letfn [(random [] (-> [true false] shuffle first))]
(take 20 (iterate #(if % false (random)) (random))))
;;; 10. ランダムなブール値の並び20項を生成しなさい。但し、trueが3つ連続してはいけない。
(letfn [(random [] (-> [true false] shuffle first))]
(->> (repeatedly 2 random)
(iterate (fn [[x y]]
(if (and x y)
[y false]
[y (random)])))
(map first)
(take 20)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment