-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday09_spec.clj
44 lines (38 loc) · 1.51 KB
/
day09_spec.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
38
39
40
41
42
43
44
(ns adventofcode2017.day09-spec
(:require [clojure.spec.alpha :as s]))
(s/def ::garbage (s/cat
:begin #{\<}
:content (s/*
(s/alt
:chars (s/+ (comp not #{\! \>}))
:ignored (s/cat :ign #{\!}
:char char?)
))
:end #{\>}))
(s/conform ::garbage (seq "<>"))
(s/conform ::garbage (seq "<random characters>"))
(s/conform ::garbage (seq "<<<<>"))
(s/conform ::garbage (seq "<{!>}>"))
(s/conform ::garbage (seq "<!!>"))
(s/conform ::garbage (seq "<!!!>>"))
(s/conform ::garbage (seq "<{o\"i!a,<{i<a>"))
(s/def ::stuff (s/alt :group ::group
:garbage ::garbage))
(s/def ::group (s/cat
:begin #{\{}
:content (s/?
(s/cat
:stuff ::stuff
:more (s/*
(s/cat
:separated #{\,}
:stuff ::stuff))))
:end #{\}}))
(s/conform ::group (seq "{}"))
(s/conform ::group (seq "{{{}}}"))
(s/conform ::group (seq "{{},{}}"))
(s/conform ::group (seq "{{{},{},{{}}}}"))
(s/conform ::group (seq "{<{},{},{{}}>}"))
(s/conform ::group (seq "{<a>,<a>,<a>,<a>}"))
(s/conform ::group (seq "{{<a>},{<a>},{<a>},{<a>}}"))
(s/conform ::group (seq "{{<!>},{<!>},{<!>},{<a>}}"))