Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

57 changes: 57 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ version = "0.1.0"
authors = []

[dependencies]
itertools = "0.8"

[[bin]]
name = "day-01-part-1-evqna"
Expand Down Expand Up @@ -69,6 +70,62 @@ path = "./day-07/part-1/atauveron.rs"
name = "day-07-part-2-atauveron"
path = "./day-07/part-2/atauveron.rs"

[[bin]]
name = "day-03-part-1-evqna"
path = "./day-03/part-1/evqna.rs"

[[bin]]
name = "day-03-part-2-evqna"
path = "./day-03/part-2/evqna.rs"

[[bin]]
name = "day-04-part-1-evqna"
path = "./day-04/part-1/evqna.rs"

[[bin]]
name = "day-04-part-2-evqna"
path = "./day-04/part-2/evqna.rs"

[[bin]]
name = "day-05-part-1-evqna"
path = "./day-05/part-1/evqna.rs"

[[bin]]
name = "day-05-part-2-evqna"
path = "./day-05/part-2/evqna.rs"

[[bin]]
name = "day-06-part-1-evqna"
path = "./day-06/part-1/evqna.rs"

[[bin]]
name = "day-06-part-2-evqna"
path = "./day-06/part-2/evqna.rs"

[[bin]]
name = "day-07-part-1-evqna"
path = "./day-07/part-1/evqna.rs"

[[bin]]
name = "day-07-part-2-evqna"
path = "./day-07/part-2/evqna.rs"

[[bin]]
name = "day-08-part-1-evqna"
path = "./day-08/part-1/evqna.rs"

[[bin]]
name = "day-08-part-2-evqna"
path = "./day-08/part-2/evqna.rs"

[[bin]]
name = "day-09-part-1-evqna"
path = "./day-09/part-1/evqna.rs"

[[bin]]
name = "day-09-part-2-evqna"
path = "./day-09/part-2/evqna.rs"

[[bin]]
name = "day-08-part-1-atauveron"
path = "./day-08/part-1/atauveron.rs"
Expand Down
7 changes: 3 additions & 4 deletions day-01/part-1/evqna.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,18 @@ use std::env::args;
use std::time::Instant;

fn main() {
let input = args().nth(1).expect("Please provide an input");
let now = Instant::now();
let output = run(&input);
let output = run(&args().nth(1).expect("Please provide an input"));
let elapsed = now.elapsed();
println!("_duration:{}", elapsed.as_secs_f64() * 1000.);
println!("{}", output);
}

fn run(input: &str) -> isize {
fn run(input: &str) -> usize {
input
.split_whitespace()
.map(|w| {
let mass = w.parse().unwrap_or(0);
let mass: usize = w.parse().unwrap();
mass / 3 - 2
})
.sum()
Expand Down
16 changes: 10 additions & 6 deletions day-01/part-2/evqna.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,14 @@ use std::env::args;
use std::time::Instant;

fn main() {
let input = args().nth(1).expect("Please provide an input");
let now = Instant::now();
let output = run(&input);
let output = run(&args().nth(1).expect("Please provide an input"));
let elapsed = now.elapsed();
println!("_duration:{}", elapsed.as_secs_f64() * 1000.);
println!("{}", output);
}

fn fuel_requirement(mut mass: i32) -> i32 {
fn fuel_requirement(mut mass: isize) -> isize {
let mut total_fuel = 0;
loop {
let extra_fuel = mass / 3 - 2;
Expand All @@ -22,9 +21,14 @@ fn fuel_requirement(mut mass: i32) -> i32 {
}
}

fn run(input: &str) -> i32 {
let modules = input.split_whitespace().map(|l| l.parse().unwrap_or(0));
modules.map(fuel_requirement).sum()
fn run(input: &str) -> isize {
input
.split_whitespace()
.map(|w| {
let mass: isize = w.parse().unwrap();
fuel_requirement(mass)
})
.sum()
}

#[cfg(test)]
Expand Down
23 changes: 6 additions & 17 deletions day-02/part-1/evqna.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ fn main() {
println!("{}", output);
}

fn run_program(mem: &mut Vec<usize>) -> usize {
fn run_program(mem: &mut Vec<usize>) {
let mut ip = 0;
loop {
let op = mem[ip];
Expand All @@ -24,29 +24,18 @@ fn run_program(mem: &mut Vec<usize>) -> usize {
mem[c] = mem[a] * mem[b];
}
ip += 4;
};

mem[0]
}
}

fn run(input: &str) -> i32 {
fn run(input: &str) -> usize {
let mut mem: Vec<usize> = input
.split(',')
.map(|n| n.parse().unwrap_or(0))
.map(|n| n.parse().unwrap())
.collect();

mem[1] = 12;
mem[2] = 02;

run_program(&mut mem) as i32
run_program(&mut mem);
mem[0]
}

// #[cfg(test)]
// mod tests {
// use super::*;

// #[test]
// fn run_test() {
// assert_eq!(run("1,1,1,4,99,5,6,0,99"), 30)
// }
// }
23 changes: 6 additions & 17 deletions day-02/part-2/evqna.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ fn main() {
println!("{}", output);
}

fn run_program(arr: &Vec<usize>, noun: usize, verb: usize) -> usize {
let mut mem = arr.clone();
fn run_program(program: &Vec<usize>, noun: usize, verb: usize) -> usize {
let mut mem = program.clone();
mem[1] = noun;
mem[2] = verb;

Expand All @@ -33,29 +33,18 @@ fn run_program(arr: &Vec<usize>, noun: usize, verb: usize) -> usize {
mem[0]
}

fn run(input: &str) -> i32 {
fn run(input: &str) -> usize {
let mem: Vec<usize> = input
.split(',')
.map(|n| n.parse().unwrap_or(0))
.map(|n| n.parse().unwrap())
.collect();

for noun in 0..100 {
for verb in 0..100 {
if run_program(&mem, noun, verb) == 19690720 {
return (100 * noun + verb) as i32
return 100 * noun + verb
}
}
}

0
panic!("No match found");
}

// #[cfg(test)]
// mod tests {
// use super::*;

// #[test]
// fn run_test() {
// assert_eq!(run("1,1,1,4,99,5,6,0,99"), 30)
// }
// }
2 changes: 2 additions & 0 deletions day-03/input/evqna.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
R999,D666,L86,U464,R755,U652,R883,D287,L244,U308,L965,U629,R813,U985,R620,D153,L655,D110,R163,D81,L909,D108,L673,D165,L620,U901,R601,D561,L490,D21,R223,U478,R80,U379,R873,U61,L674,D732,R270,U297,L354,U264,L615,D2,R51,D582,R280,U173,R624,U644,R451,D97,R209,U245,R32,U185,R948,D947,R380,D945,L720,U305,R911,U614,L419,D751,L934,U371,R291,D166,L137,D958,R368,U441,R720,U822,R961,D32,R242,D972,L782,D166,L680,U111,R379,D155,R213,U573,R761,D543,R762,U953,R317,U841,L38,U900,R573,U766,R807,U950,R945,D705,R572,D994,L633,U33,L173,U482,R253,D835,R800,U201,L167,U97,R375,D813,L468,D924,L972,U570,R975,D898,L195,U757,L565,D378,R935,U4,L334,D707,R958,U742,R507,U892,R174,D565,L862,D311,L770,D619,L319,D698,L169,D652,L761,D644,R837,U43,L197,D11,L282,D345,L551,U460,R90,D388,R911,U602,L21,D275,L763,U880,R604,D838,R146,U993,L99,U99,R928,U54,L148,D863,R618,U449,R549,D659,R449,D435,L978,D612,L645,D691,R190,D434,L841,D364,L634,D590,R962,U15,R921,D442,L284,U874,R475,D556,L135,U376,L459,D673,L515,U438,L736,U266,L601,U351,R496,U891,L893,D597,L135,D966,R121,U763,R46,D110,R830,U644,L932,D122,L123,U145,R273,U690,L443,D372,R818,D259,L695,U69,R73,D718,R106,U929,L346,D291,L857,D341,R297,D823,R819,U496,L958,U394,R102,D763,L444,D835,L33,U45,R812,U845,R196,U458,R231,U637,R661,D983,L941,U975,L353,U609,L698,U152,R122,D882,R682,D926,R729,U429,R255,D227,R987,D547,L446,U217,R678,D464,R849,D472,L406,U940,L271,D779,R980,D751,L171,D420,L49,D271,R430,D530,R509,U479,R135,D770,R85,U815,R328,U234,R83
L1008,D951,L618,U727,L638,D21,R804,D19,L246,U356,L51,U8,L627,U229,R719,D198,L342,U240,L738,D393,L529,D22,R648,D716,L485,U972,L580,U884,R612,D211,L695,U731,R883,U470,R732,U723,R545,D944,R18,U554,L874,D112,R782,D418,R638,D296,L123,U426,L479,U746,L209,D328,L121,D496,L172,D228,L703,D389,R919,U976,R364,D468,L234,U318,R912,U236,R148,U21,R26,D116,L269,D913,L949,D206,L348,U496,R208,U706,R450,U472,R637,U884,L8,U82,L77,D737,L677,D358,L351,U719,R154,U339,L506,U76,L952,D791,L64,U879,R332,D244,R638,D453,L107,D908,L58,D188,R440,D147,R913,U298,L681,D582,L943,U503,L6,U459,L289,D131,L739,D443,R333,D138,R553,D73,L475,U930,L332,U518,R614,D553,L515,U602,R342,U95,R131,D98,R351,U921,L141,U207,R199,U765,R55,U623,R768,D620,L722,U31,L891,D862,R85,U271,R590,D184,R960,U149,L985,U82,R591,D384,R942,D670,R584,D637,L548,U844,R353,U496,L504,U3,L830,U239,R246,U279,L146,U965,R784,U448,R60,D903,R490,D831,L537,U109,R271,U306,L342,D99,L234,D936,R621,U870,R56,D29,R366,D562,R276,D134,L289,D425,R597,D102,R276,D600,R1,U322,L526,D744,L259,D111,R994,D581,L973,D871,R173,D924,R294,U478,R384,D242,R606,U629,R472,D651,R526,U55,R885,U637,R186,U299,R812,D95,R390,D689,R514,U483,R471,D591,L610,D955,L599,D674,R766,U834,L417,U625,R903,U376,R991,U175,R477,U524,L453,D407,R72,D217,L968,D892,L806,D589,R603,U938,L942,D940,R578,U820,L888,U232,L740,D348,R445,U269,L170,U979,L159,U433,L31,D818,L914,U600,L33,U159,R974,D983,L922,U807,R682,U525,L234,U624,L973,U123,L875,D64,L579,U885,L911,D578,R17,D293,L211
120 changes: 120 additions & 0 deletions day-03/part-1/evqna.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
use std::env::args;
use std::time::Instant;

extern crate itertools;
use itertools::Itertools;
use std::cmp;

fn main() {
let now = Instant::now();
let output = run(&args().nth(1).expect("Please provide an input"));
let elapsed = now.elapsed();
println!("_duration:{}", elapsed.as_secs_f64() * 1000.);
println!("{}", output);
}

type Coords = Vec<(isize, isize)>;

fn manhattan_norm(x: (isize, isize)) -> isize {
x.0.abs() + x.1.abs()
}

fn run(input: &str) -> isize {
let wires: Vec<Vec<&str>> = input
.split_whitespace()
.map(|w| w.split(',').collect())
.collect();

let turns_A = build_turns(&wires[0]);
let turns_B = build_turns(&wires[1]);
let mut intersections = build_intersections(&turns_A, &turns_B);
intersections.sort_by_key(|x| manhattan_norm(*x));
manhattan_norm(intersections[1]) // Skip the origin
}

fn build_turns(wire: &Vec<&str>) -> Coords {
let mut pos = (0, 0);
let mut turn_coords = vec![pos];

for segment in wire {
let direction = segment.chars().next().unwrap();
let length: isize = segment[1..].parse().unwrap();
match direction {
'L' => pos.0 -= length,
'R' => pos.0 += length,
'U' => pos.1 += length,
'D' => pos.1 -= length,
_ => println!("Wrong direction"),
}
turn_coords.push(pos);
}

turn_coords
}

// Computes intersection [x, y] of segments [a, b] and [c, d] in 1D
// Input segments must be sorted (a <= b and c <= d)
// If intersection is empty result will have x > y
fn segment_overlap(a: isize, b:isize, c:isize, d:isize) -> (isize, isize) {
(cmp::max(a, c), cmp::min(b, d))
}

fn build_intersections(turns_A: &Coords, turns_B: &Coords) -> Coords {
let mut intersections: Coords = Vec::new();
// Du sale
for (a, b) in turns_A.iter().tuple_windows() {
// Reorder segments for easier comparisons
let (a, b) = if a.0 <= b.0 && a.1 <= b.1 { (a,b) } else { (b,a) };
for (c, d) in turns_B.iter().tuple_windows() {
if a.0 == b.0 {
let x_1 = a.0;
if c.1 == d.1 {
let y_2 = c.1;
let (c, d) = if c.0 <= d.0 { (c,d) } else { (d,c) };
if (a.1 <= y_2 && y_2 <= b.1) && (c.0 <= x_1 && x_1 <= d.0) {
intersections.push((x_1, y_2));
}
}
else if c.0 == x_1 {
let (c, d) = if c.1 <= d.1 { (c,d) } else { (d,c) };
let (y_min, y_max) = segment_overlap(a.1, b.1, c.1, d.1);
for y in y_min..y_max+1 {
intersections.push((x_1, y));
}
}
}
else if a.1 == b.1 {
let y_1 = a.1;
if c.0 == d.0 {
let x_2 = c.0;
let (c, d) = if c.1 <= d.1 { (c,d) } else { (d,c) };
if (a.0 <= x_2 && x_2 <= b.0) && (c.1 <= y_1 && y_1 <= d.1) {
intersections.push((x_2, y_1));
}
}
else if c.1 == y_1 {
let (c, d) = if c.0 <= d.0 { (c,d) } else { (d,c) };
let (x_min, x_max) = segment_overlap(a.0, b.0, c.0, d.0);
for x in x_min..x_max+1 {
intersections.push((x, y_1));
}
}
}
}
}
intersections
}

#[cfg(test)]
mod tests {
use super::*;

#[test]
fn run_test() {
assert_eq!(run("R8,U5,L5,D3\nU7,R6,D4,L4\n"), 6);
assert_eq!(run("R75,D30,R83,U83,L12,D49,R71,U7,L72\n
U62,R66,U55,R34,D71,R55,D58,R83\n"), 159);
assert_eq!(run("R98,U47,R26,D63,R33,U87,L62,D20,R33,U53,R51\n
U98,R91,D20,R16,D67,R40,U7,R15,U6,R7\n"), 135);
}
}
Loading