From bf16b19b1f6deffd1983efca059db576f3b60ee5 Mon Sep 17 00:00:00 2001 From: Yigit Sever Date: Mon, 13 Dec 2021 10:40:39 +0300 Subject: 2019, tracking --- 2019/day1/README.md | 5 + 2019/day1/part1.in | 100 +++++ 2019/day1/part2.in | 100 +++++ 2019/day1/rec_fuel.py | 23 ++ 2019/day2/1202.in | 1 + 2019/day2/intcode.pl | 57 +++ 2019/day3/part1.in | 2 + 2019/day3/smalltest.in | 2 + 2019/day3/wires.pl | 68 +++ 2019/day4/password.lp | 17 + 2019/day4/password.pl | 29 ++ 2019/day5/intcode.pl | 92 +++++ 2019/day5/part1.in | 1 + 2019/day6/orbits.pl | 39 ++ 2019/day6/orbits.py | 28 ++ 2019/day6/part1.in | 1069 ++++++++++++++++++++++++++++++++++++++++++++++++ 2019/day7/comm.py | 19 + 2019/day7/intcode.pl | 109 +++++ 2019/day7/part1.in | 1 + 19 files changed, 1762 insertions(+) create mode 100644 2019/day1/README.md create mode 100644 2019/day1/part1.in create mode 100644 2019/day1/part2.in create mode 100644 2019/day1/rec_fuel.py create mode 100644 2019/day2/1202.in create mode 100644 2019/day2/intcode.pl create mode 100644 2019/day3/part1.in create mode 100644 2019/day3/smalltest.in create mode 100644 2019/day3/wires.pl create mode 100644 2019/day4/password.lp create mode 100644 2019/day4/password.pl create mode 100644 2019/day5/intcode.pl create mode 100644 2019/day5/part1.in create mode 100644 2019/day6/orbits.pl create mode 100644 2019/day6/orbits.py create mode 100644 2019/day6/part1.in create mode 100644 2019/day7/comm.py create mode 100644 2019/day7/intcode.pl create mode 100644 2019/day7/part1.in (limited to '2019') diff --git a/2019/day1/README.md b/2019/day1/README.md new file mode 100644 index 0000000..af0b60e --- /dev/null +++ b/2019/day1/README.md @@ -0,0 +1,5 @@ +I realized part 1 can be solved with a perl one liner; + +```bash +perl -ne '$c += int ($_ / 3) - 2;END {print $c}' < part1.in +``` diff --git a/2019/day1/part1.in b/2019/day1/part1.in new file mode 100644 index 0000000..63d0a1a --- /dev/null +++ b/2019/day1/part1.in @@ -0,0 +1,100 @@ +93912 +138996 +112824 +110011 +139024 +132292 +74029 +81664 +138077 +109614 +121056 +136338 +132771 +86611 +131526 +123101 +61315 +93900 +62070 +97957 +67168 +119464 +119066 +111076 +56856 +144203 +109400 +120187 +57915 +143353 +71308 +67695 +141275 +106552 +136209 +86990 +98969 +57207 +99103 +71940 +63145 +91765 +121095 +139700 +128851 +77138 +66712 +91318 +96924 +132235 +99897 +67479 +87996 +121100 +55411 +61715 +130658 +121030 +141445 +83939 +90402 +121107 +59618 +120112 +58140 +103514 +90538 +55552 +142739 +61770 +147374 +80038 +128830 +93328 +52369 +71801 +144536 +147140 +118213 +128056 +92155 +114384 +89234 +124451 +94214 +79174 +108427 +111041 +96715 +128414 +62521 +93897 +107428 +90637 +126176 +78676 +69504 +93663 +80869 +124230 diff --git a/2019/day1/part2.in b/2019/day1/part2.in new file mode 100644 index 0000000..63d0a1a --- /dev/null +++ b/2019/day1/part2.in @@ -0,0 +1,100 @@ +93912 +138996 +112824 +110011 +139024 +132292 +74029 +81664 +138077 +109614 +121056 +136338 +132771 +86611 +131526 +123101 +61315 +93900 +62070 +97957 +67168 +119464 +119066 +111076 +56856 +144203 +109400 +120187 +57915 +143353 +71308 +67695 +141275 +106552 +136209 +86990 +98969 +57207 +99103 +71940 +63145 +91765 +121095 +139700 +128851 +77138 +66712 +91318 +96924 +132235 +99897 +67479 +87996 +121100 +55411 +61715 +130658 +121030 +141445 +83939 +90402 +121107 +59618 +120112 +58140 +103514 +90538 +55552 +142739 +61770 +147374 +80038 +128830 +93328 +52369 +71801 +144536 +147140 +118213 +128056 +92155 +114384 +89234 +124451 +94214 +79174 +108427 +111041 +96715 +128414 +62521 +93897 +107428 +90637 +126176 +78676 +69504 +93663 +80869 +124230 diff --git a/2019/day1/rec_fuel.py b/2019/day1/rec_fuel.py new file mode 100644 index 0000000..d837202 --- /dev/null +++ b/2019/day1/rec_fuel.py @@ -0,0 +1,23 @@ +import sys + + +def recfuel(mass): + """Calculate the fuel required for the module + use the new weight of the fuel recursively + r(M) = r(M / 3 - 2) + """ + M = mass // 3 - 2 + + if M < 0: + return 0 + else: + return M + recfuel(M) + + +total = 0 + +for mass in sys.stdin: + ret = recfuel(int(mass)) + total += ret + +print(total) diff --git a/2019/day2/1202.in b/2019/day2/1202.in new file mode 100644 index 0000000..6bbbce6 --- /dev/null +++ b/2019/day2/1202.in @@ -0,0 +1 @@ +1,0,0,3,1,1,2,3,1,3,4,3,1,5,0,3,2,6,1,19,1,5,19,23,2,6,23,27,1,27,5,31,2,9,31,35,1,5,35,39,2,6,39,43,2,6,43,47,1,5,47,51,2,9,51,55,1,5,55,59,1,10,59,63,1,63,6,67,1,9,67,71,1,71,6,75,1,75,13,79,2,79,13,83,2,9,83,87,1,87,5,91,1,9,91,95,2,10,95,99,1,5,99,103,1,103,9,107,1,13,107,111,2,111,10,115,1,115,5,119,2,13,119,123,1,9,123,127,1,5,127,131,2,131,6,135,1,135,5,139,1,139,6,143,1,143,6,147,1,2,147,151,1,151,5,0,99,2,14,0,0 diff --git a/2019/day2/intcode.pl b/2019/day2/intcode.pl new file mode 100644 index 0000000..984784a --- /dev/null +++ b/2019/day2/intcode.pl @@ -0,0 +1,57 @@ +use strict; +use warnings; +use Data::Dumper; +# use Smart::Comments; + +my $inputline = ; +chomp $inputline; +my @memory = split /,/, $inputline; + +@memory = map {int $_} @memory; + +my $op_code_pos = 0; +my $pos_1 = 1; +my $pos_2 = 2; +my $loc_pos = 3; +my $pc = 4; + +my @actions = (sub {print "noop"}, sub {return $_[0] + $_[1]}, sub {return $_[0] * $_[1]}); + +my $output = 0; + +my $one_inc = 0; +my $two_inc = 0; +my $turn = 0; +my @mem = @memory; + +foreach my $x (0..99) { + foreach my $y (0..99) { + + @mem = @memory; + $mem[1] = $x; + $mem[2] = $y; + + for (my $add = 0; $add < scalar @mem; $add += $pc) { + + my $op_code = $mem[$add + $op_code_pos]; + last if ($op_code == 99); + + my $op_1 = $mem[$mem[$add + $pos_1]]; + my $op_2 = $mem[$mem[$add + $pos_2]]; + my $loc = $mem[$add + $loc_pos]; + my $res = $actions[$op_code]->($op_1, $op_2); + + $mem[$loc] = $res; + } + $output = $mem[0]; + ### $output + exit if $output == 19690720; + } +} + +# print Dumper \@mem; +# print join ',', @mem; +END { + print STDERR "Output: >$mem[0]<\nFor mem[1] = $mem[1] and mem[2] = $mem[2]\n"; + print 100 * $mem[1] + $mem[2]; +} diff --git a/2019/day3/part1.in b/2019/day3/part1.in new file mode 100644 index 0000000..c2e5e1d --- /dev/null +++ b/2019/day3/part1.in @@ -0,0 +1,2 @@ +R998,U494,L814,D519,R407,U983,R307,D745,R64,D29,L935,D919,L272,D473,R689,U560,L942,U264,R816,U745,R209,U227,R241,U111,L653,D108,R823,U254,L263,U987,L368,D76,R665,D646,L759,U425,L581,D826,R829,D388,L234,U33,L48,U598,L708,D764,L414,D75,L163,U802,L183,U893,L486,U947,L393,D694,L454,D600,R377,U312,R89,D178,L652,D751,R402,D946,R213,U985,R994,D336,R573,D105,L442,U965,R603,U508,L17,U191,L37,U678,L506,U823,R878,D709,L348,U167,L355,U314,L164,D672,L309,U895,R358,D769,R869,U598,R63,D68,R105,U133,R357,U588,L154,D631,L939,D235,R506,D885,R958,D896,L195,U292,L952,D616,L824,D497,R99,D121,R387,D155,L70,U580,L890,D368,L910,U645,L786,U977,R9,U781,L454,U783,L382,U321,L195,U196,L239,U764,R18,D71,R97,U77,L803,U963,L704,U94,L511,U747,L798,D905,L679,D135,R455,U650,R947,U14,L722,D245,L490,D183,L276,U559,L901,D767,R827,U522,L380,U494,R402,U70,R589,D582,R206,U756,L989,U427,L704,D864,R885,D9,R872,U454,R912,U752,R197,U304,L728,U879,R456,D410,L141,U473,R246,U498,R443,D297,R333,D123,R12,D665,R684,D531,R601,D13,L260,U60,R302,D514,R416,D496,L562,D334,L608,U74,R451,U251,R961,U166,L368,U146,R962,U973,R120,U808,R480,D536,L690,D958,R292,U333,R656,U305,R46,U831,L756,D907,L638,D969,L445,U541,R784,U148,R338,D264,R72,D637,R759,D709,L611,D34,R99,U305,R143,D191,R673,D753,R387,U994,R720,D896,R95,U703,L499,D453,R96,U808,L485,U127,L856,U357,L543,U382,R411,U969,L532,U64,R303,U457,L412,D140,R146,D67,R147,D681,L1,D994,L876,D504,R46,U683,L992,U640,L663,D681,L327,U840,R543,U97,R988,U792,R36 +L999,U148,L592,D613,L147,D782,R594,U86,R891,D448,R92,U756,R93,D763,L536,U906,L960,D988,L532,U66,R597,U120,L273,D32,R525,U628,L630,U89,L248,U594,R886,D544,L288,U380,L23,D191,L842,U394,L818,U593,L195,U183,L863,D456,L891,D653,R618,U314,L775,D220,R952,U960,R714,U946,L343,D873,L449,U840,R769,U356,L20,D610,L506,U733,R524,D450,L888,D634,R737,U171,R906,U369,L172,D625,L97,D437,R359,D636,R775,U749,L281,U188,R418,D437,R708,D316,L388,D717,R59,U73,R304,U148,L823,U137,R265,U59,R488,D564,R980,U798,L626,U47,L763,U858,L450,U663,R378,U93,L275,U472,L792,U544,R192,D979,L520,U835,L946,D615,L120,U923,L23,U292,R396,U605,L76,U813,L388,U500,L848,U509,L276,D538,R26,D806,R685,D319,R414,D989,L519,U603,R898,D477,L107,D828,R836,U432,L601,U888,L476,D974,L911,U122,L921,D401,L878,D962,L214,D913,L113,U418,R992,U844,L928,U534,L13,U457,L866,D208,L303,D732,L497,U673,R659,D639,R430,D301,L573,U373,L270,D901,L605,D935,R440,D183,R374,D883,L551,U771,R707,D141,R984,U346,R894,U1,R33,U492,R371,D631,R95,D62,L378,D343,R108,D611,L267,D871,L296,U391,R302,D424,R160,U141,R682,U949,R380,U251,L277,D404,R392,D210,L158,U896,R350,D891,L837,D980,R288,U597,L292,D639,L943,D827,L492,D625,L153,D570,R948,D855,L945,U840,L493,U800,L392,D438,R8,U966,R218,U597,R852,D291,L840,D831,L498,U846,R875,D244,R159,U243,R975,D246,R549,D304,R954,D123,R58,U5,L621,U767,R455,U550,R800,D417,R869,D184,L966,D51,L383,U132,L664,U220,L263,D307,R716,U346,L958,U84,L154,U90,L726,U628,L159,U791,L643,D652,L138,U577,R457,U655,L547,D441,L21 diff --git a/2019/day3/smalltest.in b/2019/day3/smalltest.in new file mode 100644 index 0000000..620a05e --- /dev/null +++ b/2019/day3/smalltest.in @@ -0,0 +1,2 @@ +R75,D30,R83,U83,L12,D49,R71,U7,L72 +U62,R66,U55,R34,D71,R55,D58,R83 diff --git a/2019/day3/wires.pl b/2019/day3/wires.pl new file mode 100644 index 0000000..fa4ddf1 --- /dev/null +++ b/2019/day3/wires.pl @@ -0,0 +1,68 @@ +#!/usr/bin/env perl +use strict; +use warnings; + +use List::Util 'min'; +# use Smart::Comments; +use Data::Dumper; + +sub manhattan_distance { + my $ref = shift; + my ($x, $y) = @{$ref}; + + return abs(0 - $x) + abs(0 - $y); +} + +sub pedometer { + my $ref = shift; + my ($x, $y, $step_1, $step_2) = @{$ref}; + return $step_1 + $step_2; +} + +my %directions = ( + 'U' => [0, 1], + 'D' => [0,-1], + 'R' => [1, 0], + 'L' => [-1,0] +); + +my $turn = 0; +my @intersections = (); +my %map; + +while(<>) { + chomp; + my @path = split /,/; + my @coord = (0,0); # Starting point + my $num_steps = 0; + + if (!$turn){ + foreach my $way (@path) { + my ($dir, $speed) = ($1, $2) if ($way =~ /(\w)(\d+)/) or die "$!"; + for (1..$speed) { + $coord[0] += @{$directions{$dir}}[0]; + $coord[1] += @{$directions{$dir}}[1]; + $num_steps++; + $map{"$coord[0],$coord[1]"} = $num_steps; + } + } + $turn = !$turn; + } else { + foreach my $way (@path) { + my ($dir, $speed) = ($1, $2) if ($way =~ /(\w)(\d+)/) or die "$!"; + for (1..$speed) { + $coord[0] += @{$directions{$dir}}[0]; + $coord[1] += @{$directions{$dir}}[1]; + $num_steps++; + if (exists $map{"$coord[0],$coord[1]"}) { + push @intersections, [@coord,$num_steps,$map{"$coord[0],$coord[1]"}]; + } + } + } + } +} + +# print Dumper \@intersections; +print(min(map {pedometer($_);} @intersections)); + + diff --git a/2019/day4/password.lp b/2019/day4/password.lp new file mode 100644 index 0000000..b9a1f1a --- /dev/null +++ b/2019/day4/password.lp @@ -0,0 +1,17 @@ +%353096-843212 +digit(X) :- X = 0..9. +place(N) :- N = 1..6. + +1 {pass(Q,X) : digit(X)} 1 :- place(Q). +value(N) :- N = A + B * 10 + C * 100 + D * 1000 + E * 10000 + F * 100000, pass(6,A), pass(5,B), pass(4,C), pass(3,D), pass(2,E), pass(1,F). + +:- value(N), N < 353096. +:- value(N), N > 843212. + +:- pass(Q,X), pass(Q', Y), Q' = Q + 1, X > Y. +%:- pass(Q,X), pass(Q', Y), pass(QQ, Z), Q' = Q + 1, QQ = Q' + 1, X = Y, Y = Z. % I couldn't figure out this so I did 581 - 2 + +%1 {target(X,Y,XX,YY) : dir(DX,DY), XX-X = DX*S, YY-Y = DY*S, size(S), area(XX,YY,_)} 1 :- number(X,Y,_). + +#show pass/2. +#show value/1. diff --git a/2019/day4/password.pl b/2019/day4/password.pl new file mode 100644 index 0000000..403cf91 --- /dev/null +++ b/2019/day4/password.pl @@ -0,0 +1,29 @@ +use strict; +use warnings; + +use Data::Dumper; + +my $low_bound = 353096; +my $upper_bound = 843212; + +my $count = 0; + +for (my $number = $low_bound; $number < $upper_bound; $number++) { + my @nums = split //, $number; + my @cmp = sort {$a <=> $b} @nums; + if (@nums == @cmp and join ("\0", @nums) eq join ("\0", @cmp)) { + my %digits = (); + foreach (@nums) { + $digits{$_}++; + } + foreach my $reps (values %digits) { + if ($reps == 2) { + print "$number\n"; + $count++; + last; + } + } + } +} + +print ">$count\n"; diff --git a/2019/day5/intcode.pl b/2019/day5/intcode.pl new file mode 100644 index 0000000..613f067 --- /dev/null +++ b/2019/day5/intcode.pl @@ -0,0 +1,92 @@ +use strict; +use warnings; +use Data::Dumper; +# use Smart::Comments; +use v5.10; + +sub pos { + my ($tape_ref, $index) = @_; + my @tape = @{ $tape_ref }; + ### returning: $tape[$tape[$index]] + ### for: $index + return $tape[$tape[$index]]; +} + +sub imm { + my ($tape_ref, $index) = @_; + my @tape = @{ $tape_ref }; + return $tape[$index]; +} + +my $inputline = ; +chomp $inputline; +my @tape = split /,/, $inputline; + +my $pc = 0; # program counter is no longer consistent + +my @actions = ( + sub { print "noop" }, # no opcode 0 + sub { return $_[0] + $_[1] }, # 1 + sub { return $_[0] * $_[1] }, # 2 + sub { return 5; }, # 3 + sub { say $_[0]; }, # 4 + sub { return $_[0] ? $_[1] : -1 }, # 5, ugh, you might want to jump to 0 + sub { return $_[0] ? -1 : $_[1] }, # 6 + sub { return $_[0] < $_[1] ? 1 : 0}, # 7 + sub { return $_[0] == $_[1] ? 1 : 0}, # 8 +); + +my @modes = (\&pos, \&imm); +my %offsets = qw/1 4 2 4 3 2 4 2 5 3 6 3 7 4 8 4 99 1/; +my $inst_ptr = 0; + +while ( 1 ) { + + my $raw_op_code = $tape[$inst_ptr]; + last if ($raw_op_code == 99); + + # print("====================================\n"); + + my @modes_and_opcode; + push @modes_and_opcode, $_ // 0 for $raw_op_code =~ m/^(\d)??(\d)??(\d)??0?(\d)$/g; + ### @modes_and_opcode + + my $op_code = pop @modes_and_opcode; + ### $op_code + + # foreach my $x (0..5) { + # print("TAPE[" . ($inst_ptr + $x) . "] = $tape[($inst_ptr + $x)]\n") + # } + + my $toread = $offsets{$op_code} - 1; # excluding opcode + my @params; + foreach my $offset (1..$toread) { + push @params, $modes[ (!($op_code == 4 || $op_code == 5 || $op_code == 6) && $offset == $toread) ? 1 : pop @modes_and_opcode ]->(\@tape, $inst_ptr + $offset); + } + ### @params + + $inst_ptr += $offsets{$op_code}; + + if ($op_code == 1 || $op_code == 2 || $op_code == 7 || $op_code == 8) { # arithmetic + my $res = $actions[$op_code]->($params[0], $params[1]); + $tape[$params[2]] = $res; + ### writing: $res + ### on address: $params[2] + } + elsif ($op_code == 3) { # input + my $res = $actions[$op_code]->(); + $tape[$params[0]] = $res; + ### saved: $res + ### on: $params[0] + } elsif ($op_code == 4) { # output + $actions[$op_code]->($params[0]); + } elsif ($op_code == 5 || $op_code == 6) { # jumps + my $res = $actions[$op_code]->($params[0], $params[1]); + $inst_ptr = $res == -1 ? $inst_ptr : $res; + ### jumped to: $inst_ptr + next; + } else { + ### OH NO... + die; + } +} diff --git a/2019/day5/part1.in b/2019/day5/part1.in new file mode 100644 index 0000000..9d9b84d --- /dev/null +++ b/2019/day5/part1.in @@ -0,0 +1 @@ +3,225,1,225,6,6,1100,1,238,225,104,0,1002,114,19,224,1001,224,-646,224,4,224,102,8,223,223,1001,224,7,224,1,223,224,223,1101,40,62,225,1101,60,38,225,1101,30,29,225,2,195,148,224,1001,224,-40,224,4,224,1002,223,8,223,101,2,224,224,1,224,223,223,1001,143,40,224,101,-125,224,224,4,224,1002,223,8,223,1001,224,3,224,1,224,223,223,101,29,139,224,1001,224,-99,224,4,224,1002,223,8,223,1001,224,2,224,1,224,223,223,1101,14,34,225,102,57,39,224,101,-3420,224,224,4,224,102,8,223,223,1001,224,7,224,1,223,224,223,1101,70,40,225,1102,85,69,225,1102,94,5,225,1,36,43,224,101,-92,224,224,4,224,1002,223,8,223,101,1,224,224,1,224,223,223,1102,94,24,224,1001,224,-2256,224,4,224,102,8,223,223,1001,224,1,224,1,223,224,223,1102,8,13,225,1101,36,65,224,1001,224,-101,224,4,224,102,8,223,223,101,3,224,224,1,223,224,223,4,223,99,0,0,0,677,0,0,0,0,0,0,0,0,0,0,0,1105,0,99999,1105,227,247,1105,1,99999,1005,227,99999,1005,0,256,1105,1,99999,1106,227,99999,1106,0,265,1105,1,99999,1006,0,99999,1006,227,274,1105,1,99999,1105,1,280,1105,1,99999,1,225,225,225,1101,294,0,0,105,1,0,1105,1,99999,1106,0,300,1105,1,99999,1,225,225,225,1101,314,0,0,106,0,0,1105,1,99999,8,677,226,224,1002,223,2,223,1006,224,329,1001,223,1,223,1108,226,226,224,1002,223,2,223,1005,224,344,101,1,223,223,1108,226,677,224,1002,223,2,223,1006,224,359,101,1,223,223,107,226,226,224,1002,223,2,223,1005,224,374,101,1,223,223,1107,226,226,224,1002,223,2,223,1005,224,389,101,1,223,223,107,677,677,224,102,2,223,223,1006,224,404,101,1,223,223,1008,226,226,224,1002,223,2,223,1006,224,419,101,1,223,223,108,677,226,224,1002,223,2,223,1006,224,434,101,1,223,223,1108,677,226,224,102,2,223,223,1005,224,449,101,1,223,223,1008,677,226,224,102,2,223,223,1006,224,464,1001,223,1,223,108,677,677,224,102,2,223,223,1005,224,479,101,1,223,223,7,677,677,224,102,2,223,223,1005,224,494,1001,223,1,223,8,226,677,224,102,2,223,223,1006,224,509,101,1,223,223,107,677,226,224,1002,223,2,223,1005,224,524,1001,223,1,223,7,677,226,224,1002,223,2,223,1005,224,539,1001,223,1,223,1007,226,677,224,1002,223,2,223,1005,224,554,1001,223,1,223,8,677,677,224,102,2,223,223,1006,224,569,101,1,223,223,7,226,677,224,102,2,223,223,1006,224,584,1001,223,1,223,1008,677,677,224,102,2,223,223,1005,224,599,101,1,223,223,1007,677,677,224,1002,223,2,223,1006,224,614,101,1,223,223,1107,677,226,224,1002,223,2,223,1006,224,629,101,1,223,223,1107,226,677,224,1002,223,2,223,1006,224,644,101,1,223,223,1007,226,226,224,102,2,223,223,1005,224,659,1001,223,1,223,108,226,226,224,102,2,223,223,1006,224,674,101,1,223,223,4,223,99,226 diff --git a/2019/day6/orbits.pl b/2019/day6/orbits.pl new file mode 100644 index 0000000..9f4aed5 --- /dev/null +++ b/2019/day6/orbits.pl @@ -0,0 +1,39 @@ +use strict; +use warnings; + +my $file_name = $ARGV[0]; + +if (not defined $file_name) { + die "missing filename\n"; +} + +open my $fh, "<", $file_name or die "Can't open $file_name, $!\n"; + +my %orbit; + +while (<$fh>) { + chomp; + my ($from, $to) = split /\)/; + push @{ $orbit{$from} }, $to; +} + +close $fh; + +my @to_value = ('---', 'COM'); +my $dist = 0; +my $total = 0; + +while ( 1 ) { + + my $cur = pop @to_value; + + print $total and exit unless @to_value; + + if ($cur eq '---') { + unshift @to_value, '---'; + $dist++; + } else { + $total += $dist; + unshift @to_value, @{ $orbit{$cur} } if exists $orbit{$cur}; + } +} diff --git a/2019/day6/orbits.py b/2019/day6/orbits.py new file mode 100644 index 0000000..652256f --- /dev/null +++ b/2019/day6/orbits.py @@ -0,0 +1,28 @@ +# this solves part 2 +import sys + +import networkx as nx + + +def main(argv): + + G = nx.DiGraph() + with open(argv[0]) as fp: + for line in fp: + line = line.rstrip("\n") + start, end = line.split(")") + G.add_node(start, label=start) + G.add_node(end, label=end) + G.add_edge(start, end) + + jump_to = nx.lowest_common_ancestor(G, "SAN", "YOU") # SAN and YOU are given + jumps = ( + len(nx.shortest_path(G, jump_to, "SAN")) + + len(nx.shortest_path(G, jump_to, "YOU")) + - 4 + ) # 4 because len includes start and end, so -2 times 2 + print(jumps) + + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/2019/day6/part1.in b/2019/day6/part1.in new file mode 100644 index 0000000..8cafbd0 --- /dev/null +++ b/2019/day6/part1.in @@ -0,0 +1,1069 @@ +WGB)S14 +WN4)27C +18L)M18 +1HY)6ZP +TQ9)KQ6 +HQ3)HH1 +FLC)F1Z +D6R)ZPC +2VD)GK3 +YY3)3TP +PBL)3CK +5K4)CB5 +V5M)CNN +L4T)RHS +HHH)66F +Q3Y)DTL +DGN)YY3 +CCT)L3B +Z6X)FM2 +2QQ)VK9 +MX3)C9J +4JK)BPX +8BP)N13 +PBW)6Z6 +2LT)DT9 +JHX)GXM +5LW)BHQ +DNK)ZBT +29Z)T9D +WNP)TDC +S38)GL6 +DW9)V2F +4MG)3FW +Z9Z)CPK +FKL)QNH +55D)HT2 +D1D)N4Q +Y7W)1Y8 +SFQ)79W +JSR)62W +4WN)J18 +VK9)J2H +LS5)DCX +6LR)P4X +HDV)DGQ +1K9)KD1 +2PX)17C +KSB)GL8 +B4S)VTV +ZW1)KNR +BVH)43P +VKP)6L3 +P5K)MHR +XHR)STT +WBG)5X5 +HZF)8JQ +B47)NW4 +J5V)3ZW +KGP)VVR +24K)PK8 +31V)LXC +5XG)RHP +P1G)HN8 +R76)3GY +5CH)17Q +TVC)XJM +598)RD3 +J66)LKC +4DY)YSQ +M4Y)NLL +SMP)M2M +TBR)WNP +K22)KGP +MQ5)8MN +B9Q)6HQ +P9S)X92 +TJK)ZQK +XS7)7KL +H6J)DX1 +MTP)3Z6 +B17)B7P +S12)PC2 +47V)5KW +KCY)HWP +FB2)S38 +V5M)FNT +GXM)QPR +HXR)2R2 +2LV)NDP +6HQ)12S +22P)4HL +T8Q)9FB +8YW)TVZ +DR1)NNN +9TH)87Z +79W)TM2 +5GB)HQM +1HY)4WN +LFV)RYJ +YCN)ZMK +8SR)SB3 +P9H)PH9 +ZGQ)T3J +KWW)1HY +TLF)RPG +PFD)HZR +9SF)7PY +DCX)VCC +D1R)2RB +GXC)NN9 +ZZW)SCC +G44)Q8D +923)3J2 +KY2)8F4 +1XQ)7LD +GHX)Q6M +TZ5)V32 +LM9)1XK +Q7N)Z7H +YKD)73H +9RZ)C2Q +5KN)P1G +3FJ)L73 +ZPC)VYT +Y7D)FFY +C8W)J1Y +X5T)55D +Z3F)GK8 +WRS)PRR +T9M)JK2 +81P)5WT +7KL)5BK +S3R)VCD +56L)D1R +PR2)92L +91F)2F4 +ND4)PJ6 +9KY)YD4 +CLH)5D7 +J2F)L7Z +M4Y)PYG +891)P34 +VV6)18L +RQQ)X8P +7SR)8G6 +WJ8)CDL +9FB)TXD +RKK)2H5 +3W8)2QQ +27C)YFC +RZZ)91F +4CP)BWH +T4L)LS5 +788)G7S +47V)3W8 +FGK)719 +16Q)4KW +5H6)PC9 +KGS)TBR +44Y)BVH +GMF)VFM +LKC)PM4 +DPL)DXS +2WD)X5T +XWX)NYR +N44)Y36 +72S)56L +W25)4MG +P9S)HBC +W84)3YP +NW4)S78 +58Y)LDB +QJ9)VV1 +5D3)4Q7 +T3J)5M4 +394)ZW7 +JXL)QVK +7KL)FTL +885)ZGQ +58Y)8SR +GXN)PBW +HH1)JB4 +H6J)W95 +VYK)SQS +CCS)7CZ +PJ7)NLR +2VW)MSP +ZWK)H6X +HJ4)C1S +H41)1L3 +8B9)64N +RZR)WBJ +FNT)VL7 +K5M)S5Q +XJM)TC7 +QWT)7Q5 +43P)MY2 +YP7)51N +TDX)FWZ +DB3)NCK +37M)H2L +Z3X)XRS +SGV)R2T +Y2F)63M +ZVY)JTX +DJB)KQD +848)FQP +SX3)FM5 +PH9)ZPG +75S)Z9L +GPD)Y7D +9Y6)52N +SL4)S3R +4TH)T6F +K4V)D8V +89S)18F +GDN)WN4 +6HT)TQZ +V1Q)JVG +R55)2LC +KH3)NT5 +Q53)3DN +SRV)JND +XMC)MKK +T5J)6HT +HZR)M1M +P34)3RY +HF6)SD2 +PTM)C9X +3MZ)T9M +R76)MFF +B9Y)3MC +NFG)5FC +M63)4CP +FRG)PVQ +58Z)GDM +ZT8)4L5 +F5B)KF3 +SQT)NTZ +M2M)252 +35Y)5WF +C9J)8BP +W8H)F78 +H8Z)2VW +91P)5FP +VTV)YN7 +2KM)1K9 +KSX)TR8 +9DK)XD6 +MFF)KQR +414)6L9 +FQ7)T5K +G8M)WPX +794)FMS +WZV)XS7 +VVR)5CH +R8G)9RH +B4D)2RT +PJ6)GWB +63M)NHF +8G7)8B9 +QP5)9ZW +FW6)CDM +S5Q)172 +T24)TPD +YRT)GMF +1TJ)SGV +RV3)C3D +661)MHS +QYT)D2K +T49)MFP +GY7)T2Q +686)Z4G +J49)R9L +R5S)67X +L7Z)5RM +RPP)WG9 +5KW)2KM +5N2)Y7W +Z3X)JFD +KD8)4H5 +5MP)RVK +12S)S2Y +TPD)D5F +51N)81P +DCH)SGQ +L6N)VKP +2XQ)6LR +3DN)S3L +VS4)83N +8DJ)WZP +DCX)FX1 +SF9)Z3F +R49)S99 +D1C)794 +TKN)L83 +21R)GP3 +5RM)TG3 +ZMK)R49 +1QT)152 +9DX)GXC +GYC)TQ9 +JND)LMK +D8Z)SCW +VNZ)VS4 +C1S)9RZ +LKF)D8Z +G4J)R44 +92L)J66 +88P)657 +8Z5)R55 +VV1)KRY +N44)2QK +KBC)KKG +91P)L6N +SVH)7W3 +P9Z)34H +BWH)9TH +JNX)RZZ +YFG)ZT8 +DSM)FF3 +BMK)ZR6 +7W3)V82 +T9D)H2S +2QF)PFD +NDQ)F13 +ZVB)MX6 +KRY)7FB +KKG)HJ4 +QNH)MFQ +5X5)VQM +HQM)HF6 +HLT)TD2 +WV4)FWH +N2T)5B5 +D1R)P89 +HKT)3MZ +ZQK)1DK +QQQ)FLC +73Z)TTM +ZZW)769 +8G7)TYL +MFP)WMS +RQS)2YC +NLL)JHX +KCY)CSP +9F8)51H +SGQ)B27 +4KM)VYK +JDY)MTW +T8Q)DB3 +1VL)VV6 +VV5)B4D +SPF)JR5 +LYS)6CK +YMK)2VD +TD2)1VL +JKH)QHX +VD4)58J +9QQ)HKL +8JP)HQ3 +NHS)31S +81Z)Q5W +R7Q)Z9M +WMS)ZK2 +3J2)GY7 +MFQ)CLH +S14)934 +HY7)YBT +4SY)63F +NQF)PPQ +T9W)RZR +WL2)6QM +LZV)WRQ +TVZ)T9P +4X5)GN5 +NQ8)FPQ +J5J)K51 +Y8T)WGM +FPQ)B53 +1XK)TKX +XDW)72V +WW8)9QQ +XX7)Q7N +CDM)GHX +VCC)HPP +QRK)56B +MTW)2QT +7V5)58Z +PYY)T24 +9HB)J8F +TTM)PTB +FF3)ZY3 +ZW7)D1D +T4H)ZTG +2PW)DSM +9WB)4TH +17C)FKX +T6F)QP3 +G6R)XHR +H5T)QYT +DX1)Q9L +GJF)ZF3 +LJP)JXL +QHX)3XY +DNF)8KQ +8Q1)NDQ +GP3)6MY +FPQ)QQQ +XRS)923 +Q6M)7BS +K21)B47 +TQZ)WJ4 +9PB)3PQ +8G6)X7M +L3B)YOU +L5V)G2L +B8Y)JVS +GL6)MTP +9QZ)NRN +486)T8Q +HNN)PNM +NFK)B4S +G9C)LHT +4K9)SL4 +8X5)179 +VQM)47V +CNJ)J4R +ZD5)2PX +9TQ)X9Q +Q3Q)9DK +17Q)1KX +5GN)24K +K5Q)1NF +LCK)9WB +TYL)PYL +7XG)R2L +LXC)ZWK +Q62)SPF +89C)N7Z +GK8)GR7 +6X1)5N2 +XM8)8Q1 +MCD)GXQ +S2Y)N7G +CB5)C8W +NHF)44B +QPR)GF5 +HGX)YMY +3FW)2LV +5WF)RQQ +841)N31 +Q9L)876 +WQ8)HZ7 +6K1)QVC +C2T)FQX +J3M)HLT +H2S)K5Q +STQ)8ZF +VDX)NQF +YSR)G8M +CSL)NLF +MHS)3FH +YN7)VWC +RSW)X11 +FXS)L54 +YBT)HX4 +BHQ)FRG +83H)K4Q +NT5)2ZB +GWB)4K9 +YMY)5KN +4Q7)C3G +D3J)HZF +32D)GN7 +VGG)G3D +LVG)JXR +25V)GDN +L6V)KL8 +FW2)STQ +V6H)8G7 +COM)CB6 +6Z6)SQT +W81)6M3 +D2K)XF6 +2NX)9KY +KRQ)LKF +P1B)VVQ +QTV)Q3Y +DTZ)ZLY +R3T)FQ7 +D92)72S +H8N)9Y6 +FWZ)WGB +VQW)LHJ +2HB)848 +9ZW)NT8 +NLR)QTV +31V)DSZ +92J)WXY +8LK)QQ3 +769)ZD5 +8L9)T5J +TB2)V5M +VZQ)57T +Z7H)JMR +94D)YCN +ZPF)6WK +M1F)6C2 +MHV)ZCS +Q53)FBC +RPG)P3N +RHS)JDY +FTL)FB2 +J47)R3T +Y9S)4JK +ZVY)TK6 +LTX)BM5 +D8V)3R6 +J18)S19 +PVQ)WL2 +ZPV)QFW +719)CSV +XK9)9Q9 +BM5)L5V +LDF)WZT +MSP)DTZ +HRQ)JBG +19C)GSP +GPB)HGX +2F4)8HL +886)C8J +ZF3)LM9 +NQ1)394 +WM9)M79 +PM4)GNT +6J4)ML2 +5WT)HQS +KQD)5K4 +JBT)V1Q +JVS)DDT +3G2)52L +8ZF)D6R +4BQ)5H6 +G7T)7T6 +ZY3)83H +HYC)G9C +MX6)XC9 +2NW)2SH +YXJ)JSR +QNH)YJN +TG3)886 +N7Z)G98 +5D7)KNW +8TN)KH3 +C78)TSW +87Z)DFM +QGG)Q53 +NRN)YP7 +TTB)C2T +ZLY)25P +7KS)D5X +LNX)CNJ +QVK)YMK +CNN)N43 +5Q9)MWG +SCC)XFV +885)G7T +4BS)4BQ +N4Q)Z6X +FQX)7W4 +MLL)NF8 +52N)PZ2 +DNF)KBC +6C2)CCS +LZ8)P1B +CSV)686 +PZ2)KKC +JMR)327 +3TP)N6L +3W8)YFG +S62)J5V +FF3)VXL +4X4)MHQ +3TP)7Z7 +L83)VDN +Q8D)2HB +JB4)5LR +VYT)SAN +L54)X63 +15J)XF2 +FWZ)WLR +R44)K5M +TK6)Q5J +J81)QP5 +114)BGP +QQ3)PJ7 +D5F)HNN +MFF)WW8 +J18)MP3 +9JN)M8G +2YC)CSL +R2T)4TS +ZBT)WQ8 +XFV)MPD +R9S)XDW +8HL)99X +4MG)2QF +8X5)BMK +CN7)KSB +YJN)44Y +X11)WWY +5MP)VDX +R2L)PFY +6ZP)HPW +WGM)GPB +WCZ)KCY +NYR)TKN +1L3)SKC +MND)S5K +17N)2D1 +VL7)16Q +5FP)J5J +NBL)TLF +QDV)Z9Z +2S1)VXW +K22)G6R +DTL)9Z8 +BXN)YXJ +VYW)LNX +WJ4)4LM +JTX)DPL +SLM)DNF +YM4)J37 +4L5)BF4 +2RT)8DD +FNB)KD8 +PK8)9PD +RLR)4SY +TM2)661 +PQ6)2FF +92J)XMC +GDM)21R +ZTG)VV5 +X3B)ZZW +5XQ)H6J +WTL)W1N +PNM)H8Z +6MY)CG5 +72V)RLR +3R6)WCZ +PF8)YRM +HPY)88T +X8P)MHN +7LY)6VJ +2FF)C9G +K4Q)4BS +X63)2WD +XM8)R8Q +G98)Z3X +44B)8DJ +PWZ)V1P +MDD)7ZX +RRD)T49 +YBJ)DBX +GXQ)BXP +6FX)88P +WXZ)H22 +18F)WTL +NQF)885 +L4T)XM2 +V82)4DY +6N6)TDX +172)QRK +N6L)23T +CSP)5MP +GLG)9TQ +9P6)R76 +W1N)N3F +R8G)JZ1 +H2L)F2D +TGT)C9S +7BS)2XQ +FWH)TVM +23T)K3L +WQX)37M +3ZW)QH7 +BGP)FW6 +YFC)FGH +JCF)94D +WRQ)9JN +GN5)6RM +V6H)QGG +C1S)XK9 +FFY)9SF +WPX)HKT +7Y1)NBL +6RN)GPD +NYJ)YDT +934)FKL +P3N)FXS +ZQS)KXC +4KW)PVJ +FMS)V26 +NT8)WM9 +7Z7)G4J +NN9)2TT +VXW)DJB +C97)Q3Q +VVQ)486 +CB6)DGN +DGQ)WMN +FM5)GJF +6YY)DPN +DDT)814 +KF3)SFQ +G7S)TTB +R4C)S12 +R8Q)35Y +GXN)JKH +J2H)K22 +F5B)7LY +NCK)YSR +SMP)KY2 +P4X)X3B +DR5)LZ8 +8JQ)ZPV +WG9)SX3 +NDQ)LM2 +32S)LFV +K51)ND4 +DP3)QDV +2W7)CCT +RSK)YH6 +9NZ)NSB +K3L)RV3 +HN8)414 +92N)75S +61M)598 +ZR6)53T +J8F)TB2 +H22)5YX +HSJ)M63 +4KW)5GB +HR7)89C +FQP)15J +TZ5)LYS +5FP)WG4 +4HL)PBL +C8J)D1C +TS3)83C +C3G)1QT +GZD)DNK +2RB)KSF +BCD)SF9 +327)9QZ +4FF)ZQS +6L9)82F +TJK)123 +X9M)FMY +R92)TV1 +CDL)2PW +7ZX)58Y +C2N)H5T +8MN)TH2 +GN7)G44 +HKL)61M +XD6)1C9 +ZCS)NQ8 +2L8)QGH +DFC)XX7 +S5K)XM8 +58J)8L9 +PRR)4KM +6XT)N2T +FM2)7Y1 +V26)HR7 +2TT)91P +88F)ZW1 +JBG)891 +WZT)VZQ +PYG)NHS +2QT)P9H +FB2)9QT +MP3)PQ6 +WZV)YBJ +H53)VYW +N2T)VQW +ZK2)6RT +SQS)5XQ +DPN)W8H +TSW)2L8 +73H)R7Q +F1Z)B9Q +M8G)9KS +NSB)H41 +WBJ)THR +KSF)KGS +PXH)3BS +4NT)ZRV +VNZ)8X5 +98S)DR1 +3XY)TJK +JNX)P9Z +F4P)6YY +VRT)VKV +TVM)92N +WLR)S62 +D5X)ZVB +152)9P6 +F2D)PN3 +2R2)D6K +ZRV)2NX +67X)TS3 +HWP)YBD +5FC)SRV +X92)CQR +8N9)DFC +Q5J)H8N +GGG)8LK +PPQ)841 +6RT)WJ8 +KQR)788 +92N)Q62 +W7S)98S +S19)NFK +VRM)ZVY +GL8)DCH +4YM)17N +F13)D3J +QVC)VGG +31S)J81 +934)93X +Q21)R4C +TH2)HQ4 +1C9)114 +83N)X5B +S3L)T4L +SD2)ZWX +SC1)6K1 +TXD)ZPF +3GY)NQ1 +Z9M)9NS +D6R)7V5 +WG4)C2N +SVH)JBT +TR8)K4V +MPD)7SR +Y36)DP3 +LM2)K21 +KD1)2S1 +FC8)J3M +JFD)BWF +6Y3)88F +STT)GXN +KKC)DW9 +52L)B3G +5BK)XWX +H6X)5BQ +YH6)FGK +VM3)6RN +BWH)1PZ +JK2)BCD +9QT)LTX +6WK)F5B +HYC)C97 +GSP)3MR +6M3)B9P +7LD)9NZ +N31)7KS +GGG)9PB +6RM)SC1 +83C)TGT +BWT)1TJ +7YH)CN7 +JLD)PFT +W95)JNX +ZBT)Y2F +TPD)RSK +3BS)BR6 +KG9)X9M +6HL)5D3 +WMN)P9S +V32)V6H +RYJ)3HM +SF9)SBK +HQ4)19C +BWF)2W7 +2LC)91R +VCD)3G2 +VKJ)9BJ +NL2)VKJ +NLF)HY7 +BR6)L6V +TQ4)8N9 +QH7)W84 +D6K)GGG +W1J)SLM +DB2)RQS +M18)RRD +DXS)32S +KL8)YRT +Q5W)VD4 +SCC)WQX +GQW)VRT +52N)J47 +Z9M)6FX +FKX)GSK +TKX)WRS +7YH)NFG +9Y6)WZV +7BS)48W +NT5)KSX +1Y8)RYV +814)J2F +GSK)KRQ +FBC)W1J +C9G)VRY +V2F)8TN +5M4)Y9S +X9Q)T71 +Q7G)9HB +YLR)4YM +18L)29D +M1M)1BT +82F)MX3 +9BJ)BBL +R55)HRQ +9RH)R5S +414)MHV +ML2)Y8T +179)7YH +GK3)5Q9 +7CZ)VRM +QP3)LDF +YRM)D92 +KXC)B8Y +2ZB)6X1 +XWX)JCF +B3G)CG7 +LHT)4NT +NNN)5LW +48W)R9S +91R)6J4 +97T)BBF +1BT)KWW +B53)QL9 +HBC)DB2 +2D1)89S +BBL)WBG +7WK)LJP +TV1)SNJ +K5Q)L9Q +HNN)YKD +BXP)W81 +64N)GLG +L9Q)M4Y +PTB)8JP +RHP)3FJ +657)PWZ +HZ7)T8S +YKD)W25 +PYL)SMP +YSQ)HSJ +W84)9F8 +HQS)NL2 +3MC)6Y3 +24K)MDD +G3D)B17 +2QF)PXH +38D)FNB +614)SVH +34H)BWT +6L3)GZD +J1Y)QJ9 +3XF)GG9 +MHQ)25V +3PQ)L4T +57T)3W4 +8KQ)614 +PC9)P5K +C2Q)F4P +J37)FW2 +TDC)M1F +YD4)LZV +4H5)HYC +VRY)5XG +3W4)YLR +JZ1)Q21 +SBK)1XQ +RVK)6XT +9NS)LVG +JBT)612 +J4R)QWT +YDT)31V +123)C78 +PN3)PTM +6QM)5GN +CG7)PF8 +HX4)T4H +6CK)HXR +PFT)H53 +62W)FC8 +KQ6)4X5 +3CK)8Z5 +RHS)Q7G +N13)2LT +D3J)NYJ +PFY)N44 +N3F)4FF +P89)29Z +MHN)J49 +S78)LCK +8DD)DR5 +51H)VM3 +1NF)MLL +S99)RKK +9PD)JLD +7Q5)7WK +7WK)MND +CQR)KG9 +X5B)VTN +SCW)RPP +BF4)3XF +QL9)R8G +LDB)4X4 +VDN)73Z +9KY)BXN +VTN)WJ1 +8F4)PR2 +F78)92J +7SX)GQW +GR7)22P +56B)7SX +876)HPY +HNP)V7Y +SNJ)HHH +KNR)W7S +HT2)T9W +PC2)B9Y +6VJ)HNP +4TS)32D +7FB)TZ5 +5BQ)PRT +PRT)97T +G44)9DX +THR)81Z +25P)MCD +Z9L)R92 +V1P)L1D +DSZ)TVC +VKV)TQ4 +4LM)YM4 +T8S)6N6 +HPP)WV4 +99X)8YW +B9P)HDV +T2Q)TNM +JVG)7XG +QGH)KTD +DBX)VNZ +DFM)RSW +29D)GYC +LYS)38D +MKK)WXZ +5B5)MQ5 +BPX)2NW +5LR)PYY +VXL)6HL diff --git a/2019/day7/comm.py b/2019/day7/comm.py new file mode 100644 index 0000000..458d8b1 --- /dev/null +++ b/2019/day7/comm.py @@ -0,0 +1,19 @@ +from itertools import permutations +import os +import subprocess + +perm = permutations(range(5)) +res = [] + +for seq in perm: + signal = 0 + for phase in seq: + out = subprocess.run( + ["perl", "intcode.pl", "part1.in"], + capture_output=True, + input=b"%d\n%d" % (phase, signal), + ) + signal = int(out.stdout) + res.append(signal) + +print(sorted(res)[-1]) diff --git a/2019/day7/intcode.pl b/2019/day7/intcode.pl new file mode 100644 index 0000000..d83d2db --- /dev/null +++ b/2019/day7/intcode.pl @@ -0,0 +1,109 @@ +use strict; +use warnings; +use Data::Dumper; +# use Smart::Comments; +use v5.10; + +$| = 1; + +sub pos { + my ($tape_ref, $index) = @_; + my @tape = @{ $tape_ref }; + ### returning: $tape[$tape[$index]] + ### for: $index + return $tape[$tape[$index]]; +} + +sub imm { + my ($tape_ref, $index) = @_; + my @tape = @{ $tape_ref }; + return $tape[$index]; +} + +my $file_name = $ARGV[0]; + +if (not defined $file_name) { + die "missing filename\n"; +} + +open my $fh, "<", $file_name or die "Can't open $file_name, $!\n"; + +my $inputline = <$fh>; +chomp $inputline; +my @tape = split /,/, $inputline; +close $fh; + +my $pc = 0; # program counter is no longer consistent + +my @actions = ( + sub { print "noop" }, # no opcode 0 + sub { return $_[0] + $_[1] }, # 1 + sub { return $_[0] * $_[1] }, # 2 + sub { + print STDERR ("Getting input!\n"); + my $in = ; + print STDERR ("Read >$in<\n"); + chomp $in; + return $in; + }, # 3 + sub { say $_[0]; }, # 4 + sub { return $_[0] ? $_[1] : -1 }, # 5, ugh, you might want to jump to 0 + sub { return $_[0] ? -1 : $_[1] }, # 6 + sub { return $_[0] < $_[1] ? 1 : 0}, # 7 + sub { return $_[0] == $_[1] ? 1 : 0}, # 8 +); + +my @modes = (\&pos, \&imm); +my %offsets = qw/1 4 2 4 3 2 4 2 5 3 6 3 7 4 8 4 99 1/; +my $inst_ptr = 0; + +while ( 1 ) { + + my $raw_op_code = $tape[$inst_ptr]; + last if ($raw_op_code == 99); + + # print("====================================\n"); + + my @modes_and_opcode; + push @modes_and_opcode, $_ // 0 for $raw_op_code =~ m/^(\d)??(\d)??(\d)??0?(\d)$/g; + ### @modes_and_opcode + + my $op_code = pop @modes_and_opcode; + ### $op_code + + # foreach my $x (0..5) { + # print("TAPE[" . ($inst_ptr + $x) . "] = $tape[($inst_ptr + $x)]\n") + # } + + my $toread = $offsets{$op_code} - 1; # excluding opcode + my @params; + foreach my $offset (1..$toread) { + push @params, $modes[ (!($op_code == 4 || $op_code == 5 || $op_code == 6) && $offset == $toread) ? 1 : pop @modes_and_opcode ]->(\@tape, $inst_ptr + $offset); + } + ### @params + + $inst_ptr += $offsets{$op_code}; + + if ($op_code == 1 || $op_code == 2 || $op_code == 7 || $op_code == 8) { # arithmetic + my $res = $actions[$op_code]->($params[0], $params[1]); + $tape[$params[2]] = $res; + ### writing: $res + ### on address: $params[2] + } + elsif ($op_code == 3) { # input + my $res = $actions[$op_code]->(); + $tape[$params[0]] = $res; + ### saved: $res + ### on: $params[0] + } elsif ($op_code == 4) { # output + $actions[$op_code]->($params[0]); + } elsif ($op_code == 5 || $op_code == 6) { # jumps + my $res = $actions[$op_code]->($params[0], $params[1]); + $inst_ptr = $res == -1 ? $inst_ptr : $res; + ### jumped to: $inst_ptr + next; + } else { + ### OH NO... + die; + } +} diff --git a/2019/day7/part1.in b/2019/day7/part1.in new file mode 100644 index 0000000..a700dd4 --- /dev/null +++ b/2019/day7/part1.in @@ -0,0 +1 @@ +3,8,1001,8,10,8,105,1,0,0,21,46,59,72,93,110,191,272,353,434,99999,3,9,101,4,9,9,1002,9,3,9,1001,9,5,9,102,2,9,9,1001,9,5,9,4,9,99,3,9,1002,9,5,9,1001,9,5,9,4,9,99,3,9,101,4,9,9,1002,9,4,9,4,9,99,3,9,102,3,9,9,101,3,9,9,1002,9,2,9,1001,9,5,9,4,9,99,3,9,1001,9,2,9,102,4,9,9,101,2,9,9,4,9,99,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,2,9,9,4,9,3,9,101,2,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,101,2,9,9,4,9,99,3,9,101,2,9,9,4,9,3,9,101,2,9,9,4,9,3,9,101,1,9,9,4,9,3,9,101,1,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,101,1,9,9,4,9,99,3,9,101,2,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,101,1,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,1,9,4,9,3,9,101,2,9,9,4,9,99,3,9,102,2,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,1001,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,1,9,4,9,3,9,101,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,2,9,4,9,99,3,9,1001,9,1,9,4,9,3,9,1001,9,1,9,4,9,3,9,1001,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,101,1,9,9,4,9,3,9,101,1,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,1,9,4,9,99 -- cgit v1.2.3-70-g09d2