Skip to content

Instantly share code, notes, and snippets.

@varokas
Created May 9, 2019 05:05
Show Gist options
  • Save varokas/ea6f733ccf8783a1104d2b8b55402d03 to your computer and use it in GitHub Desktop.
Save varokas/ea6f733ccf8783a1104d2b8b55402d03 to your computer and use it in GitHub Desktop.
Primes
(ns clojure-kata.prime)
(defn divisible [x y] (zero? (mod x y)))
(defn is-prime
([primes-before n] (not-any? (partial divisible n) primes-before)))
(defn next-prime
([primes-before n] (first (filter (partial is-prime primes-before) (iterate inc n)))))
(defn primes
([] (primes[] 2))
([primes-before n]
(lazy-seq
(let [new-prime (next-prime primes-before n)
new-primes-before (conj primes-before new-prime)]
(cons new-prime (primes new-primes-before (inc new-prime)))))))
; => (take 10 (drop 200 (primes)))
; (1229 1231 1237 1249 1259 1277 1279 1283 1289 1291)
@visibletrap
Copy link

visibletrap commented May 9, 2019

; namespace มี convention ว่าตั้งชื่อหลังจุดสุดท้ายให้เหมือนกับชื่อไฟล์ (ก่อนหน้าจุด คือ directories)
(ns clojure-kata.primes)

; ?, !, +, *, _, - เป็นส่วนนึงของชื่อได้ (อาจจะมีมากกว่านี้ ผมไม่แม่นเท่าไหร่)
(defn divisible? [x y] (zero? (mod x y)))

; 1. พอเติม ? แล้วก็เอา is ออกได้ (subjective แล้วแต่ความชอบ) จาก is-prime เป็น prime?
; 2. ผมสลับตำแหน่ง arg เอา n มาอยู่ข้างหน้าเพราะ ตัวสำคัญที่สุดควรเป็น argument แรก มันจะได้ตรงกับ Java interop 
; เช่น ถ้าบน java เราเขียนแบบนี้ x.isDivisiableBy(1) บน Clojure จะเขียนแบบนี้ (.isDivisibleBy x 1)
; ยกเว้นฟังก์ชันที่ทำ operation กับ sequence จะเอา sequence เป็น arg สุดท้าย เช่น (map inc [1 2 3]) หรือ (filter even? [1 2 3])
(defn prime? [n primes-before]
  (not-any? #(divisible? n %) primes-before))

(defn next-prime [primes-before]
  (let [start-from (or (peek primes-before) 2)]
    ; filter + first โอเคแล้ว แต่ถ้าไม่ชอบใช้ some + when ได้
    (some #(when (prime? % primes-before) %) (iterate inc start-from))))

(defn primes
  ([] (primes []))
  ([primes-before]
   (lazy-seq
     (let [new-prime (next-prime primes-before)]
       (cons new-prime (primes (conj primes-before new-prime)))))))

@varokas
Copy link
Author

varokas commented May 9, 2019

ขอบคุณสำหรับท่า anonymous function ครับ นี่คือสิ่งที่สงสัยว่า ทำไม partial มันเยอะ

@veer66
Copy link

veer66 commented May 9, 2019

เขียนตาม Veerapat Boonvanich

(defn find-prime-numbers
  ([] (find-prime-numbers (drop 2 (range))))
  ([prime-numbers]   
   (lazy-seq (cons (first prime-numbers)
                   (remove #(zero? (mod % (first prime-numbers)))
                           (rest prime-numbers))))))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment