First off, thanks to all the commenters that have been contributing advice and corrections! It’s definitely helping, and I think I’m making some good progress on my quest.
Here’s another set of simple problems:
; P19 (**) Rotate a list N places to the left. (defn rotate [n input] (let [amount (if (< n 0) (+ n (count input)) n)] (concat (drop amount input) (slice 0 amount input)))) ; P20 (*) Remove the K'th element from a list. (defn remove_at [k input] (list (concat (slice 0 k input) (slice (inc k) (count input) input)) (nth input k))) ; P21 (*) Insert an element at a given position into a list. (defn insert_at [k value input] (concat (slice 0 k input) (list value) (slice k (count input) input))) ; P22 (*) Create a list containing all integers within a given range. (comment "clojure already has a (range a b), but it is [a,b), not [a,b]") (defn s99_range [s e] (loop [output (list s) curr (inc s)] (if (> curr e) (reverse output) (recur (cons curr output) (inc curr)))))
Taking some comments to heart, I came up with an alternate P22. I’m not sure, though whether it’s better or worse than my original. I’m pretty sure that there’s a pretty big difference between the two, but I don’t know enough to say what’s what.
; P22 (*) Create a list containing all integers within a given range. ; clojure already has a (range a b), but it is [a,b), not [a,b] (defn s99_range_v [s e] (loop [output [s] curr (inc s)] (if (> curr e) output (recur (conj output curr) (inc curr)))))
The next block may take a while. I’m encountering some real difficulty with P26, but I don’t think I’m ready to start “cheating” and looking for other people’s solutions yet.