Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
Stuart A Kurtz
/
advent-of-code-2021
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Pipelines
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
caf11616
authored
Dec 18, 2021
by
Stuart Kurtz
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Day 18
parent
0f0acb31
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
290 additions
and
2 deletions
data/snailfish.txt
src/AOC-18a.hs
src/AOC-18b.hs
test/snailfish.txt
data/snailfish.txt
0 → 100644
View file @
caf11616
[[2,[2,[4,0]]],[6,1]]
[[3,[4,[2,4]]],[[6,9],[6,1]]]
[7,[8,[8,[0,8]]]]
[[[[2,9],5],5],[[[0,1],8],[[7,9],5]]]
[[[[3,0],[7,0]],[[9,6],[1,9]]],4]
[[[0,[4,8]],8],[[[2,1],9],6]]
[[[5,[7,7]],[[9,6],2]],[[[5,8],8],0]]
[[0,3],[[8,2],[6,[2,2]]]]
[[[9,0],[4,[4,7]]],[7,[[9,1],9]]]
[0,[7,[1,1]]]
[[[4,[0,1]],[[1,0],8]],[[[3,9],[0,1]],[[9,1],[8,8]]]]
[[[6,0],3],2]
[[[[4,1],[2,7]],[9,[8,9]]],[[3,0],0]]
[[[[2,4],[8,7]],[9,[9,7]]],[[[2,5],6],9]]
[[7,6],[[4,[2,4]],[3,8]]]
[[7,2],[[8,8],7]]
[[[[6,0],4],[[4,7],4]],[[6,[2,7]],[[6,5],3]]]
[[[[8,8],[7,6]],4],5]
[[0,[[6,9],[7,9]]],[9,5]]
[9,[[[0,4],6],[[7,0],0]]]
[[[[4,4],0],[3,[3,9]]],[[7,5],[5,[7,2]]]]
[[[8,3],[[8,5],[4,4]]],[0,[0,3]]]
[[9,[3,[6,7]]],[[7,0],[[9,2],7]]]
[[[3,7],[[3,6],9]],7]
[[2,[2,[5,7]]],[[[6,4],5],[4,7]]]
[[[[9,0],2],[[4,4],6]],[[[3,2],[5,5]],[[5,9],7]]]
[[[[2,5],4],[8,5]],6]
[[[3,2],[[1,7],5]],[[8,1],[1,[1,2]]]]
[8,[[3,[5,4]],5]]
[[[2,[5,9]],[1,3]],[[[2,3],[8,3]],[[5,1],[8,9]]]]
[[[2,0],[[3,3],[4,7]]],[[[8,7],[7,4]],1]]
[[[[7,4],9],[3,[4,1]]],[[[8,4],5],7]]
[[[[0,2],9],3],[9,[5,3]]]
[3,4]
[[[1,[0,2]],[[9,9],[8,2]]],6]
[[[[2,9],[3,5]],9],[[9,3],[3,[6,7]]]]
[[0,[[4,6],4]],[2,[5,2]]]
[9,[[9,[6,8]],8]]
[3,[[[1,2],[0,9]],[[4,9],1]]]
[[[[8,7],[1,7]],[[2,6],[8,5]]],[3,[[8,0],[6,9]]]]
[[8,[[4,9],7]],[3,[9,4]]]
[[0,[[3,2],[2,2]]],0]
[[[2,7],[[5,7],4]],[[[6,0],[2,1]],[[4,1],[1,6]]]]
[[[[9,6],[0,3]],[[0,6],[0,4]]],[[[3,7],[6,7]],7]]
[[[[1,1],6],[[5,6],4]],[[5,[0,7]],1]]
[[[3,9],[[7,3],[1,5]]],[[[1,2],3],[0,[5,6]]]]
[[[[4,4],[0,5]],6],[[7,[2,0]],6]]
[[[[2,2],6],9],[[[9,1],2],[[8,6],8]]]
[[[[5,0],8],[[5,7],7]],[6,[5,3]]]
[[[[8,2],[8,4]],1],[[1,[7,3]],8]]
[[[[3,2],2],[[4,9],[5,4]]],[[[9,2],4],[5,[6,0]]]]
[[1,[[0,6],0]],[[[1,5],2],[[6,0],[3,7]]]]
[4,[7,[6,[3,3]]]]
[[[0,[2,5]],2],5]
[[[0,[5,7]],9],[[[2,3],[3,4]],[[0,4],9]]]
[[3,1],[[[4,1],9],[[0,5],[8,6]]]]
[[9,[2,0]],[[0,[1,7]],[9,[6,4]]]]
[[[[6,5],5],5],[5,8]]
[[[[2,8],[1,3]],[[5,4],2]],[[[0,8],[5,1]],[9,[5,6]]]]
[[[[6,9],7],[9,7]],2]
[[[[1,7],8],[8,7]],[[[3,5],4],8]]
[[[[1,8],[1,0]],0],[[7,1],5]]
[[[9,[6,8]],3],[[5,1],[4,[8,2]]]]
[[[0,[2,1]],1],[3,[9,[5,5]]]]
[[2,5],[2,5]]
[[[[1,1],[8,3]],[[1,9],[4,9]]],[[5,[4,8]],[[5,0],0]]]
[[[0,7],[[3,4],1]],[[[1,2],[2,9]],[[2,0],9]]]
[3,2]
[[[9,[8,2]],[7,3]],7]
[[[[6,9],9],[3,2]],0]
[[3,[[6,1],8]],6]
[[[[5,9],9],[[4,4],7]],[7,5]]
[1,[[2,8],0]]
[[2,[0,6]],[[[3,3],[0,4]],8]]
[[[[4,8],9],[0,[3,0]]],[[0,[3,1]],[8,[7,4]]]]
[[[6,[8,0]],[0,[8,9]]],[3,8]]
[[[[0,8],[9,4]],[1,[2,0]]],1]
[[7,6],[[[0,2],9],3]]
[[[[1,0],3],2],1]
[[[[1,2],8],5],7]
[0,[[3,0],7]]
[[7,[[0,9],[8,4]]],[[2,0],[[2,8],1]]]
[[[1,8],[[8,1],1]],[3,[8,9]]]
[4,[[3,7],[[5,2],9]]]
[[[[3,8],[2,9]],[3,9]],[[[3,7],[6,9]],[[1,7],2]]]
[9,[[[3,7],9],[[4,9],[8,6]]]]
[[7,[3,9]],[0,7]]
[[[1,6],0],[[7,[8,1]],[6,3]]]
[[[[3,9],3],[[2,6],[8,0]]],[[3,3],9]]
[[[1,2],[1,6]],[[1,[4,2]],0]]
[[[0,[3,0]],2],[[7,[9,4]],[6,8]]]
[6,[[[3,1],1],5]]
[[[3,4],[[5,9],[1,1]]],[[2,[0,1]],3]]
[[2,[[1,5],7]],[0,2]]
[[1,[[6,7],7]],4]
[6,[5,[[3,2],[6,8]]]]
[[[3,9],[[4,0],6]],[8,[3,[5,2]]]]
[[5,[[7,3],[2,2]]],[[7,7],7]]
[[[1,2],[[2,4],[6,1]]],[[0,[4,2]],[[5,7],[2,3]]]]
[[[8,7],8],[[7,[3,6]],[[1,0],4]]]
\ No newline at end of file
src/AOC-18a.hs
View file @
caf11616
module
Main
where
import
Control.Monad
(
void
)
import
Data.Char
(
isDigit
)
import
Text.ParserCombinators.ReadP
(
(
<++
),
char
,
munch1
,
readP_to_S
,
ReadP
)
data
SFNumber
=
Regular
Int
|
Pair
SFNumber
SFNumber
parseInt
::
ReadP
Int
parseInt
=
read
<$>
munch1
isDigit
parseSFNumber
::
ReadP
SFNumber
parseSFNumber
=
(
Regular
<$>
parseInt
)
<++
parsePair
where
parsePair
=
do
void
$
char
'['
x
<-
parseSFNumber
void
$
char
','
y
<-
parseSFNumber
void
$
char
']'
pure
$
Pair
x
y
instance
Read
SFNumber
where
readsPrec
_
=
readP_to_S
parseSFNumber
instance
Show
SFNumber
where
show
(
Regular
n
)
=
show
n
show
(
Pair
x
y
)
=
concat
[
"["
,
show
x
,
","
,
show
y
,
"]"
]
explode
::
SFNumber
->
Maybe
SFNumber
-- result, did a reduction occur
explode
sn
=
case
iter
1
sn
of
Nothing
->
Nothing
Just
(
result
,
_
,
_
)
->
Just
result
where
-- the second coordinate of the result encodes whether a
-- reduction occured, and if so, what numbers might need to
-- be added to the left or right.
iter
::
Int
->
SFNumber
->
Maybe
(
SFNumber
,
Maybe
Int
,
Maybe
Int
)
iter
_
(
Regular
_
)
=
Nothing
iter
5
(
Pair
(
Regular
x
)
(
Regular
y
))
=
Just
(
Regular
0
,
(
Just
x
),
(
Just
y
))
iter
5
_
=
error
"explode -- SFN too deeply nested"
iter
k
(
Pair
x
y
)
=
case
iter
(
k
+
1
)
x
of
Nothing
->
case
iter
(
k
+
1
)
y
of
Nothing
->
Nothing
Just
(
result
,
mx
,
my
)
->
Just
(
Pair
(
injectLeft
x
mx
)
result
,
Nothing
,
my
)
Just
(
result
,
mx
,
my
)
->
Just
(
Pair
result
(
injectRight
y
my
),
mx
,
Nothing
)
injectLeft
x
Nothing
=
x
injectLeft
(
Regular
x
)
(
Just
d
)
=
Regular
$
x
+
d
injectLeft
(
Pair
x
y
)
(
Just
d
)
=
Pair
x
(
injectLeft
y
(
Just
d
))
injectRight
y
Nothing
=
y
injectRight
(
Regular
y
)
(
Just
d
)
=
Regular
$
y
+
d
injectRight
(
Pair
x
y
)
(
Just
d
)
=
Pair
(
injectRight
x
(
Just
d
))
y
split
::
SFNumber
->
Maybe
SFNumber
split
(
Regular
n
)
|
n
>=
10
=
let
x
=
n
`
div
`
2
y
=
n
-
x
in
Just
(
Pair
(
Regular
x
)
(
Regular
y
))
|
otherwise
=
Nothing
split
(
Pair
x
y
)
=
case
split
x
of
Nothing
->
case
split
y
of
Nothing
->
Nothing
Just
sy
->
Just
(
Pair
x
sy
)
Just
sx
->
Just
(
Pair
sx
y
)
normalize
::
SFNumber
->
SFNumber
normalize
sfn
=
case
explode
sfn
of
Just
result
->
normalize
result
Nothing
->
case
split
sfn
of
Just
result
->
normalize
result
Nothing
->
sfn
sfAdd
::
SFNumber
->
SFNumber
->
SFNumber
sfAdd
x
y
=
normalize
(
Pair
x
y
)
magnitude
::
SFNumber
->
Int
magnitude
(
Regular
n
)
=
n
magnitude
(
Pair
x
y
)
=
3
*
magnitude
x
+
2
*
magnitude
y
main
::
IO
()
main
=
pure
()
main
=
do
input
<-
map
(
read
@
SFNumber
)
.
lines
<$>
readFile
"data/snailfish.txt"
let
result
=
foldl1
sfAdd
input
print
result
print
.
magnitude
$
result
src/AOC-18b.hs
View file @
caf11616
module
Main
where
import
Control.Monad
(
void
)
import
Data.Char
(
isDigit
)
import
Text.ParserCombinators.ReadP
(
(
<++
),
char
,
munch1
,
readP_to_S
,
ReadP
)
data
SFNumber
=
Regular
Int
|
Pair
SFNumber
SFNumber
deriving
Eq
parseInt
::
ReadP
Int
parseInt
=
read
<$>
munch1
isDigit
parseSFNumber
::
ReadP
SFNumber
parseSFNumber
=
(
Regular
<$>
parseInt
)
<++
parsePair
where
parsePair
=
do
void
$
char
'['
x
<-
parseSFNumber
void
$
char
','
y
<-
parseSFNumber
void
$
char
']'
pure
$
Pair
x
y
instance
Read
SFNumber
where
readsPrec
_
=
readP_to_S
parseSFNumber
instance
Show
SFNumber
where
show
(
Regular
n
)
=
show
n
show
(
Pair
x
y
)
=
concat
[
"["
,
show
x
,
","
,
show
y
,
"]"
]
explode
::
SFNumber
->
Maybe
SFNumber
-- result, did a reduction occur
explode
sn
=
case
iter
1
sn
of
Nothing
->
Nothing
Just
(
result
,
_
,
_
)
->
Just
result
where
-- the second coordinate of the result encodes whether a
-- reduction occured, and if so, what numbers might need to
-- be added to the left or right.
iter
::
Int
->
SFNumber
->
Maybe
(
SFNumber
,
Maybe
Int
,
Maybe
Int
)
iter
_
(
Regular
_
)
=
Nothing
iter
5
(
Pair
(
Regular
x
)
(
Regular
y
))
=
Just
(
Regular
0
,
(
Just
x
),
(
Just
y
))
iter
5
_
=
error
"explode -- SFN too deeply nested"
iter
k
(
Pair
x
y
)
=
case
iter
(
k
+
1
)
x
of
Nothing
->
case
iter
(
k
+
1
)
y
of
Nothing
->
Nothing
Just
(
result
,
mx
,
my
)
->
Just
(
Pair
(
injectLeft
x
mx
)
result
,
Nothing
,
my
)
Just
(
result
,
mx
,
my
)
->
Just
(
Pair
result
(
injectRight
y
my
),
mx
,
Nothing
)
injectLeft
x
Nothing
=
x
injectLeft
(
Regular
x
)
(
Just
d
)
=
Regular
$
x
+
d
injectLeft
(
Pair
x
y
)
(
Just
d
)
=
Pair
x
(
injectLeft
y
(
Just
d
))
injectRight
y
Nothing
=
y
injectRight
(
Regular
y
)
(
Just
d
)
=
Regular
$
y
+
d
injectRight
(
Pair
x
y
)
(
Just
d
)
=
Pair
(
injectRight
x
(
Just
d
))
y
split
::
SFNumber
->
Maybe
SFNumber
split
(
Regular
n
)
|
n
>=
10
=
let
x
=
n
`
div
`
2
y
=
n
-
x
in
Just
(
Pair
(
Regular
x
)
(
Regular
y
))
|
otherwise
=
Nothing
split
(
Pair
x
y
)
=
case
split
x
of
Nothing
->
case
split
y
of
Nothing
->
Nothing
Just
sy
->
Just
(
Pair
x
sy
)
Just
sx
->
Just
(
Pair
sx
y
)
normalize
::
SFNumber
->
SFNumber
normalize
sfn
=
case
explode
sfn
of
Just
result
->
normalize
result
Nothing
->
case
split
sfn
of
Just
result
->
normalize
result
Nothing
->
sfn
sfAdd
::
SFNumber
->
SFNumber
->
SFNumber
sfAdd
x
y
=
normalize
(
Pair
x
y
)
magnitude
::
SFNumber
->
Int
magnitude
(
Regular
n
)
=
n
magnitude
(
Pair
x
y
)
=
3
*
magnitude
x
+
2
*
magnitude
y
main
::
IO
()
main
=
pure
()
main
=
do
input
<-
map
(
read
@
SFNumber
)
.
lines
<$>
readFile
"data/snailfish.txt"
print
.
maximum
$
[
magnitude
$
sfAdd
x
y
|
x
<-
input
,
y
<-
input
,
x
/=
y
]
test/snailfish.txt
0 → 100644
View file @
caf11616
[[[0,[5,8]],[[1,7],[9,6]]],[[4,[1,2]],[[1,4],2]]]
[[[5,[2,8]],4],[5,[[9,9],0]]]
[6,[[[6,2],[5,6]],[[7,6],[4,7]]]]
[[[6,[0,7]],[0,9]],[4,[9,[9,0]]]]
[[[7,[6,4]],[3,[1,3]]],[[[5,5],1],9]]
[[6,[[7,3],[3,2]]],[[[3,8],[5,7]],4]]
[[[[5,4],[7,7]],8],[[8,3],8]]
[[9,3],[[9,9],[6,[4,9]]]]
[[2,[[7,7],7]],[[5,8],[[9,3],[0,2]]]]
[[[[5,2],5],[8,[3,7]]],[[5,[7,5]],[4,4]]]
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment