1
0
Fork 0

Added Day 16 Part 1

master 16.1
Ishan Jain 1 year ago
parent 3276d198ce
commit c58ea87895

@ -1,100 +1 @@
1277612293663378117618549828679918274822495311841997189739842189979929923519756614495694929124519976
9271393131522635231134923888495739243498692263922766681729855924329157481892259297758227655481919219
8386928948885115739239121267489851994495998157413791292128126786986984319766763919966111141398179331
8587465426836695543987965665319923697978898664688597797977756649524841879974351994933143981433398837
3613452297153349211825418198975341212117882643222179165399996886428972986351889957983918969989922294
2711886836459899996697348654589518929717652919364971266989157613172583572139989113898959831987793179
9951192993135898889299146916719111271811994499257849117115139861211199129281168591891398283457968389
8439716187711526174319682893442394391199139951943824155659619112113299898834742465527548993811971483
9982197477821999792999899834196362959819828856989589928471397858688239313155483184898968748968969633
2935248399234958924996781377957291867591529551489227962471931829396995613521327492372939599524398563
8211132973867429689139171876528381595799983193894255576334889867437981346181584912279421491748939491
8152819189939118299938843413681998149883765263178454458595913991828882295315941369254354887815162197
4687589517762459877719793766213697699871597988116588868874318981162918196139951941799342915513911357
3998953688813689431919117461299181893598913292918781817451795556914989793142881825841598379768579729
3557189691296834767612297983915793424927849956712911773754778931243937368829214955293281983334632432
5828899819217811175855131961987629213395917492231719995597859384749917693112949163138997686938468397
2961946841675841821484395345991359929229792172339562199929926973199978911164493148296894148699941138
7773912519545993547998811923758691297691819635471211912996152998347979748999152819389844832115618959
5392419451727965529932627927978319164895199489199927139938989299449119781319133561937748559197215319
8984292127491542725813142281159169967913687389158293226184249126382171365181385237851989724967611919
7944871226254192671169479996199871251849366547992917861758618557864249589934391718392431919233384735
1944932333119186197183158832399319576625288198196964719997766713411629269749246912829194414412249142
2999997591319988291411317697296189989959995266925296844979714129827924631917151669389546421894999718
4799968641943952977861479186692969816886829484972298692584159919998399758281963992198658585919598689
4672499949171752129757141197349668247689291979969732747377587699861917925589565645492187927489911897
6979994774893537679749159289875631358923956291691948595883698487889812455661992211863193819534926319
3781391969112418934274128154724629138794356821899737961999479728892145219171431697763751891947191231
6111939369241914917247949219922882195275113997454869259617737511919577752975294238973438797141935184
1156529533358871268277816969319918959158437999488477923981929914194399392396172399574665914127199898
2424793421919665769561537434777655165313893887198719196854864819879939795613843123858819673661882458
9276738961484299798428274671718919228877193546699129668779635669158495969763779228831899864199118911
6359966893718416879326139115991995397978757731977898986351831181827119356917953966996915985933845894
4936191581734878723283539418466817929339471463891788697862198922943165787597898198148791343389324976
3656828282931789395188279176276887881918964529665911384135988885929712951199638136185518991691842529
1968446992637825244282111941543575642216121996389228819321691964798947559156319921794481191478821129
9567599985411974272188292531286925567332876519927591899796935484834179754988164395999281151489167789
7939122971978968298498258895186869436998182918557414452896118966939778876945384113579296998925158895
5795288611185114829996541398249311993939891486694498217638761591961769848887419994681871481111847725
3597447699913129898973641182419462828191342261876517692817167349647648512182946876714968181774393199
6916297731592982142138339949893399976133926967974912142953873589951942188199239866479937326256625782
8293179368642648835969613741814627812798778888596786791181294134296287412381951993983968938899531574
8892991977624911731928892299886189937134891914223225349942849465124499892466146339999729581368892532
5522383971992841189594789427549294969792695696159723292449829658171757631852449938319175122882883813
8498299969138183798575161286511799799617984822833957392199884683431743724994781198869579944199917998
4886992479891988136111781869227969987947527633849676618177913812482918599934248727683992799296142793
8435984565826967361111219754788267259991349921798328173989927794137763183993492511911754419794441883
9286869596811688377189146229583581894885564593396636698559489413159921358669951438979982781881722928
8185767153711168271115172191986479993954888697997393185789358516885127571827598896934686888368945989
7287295729363558315482999918668953999928379516444497894118891622111318967549959941298456989435919498
6198481564681196928964791786464448788869471473944191849845639713891647988956314286649998991327789796
8981891587618919421999984592111184482991749631318119396377928548215989337681182999895268989419997429
1149784687279469461357269561922176512329774789188919983996791183458661917235899692549621823198787826
7756191688783127539927992779711288118291519759994741149376499149981725411311584989134142339129868926
1838987999999386417951797289244829937222556921233449474194887788174439751716559897197122256396181536
1193559599491197737918817517831872442528764519468961894149688887999639383949994917767831942522936966
9992985121391888729276639139845428223259871989191467595715296971863392199277618799291449922399836575
1662813632764913853987715333475292719937696299835788199179883828939162195566489193788519958818493819
4716385631851771781831181412919729798619239579939119191989935714797282684896686199999218797181357299
2171959319881473821239177488929974372341169687925729372189418793972187848293928197691398741998826445
4823419898735213218716928189292393427939731551959526869145839471378189919432875614968168232595958981
1991499669191529211894597416918718956918875197982146961432315832825981219932869843315344862267791194
9126829659424676195287997973569391858223699919337199762181121121883831863659719457419971159982814492
9193722611837683556177159919492622513869498559657359757683249612241719885121769191144883181883325991
7891459697349399493699421853992563983295356883694331915789834916679491697135747218768483199489417319
1114979399891764131839941799196279898199414874945595234795821811517779163993117159971587839939792988
8277491631388791695875912794382749756899169492976798793994521641186937791199889952889718399283157953
5683122356683989163146315751572249511196634769419188929199651783993936459857392884846558361696718913
5879869647918793312191972893569419591783575399614911728336392567299363589212743714127916978894327569
1162472147934257196975729897987829856729379791783919916831354939981569851147777299914819773818396381
2677882252119488894999648629399687946199369738928368882811253993399551996742582322229412759958317495
1975794815539361591978423147999264914179922677639936531948124829381125147582939857911241194921989269
4849338266428241361283929797969128954773857386194641987761291887318582229784716364977791249974787957
3983379795578481929191965117447551562924246797893299522524297586388738979796876726958919219193881238
1255899241689686692339365927938999299995592977189475638197425526663849912432995861833643297178819119
9954698391771994883918754117219919871999994818468692175117619221168961146831797159189951949519143196
1288121284985491135911816961717618162983848935289136765259688491727369291945635391278798181478216359
8867445133281761881313872898949423291365958828841764735281218753164189498943751175133315767717193928
9169795683992567934316759195353848699885726899156445833545841925461995498277225497189913799979124941
3695196326492267496821252113851165963777877139777368561619217794487976759137776929877197981898372132
4959196198998871791296999648882615294815943987999842381458146799972479951825874139696273129668836815
8138167246417661773411799195552999694289694529149987932186519785987219758987391242433677988979832999
8485961136973361673729132787174299918915839269296789759426298297671168222999619177311296897954247418
5665132699854185577312677935199518251947937983388921399187273199918185251215419765498728956593993589
9996271793859379234246119632215181687991841197911933238767996939966979545714434483533987567165159689
2122836699598579874512954921716869487962391249915319188257621423524888221575198874391834646592338911
6622311687681717168791619541192919988912841193117994689292478912921582144998479743998559841857676711
6813599115393454118369155121119879978119515914965184857689899889339899718413497971612711694511547394
1891261794699137287129151818559583753962882784499833938811583797529793151179992851891117961889318181
9499429191727797714792567211594449398582362542149922281611371252927939631299918981913871741737919684
7764866954358698116386699738323826356662179713197596168791895836995769391996124983959672516718217438
8196177992729111932633883356918799929165375578984147888876397712214521725295996929417146981984855885
5892553993915138979686734827963761897958652656313919689969359314879169899822979113898586971943386749
5173251271592628618511119617732221291969116393379833881167899148898938499869949949194129789498948342
9199665239934589983923364599829461257648812598935619949299771973445529852989941219481111785192365761
2187797487951834753122194811543386918814558579548561967681918527569711672899112415139988919143636193
9818799199799895991976949994119388875199237172991611917293439519248451226554699189751128997286224819
1291721497651916483772119276936237171914168997187944968919889659182199614157618275597581139122453289
1119771759276799682694115919928987149359191994979522687979717885829591518642649786819978694113879279
1245796791621588496343485419121481561914427942119252867114939176979919193767974638351841951857941937
9597192967121818911911176316279925598649941683258384461795695912163977398318859726194172682431494991
820D4A801EE00720190CA005201682A00498014C04BBB01186C040A200EC66006900C44802BA280104021B30070A4016980044C800B84B5F13BFF007081800FE97FDF830401BF4A6E239A009CCE22E53DC9429C170013A8C01E87D102399803F1120B4632004261045183F303E4017DE002F3292CB04DE86E6E7E54100366A5490698023400ABCC59E262CFD31DDD1E8C0228D938872A472E471FC80082950220096E55EF0012882529182D180293139E3AC9A00A080391563B4121007223C4A8B3279B2AA80450DE4B72A9248864EAB1802940095CDE0FA4DAA5E76C4E30EBE18021401B88002170BA0A43000043E27462829318F83B00593225F10267FAEDD2E56B0323005E55EE6830C013B00464592458E52D1DF3F97720110258DAC0161007A084228B0200DC568FB14D40129F33968891005FBC00E7CAEDD25B12E692A7409003B392EA3497716ED2CFF39FC42B8E593CC015B00525754B7DFA67699296DD018802839E35956397449D66997F2013C3803760004262C4288B40008747E8E114672564E5002256F6CC3D7726006125A6593A671A48043DC00A4A6A5B9EAC1F352DCF560A9385BEED29A8311802B37BE635F54F004A5C1A5C1C40279FDD7B7BC4126ED8A4A368994B530833D7A439AA1E9009D4200C4178FF0880010E8431F62C880370F63E44B9D1E200ADAC01091029FC7CB26BD25710052384097004677679159C02D9C9465C7B92CFACD91227F7CD678D12C2A402C24BF37E9DE15A36E8026200F4668AF170401A8BD05A242009692BFC708A4BDCFCC8A4AC3931EAEBB3D314C35900477A0094F36CF354EE0CCC01B985A932D993D87E2017CE5AB6A84C96C265FA750BA4E6A52521C300467033401595D8BCC2818029C00AA4A4FBE6F8CB31CAE7D1CDDAE2E9006FD600AC9ED666A6293FAFF699FC168001FE9DC5BE3B2A6B3EED060

@ -1,10 +1 @@
1163751742
1381373672
2136511328
3694931569
7463417111
1319128137
1359912421
3125421639
1293138521
2311944581
A0016C880162017C3686B18A3D4780

@ -1,5 +1,5 @@
#![feature(test)]
use std::{cmp::Reverse, collections::BinaryHeap};
use std::{any::Any, collections::HashMap};
extern crate test;
@ -8,66 +8,150 @@ const INPUTS: [&'static str; 2] = [
include_str!("../inputs/input.txt"),
];
fn parse_input(input: &'static str) -> Vec<Vec<u8>> {
input
.lines()
.map(|line| line.bytes().map(|x| x - b'0').collect())
.collect()
fn parse_input(input: &'static str) -> String {
let mapping = HashMap::from([
('0', "0000"),
('1', "0001"),
('2', "0010"),
('3', "0011"),
('4', "0100"),
('5', "0101"),
('6', "0110"),
('7', "0111"),
('8', "1000"),
('9', "1001"),
('A', "1010"),
('B', "1011"),
('C', "1100"),
('D', "1101"),
('E', "1110"),
('F', "1111"),
]);
let input = input.trim();
let mut out = String::with_capacity(input.len() * 4);
for c in input.chars() {
let v = *mapping.get(&c).unwrap();
out.push_str(v);
}
out
}
fn solution(grid: Vec<Vec<u8>>) -> u64 {
let m = grid.len();
let n = grid[0].len();
let (tm, tn) = (m * 5, n * 5);
let mut visited = vec![vec![false; tn]; tm];
let mut heap = BinaryHeap::with_capacity(tm * tn);
heap.push((Reverse(0), 0i32, 0i32));
while let Some((Reverse(cost), x, y)) = heap.pop() {
if let Some(v) = visited
.get_mut(x as usize)
.and_then(|row| row.get_mut(y as usize))
{
if *v {
continue;
} else {
*v = true;
}
}
fn read_header(s: &mut impl Iterator<Item = char>) -> (u8, u8) {
let raw_version: String = s.by_ref().take(3).collect();
let version = u8::from_str_radix(&raw_version, 2).unwrap();
if x == tm as i32 - 1 && y == tn as i32 - 1 {
return cost;
}
let raw_type_id: String = s.take(3).collect();
let type_id = u8::from_str_radix(&raw_type_id, 2).unwrap();
for (i, j) in [(1i32, 0i32), (0, 1), (-1, 0), (0, -1)] {
let px = i + x;
let py = j + y;
if px < 0
|| py < 0
|| px >= tm as i32
|| py >= tn as i32
|| visited[px as usize][py as usize]
{
continue;
}
(version, type_id)
}
let mapped_value = map_coords(&grid, px as usize, py as usize, m, n);
heap.push((Reverse(cost + mapped_value as u64), px, py));
fn read_literal(input: &mut impl Iterator<Item = char>) -> (u64, u64) {
let mut out = String::new();
let mut read = 0;
loop {
let last = input.next().unwrap() == '0';
out.extend(input.take(4));
read += 5;
if last {
break;
}
}
0
(u64::from_str_radix(&out, 2).unwrap(), read)
}
#[derive(Debug)]
struct PacketHeader {
version: u8,
type_id: u8,
}
#[derive(Debug)]
struct Packet {
header: PacketHeader,
size: u64,
literal: Option<u64>,
sub_packets: Vec<Packet>,
}
fn map_coords(grid: &Vec<Vec<u8>>, x: usize, y: usize, w: usize, h: usize) -> u8 {
let gx = (x / w) as u8;
let gy = (y / h) as u8;
let (mx, my) = (x % w, y % h);
fn read_packet(input: &mut impl Iterator<Item = char>) -> Packet {
let (version, type_id) = read_header(input);
let mut out = Packet {
size: 6,
literal: None,
header: PacketHeader { version, type_id },
sub_packets: vec![],
};
match out.header.type_id {
// Literal
4 => {
let (literal, read) = read_literal(input);
out.size += read;
out.literal = Some(literal);
}
// Operation
_ => {
let length_type_id = input.next().unwrap();
out.size += 1;
match length_type_id {
'0' => {
let mut trailing_packet_size =
u64::from_str_radix(&input.take(15).collect::<String>(), 2).unwrap();
out.size += 15;
while trailing_packet_size > 0 {
let packet = read_packet(input);
trailing_packet_size -= packet.size;
out.size += packet.size;
out.sub_packets.push(packet);
}
}
'1' => {
let trailing_packet_count =
usize::from_str_radix(&input.take(11).collect::<String>(), 2).unwrap();
out.size += 11;
for _ in 0..trailing_packet_count {
let packet = read_packet(input);
out.size += packet.size;
out.sub_packets.push(packet);
}
}
_ => unreachable!(),
}
}
};
out
}
fn solution(input: String) -> u64 {
let mut input = input.chars();
let packet = read_packet(&mut input);
let mut answer = 0;
let mut stack = vec![packet];
while let Some(packet) = stack.pop() {
answer += packet.header.version as u64;
stack.extend(packet.sub_packets);
}
(grid[mx][my] + gx + gy - 1) % 9 + 1
answer
}
fn main() {

Loading…
Cancel
Save