Skip to content

Instantly share code, notes, and snippets.

@pieter-van-prooijen
Forked from vijaykiran/yo.clj
Last active November 14, 2019 20:35
Show Gist options
  • Save pieter-van-prooijen/513e71744f74be8839be10af278c754c to your computer and use it in GitHub Desktop.
Save pieter-van-prooijen/513e71744f74be8839be10af278c754c to your computer and use it in GitHub Desktop.
(ns clojure-meetup-2019-11.core
(:require [clojure.java.io :as io]))
(defn split-name [x]
(let [[_ letters id checksum] (re-find #"^(.+)-(\d+)\[([a-z]{5})\]$" x)]
[letters (Long/parseLong id) checksum]))
(defn freq-comparator [[a-ltr a-freq] [b-ltr b-freq]]
(let [freq-result (compare a-freq b-freq)]
(if (zero? freq-result)
(compare a-ltr b-ltr)
(* -1 freq-result))))
(defn count-letters [s]
(->> s
(remove (fn [c] (= c \-)))
(frequencies)
(sort freq-comparator)))
(defn checksum [freq-v]
(->> freq-v
(map first)
(take 5)
(apply str)))
(defn check-name [name]
(let [[letters id cs] (split-name name)
freq-v (count-letters letters)
computed-cs (checksum freq-v)]
(if (= computed-cs cs)
id
0)))
(comment (->> (io/resource "input.txt")
(io/reader)
(line-seq)
(map check-name)
(apply +)))
(defn shift-letter [c shift]
(if (= \- c)
\space
(-> (- (int c) (int \a))
(+ shift)
(mod 26)
(+ (int \a))
(char))))
(defn decrypt-room-name [name]
(let [[letters id _] (split-name name) ]
[id (->> letters
(map (fn [c] (shift-letter c id)))
(apply str))]))
(comment (->> (io/resource "input.txt")
(io/reader)
(line-seq)
(map decrypt-room-name)))
;; [984 "northpole object storage"]
(char 97)
(comment (split-name "aaaaa-bbb-z-y-x-123[abxyz]")
(count-letters "aaaa-bc")
(checksum {\a 1 \b 3})
(check-name "totally-real-room-200[decoy]")
(decrypt-room-name "qzmt-zixmtkozy-ivhz-343[abcde]"))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment