-
Notifications
You must be signed in to change notification settings - Fork 0
/
two.clj
37 lines (31 loc) · 1.15 KB
/
two.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
(ns two
(:require [clojure.string :as str]))
(defn parse-line [line]
(let [[[_ min-c max-c character-s password]] (re-seq #"(\d+)-(\d+) (\w+): (\w+)" line)]
{:min (Integer/parseInt min-c)
:max (Integer/parseInt max-c)
:character (first character-s)
:password password}))
(defn read-lines []
(str/split (slurp "resources/two.txt") #"\n"))
(defn meets-policy? [line]
(let [{min :min
max :max
character :character
password :password} (parse-line line)
occurrences (count (filter (partial = character) (seq password)))]
(<= min occurrences max)))
(defn meets-new-policy? [line]
(let [{min :min
max :max
character :character
password :password} (parse-line line)
policy-indexes [(dec min) (dec max)]
password->character (partial get password)
matches-policy-character? (partial = character)]
(= 1 (count (filter matches-policy-character?
(map password->character policy-indexes))))))
(defn first-answer []
(count (filter meets-policy? (read-lines))))
(defn second-answer []
(count (filter meets-new-policy? (read-lines))))