day 4
This commit is contained in:
parent
7c03dd3d6a
commit
28036847e2
4 changed files with 130 additions and 0 deletions
1
.tool-versions
Normal file
1
.tool-versions
Normal file
|
@ -0,0 +1 @@
|
|||
erlang 27.1.2
|
10
sample/day4-sample.txt
Normal file
10
sample/day4-sample.txt
Normal file
|
@ -0,0 +1,10 @@
|
|||
MMMSXXMASM
|
||||
MSAMXMSMSA
|
||||
AMXSXMAAMM
|
||||
MSAMASMSMX
|
||||
XMASAMXAMM
|
||||
XXAMMXXAMA
|
||||
SMSMSASXSS
|
||||
SAXAMASAAA
|
||||
MAMMMXMMMM
|
||||
MXMXAXMASX
|
65
src/day4_p1.gleam
Normal file
65
src/day4_p1.gleam
Normal file
|
@ -0,0 +1,65 @@
|
|||
import gleam/dict.{type Dict}
|
||||
import gleam/int
|
||||
import gleam/io
|
||||
import gleam/iterator
|
||||
import gleam/list.{filter, fold, index_map, map}
|
||||
import gleam/string
|
||||
import stdin.{stdin}
|
||||
|
||||
const word_size = 4
|
||||
|
||||
const directions = [#(1, 0), #(1, -1), #(1, 1), #(0, 1)]
|
||||
|
||||
pub fn main() {
|
||||
stdin() |> read_input |> find_xmas |> io.debug
|
||||
}
|
||||
|
||||
fn find_xmas(xmas_map: Dict(#(Int, Int), String)) -> Int {
|
||||
xmas_map
|
||||
|> dict.filter(fn(_, char) { char == "X" || char == "S" })
|
||||
|> dict.keys
|
||||
|> map(fn(coord) {
|
||||
directions
|
||||
|> list.count(fn(dir) {
|
||||
case
|
||||
xmas_map
|
||||
|> dict.take(traverse(coord, dir))
|
||||
|> dict.values
|
||||
{
|
||||
["X", "M", "A", "S"] -> True
|
||||
["S", "A", "M", "X"] -> True
|
||||
_ -> False
|
||||
}
|
||||
})
|
||||
})
|
||||
|> fold(0, int.add)
|
||||
}
|
||||
|
||||
fn traverse(start: #(Int, Int), direction: #(Int, Int)) {
|
||||
let #(s_x, s_y) = start
|
||||
|
||||
direction
|
||||
|> list.repeat(word_size)
|
||||
|> list.index_map(fn(dir, idx) {
|
||||
let #(x, y) = dir
|
||||
#(s_x + x * idx, s_y + y * idx)
|
||||
})
|
||||
}
|
||||
|
||||
fn read_input(it: iterator.Iterator(String)) -> Dict(#(Int, Int), String) {
|
||||
it
|
||||
|> iterator.to_list
|
||||
|> map(string.trim)
|
||||
|> filter(not(string.is_empty))
|
||||
|> index_map(fn(str, col) {
|
||||
str
|
||||
|> string.to_graphemes
|
||||
|> index_map(fn(char, row) { #(#(row, col), char) })
|
||||
})
|
||||
|> list.flatten
|
||||
|> dict.from_list
|
||||
}
|
||||
|
||||
fn not(a: fn(a) -> Bool) {
|
||||
fn(param: a) -> Bool { !a(param) }
|
||||
}
|
54
src/day4_p2.gleam
Normal file
54
src/day4_p2.gleam
Normal file
|
@ -0,0 +1,54 @@
|
|||
import gleam/dict.{type Dict}
|
||||
import gleam/io
|
||||
import gleam/iterator
|
||||
import gleam/list.{count, filter, index_map, map}
|
||||
import gleam/string
|
||||
import stdin.{stdin}
|
||||
|
||||
pub fn main() {
|
||||
stdin() |> read_input |> find_xmas |> io.debug
|
||||
}
|
||||
|
||||
fn find_xmas(xmas_map: Dict(#(Int, Int), String)) -> Int {
|
||||
xmas_map
|
||||
|> dict.filter(fn(_, char) { char == "A" })
|
||||
|> dict.keys
|
||||
|> count(fn(coord) {
|
||||
coord
|
||||
|> traverse
|
||||
|> list.all(fn(keys) {
|
||||
case
|
||||
xmas_map
|
||||
|> dict.take(keys)
|
||||
|> dict.values
|
||||
{
|
||||
["M", "S"] -> True
|
||||
["S", "M"] -> True
|
||||
_ -> False
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
fn traverse(start: #(Int, Int)) {
|
||||
let #(x, y) = start
|
||||
[[#(x - 1, y - 1), #(x + 1, y + 1)], [#(x - 1, y + 1), #(x + 1, y - 1)]]
|
||||
}
|
||||
|
||||
fn read_input(it: iterator.Iterator(String)) -> Dict(#(Int, Int), String) {
|
||||
it
|
||||
|> iterator.to_list
|
||||
|> map(string.trim)
|
||||
|> filter(not(string.is_empty))
|
||||
|> index_map(fn(str, col) {
|
||||
str
|
||||
|> string.to_graphemes
|
||||
|> index_map(fn(char, row) { #(#(row, col), char) })
|
||||
})
|
||||
|> list.flatten
|
||||
|> dict.from_list
|
||||
}
|
||||
|
||||
fn not(a: fn(a) -> Bool) {
|
||||
fn(param: a) -> Bool { !a(param) }
|
||||
}
|
Loading…
Reference in a new issue