forked from jafingerhut/clojure-benchmarks
-
Notifications
You must be signed in to change notification settings - Fork 0
/
pidigits.clojure-1.clj
38 lines (32 loc) · 1.09 KB
/
pidigits.clojure-1.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
;; The Computer Language Benchmarks Game
;; http://shootout.alioth.debian.org/
;; Based on the Racket version of the benchmark by Matthew Flatt
;;; contributed by PheliX
(ns pidigits
(:gen-class))
(defn floor-ev [q r s t x]
(quot (+ (* q x) r) (+ (* s x) t)))
(defn ncomp [q r s t q2 r2 s2 t2]
[(+ (* q q2) (* r s2))
(+ (* q r2) (* r t2))
(+ (* s q2) (* t s2))
(+ (* s r2) (* t t2))])
(defn digit [k q r s t n row col]
(if (> n 0)
(let [y (floor-ev q r s t 3)]
(if (== y (floor-ev q r s t 4))
(let [[q r s t] (ncomp 10 (* -10 y) 0 1 q r s t)]
(if (== col 10)
(let [row (+ row 10)]
(printf "\t:%d\n%d" row y)
(recur k q r s t (dec n) row 1))
(do (printf "%d" y)
(recur k q r s t (dec n) row (inc col)))))
(let [[q r s t] (ncomp q r s t k (* 2 (inc (* 2 k))) 0 (inc (* 2 k)))]
(recur (inc k) q r s t n row col))))
(printf "%s\t:%d\n" (apply str (repeat (- 10 col) " ")) (+ row col))))
(defn -main [& args]
(let [n (try (Integer/parseInt (first args))
(catch NumberFormatException e 27))]
(digit 1 1 0 0 1 n 0 0))
(flush))