Compare commits

...

5 Commits

4 changed files with 277 additions and 2 deletions

View File

@ -44,7 +44,7 @@ fn extract(symbols: Vec<Vec<String>>) -> Vec<Galaxy> {
galaxies galaxies
} }
fn expand(galaxies: &mut Vec<Galaxy>) {} fn expand(_galaxies: &mut Vec<Galaxy>) {}
struct Galaxy { struct Galaxy {
x: usize, x: usize,

141
src/day17/input.txt Normal file
View File

@ -0,0 +1,141 @@
233341424221453254133544232232332553254226534524533226364366224262564522625224422453452525425244622464542422434425523245134145355424143224333
242412213131252221555412353213522155444225665266446426366462465632256323642356346454566454335634256444554463313225343352512225142313432431311
114133114415241354213311544521132232623644326462345644625462523534466624524454426623535225445364524544256246655523133515241453554135342244332
412212321154353342521444343114334223434436224433524665454653532653355354263542552643323653222332654642436434422424111235225113433525143221443
132111344233413154445333432345665423453532266462535423552663544255634622264623452624642466435255542434535356323622441134351541141425353323212
114214342554432522435451333233633322662535234536664462362464366224525466535253532526463256236253235535352444525263213353222133153241554121323
222423315115343422113335434556222632432253334666424644334263254744545733335477747222455436564233262252565264665523361123245144243335213341413
314223455123245133315554242432454554345324523446545444623535753346663476473377635663463266356246433254462454444554364453453141113515433511143
122243553421311123145455264344334233363324652246662255777774564667434434673546445546465647245325656546246252625235454335122254341313153145342
434244423321525441225526664562232335436223426546344475753347535556676747575647574575576334676435224642234352246434255543512544311224214243211
414333253414413522323336662243264242434633252653544776563673637744664737647336557565735543576444436455225262265652345355651424423242151243311
242425431443121322332636222255232224366563645446577363775636656575437565335443655673353455653747575463644243643356336452365521242424253513132
135535131153333144153332334664335222634263337663363466347556343645777366445647565347543655536776646566236325663435652362653413345233521352243
525144332235122212654422343545534642522347454743737763357654335335677544434735465777454665446674646566542342424333445645623335514123121245131
255331111443252332656262666664624225326334356365336653763577646635733375434473374636573634546664534546436256243466443455265223232522533243413
315152452252213165244433652335623633465673536434336756635357555456437765755546663345436754466764337353556344533523535432642456653532453243533
552241135411233365646643562662466335373737457564355433767675455574545553675766435775746637666646334554353373465255555343423665254111452522343
332311145215422555633366662634532343444633355533447543464454455564337764476464666377676663765474444646447646726544542426432565225114434312412
221212515211263335364464452453224546376477455346756534355746666553763576677645457754433444546744666747765446376542633326336456324212312141532
454434114453455632262355446546664467756635645577476777646547457556887568745856753675665647373334755667455547647353654662336345426643521232243
433242414335635446532426524644645337773476335454666363353755845854785567874447557874456653343557766754655466637762245335462343532334351251225
535553552532263354342346326223473477577666743676776636667886465877644844554876655677556655546446654434536664565674343234443334234625422235512
233541541322333324443323453537765457643336544773654374455845557745845477657888676487478844445677465635543645365533734245462535455366434444343
455242211655243265432436633534667476375556334657757758657756745785857675767447675545577758647644753434533666634466356445655432625644251354235
154353543343334366256264636553335566555775477467658777485686474866557868788866886857786488477586473676744436777363354546442324644466546534132
111412342352325235522232357355536344645544747758557688664764655788444746887478667465788864886575475766555565663554544465632465533566225333315
254133553664265342262422476575475543755363777678886466844766475778577677777447778485446784788574675454544757657337674556565354644664546414442
241245436662632466453665635767736677333377668475855876755485568864654454767477885546685687486857778854653335666435365466436365366463445534354
234145663233454245544264473755567637443675674584556868775544877487546478884667878586457856546847667475343663766764735764335433422522544242255
245245255653464643653447455345775334467478685765866567655647566547667544668688488455588745477684444876856363333477333343755232434266354342542
323355243244462562255476335455354575747745868757675784655658487845588874766657687688566768746778474456865463676774534565475664524344326225454
555524662633662463366534756345373563576478866874867588864866458774664576765678485447878747847864745645656555465735756556475523242356455626514
135222435553234226675747455457334574476764666748665648478475874575855887577558847558764678877648564847466655545453367557357664436525353562633
234254222542423646767664436477456754678586464688654846687648675975996769976985887867557766664448567857476777664546554653737433436464554554246
445522335466644356533757454376743574576755544546666668654579975799575575969975789675684846548648646765868564766577436654555475653542536526235
433425364254243456336564373577364748887585644685644574485968768789987588895569867566679648487474856568478544576475565637453373365344655226655
224336546453556235646535677543467565648668486556777749686887895957676796658898886877698668856784765754645675565757646376476337562555264442453
244425556266324477774435346577688846474676588468875686666596785699757969868965568665689985778866855765576548866575363756373747364446454223526
245636546453323543654547533475374645676875855665878955668967658858785666779856867957557798588486646864558687568637644357565357633535354354335
552366542245544645573374465657465765844768558568889769687777668656779875655657768985889999998587476444468574648743567457566577643234542226653
323562262232646543636376355644884867688855686849556597877656665687966869959785995877769887668977687556874575544876575777547666457435255532554
322232463233435567573773773458475465465575678695885996587988897898976696966598857768795675877556567567585876664756646754647767644625346343255
643436656533333763456776676447546466745868855668775696697785895857968765559787867885998698786579665545454547657646666576777754765435442263634
424252236335474734746374535477484457747657549889557757989666896595696858877867967589868879796968679754845777648446546674635734377734232522554
256222636255733564636543436475848684578556859596975865686585758678755797778899785968967669978755575968568586774588758377553577477574436222663
525264553363676746456663365568786468765458658676685888685675975598699987887897755965585576659597967986676457778758676547673645746354264424636
346653323353366343563356554868555475754755986889899595666789568777977887799978879965757775778676987987775648675866455447657454677434252245534
243253643646775776477753384746455845566775768558586689985959788969887888698796879998899879659657685865776474677844554534575757333553532452434
644352332647455434775337478854886884747579689669679885686956776689679679898898987877678759796598687775578846774454567543745675637765523625436
663466444263743437463333547477648585666667878957768977599878768776887797799677888688895556758575869986775586484576467454765537774657723343655
562655553735745433744378644476475555889766766575559897788896797969786779968899778766899587667557889765688866585688747884754533734457456444334
334423246446476354477666548685654884489585557669556558886696686888777967799798986796799969856767797999558577848745677775734476475644655566623
253355446767736365545548775686766565469898667856976556988686998867989899979788768899876869565676795588675668458445566566655545444733366346443
253465366374676767766655878868756488857976795955958686879797989866889769697869767667986686779587666897757667454655747774773773343345747365526
522336424745466334754587766676487775859959897956758976988978796796697788678977868876987696876987575986557868654666478584854436435747776636534
554262437373763743775668447858586865655597899579669769679969769886876699669688876777686776786965899767598879874855745777886676347475737534332
452356456653434735763685857765788587657668655685668969696767997988677786796886887777768779878679588588956959558864865684547764535777663355352
432452455546453466777857545778684656768676658979689797888688986997669996978697698896867768869799689656575859448668857658545757467365547753362
552245463646743575666644655486648586685876676599988867777997998979787897777769666796676788869877777877596596844746568474783565365646677762255
553622667564375477447678885554745586565876799768667679678676976669879798789898888868978687787676875656996658658545586667664666776766776536556
452532657347544334445685754574676487788666875969898696777776788679979887998799779977666876976688967555688789966847865588887753774756734362225
342456544377357677667865766677655866667695655557988977689977787799799797979899997989767789878978885987786967774457767885685436643453737646463
644665557475547343776688765884464596885588798897666699967979689878979888987787998677979888887996678879589555795786556665885536337555333555452
332432456447374655435756445445644757799755685589768679768768777999889978777799777789667799876967699677577887684486865485555473375557756534523
422532644653753764754477554756757958669666689597968789776696898778799888887778978789878888768798856676799759794554656887775553556453356664344
364244767665665637574455467844467986956958676866778969696769999897998977987777799989686769677698886875597866554457878658568476445644546574553
245532456533473773788868465747446868596776766588969788699878877879979788877799898979789867988869797756668985565844886677586846355773566476224
644254454533465366358744744576667999965875885696667688766667789877788787989777887879798666788966899866987597956744645755765647454766534564556
442464355637574767376545888568447658757888888899687866679767888898888977799899888789889988879788879565889659896564548775474763557747756635234
333255767754464354348674676464748557899996955969978999896688788778798897997887888799788787869666765559965895678446448686647635677335456574634
222336633554663355556577645554849758578965885697886768977677998879897978997889788777776999768797999775785865877844476887765566773763545536555
423625553777755556484457464488767686766657968886677978786688797999789988997787899978797997799966886788698885677775745644587656645635744572622
665636746547373665468568748686548558795597695669679977977878988897878989888987778798999668879669769999899769698558668777655744476577446435346
224443453754666756775564574445745569565698556798896786677998877988778788779989799797967698897966789856689999588656665864865736374455336536256
452625543464343463785885888767477959795668978779888778986698887989779788988887789777969886998678866686755865789868846888754857773457747773233
252552445436673457586767456486766767975985766769896797867978978779878799888879889877689899677897977555789567875757667757865537674434455552246
453364365746446547655444577885687679895989888976977869868777997778799777979988777998696686766688665598585866788465678477666677646445363532334
223532436533453747745574884564468669966776755687686776867867788989978987787897977779878779896696997678959988786686867756456767363375334736443
643444555447473766678687876757588758897795986689788886987667897999978879998777987878669998896786989565868686684646756745468674435675737746434
622656666737443564345844844568577587785956565966769678786768777998787897788887798767988697966797756889559958958485867784567435664455547753362
334633433555333536775764678768786799696866577856869986777868767797779888977788899996967697796677959898958786864784444577646365376776535562223
522245357655777333454857547668745789867965656597878788987768879988978997798979998896786767779799798796688678987874558668547655445543335424562
446345254454334643346776568768547668956876687985879786799767999977979989877789767888887778997878876977985868856674747778474744665543766444364
634362464655464534538547456668685597798689768765886697798876978967789979789776778796979796987677656795868989745688455776647765374637465732235
366236467464443554543668845666785789955879675587896677776969796987876879879777788676798996698685987979586869847885568744763366465446645446222
332266633456433444444765546567578785879777987876676998686678866689978668969799699979766986899699855897679896667566758888857467755636643522465
326633247777565754363545745757467566567555885555586867976778899889786697866689779996977777999575869758676699475755848657447557463657677462534
632545547374354656646458755454565459686885565776575986976768787766968688899667769668696877775589988876967969756885587857875435553546576244262
525336365354563464764587775867487677979587867586578897667788988867776769898866799669686899976685577569765556558466558888665566373477554333224
546265434664753335655755485856644648986876577656675589887978687667769697969986877688689787969887566759576756668874444745774473736455657656236
262655343343756457773456678675446755669777698975988798877769889767988996899968979968888779577579598778769675677547458857536574535544465224355
435543266536475556556776867886847557745855868756675758678969678887987877789899697696667788965885669557897647655454684788444375666563544233656
432435644376466743436577755585787575868556765957896767577876887986686686686669976977989987965777688686569886564465547476744373753564773326243
636242625266656357547373578457748566646789585768897598898679968698889667789667669698887889958669667976766764587457454443567674456363563446546
633254264237676436673666474566865687578777657569768976898856888789897876766998888766586675567979669567575878488854488475673747563573434222464
442422453547636646757366488464848488845567578869885889899897877776686969987979989965859755685796886875587484548787555767563346346444565255624
556525256436634677457677777778446855748678856588756687767686578869887877788988989585787678855996668599448788785574687457377346464556566645223
652555536247666673474345667445658555848768986697675898775555877676688778876965786669658559777896675558744864578447546657463753755333265426656
435526452244334435563654655755546648766447879867995566989798696759889678877685865886668668776766758767885785654856477574647344455754265355224
465355432232747674377367767547587754654775468866858795555775587876678895688966767589885666997595796787468774454745645535555437447462636453622
442254665644575643547636435675476645774877677956785886868798566759678676685677658855785567965585865564767448788568857455377654354655652343345
533236323633456533676363374468664885464757866479856976596768668869889887967877898879979688796866757856758465784768747545374547665453633564626
264645325452356535776435766474768674458786766559597566789977866966899758877566788567656765796756554487645658877885377364777635547444643544332
425466363555335334565633475465746886877467566457555669867785776975588776668978799588568868857667444878465886844553453355674675563522246536636
466654542365246577773437347454466666468576664764787788578789758885887655588595765688698797797546758875778565874747774564455363772255223334632
536645625654426633443654535655347485657567878888764777799797886559898858585558556588659988946458657878758577485743437437375775344364526255663
355226223322552453565377474375755787687588655486474669677697689768969678889687897687875675584786445856877647554754764656544447753444263253523
552436646345635366666547565643636484477855654458846774457785578588777567598998677586856545678467574864574575754775645774566443542255436565664
115242664563525537335743454563664748554748845487745747674787667988999995597985885868874677844877677664677874465363465374454467236432332446266
546256356234463633534566734536557346465758764744776485448675579769668679697566558757868678588467486448586866646434764676757532263364666634556
321654365533662444457343734736334373565745667844847845767756758466856599557897578556446564864446687576884746636545667454566552326356322346233
553164444553652633633763773766565647387676768785765685677878477656456474455568884767876777568877884786875636563643436334657766344543425324434
425362524222553425357576543754733533346746648856478564646886455884458878687448468768855864887677445858475447753443543743365534635635636663345
551255425355634626252674445363676673645454447445787665458668646665544645464758478687674676547755754886533756374436573655573653232633522245442
451244264564434646653234333734366776366545578886684655555646557586676455576647478558558756656874548468457556446664565743333223353262522434411
433432436324626324635626376655664375574665367676688658684546576446855844476866468865784458584566754837535645343335545776654224344625543431432
431221363322245436546353456334674665573654675687575444764545748588867665458747546684555587866746448676466477337473754755555236333252545223554
344212242326426243234443333754477644356336674384864664674684545865644464577554845456476544565747773676357464755444755564465353642366362212325
141143345252553552335443226767373637563467337355786748445765648644665848685458585768487476784583356354645336455747544634243326256232322333215
215243552434526646366352245346356777555435537337658564656666874686756576888648465567788778765645673636664735545774475633263464535265564525111
345323451322543542563243445366775734344576444755734455888454548648566746755466866454755477553657654457473343476333464644433543452245322412515
212253245445664452246336423324756565377345336673663737766567784684688676466565478668884757374645563637667347336443423335524666554543512515451
134131451146642334642256366556745364435665773457556657677748864788465684874874664864355363454746547457775563756574335253452353433245553143424
423425353121422632653246653625656447353464457746547577575335465386584746555786855633556377533365466477343545537544453234624263243554451222342
433245544343453456266232265365664675453376474474456354475563573465343455333575336447356643644467533763654755664343244562446256225355244215552
142325142211513523463534625656535634746553673665674473665336645537553576676664353473364357775667344643635463645245245466265423423423355211321
115554244125224524532264332566254254464644465654755744343343564563577436675647646344563463434545334775547673423256656224464552443242144145554
513535352425341354356454652542552432643773465755667456547556457666633337575646437456655343736575437343737656433635456555265425515424215123114
254111145121153515335265524345643442263335347354747354353737463753675535653766433347375765355434765677466336233622644226463423211445552515555
121251423135255143642444222656525564555437455677663755556435657433533646763577454475443457464555676536536362535443323553362252453321553442443
345142233131321415123352352364245332242334365647443335763766363366374637565474377544337676777737647552445465545526345555453535444342534425514
342542124355125312256254523362324665464554453757443556537363663773356445653366464463333466737637335323234446242336536554524453344214123145112
124313421151344223454132524533422533563225236655474465357745535377767356363573447353573333634576336356555653552266645225212432525353352543211
422223413134233114323356646334536555663633363342654565357543536547555335334576473763655567736356435536526426232346436566515224314345213511141
213231432153443113313411336644645463445246245333432664656553345547754455657747643347733366455335553454324523654563552624225123234341254225332
231131155433155325323533432446635643536336525552643245356736563356745543643736755776472363634323645232424243654352534142354412324243441411143
121312534221314523423135231436532262256366324245233324232462546747535364757347546222225455222352262533424656456345641443355231341134514411224
122314125212135515135151255136443446455625322523333424335644534335525252323454342344223534524264534462652222223332633155512352113121223542123
342323312324532243211351545152655642335462622354442524446263243233526656325243326532665422635633352326326662323431511435154553245453423133314
431334132234314213315211423423236563652446256363246236523454664226334465242435653545333333622252346343332645234324121425215522524515522424331
314212442212225511445125333213352432542544534352632563425326262363622436663656554522332336546546655426263443432333322413335225445523142231413

130
src/day17/mod.rs Normal file
View File

@ -0,0 +1,130 @@
use crate::common::{convert_num, match_inputs, read_file, split_lines};
#[allow(dead_code)]
pub fn part_two() {}
#[allow(dead_code)]
pub fn part_one() {
let input = setup();
}
fn pathfind(grid: &mut Vec<Vec<Block>>) -> i32 {
let mut closed: Vec<&mut Block> = Vec::new();
let (end, mut open);
{
let result = init_pos(grid);
end = result.0;
open = result.1;
};
while !open.is_empty() {
let mut current = None;
let mut index = 0;
let mut record = std::i32::MAX;
// Get best distance + heuristic
for (i, next) in open.iter().enumerate() {
let score = next.d + next.h;
if score < record {
record = score;
index = i;
}
}
// Remove current from open set
current = Some(open.remove(index));
if let Some(current) = current {
// Break if current is end
if current.compare(end) {
break;
}
// Scan neighbors, limit straight line length
// Add neighbors to open set
for (j, line) in grid.iter_mut().enumerate() {
for (i, next) in line.iter_mut().enumerate() {
if !closed.contains(&next) && !open.contains(&next) {
next.d = current.d + next.c;
next.h = next.distance(end);
open.push(next);
}
}
}
// Add current to closed set
closed.push(current);
}
}
end.d
}
fn init_pos(grid: &mut Vec<Vec<Block>>) -> (&mut Block, Vec<&mut Block>) {
let mut open = Vec::new();
let middle = grid.len() / 2;
let (top, bottom) = grid.split_at_mut(middle);
let start = top.first_mut().unwrap().first_mut().unwrap();
let end = bottom.last_mut().unwrap().last_mut().unwrap();
start.h = start.distance(end) as i32;
open.push(start);
(end, open)
}
struct Block {
x: usize,
y: usize,
c: i32,
d: i32,
h: i32,
}
impl Block {
fn distance(&self, other: &Block) -> i32 {
let dx = (other.x as i32 - self.x as i32).abs();
let dy = (other.y as i32 - self.y as i32).abs();
dx + dy
}
fn compare(&self, other: &Block) -> bool {
self.x == other.x && self.y == other.y
}
}
impl PartialEq for Block {
fn eq(&self, other: &Self) -> bool {
self.compare(other)
}
}
impl Eq for Block {}
fn setup() -> Vec<Vec<Block>> {
let name = "day17";
println!("Executing module '{name}' entrypoint . . . ");
let content = read_file(name);
let lines = split_lines(&content);
let input = match_inputs(lines, &r".");
convert_num(input)
.iter()
.enumerate()
.map(|(j, v)| {
v.iter()
.enumerate()
.map(|(i, n)| Block {
x: i,
y: j,
c: *n,
d: 0,
h: 0,
})
.collect()
})
.collect()
}

View File

@ -4,6 +4,7 @@ mod common;
mod day09; mod day09;
mod day11; mod day11;
mod day17;
fn main() { fn main() {
println!("Executing main entrypoint . . . "); println!("Executing main entrypoint . . . ");
@ -12,9 +13,12 @@ fn main() {
// day09::part_one(); // day09::part_one();
// day09::part_two(); // day09::part_two();
day11::part_one(); // day11::part_one();
// day11::part_two(); // day11::part_two();
day17::part_one();
// day17::part_two();
let elapsed = now.elapsed(); let elapsed = now.elapsed();
println!("Execution in {:?}.", elapsed); println!("Execution in {:?}.", elapsed);
} }