Add 9 first days

This commit is contained in:
2021-01-08 23:41:37 +11:00
parent 4846e7c811
commit 2fd73ae5d1
49 changed files with 9734 additions and 0 deletions

1
3-toboggan_trajectory/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
/target

5
3-toboggan_trajectory/Cargo.lock generated Normal file
View File

@@ -0,0 +1,5 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
[[package]]
name = "toboggan_trajectory"
version = "0.1.0"

View File

@@ -0,0 +1,9 @@
[package]
name = "toboggan_trajectory"
version = "0.1.0"
authors = ["Guilhem MARION <gmarion@netc.fr>"]
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]

View File

@@ -0,0 +1,323 @@
.#.#....##.......#..........#..
...#...........##...#..#.......
#.####......##.#...#......#.#..
##.....#.#.#..#.#............#.
##.....#....#.........#...##...
###..#.....#....#..............
..........#..#.#..#.#....#.....
##.....#....#.#...#.##.........
#...#......#....##....#..#.#...
.##.##...#....##..#.#.....#...#
.....#.#..........##.#........#
.##..................#..#..##.#
#.#..........##....#.####......
.#......#.#......#.........#...
#....#..##.##..##........#.#...
##..#.##..#...#..####.#..#.....
###....#.###.##...........##..#
.....#.##.....##.#..#####....##
....#.###....#..##....##...#...
..###.#...##.....#.##..#..#.#..
#...#..#..#.........#..#.......
##..#.#.....#.#.#.......#...#.#
...#...##.#........#...#.......
..#..#.#..#...#...#...........#
........#.....#......#...##....
#........##.##.#.#...#...#.....
####.......#.##.###.#....#.....
...#...........#...#......#...#
##...#...#............#.......#
....#...........##.......#.....
###......#.....#....#...#.#...#
.....##..........#.......#.#...
##.##.##...#......#....#.......
##..#.#..#......#...#..#.......
....#....##.##............####.
..#.###..#.##.###..#.##.......#
#.##..#.#.....#..#.....##......
..##..#.....##.#.##........#...
.#..#.#......#..#............#.
.....#..#.#...#....#.##.#......
.#...##.#..#.#...##...##..##...
###............#.#..#..#...#...
..#..##.####.#.....#.....##.###
#....#.##..##....#..#...#.##.#.
.....#.##.........##...##......
.........####.#....#.#......#.#
.........#.#..#...#.#..#.#....#
.#.....#..##.##..##....#.......
..........##......#.##.###....#
.##...###..##.#...#........##..
..............#.#....#.#.###.##
..##.##.......#.#......##...#..
.#.....#..##..#.###...#..#.##.#
#.....#.#..#...#........#...#..
.#......#....#.#.....###...#..#
..##.#....#..##......#.....#...
..#.#.##..#.....#.####..###....
.........#......#..#...........
..#........#.##.#.....##.##..#.
.......#.........#....#...#.#..
.##.....#.#....#.#.......#.....
..........#.##........##...##..
###..###.#.#..#..#####.##.#.##.
..##..##.#.#...#..#.#.#......#.
#..#..#..#..##..#.....#......#.
..#....#.##..#......##.........
..#.##......#...##.#......#....
.......#..#.##.#.....#.........
.......#.#.#.###...##......#...
.....#.#..........#..#...#.....
....##..........#..........##..
..#......#.....#.##.#..#...#.#.
....#.....#..#...#..#.#.##..###
.####....#........#...#........
...##.#.##.#..#...##...#.##....
....#...#...#.#.#.#...#..#.....
.....#...#.#.....#.#........##.
..#.#.......###.#.....##.......
......#.........##....#....#..#
.............##.....##.........
.........##...##.......#.....#.
##.........#..........#.###..##
...#.....#......#....#..##.....
##..#...#...##.#.....#.#......#
..#...##.#.......#.#......#.##.
......#.......#.#...........#..
..........#.....##............#
#........#...#..#.......###.##.
.##...........#.#........#.#.#.
...#..##...#.#....#####.#......
.....##...###...#..#.##...####.
...#....#.....#..#.......#.....
#....#....#...#..#..#.######..#
#.###...........#......#...#..#
.#.#.#.#..#....#....#...##.#...
.#..#.........#.#....###...#...
......#..##.##..........#....##
.....#......##....##.....#...#.
.#...#.#.#....##....#..#....#.#
..................#..###.#..##.
..#.........#......#....#..###.
#.#.....#..#..#....###..###....
..##..##.#..##........##...##..
##..#........##..###..#.....#.#
..#..###..#......#....#...#...#
#..#.#..............##.#..#.#..
.....####....#...####.....#.#..
.....#....##.#......###........
##.##...#.#.#.#.......#....##..
.#......#...#.#....#..##.#.##.#
#.#.##.#.#......#..##........##
...##.....#.....#...#..###...#.
........###.....#.....#...##..#
.....#.##.##......#.#....#...#.
.#....##.......#..#.####.......
.#..#....#..........#......#.#.
.#.##.##.....###.#.#...........
.........#......#..##..........
....#...##.#.#.#..#.#.........#
..#.....#.##...#..#..#.###....#
...#.##......#.....##....#.....
###............#.#....#...#....
.......#.....#..#.#.#....#..#.#
...#......#.#..##..#....#...#.#
............##........##..##...
..#..#.##..#......###..#.......
........#.........#............
..#...#.#########.#...##..###..
#....#......#.......#.#.....#..
#.#..#....###.###....#...#.#...
#...###.#.#.......#.##......#..
.................#...#.#.#.....
##....#...#........#....#.#..#.
......#.....#...#..........#.#.
##..........#...#..........#.##
..#.#.##.#....#.#......#...##..
.....#.......#..#.....#........
#.##.#..##..#.......##.........
....#......#..#..#.#...#.......
...#....#................###...
.##.....#.#....#.#..........##.
...#..#....#.##.##......#......
..#.#....#.......#.#..##.......
....#.....#..........##.#.#####
#.....................##..#..#.
.###..#.##.......##.#...#..#...
...###.......#..#...#......#..#
#..#...#.#..#.#..#..#.##.......
#...##.......#..#..#.##..###...
......#....#.#.#........#.##..#
..##..#....#....#..#.#..#......
..##.#...#.#######..#...#.....#
..#....#..#.........#..##......
...#....#.#......#..#..#.#.....
#..#....#........#.#..##....###
#....#..##......##.##.....#.###
...#.#..........#..#.#.#.#.##..
......##..#.#..#.#....#....#...
##....#....#..#..#.##......#...
....#.#..##.#.#...###....##.#..
...#.......##..#.......#...#...
......##.......#..##.....#...#.
...#.#...#...........#...#.....
.#....#...#......##.##..###..#.
.#..........#...#...#...##.##..
.....###..#.....#..##....#.####
..#.###..#..##..##.....#.#.....
.............#.###...##.#.....#
....###.......###.#.....#..#.#.
........##.#.........#.....###.
.....###.#..#.....#...#..#.....
.#....#..##.#..#.#....#.......#
........#......#.#..#.#..#...##
...#.##.##......#..............
.#.....##.#.....#..#......##...
#..#..#.....#.....#.....###....
.##...........#..#.##.....#....
..#.#......#.#...#.##.#..#...##
...#..........#.....#..........
#.#.#.#.#...#....#...#.....##..
#......##...#...#..........#.#.
....##........#.#..............
#..#.#.#..#........##......#.##
........####...##.#.....#......
....#........#.#..#..##..#.#...
.#.....#..###...#..#.....#..#..
#......###.#..#....#..#.#......
....#.....##.##..#...#.#..##.#.
..##..#...#.#......#....#...#.#
#..##...##..#...###...#..#.....
.......#.....#...........##....
#..##....#........#....##..#.#.
.#........#..##...###.#..#.....
.#.#....#..##...#...##.#..###..
#.........#.......#.....#.#....
#..#.....#.#.###.#..#......#...
....#..#.#....#..##..###....###
###.##.#.#..#...........#.#.#..
..##.#.......#......#..##....#.
.....#.#.#.......##.......#...#
...........#.##....##.##....#.#
...#.......#..#.##..#......#..#
#.#.#...#......##.#...........#
##........#...........###.#..#.
..........#.#.#....#.#..##.#.#.
...#.#.#....#..........#..#....
#.#....###.#.#..#.......###...#
.#....#......#.#.#..#..#.......
......##.............#....#.#.#
.#..........#.........#.##.....
##....#....##....#..#.......#..
#.##.##.#..#..#.....#..#.##.#..
.#..#.......##..#.....##.##....
.......#..........#.#.##..#.##.
....#.....#.#...##....##.......
.......#.........#...##....##.#
#.....#......#..........#...#..
...#.#.......#.#..#....###..#..
.....#.#.#.........#...........
.#..###.#.#........#.#.........
.........#..#......##...##....#
...###..#.....##.....#.###....#
.##...#...#........###.#..#....
.##........#..#.###.######.##.#
##.#...#.#....#..##.#....##....
.......##.....##.#..###.#......
..##...##........#.......#....#
#..##...#.####...###......#...#
.##.....#.##.#.#.....###.#..##.
..###....#.#.###.#....#........
....#..###..#...#....#..#..#.#.
#.#.##....##...##.......#......
.........#...#....#..#.........
.............#...#..##.#.......
...#.##.......#...#.#..##.##...
.####.#.##..#.#......#.##...#.#
.#..#.#.....#.................#
..#.##..###....#...#......####.
..##..##...........#....#...#..
....#...#...#...#.......#....#.
#.#...###...#...#.#...#....##.#
......#...#.#.......#.....#...#
....##...#.#.#....#....#.#....#
.....#.....#...##..#...#....##.
#.....#....#......##.##....#...
...#.#....#...#....#.#....##..#
...#.#..#...##....###..#.......
...##......###...###.#...#..#..
##.......#.......###.......#..#
..##.##..###.#............#...#
#.....##..#..##....##..#.......
......#.#...#......#.....#.....
#...........#....#..##.##.#....
.......#..#......#...#....#...#
.#...##...........#......#...#.
#........#....##...###.#....#..
.....#.......##.........#.##...
.#.###..#....#..##.#..#.#..#...
#.......#.##.#.#....#.#..#....#
###.....#.#.......#..#......#.#
#..#.#.......#.#..##..##.#.#...
#..#.#.#.###........#.....#...#
#.#.#..#..##.....#...........#.
..#.#..#.....#...#...#...##....
...#.##......#...##.#...#.#.#.#
#..#.#.#.#.......####..........
..#......#.#......##.###.....##
..#...##..#.........##....#.##.
##.##.##.#.#.....#..........##.
.#.....###.#..#....#..#.###...#
#...##.......###....#.#..#.....
..#....##.........##.........##
......#....#.##.......#........
..#.#.#..#...#...#...##.#...#..
......#..##.#.#.#...##...#.#.##
#..#...##.#.....#...#.##.......
..#..#.........##.#...#.##...##
##.##.#....#.......#.##..#.....
.....##...##.##...##.........##
#......#...#.......#...#...#...
...##...........#...#..#.......
.#.##.#..#........#....#.......
#.#...#..#......##...#.#.##....
##........####..#.#...#.#.##.##
#..#.#.##......##.#.#..#.......
.....#.........#..#.####....#..
......##..#....#...#.#....#....
#...##........#.........#.....#
.#.#...#.#.#..#............##.#
.#..#....#....#.....#...#.....#
..###...#..#.....#.##.###...#.#
.#.###..#..#...#.#...#.#......#
#...#####......###........##...
.....#.....#..#.#....#..##.....
....##...#.#.##.#####...#....#.
.#.#.........##.#.......#..##..
.#...#.#...#...#....#.#...##.#.
.##...#..#.#..#......#.#.#..##.
..#.....#..#.....##.....#......
..#........#..##...#.......###.
.#....#.......#....#....#..#...
....#......#.#.#.........#.....
..##...#.#.#...#.#........#....
.#.....####...##.#..#...##.....
...#.....#...#...#....#....#...
.........#..#.#.....#..#.#..#..
.........##...........#.......#
......#..#.....##...#.##.#.....
.#......##........##...#.#.##..
.....#.#..##...........#..#..#.
...#.......#...#.#..#.##..#.##.
...#.......#.....#.#...#.##.#..
#.....#.............##.#..####.
.#...#......#...##.#....#.#....
.##..##.##....#.#.....#.......#
...#...#....#....##.#..#....##.
..............##....#.......#.#
.#.#.#...##..#..#...###.#..#...
.#.#...#.#..#.#..#...######..#.
........#......#.#..#.#....#...
..###.....###.#.##....#...##...
.##.#.....#.......##.......#...
..#..##...#..........#.#....#.#

View File

@@ -0,0 +1,133 @@
use std::{fmt};
#[derive(Clone, Copy, PartialEq)]
pub enum Terrain {
Plain,
Tree,
}
impl Default for Terrain {
fn default() -> Self {
Terrain::Plain
}
}
impl fmt::Debug for Terrain {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", match self {
Terrain::Plain => '.',
Terrain::Tree => '#',
})
}
}
#[derive(Debug, Copy, Clone, PartialEq, Default)]
pub struct Vec2 {
pub x: i64,
pub y: i64,
}
impl From<(i64, i64)> for Vec2 {
fn from((x,y): (i64, i64)) -> Self {
Self { x, y }
}
}
#[derive(Clone)]
pub struct Map {
size: Vec2,
tiles: Vec<Terrain>
}
impl fmt::Debug for Map {
fn fmt(&self,f: &mut fmt::Formatter) -> fmt::Result {
// A most honourable moment, but chaining debugs means lots of spare ""[]
//let dd: Vec<String> = self.tiles.chunks_exact(self.size.x as usize).map(|x| format!("{:?}", x)).collect();
for line in self.tiles.chunks_exact(self.size.x as usize) {
let line_s: String = line.iter().map(|x| format!("{:?}", x)).collect();
writeln!(f, "{}", line_s)?
}
// let banana = self.tiles
// .chunks_exact(self.size.x as usize)
// .map(|x| format!("{:?}", x))
// .collect::<Vec<String>>()
// .join("\n");
// writeln!(f, "{}", banana)
Ok(())
}
}
impl Map {
pub fn new(size: Vec2) -> Self {
Self {
size,
tiles: vec![Default::default();(size.x*size.y) as usize]
}
}
pub fn get(&self, pos: Vec2) -> Terrain {
self.tiles[self.idx(pos).unwrap_or_default()]
}
pub fn set(&mut self, pos: Vec2, tile: Terrain) {
if let Some(idx) = self.idx(pos) {
self.tiles[idx] = tile;
}
}
fn wrap_coords(&self, pos: Vec2) -> Option<Vec2> {
if !(0..=self.size.y).contains(&pos.y) {
None
} else {
Some(Vec2{
x: pos.x % self.size.x,
y: pos.y})
}
}
fn idx(&self, pos: Vec2) -> Option<usize> {
self.wrap_coords(pos).map(|pos| (pos.x + pos.y * self.size.x) as usize)
}
pub fn from_bytes(s: &[u8]) -> Self {
let rows = s.iter().filter(|&&x| x == b'\n').count();
let cols = (s.len() - rows) / rows;
println!("Size : {} {}", rows, cols);
let mut res = Self::new((cols as i64,rows as i64).into());
let mut pos = Vec2 { x: 0, y: 0 };
for tile in s {
match tile {
b'\n' => {
pos.y += 1;
pos.x = 0;
}
b'#' => {
res.set(pos, Terrain::Tree);
pos.x += 1;
}
_ => {
res.set(pos, Terrain::Plain);
pos.x += 1;
}
}
}
res
}
pub fn solve(&self, slope: (i64, i64)) -> i64 {
let mut seek_pos = Vec2 { x: 0, y: 0};
let mut tree_count = 0;
loop {
if self.get(seek_pos) == Terrain::Tree {
tree_count += 1;
}
if seek_pos.y + slope.1 >= self.size.y {
break;
}
seek_pos.y += slope.1;
seek_pos.x += slope.0;
}
tree_count
}
}

View File

@@ -0,0 +1,17 @@
use toboggan_trajectory::*;
fn main() {
let map_str = include_str!("../data/input.txt");
// println!("{}", map_str);
let map: Map = Map::from_bytes(map_str.as_bytes());
// println!("{:#?}", map);
eprintln!("First part solution = {}", map.solve((3,1)));
let sols: i64 = vec![
(1, 1),
(3, 1),
(5, 1),
(7, 1),
(1, 2),
].iter().map(|slope| map.solve(*slope)).product();
println!("Second part solution = {}", sols);
}

View File

@@ -0,0 +1,54 @@
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_vec2_from_tuple() {
// let v: Vec2 = (32, 75).into();
let v = Vec2::from((32, 75));
assert_eq!(v, Vec2 {x: 32, y: 75})
}
#[test]
fn test_format_map() {
let m = Map{
size: Vec2{x: 2, y:2},
tiles: vec!(Terrain::Tree, Terrain::Plain, Terrain::Plain, Terrain::Plain)
};
assert_eq!(format!("{:?}", m), "#.\n..\n")
}
#[test]
fn test_normalize_pos() {
let m = Map::new((2, 2).into());
assert_eq!(m.normalize_pos((0, 0).into()), Some((0, 0).into()));
assert_eq!(m.normalize_pos((1, 0).into()), Some((1, 0).into()));
assert_eq!(m.normalize_pos((2, 0).into()), Some((0, 0).into()));
assert_eq!(m.normalize_pos((-1, 0).into()), Some((1, 0).into()));
assert_eq!(m.normalize_pos((-2, 0).into()), Some((0, 0).into()));
assert_eq!(m.normalize_pos((0, -1).into()), None);
assert_eq!(m.normalize_pos((0, 2).into()), None);
}
#[test]
fn test_index() {
let m = Map::new((3, 5).into());
assert_eq!(m.index((0, 0).into()), Some(0));
assert_eq!(m.index((2, 0).into()), Some(2));
assert_eq!(m.index((0, 1).into()), Some(3));
assert_eq!(m.index((2, 1).into()), Some(5));
}
#[test]
fn test_create_map() {
let mut map = Map::new(Vec2{x:5,y:5});
let trees: Vec<Vec2> = vec![
(1,2).into(),
(2,1).into(),
(3,3).into(),
(1,4).into(),
(5,1).into(),
];
trees.iter().for_each(|pos| map.set(*pos, Terrain::Tree));
println!("{:?}", map)
}
}