-
-
Save pieter-van-prooijen/513e71744f74be8839be10af278c754c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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