days 5-11
This commit is contained in:
parent
d3ae65f625
commit
1d2d5def97
18 changed files with 804 additions and 0 deletions
72
10/1.pl
Normal file
72
10/1.pl
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use v5.10;
|
||||||
|
use Data::Dumper;
|
||||||
|
|
||||||
|
chomp (my @data = <STDIN>);
|
||||||
|
|
||||||
|
my (@cx, @cy, @vx, @vy);
|
||||||
|
|
||||||
|
foreach my $line (@data) {
|
||||||
|
# position=< 9, 1> velocity=< 0, 2>
|
||||||
|
|
||||||
|
my ($x, $y, $vx, $vy) =
|
||||||
|
($line =~ m/position=<\s*(-?\d+),\s*(-?\d+)> velocity=<\s*(-?\d+),\s*(-?\d+)>/);
|
||||||
|
say "$x,$y - $vx,$vy";
|
||||||
|
push @cx, $x;
|
||||||
|
push @cy, $y;
|
||||||
|
push @vx, $vx;
|
||||||
|
push @vy, $vy;
|
||||||
|
}
|
||||||
|
|
||||||
|
my $count = 0;
|
||||||
|
my $triggered = 0;
|
||||||
|
while () {
|
||||||
|
$count++;
|
||||||
|
my %sumY;
|
||||||
|
for (my $i = 0; $i <= $#cx; $i++) {
|
||||||
|
$cx[$i] += $vx[$i];
|
||||||
|
$cy[$i] += $vy[$i];
|
||||||
|
$sumY{$cy[$i]}++;
|
||||||
|
#say "$i $cx[$i],$cy[$i]";
|
||||||
|
}
|
||||||
|
my @most = sort { $sumY{$b} <=> $sumY{$a} } keys %sumY;
|
||||||
|
|
||||||
|
if ($sumY{$most[0]} > 14 || $triggered) {
|
||||||
|
say "count: $count";
|
||||||
|
$triggered = 1;
|
||||||
|
sleep 1;
|
||||||
|
my $minx = 999999999;
|
||||||
|
my $miny = 999999999;
|
||||||
|
my $maxx = 0;
|
||||||
|
my $maxy = 0;
|
||||||
|
for (my $i = 0; $i <= $#cx; $i++) {
|
||||||
|
($minx = $cx[$i]) if ($cx[$i] < $minx);
|
||||||
|
($miny = $cy[$i]) if ($cy[$i] < $miny);
|
||||||
|
($maxx = $cx[$i]) if ($cx[$i] > $maxx);
|
||||||
|
($maxy = $cy[$i]) if ($cy[$i] > $maxy);
|
||||||
|
}
|
||||||
|
my %render;
|
||||||
|
for (my $i = 0; $i <= $#cx; $i++) {
|
||||||
|
$cx[$i] -= $minx;
|
||||||
|
$cy[$i] -= $miny;
|
||||||
|
#say "$cx[$i], $cy[$i]";
|
||||||
|
$render{"$cx[$i],$cy[$i]"}=1;
|
||||||
|
|
||||||
|
}
|
||||||
|
for (my $y = 0; $y <= ($maxy-$miny); $y++) {
|
||||||
|
for (my $x = 0; $x <= ($maxx-$minx); $x++) {
|
||||||
|
if ($render{"$x,$y"}) {
|
||||||
|
print "#";
|
||||||
|
} else {
|
||||||
|
print " ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
31
10/sample.txt
Normal file
31
10/sample.txt
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
position=< 9, 1> velocity=< 0, 2>
|
||||||
|
position=< 7, 0> velocity=<-1, 0>
|
||||||
|
position=< 3, -2> velocity=<-1, 1>
|
||||||
|
position=< 6, 10> velocity=<-2, -1>
|
||||||
|
position=< 2, -4> velocity=< 2, 2>
|
||||||
|
position=<-6, 10> velocity=< 2, -2>
|
||||||
|
position=< 1, 8> velocity=< 1, -1>
|
||||||
|
position=< 1, 7> velocity=< 1, 0>
|
||||||
|
position=<-3, 11> velocity=< 1, -2>
|
||||||
|
position=< 7, 6> velocity=<-1, -1>
|
||||||
|
position=<-2, 3> velocity=< 1, 0>
|
||||||
|
position=<-4, 3> velocity=< 2, 0>
|
||||||
|
position=<10, -3> velocity=<-1, 1>
|
||||||
|
position=< 5, 11> velocity=< 1, -2>
|
||||||
|
position=< 4, 7> velocity=< 0, -1>
|
||||||
|
position=< 8, -2> velocity=< 0, 1>
|
||||||
|
position=<15, 0> velocity=<-2, 0>
|
||||||
|
position=< 1, 6> velocity=< 1, 0>
|
||||||
|
position=< 8, 9> velocity=< 0, -1>
|
||||||
|
position=< 3, 3> velocity=<-1, 1>
|
||||||
|
position=< 0, 5> velocity=< 0, -1>
|
||||||
|
position=<-2, 2> velocity=< 2, 0>
|
||||||
|
position=< 5, -2> velocity=< 1, 2>
|
||||||
|
position=< 1, 4> velocity=< 2, 1>
|
||||||
|
position=<-2, 7> velocity=< 2, -2>
|
||||||
|
position=< 3, 6> velocity=<-1, -1>
|
||||||
|
position=< 5, 0> velocity=< 1, 0>
|
||||||
|
position=<-6, 0> velocity=< 2, 0>
|
||||||
|
position=< 5, 9> velocity=< 1, -2>
|
||||||
|
position=<14, 7> velocity=<-2, 0>
|
||||||
|
position=<-3, 6> velocity=< 2, -1>
|
53
11/1.pl
Normal file
53
11/1.pl
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use v5.10;
|
||||||
|
use Data::Dumper;
|
||||||
|
|
||||||
|
sub get_grid ($) {
|
||||||
|
my $serial = shift;
|
||||||
|
|
||||||
|
my @grid;
|
||||||
|
foreach my $y (1..300) {
|
||||||
|
my @x;
|
||||||
|
foreach my $x (1..300) {
|
||||||
|
my $pl = ((($x+10)*$y)+$serial)*($x+10);
|
||||||
|
$pl = (($pl / 100) % 10)-5;
|
||||||
|
push @x, $pl;
|
||||||
|
|
||||||
|
}
|
||||||
|
push @grid, \@x
|
||||||
|
}
|
||||||
|
return @grid;
|
||||||
|
}
|
||||||
|
|
||||||
|
#122,79, grid serial number 57: power level -5.
|
||||||
|
#my @grid=get_grid(57);
|
||||||
|
#say $grid[78][121];
|
||||||
|
|
||||||
|
#217,196, grid serial number 39: power level 0.
|
||||||
|
#@grid=get_grid(39);
|
||||||
|
#say $grid[195][216];
|
||||||
|
|
||||||
|
#101,153, grid serial number 71: power level 4.
|
||||||
|
#@grid=get_grid(71);
|
||||||
|
#say $grid[152][100];
|
||||||
|
my $serial = $ARGV[0];
|
||||||
|
my @grid = get_grid($serial);
|
||||||
|
|
||||||
|
my $biglytotal = -9999;
|
||||||
|
my $coords;
|
||||||
|
for (my $y=2; $y < 299; $y++) {
|
||||||
|
for (my $x=2; $x < 299; $x++) {
|
||||||
|
my $total = $grid[$y-1][$x-1] + $grid[$y-1][$x] + $grid[$y-1][$x+1] +
|
||||||
|
$grid[$y][$x-1] + $grid[$y][$x] + $grid[$y][$x+1] +
|
||||||
|
$grid[$y+1][$x-1] + $grid[$y+1][$x] + $grid[$y+1][$x+1];
|
||||||
|
if ($total > $biglytotal) {
|
||||||
|
$biglytotal = $total;
|
||||||
|
$coords = "$x,$y";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
say $coords;
|
||||||
|
|
||||||
|
|
74
11/2.pl
Normal file
74
11/2.pl
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use v5.10;
|
||||||
|
use Data::Dumper;
|
||||||
|
|
||||||
|
my $serial = $ARGV[0];
|
||||||
|
my $maxsize = 300;
|
||||||
|
|
||||||
|
my @sat = get_grid($serial);
|
||||||
|
|
||||||
|
# calculate summed area table
|
||||||
|
for (my $y=0; $y < $maxsize; $y++) {
|
||||||
|
for (my $x=0; $x < $maxsize; $x++) {
|
||||||
|
|
||||||
|
my $tmp = $sat[$y][$x];
|
||||||
|
|
||||||
|
if (($y > 0) && ($x > 0)) {
|
||||||
|
$tmp -= $sat[$y-1][$x-1];
|
||||||
|
}
|
||||||
|
if ($y > 0) {
|
||||||
|
$tmp += $sat[$y-1][$x];
|
||||||
|
}
|
||||||
|
if ($x > 0) {
|
||||||
|
$tmp += $sat[$y][$x-1];
|
||||||
|
}
|
||||||
|
|
||||||
|
$sat[$y][$x] = $tmp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
my $biglytotal = -9999;
|
||||||
|
my $coords;
|
||||||
|
my $maxgs;
|
||||||
|
|
||||||
|
for (my $gridsize=1; $gridsize < 300; $gridsize++) {
|
||||||
|
for (my $y=0; $y < ($maxsize-$gridsize); $y++) {
|
||||||
|
for (my $x=0; $x < ($maxsize-$gridsize); $x++) {
|
||||||
|
my $total = get_total(\@sat, $x, $y, $gridsize);
|
||||||
|
if ($total > $biglytotal) {
|
||||||
|
$biglytotal = $total;
|
||||||
|
$coords = "result:" . ($x+2) . "," . ($y+2);
|
||||||
|
$maxgs = $gridsize;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
say $coords, ",", $maxgs;
|
||||||
|
|
||||||
|
|
||||||
|
sub get_total {
|
||||||
|
my ($table, $x, $y, $gridsize) = @_;
|
||||||
|
|
||||||
|
return $$table[$y+$gridsize][$x+$gridsize] + $$table[$y][$x]
|
||||||
|
- $$table[$y][$x+$gridsize] - $$table[$y+$gridsize][$x];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sub get_grid ($) {
|
||||||
|
my $serial = shift;
|
||||||
|
|
||||||
|
my @grid;
|
||||||
|
foreach my $y (1..300) {
|
||||||
|
my @x;
|
||||||
|
foreach my $x (1..300) {
|
||||||
|
my $pl = ((($x+10)*$y)+$serial)*($x+10);
|
||||||
|
$pl = (($pl / 100) % 10)-5;
|
||||||
|
push @x, $pl;
|
||||||
|
|
||||||
|
}
|
||||||
|
push @grid, \@x
|
||||||
|
}
|
||||||
|
return @grid;
|
||||||
|
}
|
23
5/1-2.pl
Normal file
23
5/1-2.pl
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use v5.10;
|
||||||
|
use Data::Dumper;
|
||||||
|
|
||||||
|
chomp (my @data = <STDIN>);
|
||||||
|
@data = sort @data;
|
||||||
|
|
||||||
|
my @remove;
|
||||||
|
foreach my $c ('a'..'z') {
|
||||||
|
push @remove, ($c . uc($c)), (uc($c) . $c);
|
||||||
|
}
|
||||||
|
my $remove = join("|", @remove);
|
||||||
|
|
||||||
|
foreach my $line (@data) {
|
||||||
|
say $line;
|
||||||
|
|
||||||
|
while ( $line =~ s/($remove)//ge ) {
|
||||||
|
|
||||||
|
}
|
||||||
|
say $line . " " . length($line);
|
||||||
|
}
|
37
5/1.pl
Normal file
37
5/1.pl
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use v5.10;
|
||||||
|
use Data::Dumper;
|
||||||
|
|
||||||
|
chomp (my @data = <STDIN>);
|
||||||
|
@data = sort @data;
|
||||||
|
|
||||||
|
foreach my $line (@data) {
|
||||||
|
say $line;
|
||||||
|
my @line = split //, $line;
|
||||||
|
|
||||||
|
my $pos = 0;
|
||||||
|
say $pos, "/", $#line;
|
||||||
|
while ( $pos < $#line ) {
|
||||||
|
|
||||||
|
if (($line[$pos] =~ m/[A-Z]/) && ( lc($line[$pos]) eq $line[$pos+1] )
|
||||||
|
|| ($line[$pos] =~ m/[a-z]/) && ( uc($line[$pos]) eq $line[$pos+1] )) {
|
||||||
|
|
||||||
|
#say "Cancelling ", $line[$pos], $line[$pos+1];
|
||||||
|
|
||||||
|
# Urgh, this is slow.
|
||||||
|
if ($pos > 0) {
|
||||||
|
@line = (@line[ 0..$pos-1 ], @line[ $pos+2 .. $#line ]);
|
||||||
|
} else {
|
||||||
|
@line = @line[ $pos+2 .. $#line ];
|
||||||
|
}
|
||||||
|
$pos--;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$pos++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
say join("", @line);
|
||||||
|
print ($#line + 1);
|
||||||
|
}
|
34
5/2.pl
Normal file
34
5/2.pl
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use v5.10;
|
||||||
|
use Data::Dumper;
|
||||||
|
|
||||||
|
chomp (my @data = <STDIN>);
|
||||||
|
@data = sort @data;
|
||||||
|
|
||||||
|
my @remove;
|
||||||
|
foreach my $c ('a'..'z') {
|
||||||
|
push @remove, ($c . uc($c)), (uc($c) . $c);
|
||||||
|
}
|
||||||
|
my $remove = join("|", @remove);
|
||||||
|
|
||||||
|
foreach my $line (@data) {
|
||||||
|
say $line;
|
||||||
|
|
||||||
|
my $min = length($line);
|
||||||
|
foreach my $c ('a'..'z') {
|
||||||
|
my $test = $line;
|
||||||
|
say $test . " " . length($test);
|
||||||
|
my $pre = $c . "|" . uc($c);
|
||||||
|
|
||||||
|
$test =~ s/($pre)//ge;
|
||||||
|
while ( $test =~ s/($remove)//ge ) {
|
||||||
|
}
|
||||||
|
if (length($test) < $min) {
|
||||||
|
$min = length($test);
|
||||||
|
}
|
||||||
|
say $pre . " " . $test . " " . length($test);
|
||||||
|
}
|
||||||
|
say $min;
|
||||||
|
}
|
1
5/sample.txt
Normal file
1
5/sample.txt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
dabAcCaCBAcCcaDA
|
83
6/1.pl
Normal file
83
6/1.pl
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use v5.10;
|
||||||
|
use Data::Dumper;
|
||||||
|
|
||||||
|
chomp (my @data = <STDIN>);
|
||||||
|
@data = sort @data;
|
||||||
|
|
||||||
|
my (@x, @y);
|
||||||
|
foreach my $coord (@data) {
|
||||||
|
my ($x, $y) = split /, /, $coord;
|
||||||
|
push @x, $x;
|
||||||
|
push @y, $y;
|
||||||
|
}
|
||||||
|
@x = sort { $a <=> $b } @x;
|
||||||
|
@y = sort { $a <=> $b } @y;
|
||||||
|
|
||||||
|
my $minX = $x[0];
|
||||||
|
my $minY = $y[0];
|
||||||
|
my $maxX = $x[$#x];
|
||||||
|
my $maxY = $y[$#y];
|
||||||
|
|
||||||
|
my %infinite;
|
||||||
|
my %count;
|
||||||
|
for ( my $y = $minY; $y <= $maxY; $y++ ) {
|
||||||
|
for ( my $x = $minX; $x <= $maxX; $x++ ) {
|
||||||
|
# work out distances
|
||||||
|
|
||||||
|
my $closest = closest($x, $y, \@data);
|
||||||
|
$count{$closest}++;
|
||||||
|
#say "$x, $y, ", $closest;
|
||||||
|
|
||||||
|
# establish 'infinite' areas
|
||||||
|
if ( $closest && (($x == $minX) || ($x == $maxX)
|
||||||
|
|| ($y == $minY) || ($y == $maxY)) ) {
|
||||||
|
$infinite{$closest}++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
my @best = sort { $count{$b} <=> $count{$a} } keys %count;
|
||||||
|
foreach my $b (@best) {
|
||||||
|
if ($infinite{$b}) {
|
||||||
|
next;
|
||||||
|
} else {
|
||||||
|
say "$b $count{$b}";
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
sub closest($$$) {
|
||||||
|
my ($x, $y, $coords) = @_;
|
||||||
|
my %result;
|
||||||
|
|
||||||
|
foreach my $c (@$coords) {
|
||||||
|
my ($cx, $cy) = split /, /, $c;
|
||||||
|
|
||||||
|
my ($xdiff, $ydiff);
|
||||||
|
if ($x < $cx) {
|
||||||
|
$xdiff = $cx - $x;
|
||||||
|
} else {
|
||||||
|
$xdiff = $x - $cx;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($y < $cy) {
|
||||||
|
$ydiff = $cy - $y;
|
||||||
|
} else {
|
||||||
|
$ydiff = $y - $cy;
|
||||||
|
}
|
||||||
|
|
||||||
|
$result{$c} = ($xdiff + $ydiff);
|
||||||
|
}
|
||||||
|
|
||||||
|
my @best = sort { $result{$a} <=> $result{$b} } keys %result;
|
||||||
|
if ($result{$best[0]} == $result{$best[1]}) {
|
||||||
|
return undef;
|
||||||
|
} else {
|
||||||
|
return $best[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
64
6/2.pl
Normal file
64
6/2.pl
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use v5.10;
|
||||||
|
use Data::Dumper;
|
||||||
|
|
||||||
|
chomp (my @data = <STDIN>);
|
||||||
|
@data = sort @data;
|
||||||
|
|
||||||
|
my (@x, @y);
|
||||||
|
foreach my $coord (@data) {
|
||||||
|
my ($x, $y) = split /, /, $coord;
|
||||||
|
push @x, $x;
|
||||||
|
push @y, $y;
|
||||||
|
}
|
||||||
|
@x = sort { $a <=> $b } @x;
|
||||||
|
@y = sort { $a <=> $b } @y;
|
||||||
|
|
||||||
|
my $minX = $x[0];
|
||||||
|
my $minY = $y[0];
|
||||||
|
my $maxX = $x[$#x];
|
||||||
|
my $maxY = $y[$#y];
|
||||||
|
|
||||||
|
my $count;
|
||||||
|
for ( my $y = $minY; $y <= $maxY; $y++ ) {
|
||||||
|
for ( my $x = $minX; $x <= $maxX; $x++ ) {
|
||||||
|
# work out distances
|
||||||
|
|
||||||
|
my $closest = closest($x, $y, \@data);
|
||||||
|
# this assumes there's only a single region, but that seems to be the case here.
|
||||||
|
if ($closest < 10000) {
|
||||||
|
$count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
say $count;
|
||||||
|
|
||||||
|
|
||||||
|
sub closest($$$) {
|
||||||
|
my ($x, $y, $coords) = @_;
|
||||||
|
my $result;
|
||||||
|
|
||||||
|
foreach my $c (@$coords) {
|
||||||
|
my ($cx, $cy) = split /, /, $c;
|
||||||
|
|
||||||
|
my ($xdiff, $ydiff);
|
||||||
|
if ($x < $cx) {
|
||||||
|
$xdiff = $cx - $x;
|
||||||
|
} else {
|
||||||
|
$xdiff = $x - $cx;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($y < $cy) {
|
||||||
|
$ydiff = $cy - $y;
|
||||||
|
} else {
|
||||||
|
$ydiff = $y - $cy;
|
||||||
|
}
|
||||||
|
|
||||||
|
$result += ($xdiff + $ydiff);
|
||||||
|
}
|
||||||
|
return $result;
|
||||||
|
|
||||||
|
}
|
6
6/sample.txt
Normal file
6
6/sample.txt
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
1, 1
|
||||||
|
1, 6
|
||||||
|
8, 3
|
||||||
|
3, 4
|
||||||
|
5, 5
|
||||||
|
8, 9
|
66
7/1.pl
Normal file
66
7/1.pl
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use v5.10;
|
||||||
|
use Data::Dumper;
|
||||||
|
|
||||||
|
chomp (my @data = <STDIN>);
|
||||||
|
|
||||||
|
my %deps;
|
||||||
|
my %steps;
|
||||||
|
foreach my $line (sort @data) {
|
||||||
|
my ($dep, $step) = ($line =~ /Step (\S+) must be finished before step (\S+) can begin\./);
|
||||||
|
say "$dep, $step";
|
||||||
|
if (exists $deps{$step}) {
|
||||||
|
my $t = $deps{$step};
|
||||||
|
push @$t, $dep;
|
||||||
|
$deps{$step} = $t;
|
||||||
|
} else {
|
||||||
|
my @add = ($dep);
|
||||||
|
$deps{$step} = \@add;
|
||||||
|
}
|
||||||
|
$steps{$dep}=0;
|
||||||
|
$steps{$step}=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
my @final;
|
||||||
|
while (my @doable = find_nextsteps(\%deps) ) {
|
||||||
|
my $first = $doable[0];
|
||||||
|
mark_complete($first, \%deps);
|
||||||
|
push @final, $first;
|
||||||
|
}
|
||||||
|
|
||||||
|
say join "", @final;
|
||||||
|
|
||||||
|
|
||||||
|
sub mark_complete {
|
||||||
|
my ($step, $deps) = @_;
|
||||||
|
|
||||||
|
# complete task.
|
||||||
|
$steps{$step} = 1;
|
||||||
|
# remove from dep list.
|
||||||
|
foreach my $s (sort keys %$deps) {
|
||||||
|
my @tasks = @{$$deps{$s}};
|
||||||
|
@tasks = grep {!/$step/} @tasks;
|
||||||
|
if ($#tasks > -1) {
|
||||||
|
$$deps{$s} = \@tasks;
|
||||||
|
} else {
|
||||||
|
delete $$deps{$s};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub find_nextsteps {
|
||||||
|
my ($deps) = @_;
|
||||||
|
|
||||||
|
# find next.
|
||||||
|
my @doable;
|
||||||
|
foreach my $s (sort keys %steps) {
|
||||||
|
next if ($steps{$s} == 1);
|
||||||
|
if (!$$deps{$s}) {
|
||||||
|
push @doable, $s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return sort @doable;
|
||||||
|
}
|
110
7/2.pl
Normal file
110
7/2.pl
Normal file
|
@ -0,0 +1,110 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use v5.10;
|
||||||
|
use Data::Dumper;
|
||||||
|
|
||||||
|
my $timeoffset = 60;
|
||||||
|
my $workers = 5;
|
||||||
|
|
||||||
|
# set up time delay...
|
||||||
|
my %time;
|
||||||
|
foreach my $n ('A'..'Z') {
|
||||||
|
$time{$n} = $timeoffset + ord($n)-64;
|
||||||
|
}
|
||||||
|
|
||||||
|
chomp (my @data = <STDIN>);
|
||||||
|
|
||||||
|
my %deps;
|
||||||
|
my %steps;
|
||||||
|
foreach my $line (sort @data) {
|
||||||
|
my ($dep, $step) = ($line =~ /Step (\S+) must be finished before step (\S+) can begin\./);
|
||||||
|
say "$dep, $step";
|
||||||
|
if (exists $deps{$step}) {
|
||||||
|
my $t = $deps{$step};
|
||||||
|
push @$t, $dep;
|
||||||
|
$deps{$step} = $t;
|
||||||
|
} else {
|
||||||
|
my @add = ($dep);
|
||||||
|
$deps{$step} = \@add;
|
||||||
|
}
|
||||||
|
$steps{$dep}=0;
|
||||||
|
$steps{$step}=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
my @final;
|
||||||
|
|
||||||
|
my %workercurrent;
|
||||||
|
my %workertime;
|
||||||
|
|
||||||
|
my $totaltime = 0;
|
||||||
|
while ( !check_complete() ) {
|
||||||
|
|
||||||
|
my @doable = find_nextsteps(\%deps);
|
||||||
|
|
||||||
|
foreach my $w (1...$workers) {
|
||||||
|
say "worker $w, $workercurrent{$w} $workertime{$w}";
|
||||||
|
|
||||||
|
if ($workertime{$w} <= 1 && $workercurrent{$w}) {
|
||||||
|
mark_complete($workercurrent{$w}, \%deps);
|
||||||
|
push @final, $workercurrent{$w};
|
||||||
|
$workercurrent{$w} = undef;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$workercurrent{$w}) {
|
||||||
|
if (my $next = pop @doable) {
|
||||||
|
say "adding... w:$w t:$next";
|
||||||
|
$steps{$next} = 2;
|
||||||
|
$workercurrent{$w} = $next;
|
||||||
|
$workertime{$w} = $time{$next};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$workertime{$w}--;
|
||||||
|
}
|
||||||
|
$totaltime++;
|
||||||
|
|
||||||
|
}
|
||||||
|
say join "", @final;
|
||||||
|
say $totaltime;
|
||||||
|
|
||||||
|
sub check_complete {
|
||||||
|
foreach my $k (keys %steps) {
|
||||||
|
say "check: $k $steps{$k}";
|
||||||
|
if ($steps{$k} != 1) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub mark_complete {
|
||||||
|
my ($step, $deps) = @_;
|
||||||
|
|
||||||
|
# complete task.
|
||||||
|
$steps{$step} = 1;
|
||||||
|
# remove from dep list.
|
||||||
|
foreach my $s (sort keys %$deps) {
|
||||||
|
my @tasks = @{$$deps{$s}};
|
||||||
|
@tasks = grep {!/$step/} @tasks;
|
||||||
|
if ($#tasks > -1) {
|
||||||
|
$$deps{$s} = \@tasks;
|
||||||
|
} else {
|
||||||
|
delete $$deps{$s};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub find_nextsteps {
|
||||||
|
my ($deps) = @_;
|
||||||
|
|
||||||
|
# find next.
|
||||||
|
my @doable;
|
||||||
|
foreach my $s (sort keys %steps) {
|
||||||
|
next if ($steps{$s} > 0);
|
||||||
|
if (!$$deps{$s}) {
|
||||||
|
push @doable, $s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return sort @doable;
|
||||||
|
}
|
7
7/sample.txt
Normal file
7
7/sample.txt
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
Step C must be finished before step A can begin.
|
||||||
|
Step C must be finished before step F can begin.
|
||||||
|
Step A must be finished before step B can begin.
|
||||||
|
Step A must be finished before step D can begin.
|
||||||
|
Step B must be finished before step E can begin.
|
||||||
|
Step D must be finished before step E can begin.
|
||||||
|
Step F must be finished before step E can begin.
|
46
8/1.pl
Normal file
46
8/1.pl
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use v5.10;
|
||||||
|
use Data::Dumper;
|
||||||
|
|
||||||
|
chomp (my @data = <STDIN>);
|
||||||
|
|
||||||
|
foreach my $line (@data) {
|
||||||
|
my @list = split / /, $line;
|
||||||
|
say join ",", @list;
|
||||||
|
|
||||||
|
my $pos = 0;
|
||||||
|
my ($p, $m) = do_process(\@list, $pos);
|
||||||
|
say "$p, $m";
|
||||||
|
}
|
||||||
|
|
||||||
|
# 2 3 0 3 10 11 12 1 1 0 1 99 2 1 1 2
|
||||||
|
# A----------------------------------
|
||||||
|
# B----------- C-----------
|
||||||
|
# D-----
|
||||||
|
|
||||||
|
sub do_process {
|
||||||
|
my ($list, $pos) = @_;
|
||||||
|
|
||||||
|
my $children = $$list[$pos++];
|
||||||
|
my $metadata = $$list[$pos++];
|
||||||
|
|
||||||
|
my $mdsum;
|
||||||
|
|
||||||
|
for (my $c=0; $c<$children; $c++) {
|
||||||
|
say "child $c";
|
||||||
|
my ($p, $m) = do_process($list, $pos);
|
||||||
|
$pos = $p;
|
||||||
|
$mdsum += $m;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (my $m=$pos; $m<$pos+$metadata; $m++) {
|
||||||
|
$mdsum += $$list[$m];
|
||||||
|
say "metadata: ", $$list[$m];
|
||||||
|
}
|
||||||
|
$pos += $metadata;
|
||||||
|
|
||||||
|
return ($pos, $mdsum)
|
||||||
|
|
||||||
|
}
|
50
8/2.pl
Normal file
50
8/2.pl
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use v5.10;
|
||||||
|
use Data::Dumper;
|
||||||
|
|
||||||
|
chomp (my @data = <STDIN>);
|
||||||
|
|
||||||
|
foreach my $line (@data) {
|
||||||
|
my @list = split / /, $line;
|
||||||
|
|
||||||
|
my $pos = 0;
|
||||||
|
my ($p, $m) = do_process(\@list, $pos);
|
||||||
|
say "$p, $m";
|
||||||
|
}
|
||||||
|
|
||||||
|
# 2 3 0 3 10 11 12 1 1 0 1 99 2 1 1 2
|
||||||
|
# A----------------------------------
|
||||||
|
# B----------- C-----------
|
||||||
|
# D-----
|
||||||
|
|
||||||
|
sub do_process {
|
||||||
|
my ($list, $pos) = @_;
|
||||||
|
|
||||||
|
my $children = $$list[$pos++];
|
||||||
|
my $metadata = $$list[$pos++];
|
||||||
|
|
||||||
|
my $mdsum = 0;
|
||||||
|
|
||||||
|
my @children;
|
||||||
|
for (my $c=0; $c<$children; $c++) {
|
||||||
|
my ($p, $value) = do_process($list, $pos);
|
||||||
|
$pos = $p;
|
||||||
|
push @children, $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for (my $m=$pos; $m<$pos+$metadata; $m++) {
|
||||||
|
my $mval = $$list[$m];
|
||||||
|
if ($children == 0) {
|
||||||
|
$mdsum += $mval;
|
||||||
|
} else {
|
||||||
|
$mdsum += int($children[$mval-1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$pos += $metadata;
|
||||||
|
|
||||||
|
return ($pos, $mdsum)
|
||||||
|
|
||||||
|
}
|
1
8/sample.txt
Normal file
1
8/sample.txt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
2 3 0 3 10 11 12 1 1 0 1 99 2 1 1 2
|
46
9/1.pl
Normal file
46
9/1.pl
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use v5.10;
|
||||||
|
use Data::Dumper;
|
||||||
|
|
||||||
|
my $players = $ARGV[0];
|
||||||
|
my $score = $ARGV[1];
|
||||||
|
say "players: $players, score: $score";
|
||||||
|
|
||||||
|
my $marble = 0;
|
||||||
|
my $currentplayer = 0;
|
||||||
|
my $currentpos = 0;
|
||||||
|
my @board;
|
||||||
|
my %score;
|
||||||
|
|
||||||
|
# the splice approach isn't efficient, but it's fine for part 1.
|
||||||
|
# it takes a couple of hours to solve part 2, but I was short of time to rewrite...
|
||||||
|
|
||||||
|
while ($marble <= $score) {
|
||||||
|
if ($marble > 0 && ($marble % 23 == 0)) {
|
||||||
|
$score{$currentplayer} += $marble;
|
||||||
|
$currentpos = $currentpos - 8;
|
||||||
|
if ($currentpos < 0) {
|
||||||
|
$currentpos += (scalar @board);
|
||||||
|
}
|
||||||
|
#say "KEEP $currentplayer $marble ", $board[$currentpos];
|
||||||
|
$score{$currentplayer} += $board[$currentpos];
|
||||||
|
splice(@board,$currentpos,1);
|
||||||
|
$currentpos = ($currentpos+1) % (scalar @board);
|
||||||
|
} else {
|
||||||
|
splice(@board, $currentpos+1, 0, $marble);
|
||||||
|
|
||||||
|
$currentpos = ($currentpos+2) % (scalar @board);
|
||||||
|
}
|
||||||
|
$marble++;
|
||||||
|
|
||||||
|
|
||||||
|
#say "player: $currentplayer, pos: $currentpos, board: ", join ",", @board;
|
||||||
|
|
||||||
|
|
||||||
|
$currentplayer = ($currentplayer + 1) % $players;
|
||||||
|
}
|
||||||
|
say Dumper \%score;
|
||||||
|
my @keys = sort { $score{$b} <=> $score{$a} } keys %score;
|
||||||
|
say $score{$keys[0]};
|
Loading…
Add table
Add a link
Reference in a new issue