day3: problem 1 solution

This commit is contained in:
Keenan Tims 2023-12-05 16:01:40 -08:00
parent b9247c9eaf
commit 1911614428
No known key found for this signature in database
GPG Key ID: B8FDD4AD6B193F06
4 changed files with 316 additions and 0 deletions

7
3/Cargo.lock generated Normal file
View File

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

8
3/Cargo.toml Normal file
View File

@ -0,0 +1,8 @@
[package]
name = "day3"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]

140
3/input Normal file
View File

@ -0,0 +1,140 @@
........897.......839...........651.399.............236...............................343...986...........308...............................
........*................*404......*............134.....953..508=.....................*....*..........325*..........744......392............
...350..847..403...-..541.....622.................*....................356.......%..95...793....................830...........*.....163.....
.....&.......@...105.............$..745............42...785.............*..443.412............922..............*...........663........*.....
.253....../..........696.............*..................*..............817.$.....................*...........62........................373..
...........244...419....*189....=........*...871.74...797...353.737................227..626.....429.726%...9......*956...803/.......*.......
.793...........=.....-...........119..683.18.*...............@......+.....182..372....$.&...................*..756...............945.610....
....*.........496.....395.....................929.746................76..*.....*..............673-...*.....47........591..271...............
.....964..................241...........*............+.....+....590.......129.6....$.....@...........680....................*...............
..........523*448...........&....136.759.356............789.......*.................367.330..397.............483....354......354...869......
...488................920........*...........................652...802....$.......*............*..............-.....................*.......
..../.........986....*......*....550.995......376...............+......641.....567.315.........887..66...863....552.936..........277........
.................*.800...354.464.......*.533......................20.......704..........918........*.....*...........*....214........&434...
........%.....589...................596..*.......373...-..........*....785.@......941......*....521.......908...897..610....................
........384..........827*101....698......978....*......947.614.571....*..........@.....+...1.......................=......#73...734.........
122%..........*...................*..........993............./.....260.........+.....466...............%........................*...........
...........938.992........246......305...449......335...739................588..681.........920.....164.........................431.........
..558....$........................................@.....*.....................=............-............847.....879..51................624..
.....*.104....*818.......505.785.10...................161....210....................723..........55......*..424..&.....*.........723..*.....
...44......542.....975..................437...............51....*686.....*....../..*.........990*......708.....@....715...&....#.......997..
...............801..@.............-....*.....702....&....*............238.236.706.183..+................................842.545.............
...........202*...................906..204...*...990......212....380%..................208...................66.............................
......./........../....878............................266.......................278...............920...................144.........423.....
....494..*.....976........@.....&.......*287...553-..*.............731...................649..247*........703......@....%....817....*.......
.........856.......592...........708.404............707.......274...*........-............#.....................%.567.........*......431.761
.............663.........974...............%...446.............*............751....793..........811....225.&...48.....860..887..............
................&...........*.......673..536......-.........447.....@...............@...$..................816..........*...................
....822................@....251....$............................413..306.164.............540.....313..476..........@...586./65....840.......
.....*......@.950.....266............$.........1...+...............*..........373..................*.............885.................*......
......157.529....*.........341.....480.............60......765....122...633....+............$182....963.....................587..976.824....
................172............685.....480....#........831*................*......747......................262..................-...........
....*......+438.....@......332./.......=...739..815...............356.....119.273.&.....317*674.......=...*....561..........192..........89.
....867..-........179..............319........../....74@..952*374...*.........*....................125....578...*...........*......652......
..........549.............873.........*...=........*...............695.*.....126.........821.....................697.$......806.52....*54...
....792...........-...646*....770.....163.637....941........884.........744..............................#............800...................
.......*.......181............@.............../........92..#...................518...654.......421*995.310....450...............771.........
...+................./48...........968.........269................904.......=...../.....................................266.....*...........
.211....636.................630.17*.....%581........./843.....%..*.......878...............829.....119.33........211.........247............
.......*......................-...................%..........559..873.............*138.439*....687*..........130....*681....................
....522.................792........896.........471...480*321...................125..............................*...................291.....
........616.......818.....$..858.............................659*826.....109.....................................10.564=.331...156...+......
........*.......@...*..29....*...@......546.............907.............*.....965.......217.808.....802..212...............*................
....607.976..641..852.@...330...158....../.......630........247.......503........$.335+....*.........*..*....618...423&.335...803...........
......=..............................502........#........-..*.....923......664....................421...395.-..................#............
........*.................625....646..@...99............901.59......*.....*..........517.$747.*....................315..............79...922
.....289.789..............%......*.........*......................762....388..189.....*........277.........*222...*.................$.......
.................................738....406.....462...........................*.....915..............505/.......61.....+.......202*......646
..749..............163............................*.....963..........907.......979....................................223..716.....265......
.......&....741............362.......117.......837..96../.................#..............786.256.....942..=970...983........*...............
......133......*486.725.......*....../...............%................930.310...................*733.-.............$.....198.........189....
....................*........256........68.......267...873........418*.....................573.................................219..*.......
......+.....439..525..187........495..............*...=.......923..........327..988..300........447*59..702../..840......40.....*...........
......731....*........*..........*..............547.......453.....6.$.........*.......*................-....447....@.......*.737............
.907#.......375........195.....707..17.................9..........%..119...147..594.22.......81.........................485......446........
.....................................*....#............*.....62...................*...........*....569...935.868....-...............*528....
...#..........209........229.......787.470..............403........892.........816.....923..811...$.........*......104.907.849....*.........
..154.346.....*...361.........................10/...237................-................*.............600..............*.......998.606......
.........%...216..*.......*.........*368.869.........#................6..98...........53.............*.....850@...102...751.................
....550............727...383.....818.....*...913.............879...........*.....420.....150.........708....................................
705*.......@688.......................289.....*.........................431........*...+....*50.....................698...668*144...........
..................501..70.520....$32......562..458....170......279$............504......883............/...44........*......................
..450..107@........*..................586*...........*.........................*....510............788.274............589...-26......&......
...................342.........&.551+.................302...............286.....931....&....-649..$.............575................185...199
............602..............470.........243*......@............818.690*.......................................*....863..793*...............
......934.....*......200.936.....46..........137.72.........377*......................443*372........498....320..#...........553......598...
........-...451./952..*...*....*.......................804..............305......700............675...&.........611.........................
......................393.......708....957........*697......808.....138*.........%......186....*....%...162*...........624........244.%.....
.....220*.........872......*...........*.........7.........................................=..6....391......562...880.....*......#....120...
...+.....608.........*...74.568........193.........379.........$682......933.927&.....&............................./..984..................
93..553........*768.739...........421.........880.....*....737.............*.........69.....................................................
.........334...............................40*........910.................................+465..682.............141*.......248..80..........
.........=..................323...172.............506..............503........568....785+.......%.......940*734.......#573....*...*.....130.
...163@........%17..42..108*.......*...$......700..*..81...../...............+....%.............................#285.........499.523....*...
.............-........*..........305.706.....*....942.....843........*.............378.861.......573.859.173............522............544..
..........974.......517.756..762.............480.....................289................*...........*......*.228%..........*......628.......
....567........&274......+..../..........................................926.............391............214.............270...230..-........
...........=...............52...../......155*150.......180&..*......482..&...884................-125...........................@............
..........332..................318............................123......%......*...............=........................310..................
....................856.154........@............161....192..................=..387.............384..*827................*..&400......588....
.......283.............*....@.......12.....309...*...$...........643.......885..........862................210.......449....................
.......*......937.........98.....&........*....560....884.......$.................866#.../.............622..*..901.............462..........
.....279............273......896..17.661..880...............138...632......66...%.............93......*....349...*........./......=.........
..............430....*....+.....*.....*............350...............*..........226.......621*......312........=..266....574..111...........
..339........../.....770.451....122........990.....................811...780........*448.................325.249...............+...$...441..
......................................$......%...........793..............@..787.766....................................64..+......252.*....
.........556........../.....256/...267...336.....897..........524*417.........................950...930$.452........164......713.......592..
....759....*...........672.................-.868....*....613......................401.....742..*..............560........=.........939......
.....$...780.......195......578...............*...%...+....*.....=.....&.............*......#...645...636.797..........652...........*......
......................*......................77...97.988.821...882...977.......127.609.914...............*..................................
..........+...195&.....930.....872.......................................79..............&.....14...................-.......150..274........
..........473................9*.............951&................./...827*.............46......-...13....751.........640.......*.....*504....
898................-.............56*....378..............291..310..........58............937.....$.......*.../.............840..714.........
............-321.128.157............549..-....130....478*.........*.....................................123...164..............*....631.....
..516..989@..........*.........*670............................204..577.......&817....@514........790...............816.........148.*.......
.....*................233...........*838.....*951.....-954..........$.......&.................110.........99...........*..@187.......671.467
224...205.....552................823......343................490*...........377..................*.......$...........779.......408..........
............./..../.....................................166*..........120...........452.........148...=.......................*.............
.562..............768.........#.267.29...806*......476......214.........*....*......*...............867.211....248.$870....@...829...*......
...*..826@...................1.....*.........251....+.....#...........211.893.403....702.......44.......*........+..........75......977.....
..368.........861$......867....=.......................834.....................................=.........507................................
.......721*............*.......912.#497....................87-.....231...894.......968..........................659$.......@..........564...
...........690.......432....@..................332................*.........*756..*................302..214*.........803..855...............
..................26.......943...........633...*.....299.150....639.................796.....440.............428......+...........538.647....
........31........*............................260.....-................=..261.............*............................644.303..%.....-....
227..........#.161....*....&.....305...............345........328....639...*........$.......802....612.185................%../..............
.......683.953.....224....58.....*.................*....799...............944.964....245.............*.%................@......28.19.242.97.
....93*........../.............908.........$249..480.......*......978..............................58........=209......373.802*.........*...
467...........201..........932.....997......................548................/.....-904.....796.....3+............................915.....
...................#......@.......*......748*965.................922......451..169..............$.945....372#..979........%..436...*........
........&.....880&..789........14.805..............571....222/.....*.70......*........./958..........%.........&.../....61.....*...73.......
.......280.................................=.861......-.........144...........950................%.......907......910.......396.............
.....+.........592*149.820*511...........298....&.......*264..........-..527..............-.....679.......*...............@......50*270.....
...901......=....................@483.............$..936......625%...619....%..........748...............785...860......26..181.........747.
.........85..640...#........=.=.......49.......216.............................268*.............................#...........#.....53....*...
...........+.......744...933...766....*.................%...............*714.......909................................999...........*...311.
.............783....................947.................352...765..............897.....+430..869.................121.%............236.......
...45....*......*..752......617..................332...........*...236...........*..........*....@.528..........&......530..................
..../.134.713.871..*.............*...........#.....%.930...........*....323....377........678.544..*........542.........$.......470.629*786.
..................259...&.....959.225......177.......*.....912*..........$.........................306..996.*....*.........*681...*.........
..........250*768......598.........................850.........598..............3*.........904*648........=.372...197...410......152...=....
............................................507@.......960..............362.164...131...................................................115.
.....746.......117..678=........952...303*.......+......................./..*...........$636../...597......37................351...=........
.......*.281...@...................*......337.258..814...687.....#922.=....772..611.153.......573....*.......*..............*.......518.....
....144.....*.......396...........240................+......*.........45.......+.......*...........479.&293..126.....784-...783.............
...........843...@....*..918*.............................986.....542...................117.....................................578.707.....
..984.............251........258....597$.650.........................*..................................928.409.684...547.......*....%......
....&..489....931...........................$....356........................489..............302...............*............./...259.../996.
......./........*.................................*......385........63*911...*.........%........*578...633.175.........@804..421............
..98...........188..........226....+...............909....*...................535.....798................$....*.796.........................
....*.....%...................+....531...563...........426......617*202.........................929-.......439....%..332.....+.23&.347......
...364..149..............425............*.....662.481.......................788..$844..................506..........@.....693......&........
..........................*....408...772....+.......-.......232*......*......*.............#.+294.....*.....706................435..........
......566*972........631=.425.*...........14............984.....667..7.236....195..9.....222........757......*.....865..604&..*....344.&....
.................439..........710..............477*714..............................*544........368............395*...........435...*..204..
..........229......+..596.179........../................165.542*47........147..............653..*...................466...........119.......
.....690...@............@.......467..626........&......*.................*....=42.....724....+.816....262*.....237.@....549.383.............
......*.........750..............*..............202....967.914......279..................*........./......147.@...............*........480..
...444.......84...#....+..........527......*351..............*......*................225..888.......806.............7......#...518.....*....
.............*........628...............749......*976.200.....852..354...23....=........*...............................138............833..
..........964.................................211...............................578.....986.............879......59.........................

161
3/src/main.rs Normal file
View File

@ -0,0 +1,161 @@
use std::fs::File;
use std::io::{BufRead, BufReader, Lines};
// --- Day 3: Gear Ratios ---
// You and the Elf eventually reach a gondola lift station; he says the gondola lift
// will take you up to the water source, but this is as far as he can bring you. You go
// inside.
// It doesn't take long to find the gondolas, but there seems to be a problem: they're
// not moving.
// "Aaah!"
// You turn around to see a slightly-greasy Elf with a wrench and a look of surprise.
// "Sorry, I wasn't expecting anyone! The gondola lift isn't working right now; it'll
// still be a while before I can fix it." You offer to help.
// The engineer explains that an engine part seems to be missing from the engine, but
// nobody can figure out which one. If you can add up all the part numbers in the engine
// schematic, it should be easy to work out which part is missing.
// The engine schematic (your puzzle input) consists of a visual representation of the
// engine. There are lots of numbers and symbols you don't really understand, but
// apparently any number adjacent to a symbol, even diagonally, is a "part number" and
// should be included in your sum. (Periods (.) do not count as a symbol.)
// Here is an example engine schematic:
// 467..114.. ...*...... ..35..633. ......#... 617*...... .....+.58. ..592.....
// ......755. ...$.*.... .664.598..
// In this schematic, two numbers are not part numbers because they are not adjacent to
// a symbol: 114 (top right) and 58 (middle right). Every other number is adjacent to a
// symbol and so is a part number; their sum is 4361.
// BOILERPLATE
type InputIter = Lines<BufReader<File>>;
fn get_input() -> InputIter {
let f = File::open("input").unwrap();
let br = BufReader::new(f);
br.lines()
}
fn main() {
println!("Problem 1 solution: {}", problem1(get_input()));
println!("Problem 2 solution: {}", problem2(get_input()));
}
// PARSING
// We will store the schematic as a 2D Vector of char
struct Pos(usize, usize);
// Outer Vec holds rows, so addressing is column then row
#[derive(Debug)]
struct SchematicRow(Vec<char>);
#[derive(Debug)]
struct Schematic(Vec<SchematicRow>);
impl From<&str> for SchematicRow {
fn from(s: &str) -> Self {
SchematicRow(s.chars().collect())
}
}
impl From<InputIter> for Schematic {
fn from(input: InputIter) -> Self {
Self(input.map(|line| line.unwrap().as_str().into()).collect())
}
}
const ADJACENCY_OFFSETS: &[(i64, i64)] = &[
(-1, -1),
(0, -1),
(1, -1),
(-1, 0),
(1, 0),
(-1, 1),
(0, 1),
(1, 1),
];
// We assume the schematic is composed of equal length lines
impl Schematic {
fn at(&self, pos: &Pos) -> char {
self.0[pos.1].0[pos.0]
}
fn adjacent_to_symbol(&self, pos: &Pos) -> bool {
ADJACENCY_OFFSETS.iter().any(|(x_ofs, y_ofs)| {
let adj_x = (pos.0 as i64) + x_ofs;
let adj_y = (pos.1 as i64) + y_ofs;
if adj_x < 0
|| adj_x >= self.0[pos.1].0.len() as i64
|| adj_y < 0
|| adj_y >= self.0.len() as i64
{
false
} else {
let adj_c = self.at(&Pos(adj_x as usize, adj_y as usize));
adj_c != '.' && adj_c.is_ascii_punctuation()
}
})
}
}
// PROBLEM 1 solution
// Of course, the actual engine schematic is much larger. What is the sum of all of the
// part numbers in the engine schematic?
fn problem1_all_valid_part_numbers(schematic: &Schematic) -> Vec<u64> {
let mut results = Vec::new();
let mut cur_pos = Pos(0usize, 0usize);
while cur_pos.1 < schematic.0.len() {
while cur_pos.0 < schematic.0[0].0.len() {
let c = schematic.at(&cur_pos);
if c.is_digit(10) {
let mut valid: bool = schematic.adjacent_to_symbol(&cur_pos);
let mut num = c.to_digit(10).unwrap() as u64;
loop {
if cur_pos.0 + 1 >= schematic.0[0].0.len() {
break;
}
cur_pos.0 += 1;
if schematic.at(&cur_pos).is_digit(10) {
num = num * 10 + schematic.at(&cur_pos).to_digit(10).unwrap() as u64;
valid = valid || schematic.adjacent_to_symbol(&cur_pos);
} else {
break;
}
}
if valid {
results.push(num);
}
}
cur_pos.0 += 1;
}
cur_pos.1 += 1;
cur_pos.0 = 0;
}
results
}
fn problem1(input: InputIter) -> u64 {
let schematic: Schematic = input.into();
problem1_all_valid_part_numbers(&schematic).iter().sum()
}
// PROBLEM 2 solution
fn problem2(input: InputIter) -> u64 {
0
}