(set! *warn-on-reflection* true)
(set! *unchecked-math* :warn-on-boxed)

(def loop-count 1000000)
(def expected-checksum 4600001)
(def words ["alpha" "omega" "delta" "omega" "sigma"])

(defn configured-loop-count []
  (try
    (let [line (read-line)
          value (Integer/parseInt (.trim ^String line))]
      (if (pos? value) value loop-count))
    (catch Exception _
      loop-count)))

(defn configured-target []
  (or (first *command-line-args*) "omega"))

(defn string-eq-loop [limit target]
  (loop [i 0
         acc 1]
    (if (< i limit)
      (let [current (nth words (rem i 5))
            next (if (= ^String current ^String target)
                   (+ acc 7)
                   (+ acc 3))
            bounded (if (> next 1000000000)
                      (- next 1000000000)
                      next)]
        (recur (inc i) bounded))
      acc)))

(let [result (string-eq-loop (configured-loop-count) (configured-target))]
  (println result)
  (System/exit (if (= result expected-checksum) 0 1)))
