26 lines
803 B
Clojure
26 lines
803 B
Clojure
(ns example
|
|
(:require [clojure.contrib.math :as math]))
|
|
|
|
; Length of integer in binary
|
|
; (copied from a private multimethod in clojure.contrib.math)
|
|
(defmulti #^{:private true} integer-length class)
|
|
|
|
(defmethod integer-length java.lang.Integer [n]
|
|
(count (Integer/toBinaryString n)))
|
|
(defmethod integer-length java.lang.Long [n]
|
|
(count (Long/toBinaryString n)))
|
|
(defmethod integer-length java.math.BigInteger [n]
|
|
(count (.toString n 2)))
|
|
|
|
(defn sierpinski-triangle [order]
|
|
(loop [size (math/expt 2 order)
|
|
v (math/expt 2 (- size 1))]
|
|
(when (pos? size)
|
|
(println
|
|
(apply str (map #(if (bit-test v %) "*" " ")
|
|
(range (integer-length v)))))
|
|
(recur
|
|
(dec size)
|
|
(bit-xor (bit-shift-left v 1) (bit-shift-right v 1))))))
|
|
|
|
(sierpinski-triangle 4)
|