days 5-11
This commit is contained in:
parent
d3ae65f625
commit
1d2d5def97
18 changed files with 804 additions and 0 deletions
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
|
Loading…
Add table
Add a link
Reference in a new issue