main
henine 4 years ago
parent 0b4d7cde39
commit cfc301b866

@ -0,0 +1,9 @@
[package]
name = "day12"
version = "0.1.0"
authors = ["henine <why@no.com>"]
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]

@ -0,0 +1,779 @@
E1
S4
W5
N5
W2
L90
E5
R90
F73
E1
N3
E5
R180
E1
F26
N5
W5
R180
E5
F50
E4
F63
S2
F24
R90
E2
L90
N2
F94
S4
F70
N3
F60
L90
W5
R90
E2
R90
F38
R180
S3
L90
R90
S1
L180
W3
F23
N4
R90
N1
E3
S3
F26
S5
E1
E2
S3
E5
N2
E2
L90
F9
S4
F77
F70
F92
N1
W4
R90
S3
F56
N2
F21
R90
E5
W5
F87
E1
L90
N3
W4
N4
F86
L90
W2
E2
F94
S1
E5
L90
W5
N4
W4
S2
W4
L180
F29
R180
E2
F12
S3
W4
F48
L90
W4
L90
F69
N1
F51
L270
F62
W2
R90
W2
F5
L90
F62
E3
N3
W5
R90
E3
L90
F6
E1
W5
F72
R180
E5
L180
F38
E1
N5
R90
F98
N4
F69
W3
R270
N4
F53
E3
N5
R180
F2
R90
L90
F38
N3
E1
F100
E3
L90
N5
F74
F38
W2
F8
N4
E3
F84
L270
S1
F38
S3
F92
L90
F12
S3
F83
E5
R90
E1
N3
F70
N4
F47
N5
L90
F29
R90
S2
W5
F20
R90
E3
F58
N2
E1
F2
R90
E5
F9
E3
L180
E4
F11
E5
L90
F64
W1
F13
R90
W4
R90
N1
E3
F29
S5
W3
N3
W3
L90
F100
E2
F93
R90
F34
N1
F51
R90
E2
R90
W4
L90
E3
R180
W1
W4
S2
F88
S3
W3
N4
E5
S4
E2
F80
R90
S5
R90
F46
E1
N2
L90
F52
F92
W4
R90
S5
F21
N2
F37
S1
L180
N4
E1
L90
F17
L90
F95
E5
R180
W2
L90
W4
R180
S2
W1
E2
N2
F88
E3
R180
W4
L180
E2
S2
R90
S5
L90
S1
L90
N4
W4
F52
S5
F23
W2
R90
F100
W1
N3
L90
E1
F8
L90
F97
N1
F46
N3
F10
W3
R180
N5
L90
F85
N5
L90
E1
F29
L90
E3
W3
S5
L270
W1
N3
E3
F87
R180
F15
S1
R180
N1
F37
E3
R90
E1
N3
L90
F73
R90
F15
F6
L180
S5
F8
S2
R90
W3
N1
L180
F87
N4
R180
N5
L90
W3
N5
R90
E4
F35
E1
L90
S1
E1
F58
E1
W3
S1
L270
F65
W3
F27
S2
F68
R90
E5
F80
R90
W5
R180
S5
L90
W1
F63
E2
R270
S2
R90
L90
E4
R90
S3
R270
L180
F78
W4
R90
W1
F33
N1
F1
F79
R90
W5
S5
N3
L270
E1
R180
S1
N1
W2
R90
S4
R270
F49
F39
E2
F6
N5
R90
N2
E3
L90
F30
L180
W2
L90
F39
L270
S3
F89
N2
R90
S5
F95
W2
L90
S2
L180
S3
F74
L90
S2
W1
S3
E1
R90
S5
L180
N3
L90
F52
W1
L90
F79
N4
F19
R180
E3
R270
F52
L180
E5
R270
E5
N3
W4
F57
S5
R180
N2
L180
W4
L90
W4
L90
F98
S4
E3
F22
N3
W5
F9
E3
F25
R180
F76
N1
F39
R90
F81
N5
F73
W2
F80
N3
R90
W3
F63
R270
E1
R90
W2
L90
S5
R90
F5
N1
F98
F20
E4
L90
F69
S3
L180
L90
F99
L90
F52
L90
F29
E5
N4
R180
R90
E2
R90
S5
E3
L270
F77
E2
F8
W1
N4
F38
S4
W4
S3
L90
E3
N4
R90
F99
S3
E2
F80
N5
F43
N3
F99
L90
S4
F66
L90
L90
N2
F80
N3
F86
S4
R270
S3
E4
F83
E2
R90
F26
E3
N5
E2
S4
F60
E5
S3
R90
W4
S5
E2
R90
F67
N1
E3
N2
L90
E4
L90
W5
E1
R90
S2
W1
N1
F39
F23
F64
R180
F82
S4
W1
F18
F57
W5
F55
L90
N5
L90
W2
L90
F12
E4
R90
W4
F37
W3
F72
R90
N5
R90
F95
W3
L180
F6
W5
F67
R90
F60
R90
F77
E4
R180
F81
E1
F39
E2
N2
F95
N5
F69
L90
N3
R90
S1
F11
N1
L180
E2
F47
W2
L90
N2
W3
N2
R180
F20
L90
F17
S3
E4
L270
W4
S2
L180
W1
S1
R180
N1
W4
N3
L180
N4
F30
E5
R90
S2
F62
L90
E5
F17
L90
W2
R180
E5
S2
F8
R180
S5
F56
S1
E3
F91
L90
E1
R90
S3
R90
E3
R90
S1
E2
F56
E5
L90
S4
F44
S2
L90
F38
E3
S5
E5
S5
W3
N1
R90
N5
F82
W2
S3
R90
E4
R90
E5
E1
F64
N2
L180
S1
E2
N4
L90
F7
R180
S3
F79
W4
S2
L180
E5
R180
N1
L90
E2
R90
F92
S4
F42
E4
R180
W3
R90
N3
F9
L90
W5
F4
R90
S4
F39
N3
F78
E5
N2
F79
S3
R90
N2
F2
S1
F94
N2
W2
F17
R90
W1
S3
E2
F83
L180
W2
N3
R270
N5
W4
F40

@ -0,0 +1,135 @@
use std::fs::File;
use std::io::{BufRead, BufReader};
// use crate::Direction::{North, East, West, South};
use crate::Command::{N, R, L, W, S, E, F};
// #[derive(Copy, Clone, Debug)]
// enum Direction {
// East(i32),
// North(i32),
// West(i32),
// South(i32),
// }
// impl Direction {
// fn turn(&self, degrees: i32) -> Direction {
// match self {
// East(d) => Direction::new((d + degrees + 360) % 360),
// North(d) => Direction::new((d + degrees + 360) % 360),
// West(d) => Direction::new((d + degrees + 360) % 360),
// South(d) => Direction::new((d + degrees + 360) % 360),
// }
// }
//
// fn new(degrees: i32) -> Direction {
// match degrees {
// 0 => East(0),
// 90 => North(90),
// 180 => West(180),
// 270 => South(270),
// n => panic!(n)
// }
// }
// }
#[derive(Copy, Clone, Debug)]
struct Ship {
// direction: Direction,
v: Velocity,
x: i32,
y: i32,
}
impl Ship {
fn new() -> Self {
Self {
// direction: Direction::new(0),
v: Velocity::new(),
x: 0,
y: 0,
}
}
}
#[derive(Copy, Clone, Debug)]
struct Velocity {
x: i32,
y: i32,
}
impl Velocity {
fn new() -> Self {
Velocity { x: 10, y: 1 }
}
fn rotate(self, angle: i32) -> Velocity {
match angle {
0 => self,
90 => Velocity { x: -self.y, y: self.x },
180 => Velocity { x: -self.x, y: -self.y },
270 => Velocity { x: self.y, y: -self.x },
// -0 => self,
-90 => Velocity { x: self.y, y: -self.x },
-180 => Velocity { x: -self.x, y: -self.y },
-270 => Velocity { x: -self.y, y: self.x },
n => panic!(n)
}
}
}
enum Command {
N(i32),
S(i32),
E(i32),
W(i32),
L(i32),
R(i32),
F(i32),
}
impl Command {
fn parse(command: String) -> Self {
match &command[0..1] {
"N" => N(command[1..command.len()].parse::<i32>().unwrap()),
"S" => S(command[1..command.len()].parse::<i32>().unwrap()),
"E" => E(command[1..command.len()].parse::<i32>().unwrap()),
"W" => W(command[1..command.len()].parse::<i32>().unwrap()),
"L" => L(command[1..command.len()].parse::<i32>().unwrap()),
"R" => R(command[1..command.len()].parse::<i32>().unwrap()),
"F" => F(command[1..command.len()].parse::<i32>().unwrap()),
e => panic!(e.to_string())
}
}
fn execute(&self, ship: Ship) -> Ship {
match self {
N(dist) => Ship { v: Velocity { x: ship.v.x, y: ship.v.y + dist }, x: ship.x, y: ship.y },
S(dist) => Ship { v: Velocity { x: ship.v.x, y: ship.v.y - dist }, x: ship.x, y: ship.y },
E(dist) => Ship { v: Velocity { x: ship.v.x + dist, y: ship.v.y }, x: ship.x, y: ship.y },
W(dist) => Ship { v: Velocity { x: ship.v.x - dist, y: ship.v.y }, x: ship.x, y: ship.y },
L(angle) => Ship { v: ship.v.rotate(*angle), x: ship.x, y: ship.y },
R(angle) => Ship { v: ship.v.rotate(-*angle), x: ship.x, y: ship.y },
F(dist) => Ship { v: ship.v, x: ship.x + dist * ship.v.x, y: ship.y + dist * ship.v.y }
}
}
}
fn main() {
let file = File::open("input").unwrap();
let input_buffer = BufReader::new(&file);
let lines = input_buffer.lines();
let final_position: Ship = lines
.map(Result::unwrap)
.map(|x: String| x.trim().to_string())
.map(Command::parse)
.fold(Ship::new(), |ship, command| {
println!("{:?}", ship);
command.execute(ship)
});
println!("{:?}", final_position);
println!("{}", final_position.x.abs() + final_position.y.abs())
}

@ -0,0 +1,5 @@
F10
N3
F7
R90
F11
Loading…
Cancel
Save