solution: day 1, primitive
This commit is contained in:
parent
6368f3a66e
commit
3070407092
1
in/1.txt
Normal file
1
in/1.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
L1, L3, L5, L3, R1, L4, L5, R1, R3, L5, R1, L3, L2, L3, R2, R2, L3, L3, R1, L2, R1, L3, L2, R4, R2, L5, R4, L5, R4, L2, R3, L2, R4, R1, L5, L4, R1, L2, R3, R1, R2, L4, R1, L2, R3, L2, L3, R5, L192, R4, L5, R4, L1, R4, L4, R2, L5, R45, L2, L5, R4, R5, L3, R5, R77, R2, R5, L5, R1, R4, L4, L4, R2, L4, L1, R191, R1, L1, L2, L2, L4, L3, R1, L3, R1, R5, R3, L1, L4, L2, L3, L1, L1, R5, L4, R1, L3, R1, L2, R1, R4, R5, L4, L2, R4, R5, L1, L2, R3, L4, R2, R2, R3, L2, L3, L5, R3, R1, L4, L3, R4, R2, R2, R2, R1, L4, R4, R1, R2, R1, L2, L2, R4, L1, L2, R3, L3, L5, L4, R4, L3, L1, L5, L3, L5, R5, L5, L4, L2, R1, L2, L4, L2, L4, L1, R4, R4, R5, R1, L4, R2, L4, L2, L4, R2, L4, L1, L2, R1, R4, R3, R2, R2, R5, L1, L2
|
||||||
23
src/days.rs
23
src/days.rs
@ -1 +1,24 @@
|
|||||||
pub mod d1;
|
pub mod d1;
|
||||||
|
// pub mod d2;
|
||||||
|
// pub mod d3;
|
||||||
|
// pub mod d4;
|
||||||
|
// pub mod d5;
|
||||||
|
// pub mod d6;
|
||||||
|
// pub mod d7;
|
||||||
|
// pub mod d8;
|
||||||
|
// pub mod d9;
|
||||||
|
// pub mod d10;
|
||||||
|
// pub mod d11;
|
||||||
|
// pub mod d12;
|
||||||
|
// pub mod d13;
|
||||||
|
// pub mod d14;
|
||||||
|
// pub mod d15;
|
||||||
|
// pub mod d16;
|
||||||
|
// pub mod d17;
|
||||||
|
// pub mod d18;
|
||||||
|
// pub mod d19;
|
||||||
|
// pub mod d20;
|
||||||
|
// pub mod d21;
|
||||||
|
// pub mod d22;
|
||||||
|
// pub mod d23;
|
||||||
|
// pub mod d24;
|
||||||
|
|||||||
@ -1,18 +1,72 @@
|
|||||||
use crate::prelude::*;
|
use crate::prelude::*;
|
||||||
|
|
||||||
pub type I = String;
|
pub type I = Vec<u16>;
|
||||||
pub type O = i64;
|
pub type O = u64;
|
||||||
|
|
||||||
fn solve (data: I) -> O {
|
fn _parse (data: &str) -> I {
|
||||||
0
|
data.split(", ").map(|e| {
|
||||||
|
let dir = e.chars().next().unwrap();
|
||||||
|
let turn: u16 = if dir == 'L' { 1 << 15 } else { 0 };
|
||||||
|
|
||||||
|
let distance = &e[1..].trim().parse().unwrap();
|
||||||
|
|
||||||
|
distance | turn
|
||||||
|
}).collect_vec()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn silver (data: I) -> O {
|
|
||||||
0
|
fn _silver (data: &I) -> O {
|
||||||
|
let mut d = 0;
|
||||||
|
let mut x: i32 = 0;
|
||||||
|
let mut y: i32 = 0;
|
||||||
|
|
||||||
|
for i in data {
|
||||||
|
let direction = i & (1 << 15);
|
||||||
|
let steps = (i & !(1 << 15)) as i32;
|
||||||
|
d = (d + if direction > 0 { 3 } else { 1 }) % 4;
|
||||||
|
|
||||||
|
match d {
|
||||||
|
0 => y -= steps,
|
||||||
|
1 => x += steps,
|
||||||
|
2 => y += steps,
|
||||||
|
3 => x -= steps,
|
||||||
|
_ => panic!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
(x.abs() + y.abs()) as u64
|
||||||
}
|
}
|
||||||
|
|
||||||
fn gold (data: I) -> O {
|
fn _gold (data: &I) -> O {
|
||||||
0
|
let mut d = 0;
|
||||||
|
let mut x: i32 = 0;
|
||||||
|
let mut y: i32 = 0;
|
||||||
|
|
||||||
|
let mut s = S::new();
|
||||||
|
|
||||||
|
for i in data {
|
||||||
|
let direction = i & (1 << 15);
|
||||||
|
let steps = (i & !(1 << 15)) as i32;
|
||||||
|
d = (d + if direction > 0 { 3 } else { 1 }) % 4;
|
||||||
|
|
||||||
|
for _ in 0..steps {
|
||||||
|
match d {
|
||||||
|
0 => y -= 1,
|
||||||
|
1 => x += 1,
|
||||||
|
2 => y += 1,
|
||||||
|
3 => x -= 1,
|
||||||
|
_ => unreachable!()
|
||||||
|
}
|
||||||
|
if !s.insert((x, y)) {
|
||||||
|
return (x.abs() + y.abs()) as u64
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
(x.abs() + y.abs()) as u64
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
@ -20,16 +74,30 @@ mod test {
|
|||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
fn read () -> I {
|
fn read () -> I {
|
||||||
Default::default()
|
let file = inc!(1);
|
||||||
|
_parse(file)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn example () {
|
||||||
|
let data = _parse("R8, R4, R4, R8");
|
||||||
|
|
||||||
|
assert_eq!(_gold(&data), 4)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn silver () {
|
fn silver () {
|
||||||
|
let data = read();
|
||||||
|
let ans = _silver(&data);
|
||||||
|
|
||||||
|
assert_eq!(ans, 299)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn gold () {
|
fn gold () {
|
||||||
|
let data = read();
|
||||||
|
let ans = _gold(&data);
|
||||||
|
|
||||||
|
assert_eq!(ans, 181)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
35
src/days/template.rs
Normal file
35
src/days/template.rs
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
use crate::prelude::*;
|
||||||
|
|
||||||
|
pub type I = String;
|
||||||
|
pub type O = i64;
|
||||||
|
|
||||||
|
fn solve (data: I) -> O {
|
||||||
|
0
|
||||||
|
}
|
||||||
|
|
||||||
|
fn silver (data: I) -> O {
|
||||||
|
0
|
||||||
|
}
|
||||||
|
|
||||||
|
fn gold (data: I) -> O {
|
||||||
|
0
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod test {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
fn read () -> I {
|
||||||
|
Default::default()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn silver () {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn gold () {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,3 +1,6 @@
|
|||||||
|
#![feature(let_chains)]
|
||||||
|
#![feature(decl_macro)]
|
||||||
|
|
||||||
pub mod days;
|
pub mod days;
|
||||||
pub mod utils;
|
pub mod utils;
|
||||||
pub mod prelude;
|
pub mod prelude;
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
pub use crate::utils::*;
|
pub use crate::utils::*;
|
||||||
pub use anyhow::Error;
|
pub use anyhow::Error;
|
||||||
pub use itertools::Itertools;
|
pub use itertools::Itertools;
|
||||||
|
pub use std::collections::{ HashMap as M, HashSet as S };
|
||||||
|
|||||||
@ -0,0 +1,5 @@
|
|||||||
|
pub macro inc {
|
||||||
|
($d: literal) => {
|
||||||
|
include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/in/", $d, ".txt"))
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user