Source

metaljoe_codekata / code_kata_2d.clj

; http://codekata.pragprog.com/2007/01/kata_two_karate.html

(ns code-kata)

  
(defn
  #^{:test (fn []
			 (assert (= -1 (chop 3 []) ))
			 (assert (= -1 (chop 3 [1]) ))
			 (assert (=  0 (chop 1 [1]) ))

			 (assert (=  0 (chop 1 [1 3 5]) ))  ; failing
			 (assert (=  1 (chop 3 [1 3 5]) ))
			 (assert (=  2 (chop 5 [1 3 5]) ))  ; failing
			 (assert (= -1 (chop 0 [1 3 5]) ))
			 (assert (= -1 (chop 2 [1 3 5]) ))
			 (assert (= -1 (chop 4 [1 3 5]) ))
			 (assert (= -1 (chop 6 [1 3 5]) ))

			 (assert (=  0 (chop 1 [1 3 5 7]) )) ; failing
			 (assert (=  1 (chop 3 [1 3 5 7]) ))
			 (assert (=  2 (chop 5 [1 3 5 7]) ))
			 (assert (=  3 (chop 7 [1 3 5 7]) ))
			 (assert (= -1 (chop 0 [1 3 5 7]) ))
			 (assert (= -1 (chop 2 [1 3 5 7]) ))
			 (assert (= -1 (chop 4 [1 3 5 7]) ))
			 (assert (= -1 (chop 6 [1 3 5 7]) ))
			 (assert (= -1 (chop 8 [1 3 5 7]) )) ) }
  chop
  [item list]
  (println "---")  ; DEBUG
  (def start        (atom 0))
  (def offset       (atom (quot (count list) 2)))
  (def current-item (atom nil))

  (loop [ position (+ @start @offset) ]
	(reset! current-item (get list position))
    (println item list @start @offset position " " @current-item)  ; DEBUG
	(if (nil? @current-item)
	  -1
	  (if (= @current-item item)
		position
		(if (= @offset 0)
		  -1
		  (do
			(reset! start  position)
			(reset! offset (quot @offset 2))
			(if (< @current-item item)
			  (recur (+ position @offset))  ; go right
			  (recur (- position @offset) ; go left
		  )
		)
	  )
    )
  )
)

(test #'chop)
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.