Skip to content

Instantly share code, notes, and snippets.

@vijaykiran
Created November 14, 2019 20:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 5 You must be signed in to fork a gist
  • Save vijaykiran/640f7cf5b8cb39612b375241a9f19f02 to your computer and use it in GitHub Desktop.
Save vijaykiran/640f7cf5b8cb39612b375241a9f19f02 to your computer and use it in GitHub Desktop.
(ns adoc.core
(:require [clojure.string :as str]))
(defn parse-name [room]
(let [parsed (str/split room #"-")
name (drop-last parsed)
sector-checksum (str/split (last parsed) #"\[")
sector (first sector-checksum)
checksum (str/replace (last sector-checksum) "]" "")]
{:room-name name
:sector-id sector
:checksum checksum}))
(defn get-frequencies [room-name]
(reduce #(conj %1 [(first %2) (count %2)])
[]
(partition-by identity (sort (str/join room-name)))))
(defn extract-checksum [frequencies]
(->> frequencies
(group-by last)
(sort-by key)
reverse
flatten
(filter char?)
(take 5)
(apply str)))
(defn sector-val [input]
(let [room (parse-name input)
room-name (:room-name room)
checksum (extract-checksum (get-frequencies room-name))]
(if (= checksum (:checksum room))
(Integer/valueOf (:sector-id room))
0)))
(defn shift-cipher [a s]
(let [v (int a)
r (rem s 26)]
(char (+ v r))))
(defn -main [& args]
(with-open [rdr (clojure.java.io/reader "input.txt")]
(reduce #(+ %1 (sector-val %2))
0
(line-seq rdr))))
(comment
(def t1 "not-a-real-room-404[oarel]")
(shift-cipher \b 26)
(shift-cipher \z 343)
(letter-counts (:room-name (parse-name t1)))
(extract-checksum (letter-counts (:room-name (parse-name t1))))
(is-real? t1)
(def t2 "totally-real-room-200[decoy]")
(extract-checksum (letter-counts (:room-name (parse-name t2))))
(is-real? t2)
(-main)
;;COMMENT
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment