Compare commits
4 Commits
a6470fe6bb
...
abd869ff05
| Author | SHA1 | Date |
|---|---|---|
|
|
abd869ff05 | 2 years ago |
|
|
8542b88792 | 2 years ago |
|
|
80280f6765 | 2 years ago |
|
|
c603f08c1b | 2 years ago |
@ -0,0 +1 @@
|
||||
/target
|
||||
@ -0,0 +1,7 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "day_5"
|
||||
version = "0.1.0"
|
||||
@ -0,0 +1,8 @@
|
||||
[package]
|
||||
name = "day_5"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
@ -0,0 +1,31 @@
|
||||
|
||||
use std::{env, fs, path::Path};
|
||||
|
||||
fn main()
|
||||
{
|
||||
// let out_dir = env::var("OUT_DIR").unwrap();
|
||||
// let cwd = env::var("CARGO_MANIFEST_DIR").unwrap();
|
||||
// println!("CWD: {}\n", cwd);
|
||||
// let data_dir = cwd + "\\data";
|
||||
// let data_path = Path::new(&data_dir);
|
||||
// println!("Data path: {}", data_path.to_string_lossy());
|
||||
|
||||
// let data_path = Path::new("data/test_input");
|
||||
|
||||
let out_path = format!("target/{}", &env::var("PROFILE").unwrap());
|
||||
let out_path = Path::new(&out_path);
|
||||
//let out_path = Path::new(&out_dir).join(&env::var("PROFILE").unwrap());
|
||||
let out_path_data = out_path.join(Path::new("data"));
|
||||
|
||||
if !out_path_data.exists()
|
||||
{
|
||||
fs::create_dir(&out_path_data).expect(&format!("Could not create data directory at: {}", out_path_data.to_string_lossy()));
|
||||
}
|
||||
|
||||
for file in fs::read_dir("data").unwrap()
|
||||
{
|
||||
let file = file.unwrap();
|
||||
let dest = out_path.join(file.path());
|
||||
fs::copy(file.path(), &dest).expect(&format!("Could not copy file {} to {}", file.path().to_string_lossy(), dest.to_string_lossy()));
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,197 @@
|
||||
seeds: 1972667147 405592018 1450194064 27782252 348350443 61862174 3911195009 181169206 626861593 138786487 2886966111 275299008 825403564 478003391 514585599 6102091 2526020300 15491453 3211013652 546191739
|
||||
|
||||
seed-to-soil map:
|
||||
325190047 421798005 78544109
|
||||
4034765382 1473940091 137996533
|
||||
403734156 658668780 288666603
|
||||
2574766003 2624114227 17352982
|
||||
1931650757 2203381572 98211987
|
||||
4263596455 2843660329 31370841
|
||||
1614547845 2641467209 55121215
|
||||
3441604278 2032673361 170708211
|
||||
692400759 563703672 94965108
|
||||
2992851755 3824700930 114550818
|
||||
3957953582 2540115966 24844899
|
||||
0 500342114 59804107
|
||||
4172761915 2577017231 47096996
|
||||
2029862744 3548344768 52256082
|
||||
2620304610 2875031170 99567251
|
||||
3982798481 3939251748 51966901
|
||||
2325101894 1616388089 203150170
|
||||
3612312489 1611936624 4451465
|
||||
787365867 0 77461445
|
||||
1341614907 4162572181 132395115
|
||||
2542801978 3468402968 31964025
|
||||
223387052 947335383 59156225
|
||||
2297805420 1819538259 27296474
|
||||
2082118826 3991218649 171353532
|
||||
3374211778 3040047171 67392500
|
||||
2592118985 1341614907 28185625
|
||||
2253472358 2495782904 44333062
|
||||
4219858911 3780963386 43737544
|
||||
59804107 560146221 3557451
|
||||
3107402573 3600600850 64973479
|
||||
1669669060 3115086052 235712356
|
||||
2719871861 1369800532 104139559
|
||||
3172376052 2301593559 194189345
|
||||
2980795389 2564960865 12056366
|
||||
1905381416 3350798408 26269341
|
||||
63361558 261772511 160025494
|
||||
2824011420 3377067749 91335219
|
||||
3366565397 3107439671 7646381
|
||||
282543277 77461445 42646770
|
||||
3713793353 2696588424 147071905
|
||||
2528252064 1877585624 14549914
|
||||
3927202691 1846834733 30750891
|
||||
3665815578 3500366993 47977775
|
||||
1474010022 1892135538 140537823
|
||||
3616763954 3665574329 49051624
|
||||
2915346639 2974598421 65448750
|
||||
864827312 120108215 141664296
|
||||
3860865258 3714625953 66337433
|
||||
|
||||
soil-to-fertilizer map:
|
||||
3835605444 4098164436 1662218
|
||||
682286299 0 63480553
|
||||
396476124 2072802434 285810175
|
||||
1644893571 655614677 162631098
|
||||
3625179075 4099826654 40627721
|
||||
1431211762 1859120625 213681809
|
||||
2853687843 4140454375 103601386
|
||||
1390165578 2358612609 41046184
|
||||
2405285827 3959200676 138963760
|
||||
900243562 1478767251 170015757
|
||||
3727732722 3084190064 107872722
|
||||
893948759 1084467374 6294803
|
||||
210337617 818245775 186138507
|
||||
1807524669 63480553 592134124
|
||||
825849944 1090762177 68098815
|
||||
3837267662 3192062786 457699634
|
||||
0 1648783008 210337617
|
||||
3665806796 2405285827 61925926
|
||||
1070259319 1158860992 319906259
|
||||
745766852 1004384282 80083092
|
||||
2957289229 4244055761 50911535
|
||||
2544249587 3649762420 309438256
|
||||
3008200764 2467211753 616978311
|
||||
|
||||
fertilizer-to-water map:
|
||||
1169336944 3024036226 46676171
|
||||
1263157944 1445876546 148868263
|
||||
2080390054 2683279801 65621604
|
||||
949040795 1266013203 61140343
|
||||
2146011658 2793621589 110265098
|
||||
525510412 2618124082 65155719
|
||||
2977122301 3122211455 179751286
|
||||
3885825304 713560214 409141992
|
||||
1081017627 4124851079 88319317
|
||||
590666131 2039951828 38597255
|
||||
3596454634 1981772613 58179215
|
||||
2256276756 2078549083 315165891
|
||||
1639631621 1122702206 143310997
|
||||
2858399301 1327153546 118723000
|
||||
3654633849 3301962741 72039868
|
||||
749412925 3549292249 161128796
|
||||
1412026207 541983534 151190298
|
||||
1054901322 4268850991 26116305
|
||||
1829368778 3374002609 175289640
|
||||
1216013115 2570979253 47144829
|
||||
2806900243 3070712397 51499058
|
||||
1563216505 3760425124 76415116
|
||||
1782942618 3710421045 29953038
|
||||
629263386 2903886687 120149539
|
||||
2060339013 3740374083 20051041
|
||||
3156873587 3836840240 52553243
|
||||
2693038006 4010988842 113862237
|
||||
3726673717 2411827666 159151587
|
||||
2004658418 4213170396 55680595
|
||||
1812895656 525510412 16473122
|
||||
1010181138 2748901405 44720184
|
||||
910541721 693173832 20386382
|
||||
930928103 2393714974 18112692
|
||||
3209426830 1594744809 387027804
|
||||
2571442647 3889393483 121595359
|
||||
|
||||
water-to-light map:
|
||||
555269773 2142838063 230952411
|
||||
2879443939 2889030006 80512763
|
||||
192641991 2686257040 106620606
|
||||
786222184 967781117 56662479
|
||||
3467110983 4162792381 132174915
|
||||
1955778230 0 505352386
|
||||
2461130616 1138855522 99691153
|
||||
1436321461 1403321335 440861327
|
||||
2625559119 1024443596 104825859
|
||||
1255310011 2792877646 96152360
|
||||
1877182788 697994377 78595442
|
||||
3732975066 3467110983 374194949
|
||||
842884663 2373790474 56459390
|
||||
299262597 2430249864 256007176
|
||||
3599285898 3841305932 133689168
|
||||
4107170015 3974995100 187797281
|
||||
0 505352386 192641991
|
||||
1090535351 1238546675 164774660
|
||||
2959956702 1129269455 9586067
|
||||
1351462371 1844182662 84859090
|
||||
2730384978 1929041752 149058961
|
||||
899344053 776589819 191191298
|
||||
2560821769 2078100713 64737350
|
||||
|
||||
light-to-temperature map:
|
||||
4103141199 3912772142 105835099
|
||||
1994281004 833968687 112844016
|
||||
4208976298 1124841590 85990998
|
||||
3756966983 4018607241 111390720
|
||||
3868357703 1907239336 234783496
|
||||
2368591640 1210832588 293667703
|
||||
882426579 2320467318 1111854425
|
||||
3064998388 717457244 33489309
|
||||
3578938096 946812703 178028887
|
||||
2107125020 750946553 83022134
|
||||
3157760738 3432321743 421177358
|
||||
717457244 4129997961 164969335
|
||||
2190147154 2142022832 178444486
|
||||
3098487697 3853499101 59273041
|
||||
2662259343 1504500291 402739045
|
||||
|
||||
temperature-to-humidity map:
|
||||
0 1820412620 129662806
|
||||
613828383 2855382935 55943394
|
||||
4004726464 3519717349 290240832
|
||||
769767991 99996214 1720416406
|
||||
3126066249 3043992795 475724554
|
||||
2490184397 2434241003 421141932
|
||||
129662806 1950075426 484165577
|
||||
689805485 0 79962506
|
||||
669771777 79962506 20033708
|
||||
3601790803 3809958181 402935661
|
||||
3043992795 4212893842 82073454
|
||||
|
||||
humidity-to-location map:
|
||||
1305211417 3371927062 89487200
|
||||
947159122 0 358052295
|
||||
324330151 2021970861 8067408
|
||||
332397559 654359706 174171341
|
||||
506568900 3311893445 60033617
|
||||
11065691 828531047 45586147
|
||||
3556729147 369117986 26689998
|
||||
3583419145 395807984 258551722
|
||||
2356886904 984938593 400606547
|
||||
1394698617 874117194 110821399
|
||||
566602517 3946624826 164852367
|
||||
2998901322 2301963630 256425441
|
||||
0 358052295 11065691
|
||||
3331964991 3087129289 34908052
|
||||
1505520016 2106676497 195287133
|
||||
56651838 2819450976 267678313
|
||||
3366873043 3293025783 18867662
|
||||
3385740705 3122037341 170988442
|
||||
2281795782 2799796942 19654034
|
||||
2301449816 1966533773 55437088
|
||||
3992934054 3677118500 118543139
|
||||
3255326763 2030038269 76638228
|
||||
3849868384 3803559156 143065670
|
||||
2757493451 2558389071 241407871
|
||||
3841970867 3795661639 7897517
|
||||
1700807149 1385545140 580988633
|
||||
731454884 3461414262 215704238
|
||||
@ -0,0 +1,33 @@
|
||||
seeds: 79 14 55 13
|
||||
|
||||
seed-to-soil map:
|
||||
50 98 2
|
||||
52 50 48
|
||||
|
||||
soil-to-fertilizer map:
|
||||
0 15 37
|
||||
37 52 2
|
||||
39 0 15
|
||||
|
||||
fertilizer-to-water map:
|
||||
49 53 8
|
||||
0 11 42
|
||||
42 0 7
|
||||
57 7 4
|
||||
|
||||
water-to-light map:
|
||||
88 18 7
|
||||
18 25 70
|
||||
|
||||
light-to-temperature map:
|
||||
45 77 23
|
||||
81 45 19
|
||||
68 64 13
|
||||
|
||||
temperature-to-humidity map:
|
||||
0 69 1
|
||||
1 0 69
|
||||
|
||||
humidity-to-location map:
|
||||
60 56 37
|
||||
56 93 4
|
||||
@ -0,0 +1,227 @@
|
||||
|
||||
use std::{io::prelude::*, fs::File, path::Path, collections::HashMap };
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
// DATA STRUCTS
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
struct SubMap
|
||||
{
|
||||
destination_start: i64,
|
||||
source_start: i64,
|
||||
length: i64,
|
||||
|
||||
// map: HashMap<i64, i64>
|
||||
}
|
||||
|
||||
impl SubMap
|
||||
{
|
||||
fn new() -> SubMap
|
||||
{
|
||||
SubMap { destination_start: 0, source_start: 0, length: 0 }
|
||||
}
|
||||
|
||||
// fn map_values(&mut self)
|
||||
// {
|
||||
// for i in 0..self.length
|
||||
// {
|
||||
// self.map.insert(self.source_start + i, self.destination_start + i);
|
||||
// }
|
||||
// }
|
||||
|
||||
fn contains_value(&self, val: i64) -> bool
|
||||
{
|
||||
val >= self.source_start && val <= self.source_start + self.length
|
||||
}
|
||||
|
||||
fn map_value(&self, val: i64) -> i64
|
||||
{
|
||||
let distance = val - self.source_start;
|
||||
if distance < 0
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
return self.destination_start + distance;
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
struct Map
|
||||
{
|
||||
name: String,
|
||||
sub_maps: Vec<SubMap>,
|
||||
}
|
||||
|
||||
impl Map
|
||||
{
|
||||
fn new(name: &str) -> Map
|
||||
{
|
||||
Map { name: name.to_string(), sub_maps: Vec::new() }
|
||||
}
|
||||
|
||||
fn map_input(&self, input: i64) -> i64
|
||||
{
|
||||
for sub_map in &self.sub_maps
|
||||
{
|
||||
if sub_map.contains_value(input)
|
||||
{
|
||||
return sub_map.map_value(input);
|
||||
}
|
||||
}
|
||||
|
||||
return input;
|
||||
}
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
// MAIN MAIN MAIN MAIN MAIN
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
fn main()
|
||||
{
|
||||
let input = load_data("data/input");
|
||||
let (seeds, maps) = parse_input(&input);
|
||||
|
||||
// TEST STUFF
|
||||
// println!("SEEDS: {:#?}, MAPS: {:#?}", seeds, maps);
|
||||
|
||||
// let test_1 = maps[0].map_input(99);
|
||||
// let test_2 = maps[0].map_input(53);
|
||||
// let test_3 = maps[0].map_input(47);
|
||||
|
||||
// println!("=========TESTS:\n\tseed-to-soil {} maps to {}\n\n\tseed-to-soil {} maps to {}\n\n\tseed-to-soil {} maps to {}\n",
|
||||
// 99, test_1, 53, test_2, 47, test_3);
|
||||
//
|
||||
|
||||
let location = find_closest_location(&seeds, &maps);
|
||||
println!("Closest location: {}", location);
|
||||
}
|
||||
|
||||
fn find_closest_location(seeds: &Vec<i64>, maps: &Vec<Map>) -> i64
|
||||
{
|
||||
// let mut best_seed = 0;
|
||||
let mut closest_location = i64::MAX;
|
||||
|
||||
for seed in seeds
|
||||
{
|
||||
println!("Checking seed: {}", seed);
|
||||
let location = find_seed_location(*seed, maps);
|
||||
|
||||
if location < closest_location
|
||||
{
|
||||
closest_location = location;
|
||||
// best_seed = *seed;
|
||||
}
|
||||
}
|
||||
|
||||
closest_location
|
||||
}
|
||||
|
||||
fn find_seed_location(seed: i64, maps: &Vec<Map>) -> i64
|
||||
{
|
||||
|
||||
let mut current_value = seed;
|
||||
for map in maps
|
||||
{
|
||||
println!("Mapping {}...", map.name);
|
||||
current_value = map.map_input(current_value);
|
||||
}
|
||||
|
||||
current_value
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
// INPUT PARSING
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
fn parse_input(input: &str) -> (Vec<i64>, Vec<Map>) // String is the map name
|
||||
{
|
||||
let mut seeds: Vec<i64> = Vec::new();
|
||||
|
||||
let mut maps: Vec<Map> = Vec::new();
|
||||
let mut current_map = "";
|
||||
let mut sub_map_idx = 0;
|
||||
for (_, line) in input.to_ascii_lowercase().split("\n").into_iter().enumerate()
|
||||
{
|
||||
// stupid windows dumb line ending non-sense
|
||||
if line.starts_with("\r")
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// SEEDS
|
||||
if line.contains("seeds:")
|
||||
{
|
||||
println!("Parseing seed input...");
|
||||
for val in line.trim_start_matches("seeds:").trim().split(" ")
|
||||
{
|
||||
let num = val.parse::<i64>().expect(&format!("Failed to parse seed value: {}", val));
|
||||
seeds.push(num);
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
// NEW MAP
|
||||
if line.contains("map:")
|
||||
{
|
||||
sub_map_idx = 0;
|
||||
current_map = line.trim().trim_end_matches("map:").trim();
|
||||
println!("Parsing map: {}", current_map);
|
||||
let map = Map::new(¤t_map);
|
||||
// maps.insert(current_map.to_string(), map.clone());
|
||||
maps.push(map.clone());
|
||||
continue;
|
||||
}
|
||||
|
||||
// NEW SUB MAP
|
||||
let mut sub_map = SubMap::new();
|
||||
let vals: Vec<&str> = line.trim().split(" ").collect();
|
||||
println!("Parsing sub map: {}", sub_map_idx);
|
||||
|
||||
if vals.len() < 3
|
||||
{
|
||||
println!("========INVALID SUBMAP FOR {}: {:#?}========", current_map, vals);
|
||||
continue;
|
||||
}
|
||||
|
||||
sub_map.destination_start = vals[0].parse::<i64>().expect(&format!("Failed to parse dest value: {}", vals[0]));
|
||||
sub_map.source_start = vals[1].parse::<i64>().expect(&format!("Failed to parse source value: {}", vals[1]));
|
||||
sub_map.length = vals[2].parse::<i64>().expect(&format!("Failed to parse length value: {}", vals[2]));
|
||||
//sub_map.map_values();
|
||||
let idx = maps.len() - 1;
|
||||
maps[idx].sub_maps.push(sub_map.clone());
|
||||
sub_map_idx += 1;
|
||||
// if let Some(map) = maps.get_mut(current_map)
|
||||
// {
|
||||
// map.sub_maps.push(sub_map.clone());
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// println!("========CURRENT MAP NOT FOUND IN MAP: {}========", current_map);
|
||||
// }
|
||||
}
|
||||
|
||||
(seeds, maps)
|
||||
}
|
||||
|
||||
|
||||
fn load_data(file_name: &str) -> String
|
||||
{
|
||||
let mut file = match File::open(Path::new(file_name))
|
||||
{
|
||||
Ok(file) => file,
|
||||
Err(why) => panic!("Could not open file {}: {}", Path::new(file_name).display(), why),
|
||||
};
|
||||
|
||||
let mut s = String::new();
|
||||
let file_contents = match file.read_to_string(&mut s)
|
||||
{
|
||||
Err(why) => panic!("couldn't read {}: {}", Path::new(file_name).display(), why),
|
||||
Ok(_) => s,
|
||||
};
|
||||
|
||||
return file_contents;
|
||||
}
|
||||
Loading…
Reference in New Issue