Skip to content

Commit 5edd6e1

Browse files
committed
Solve parabolic, part 1
1 parent 4eb45c4 commit 5edd6e1

File tree

5 files changed

+247
-5
lines changed

5 files changed

+247
-5
lines changed

run.sh

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#!/bin/zsh
1+
#!/bin/bash
22

33
if [ "$#" -lt 1 ]; then
44
printf "\e[31mpass the advent day as an argument, e.g. 00\e[0m\n"
@@ -33,12 +33,12 @@ set -e
3333

3434
mkdir -p build
3535

36-
ghc -o build/advent ${src[@]} -tmpdir build -outputdir build
36+
ghc -fforce-recomp -o build/advent ${src[@]} -tmpdir build -outputdir build
3737

3838
printf "\e[32mrun advent : $aoc\e[0m\n"
39-
printf "\e[32msource file : ${src[1]}\e[0m\n"
40-
printf "\e[32minput file : ${inp[1]}\e[0m\n"
39+
printf "\e[32msource file : ${src[0]}\e[0m\n"
40+
printf "\e[32minput file : ${inp[0]}\e[0m\n"
4141

4242
printf "\e[33m"
43-
build/advent "${inp[1]}"
43+
build/advent "${inp[0]}"
4444
printf "\e[0m"

solutions/04_scratchcards.hs

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ main = do
88
let cards = lines input
99
print (answer1 cards)
1010
print (answer2 cards)
11+
print "hello"
1112

1213
-- Part 1.
1314

solutions/14_example1.txt

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
O....#....
2+
O.OO#....#
3+
.....##...
4+
OO.#O....O
5+
.O.....O#.
6+
O.#..O.#.#
7+
..O..#O..O
8+
.......O..
9+
#....###..
10+
#OO..#....

solutions/14_input.txt

+100
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
#...#..O#.OO...#......#...O.#.O#.O........O#..O#.O.OO..O.......O....##..O#O.........#O....O..O#.....
2+
OO..O....#.####...#.O..#.....OO.O...O.#OOO.##..O.#.OO.#....O.#....#..#.O#..O#.O...#OO.#....#.O.#...O
3+
..........O..#..OO.O...##.O........O#O#.#...#O....O.........O.....OO#....O..............#......#...#
4+
#..O.O.#OO#....O#OO.#.#.O..O#...#.OO#.O#.O......#.....OO...O#.O....O..#.O#..#..O.#.O........#..#..O#
5+
...#..O#.OO..#O...#..#..O###.........#.....OOOOOO.........#O.O.O#O.O.......O........#.OO....O..#...O
6+
..OO...O.#.......#.#O....#..O##....O.O..OOO...#O.#..O.#O...#.O..O..#O#.#OO...O.OO..#..O..O.O.O....O#
7+
.OO#............O.O...#.OO.#..##O......OO...#......##......#.#..#.O..O.O...#..#...O#......O..OOO....
8+
..........O..#O...O.#....OOO.#........#.##O.#......#..###O...O...O..O.#.O..O.#..O.O.O.O.##.....#.#..
9+
.##.O#O.........O.#.OOOO..O..O#.#..O.O...O..#......O.O.#O........O..#.#..#OO...#......##O.#O..O.OO..
10+
.O.O.O##...O...O.........O##O##....#O....O#...OO.O.#..#O....OO...O.O.....##.....#..O#O#.#...O..O..#.
11+
..OO#.#O.#...............#...#.#.O..#..O.#.#..O.##O..OOO..#O#....##.#.#...#.#.O#.#.O..#.#......#....
12+
.#...#.#....O..O.#..O.O..O.....##O#..#.##..OO.....OO.OO..OO...O#...O.O...O.OO##.....O..............O
13+
.....O.....#........#O..#.OO#..O...#O....OO..O.#.OOO.#O.O......#O.#.....#O..O..O#..#.#.#.O..O.#...OO
14+
#.....#..OO.#....#.##.O.##..O.#.O#.O...O...#O.#.O#..O.#...##....OO#OO......#.O...O.O#.#...O...##.OO#
15+
O.......O......O..O...#...#..#...##.##..O...O....O.##.#.#OO#.....#.O#...O.##O...O..........#..##.O.O
16+
..............OO.O##.....#.O......##O#....O.O....O..##.#.............O#...O.#OO...O....#...O..O#..OO
17+
.#O#...OO...#.#.....O#...O#.O.O#..O..##O.#.#..OO.O.##.#......O..O.O.O...#......OO#.#.#.#.O.OOO#.O.O.
18+
..#...#..O.........O.O.O..O.........#..#....#.O#..#O...............O##.O##O.O..O#.#....O.#OO.#.#....
19+
..#.#OO.OO..OO#..#O..O##.....O......OO..O.#..O#.......O..##..##.O.O..O.#O....O.O.......O....O....#.#
20+
....OOOOO.#.#......#.........#.O.O....O....#.O..O#.....O##..........#..#.....O..O.....O....O.#O.#...
21+
OOO.O#..#...O#...O.#..OOO.#.....O..#.O#.O.O.O.#O..#...#...#O....O.#..O..#O..O.#O#.OOOO..............
22+
.#.O#OO#..##...O.#..O.O....#O........#O.....O..O....O.....#...#O.O..........#.......OO#...O..OO.##.O
23+
OO.....O#.O....O..O.O.#.#O#.......#..##...O.......O...OOO...#...#OO.OO#....O#........OO.OO..OO....##
24+
..O..#..#.#.O..O...#.#.#.O......O....O...#....#...#O.....O.#.#O.O..O#......OO.O...#.#OO.#...O.O.O..#
25+
.#.O#.O.....O..OO...O..O..#....O#..O..O#....#......O#O....OO....#...O#O....#........O.O##..O....#...
26+
#.OOO#..##..O#.#....#.O##..#......O#..OO.....O.....O..OO..#..OO..O..#..#...O.....#.#..O.O.O..#.O...#
27+
#.O.#..#.....O.....#O.O...##.O....OO...OO.#....O.#.........O.O#.#....#.#......O....O..O....#.O....#O
28+
.#O...O.O....OO#.....O......#...O#..#.O#.O....#...O.O#..O...O...........#......#.##...OO......OO##..
29+
........#.#O......#O..#OO....O......#.O.#O#O...O...#O....O...O.........O..OO..##...O.#.#OO#.....##.O
30+
.#.OOO.....#...#..O#....#.O....OO.O.O..OO..#.O..OOO.#....O.#..#O#O.#...O.#...O......#.O.O#O...O.OO..
31+
.#..#.O#...O....O....O...#.O..#.O...##.##O.O....O..#.#.#.O..#.O.OO..O...#..O#...##.O.....O...O....#.
32+
...##...#.##OO.O.O...O...#...##.O..#OOO..#.OO#..O..O....O.O#.#.#O..##.O...O.O..O...O......#.......O.
33+
.##.#O..#....O........O..O.O..##...#...#O#...O.....O##.#..#.O........O........O##....#....#.O..O...O
34+
O.#.O..O..#..#O.##O.......O.O...O#.O......OO.O.O....O..#.O...#O.O..#..O....O..#..OO#.#.O#..#.#..#.#.
35+
...................OO.#O..O...#.O...O...O.O#....#....O.OO.#O.O#.#.O#O.O#.#..O...OOOO..#..O...O.#..#.
36+
#.....#....#OO..O...O#..#.##....#.#..#.#O..#.O.O....#.#O.........##OOO...OO...O..#.##.O#..O.#....#..
37+
O..#.##....O##.....O.......O.#...#...#.##.....OO.O..O#.#O.#....#.....#.....#.....O.....#............
38+
#..#..#...O.#....#......O...#...#.#O.........#O#.#O...O...O...#.#.......#O...............O#....O....
39+
##.#..OO..OO#...#.OO.....#....O#O...O.O.O.#....#......O...O#..OO.O..#.#...O.#O...O...#........O.O.O#
40+
O.#...O..#.#.O...#O..O#..O.#..O#O#OOO.......#..#O..#....O#...O.O...O....O.............OO..O..O#.#...
41+
O##.OO....#..#.....O..O..#..O.#...O..OO.......#...#.#....#...##.#.....#..#..OO#O.#..OO..O#..#..#...O
42+
#.O.#...#O.#...#.OO.OO..##.#...#.....O#.O#O.OO.........O...O..O.O...#.........O......OO..#..O...#O..
43+
.....#....O.##..O#..O.....#.O.....O...O.OO#OO.O......O..O..O.....#.#...#.O..#...O.O#.OOO.O.#....O...
44+
..O...#....O....#.O.O#.#.#.O.OOO........O..OO..O##.....##.....#.O.......#....#.#O.O.#..#.O...#..#..O
45+
O#...O...##.#.#..O#O#......#.O..#....O...OO.#...#.OOO##..O.O#.#.#..O#OO.OO###.....O..#...#O.#..O....
46+
O.OO..#...O..O......O.#....O.O##....O.#O.O.O###..O...#..#.....#....O###..#...#O.OOO..O.#O.....#.....
47+
#O....#....O..O..O#.O.OOO...O.OOO......#....O.##O##O....#.OO..O#..#......O#.........#.#...OO...O....
48+
.#..OO.....O..#....O..........O..O.O..O.##...O.O.O.#.O.#...#O..#....O.#........#.#..O.##....#O##.#.#
49+
.OO.......O..O#.O..#OOO.O...#.#.O#.##....#.O..#.#.O.OO......#O##.O...........OO..#.......#...O#.....
50+
....#......#..........#.#.O..O.....#...O....O.O.OO#.#......O..#.#O..OO..OO#.O#.#O#.O..O.O......#...#
51+
O.O.O..#O#......O.#O..#####...O.....#.O..#..O.........O...##.#O.....##.....#..#.....O.#...#O.#O#OO.O
52+
.....O..O#...O..#...O.......O..###O...O..O...OO.O...O..O#OO.....O#.O.#.O......#........O.O.O..OO#.O.
53+
.O...#.O....O#OO...OO#.#.......OO.....#.#.....#O..#..#.#.#O#..#.O.O.....##.#.#.#...#O...O......O....
54+
.#..#.OO....O.#..O..O..O...O..........O.#.OO..#..O............O#.O.#.O#...OO...O#.O.O.###.#O.#..O.O.
55+
..#O...#..#..O....#............O..#.O....#...O...#.....O..##.##OO#....#...O#.O.O....OO#O..##..O...#O
56+
..OO.#O#....O..#..#..O.#O..O....O.........#.O...#.O....##..#.O........O....O...#.OO..#........O.OOO.
57+
.O..#.OOO.O.O..O...#O..#..OO.....##....#..#..O.OO#O...#.O...#.....O#..##.##.#.....O..O....O..#O..OO.
58+
...#.O.#.#.....O...#....O..O..##OO.........O.#..O..O......O#.#....O.O..O..O.......O.#.#..#...##...O.
59+
..O....##...O...O.#OOOO.O..#.....OO.O.......#O..O..#..O...#....OO....O...##.#....##....O...O...O##.O
60+
O..O#.....#O...O...#O...#...O.....#......O...#..#O............#.###O.....O.....O.O.#..#OOOO...#O#...
61+
O.O...OO.##....#....#.#.#O....O.#.#..O..O..O.....OOO#.#.......#.....O...O...O...#..#....OO.#.O.....#
62+
..#.#.O.O...O..#..O#..O..#..#.OO..##......#OO#....#.O.O.O##..O...O#..#O.........OO.#...OO.O.O.OOO...
63+
.......O.O..#.......O.O..#.O#..#...O.......O....O....##OOOO..#....#.#....#.....#O#....#.....O..OO.#.
64+
O..#OO..#.##.......##..O..O.#..O.O##.....OOO#..#....#..O.O..O....#..O.O.....#O..#.OO..O#....#.#.....
65+
OOO..O.....##....O..#.O.#...O##OOOOO....O.#..O.O#.O..##O.O#OO...O........O.O..O..O..#.O..OOO..#.O.OO
66+
...O.O.O..OOO..O..#...#..O...##O#OO.OO..O.........O.....O#O.O.O....#..O#.O#..O.O.O.#.#O##O..#.......
67+
OO....O...OO..#..#OO..#......#.O.OO.O.O.#.......#OO........OO...#..O...##..O.....O...O.O#O.O.O#OO...
68+
O...O#.OO.....O.O.O...#O.O..O#O........#O.#....#...#.O.#...OOO#..........O.....O...##.....O#O.#.O##.
69+
...O....#.O......OO......##..O..O.O....##........O.....#....##...##..#........#..##..O....O.O.#..O#O
70+
..##.O....#.O##.OO#O....#OO#OO....O#.O......##..##.O..OO.O...O....O...OO....#.O..O....O#..#...#....O
71+
.###....#OOO...#....OOO.#..#....O.O#.......#............O......#...#..##..O#..O..O.##.O...O#....O...
72+
..##O..#OO#...O....##.O..#...O.....#.O..O.O.....O..#O#O...##.#O.#....#OOO..O....O....#...OOO.#O..##.
73+
.O.O......#OO.......#.O.....#...OOO.O.O.#.O..#.O..##.O..O..O...O.#O##.O....#......#.O.#......#....O.
74+
##......O.OO..O#.#O.###O....#...O#......##.......O.OO#O.....O....OO.........#....O.#.O.......O#...#.
75+
.O.....##..#....#.O.....O.#..OO...#O...#.#...##....O....#OO.#.O.#O.....#O.O.O#O.OO.....#...OO#...O.O
76+
.O#....OO.OO..O..OO.O....##...#..OO.O....O...O.O..O..O..O..#OO...#O...O...O.OO#...O.O.....#O....O...
77+
#O......O#....OO###.O...O##...#.........O.....O..##.##....O......O##....#...#..O...O.O.......O...###
78+
.....O##O..O..####.#O.OO..#..#..OO.#O.....O...O####.#......#..O....O.#.#......OOOOO.O.O...#.##......
79+
O##.#..#..#.#..#.#....#......OO#...O..O#..OO.#O.....O.........O#..#.......#.....##...#O#.#O..OO.....
80+
.O..O#O..#.OO.O....O..##O......O.##...O...#.O#.........O...O.O...O.#...OO.........#...#..#OO#.#....#
81+
........O#....OO.#.O..O...OO#O..OO#OOO.O#.#.#O..#.....O.OO...O...OO.#..O..O....##..O#...OOO.O.##.O..
82+
..#.O....##O.O.#.#....O.#.O.#...OO.O.....#..O.....O....##.......O#.......O.#..O.#.O#.O.O..##......O.
83+
#O#O.#...OOOO..OOO.O###....OO....#.O..OOO#..O...#....O.....O..OO.#.O..O###.O...O..#.#...OO...O......
84+
......O#.O..#.O.......OOOO..#.O........O.#O##.#.#O#O.....O.#O....#...O...OO.O......OO........O.#..#.
85+
O..#..O..##..O.O....#....#..#O...OOO.OO.#O...#.........O..#..O........O#....O.#O#.#O.OO.......O.....
86+
..O.OO#..O..O......O...OO...#.....#.....O......O.....O..#....#.....O.O..O#..O.#...#...#O..#..O..O...
87+
O.#..O.#O.OO.O#..OO...O#O..OO..O...#.O..#O..#...O....OO#..OO.....OOOO...#O...O#O..OO.........#......
88+
....O.O#.#......O.O#....O#.......#....#.#.#O.#O...O#O.#..#.#.OO........O.#.#O....O#.......#..OO#O.O.
89+
...O...O..###..#......#.#.O..O....OO##..##OO.......O...O#..OO#OO..#..O........O...#.#.#O.....#O#OOOO
90+
...O..O.O#.O.#......O.#OO..OO.O....O.O....#.#O#.O.....O.....O..O.#.OO.....O...O.......O....O.#....O.
91+
#..O....O.O.O#..O..#..........#O...##..OO.#.O.O#O...#..O...#.......O.........O....O#O#O.O.O.#.OO.OO#
92+
O...#.....O..O#.#O...O...O.##..#O..#.##.O...O##.#O...O..O..O#....#.O..#O##..#...O.O.O..##..OO.O....O
93+
#.....#.O....O......OO...OO.#.O..O#..O.O#O......#O...#.#..O.#...#.O.#..#..#....O.O....OOO#..O.......
94+
#....#...O#.....O..O.#...O.O..O#..#.O.O.#...#.O..O#.......O......O..O....O....##OO.#O....##.OO....#.
95+
O...O.O..#..O#..#O.....#.#.O#O.O......#OOO...OO........O#.O.....#..#.#..#.O.#....#.......OO.#....#O.
96+
OO.##.#O...#.O.....O..#.#...#OO......##O......O..###...#.......O#.OO..O...#.#.....O.O......O##......
97+
#.O....OO.O.OO.....OO..O...........O..O..#OO#...O#....OO.O.......#.#.OO..OO.OO.#.O...O.#O.O........#
98+
..##...O.O.O.O.O...OO.O...O..O.#.#......O.#.#.O.....#.O...O#..O.##O...#....O..#...O.OO.........O#.#.
99+
.....OOO#O#OO.O...#......#.O..##OOO#.#.#O.O.#O..#O..O..##O.#.#.....#.....#.#...OO.......O#...O....O#
100+
O..##.##...O...O.O#..#....O..O.....O#O#O#O#O....#.O.#O..#....O.O...O..O.#...O.OO..O..O.O#..#O##.#O.O

solutions/14_parabolic.hs

+131
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
import Data.List
2+
import System.Environment (getArgs)
3+
4+
data Element = Empty | Round | Cube deriving (Eq, Show)
5+
6+
type Platform = [[Element]]
7+
8+
type Coord = (Int, Int)
9+
10+
data Direction = North | South | East | West deriving (Eq, Show)
11+
12+
at :: Platform -> Coord -> Element
13+
at platform (x, y) = (platform !! y) !! x
14+
15+
width :: Platform -> Int
16+
width platform = length (platform !! 0)
17+
18+
height :: Platform -> Int
19+
height platform = length platform
20+
21+
isLegal :: Platform -> Coord -> Bool
22+
isLegal platform (x, y) = x >= 0 && x < width platform && y >= 0 && y < height platform
23+
24+
set :: Platform -> Coord -> Element -> Platform
25+
set platform (x, y) element = vInserted
26+
where
27+
(va, vb) = splitAt y platform
28+
(ha, hb) = splitAt x (head vb)
29+
hInserted = ha ++ [element] ++ tail hb
30+
vInserted = va ++ [hInserted] ++ tail vb
31+
32+
swap :: Platform -> Coord -> Coord -> Platform
33+
swap platform coord1 coord2 = set (set platform coord2 e1) coord1 e2
34+
where
35+
e1 = at platform coord1
36+
e2 = at platform coord2
37+
38+
main = do
39+
args <- getArgs
40+
input <- readFile (args !! 0)
41+
let platform = parsePlatform (lines input)
42+
print (answer1 platform)
43+
let spins = foldl (\ps c -> ps ++ [spin (last ps)]) [platform] [1..40]
44+
let loads = map load spins
45+
let shows = foldl (\ss p -> ss ++ (showPlatform p)) "" spins
46+
putStr shows
47+
print (loads)
48+
49+
-- Part 1.
50+
51+
answer1 :: Platform -> Int
52+
answer1 platform = load (roll platform North)
53+
54+
roll :: Platform -> Direction -> Platform
55+
roll platform direction = foldl (\p c -> rollRock p direction c) platform coords
56+
where
57+
(w, h) = (width platform, height platform)
58+
coords = case direction of
59+
North -> [(x, y) | x <- [0..w-1], y <- [0..h-1]]
60+
South -> [(x, y) | x <- [0..w-1], y <- reverse [0..h-1]]
61+
East -> [(x, y) | x <- reverse [0..w-1], y <- [0..h-1]]
62+
West -> [(x, y) | x <- [0..w-1], y <- [0..h-1]]
63+
64+
65+
rollRock :: Platform -> Direction -> Coord -> Platform
66+
rollRock platform direction coord
67+
| (at platform coord) /= Round = platform
68+
| otherwise = swap platform coord (furthest platform direction coord)
69+
70+
furthest :: Platform -> Direction -> Coord -> Coord
71+
furthest platform direction coord
72+
| not (isLegal platform nextCoord) = coord
73+
| nextElement /= Empty = coord
74+
| otherwise = furthest platform direction nextCoord
75+
where
76+
nextCoord = next coord direction
77+
nextElement = at platform nextCoord
78+
79+
next :: Coord -> Direction -> Coord
80+
next (x, y) direction = case direction of
81+
East -> (x + 1, y)
82+
West -> (x - 1, y)
83+
North -> (x, y - 1)
84+
South -> (x, y + 1)
85+
86+
load :: Platform -> Int
87+
load platform = foldl (+) 0 weights
88+
where
89+
(w, h) = (width platform, height platform)
90+
coords = [(x, y) | x <- [0..w-1], y <- [0..h-1]]
91+
weights = map (weight platform) coords
92+
93+
weight :: Platform -> Coord -> Int
94+
weight platform coord
95+
| rock /= Round = 0
96+
| otherwise = dist coord
97+
where
98+
rock = at platform coord
99+
dist (x, y) = (height platform) - y
100+
101+
-- Part 2.
102+
103+
spin :: Platform -> Platform
104+
spin platform = foldl roll platform [North, West, South, East]
105+
--cycle p = roll (roll (roll (roll p North) West) South) East
106+
107+
-- Parse platform.
108+
109+
parsePlatform :: [String] -> Platform
110+
parsePlatform = map parseRow
111+
112+
parseRow :: String -> [Element]
113+
parseRow line = map (\c -> (parseChar c)) line
114+
115+
parseChar :: Char -> Element
116+
parseChar c
117+
| c == '.' = Empty
118+
| c == 'O' = Round
119+
| c == '#' = Cube
120+
121+
showPlatform :: Platform -> String
122+
showPlatform platform = foldl (\rs r -> rs ++ (showRow r)) "\n" platform
123+
where
124+
showRow row = (map asChar row) ++ "\n"
125+
126+
127+
asChar :: Element -> Char
128+
asChar element = case element of
129+
Empty -> '.'
130+
Round -> 'O'
131+
Cube -> '#'

0 commit comments

Comments
 (0)