day14
This commit is contained in:
parent
085033703f
commit
1f0c8ef911
14
14/1.pl
Normal file
14
14/1.pl
Normal file
@ -0,0 +1,14 @@
|
||||
use 5.20.0;
|
||||
|
||||
use lib '.';
|
||||
use hash;
|
||||
my $key = 'stpzcrnm';
|
||||
|
||||
use List::AllUtils qw/ sum /;
|
||||
|
||||
say sum
|
||||
map { split '' }
|
||||
map { sprintf "%04b", $_ }
|
||||
map { hex }
|
||||
map { split '' }
|
||||
map { knot_hash( join '-', $key, $_) } 0..127;
|
36
14/2.pl
Normal file
36
14/2.pl
Normal file
@ -0,0 +1,36 @@
|
||||
use 5.20.0;
|
||||
|
||||
use lib '.';
|
||||
use hash;
|
||||
my $key = 'stpzcrnm';
|
||||
|
||||
use List::AllUtils qw/ sum /;
|
||||
|
||||
my @grid =
|
||||
map { [ map { $_ ? '#' : ' ' } map { split '', sprintf "%04b", hex } split '' ] }
|
||||
map { knot_hash( join '-', $key, $_) } 0..127;
|
||||
|
||||
my $clusters;
|
||||
for my $x ( 0..127 ) {
|
||||
for my $y ( 0..127 ) {
|
||||
$clusters+= eradicate(\@grid,$x,$y);
|
||||
}
|
||||
}
|
||||
|
||||
say $clusters;
|
||||
|
||||
use experimental qw/ signatures /;
|
||||
sub eradicate($grid,$i,$j) {
|
||||
return 0 if $grid->[$i][$j] ne '#';
|
||||
$grid->[$i][$j] = ' ';
|
||||
eradicate($grid,$i-1,$j) if $i > 0;
|
||||
eradicate($grid,$i,$j-1) if $j > 0;
|
||||
eradicate($grid,$i+1,$j);
|
||||
eradicate($grid,$i,$j+1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
sub print_g {
|
||||
say @$_ for @grid;
|
||||
}
|
34
14/hash.pm
Normal file
34
14/hash.pm
Normal file
@ -0,0 +1,34 @@
|
||||
use 5.20.0;
|
||||
|
||||
use List::AllUtils qw/ reduce part /;
|
||||
use experimental qw/ signatures /;
|
||||
|
||||
use base 'Exporter';
|
||||
our @EXPORT = qw/ knot_hash /;
|
||||
|
||||
sub knot_hash ( $string ) {
|
||||
my @commands = map { ord } split '', $string;
|
||||
push @commands, 17, 31, 73, 47, 23;
|
||||
|
||||
my $skip = 0;
|
||||
|
||||
my $i = 0;
|
||||
my @array = 0..255;
|
||||
|
||||
for ( 1..64 ) {
|
||||
for my $c ( @commands ) {
|
||||
@array[0..$c-1] = @array[ reverse 0..$c-1];
|
||||
push @array, shift @array for 1..$c + $skip++;
|
||||
$i += $c + $skip-1;
|
||||
}
|
||||
}
|
||||
|
||||
unshift @array, pop @array for 1..($i%@array);
|
||||
|
||||
my $j;
|
||||
my @grouped = map {
|
||||
reduce { $a ^ $b } @$_
|
||||
} part { $j++ / 16 } @array;
|
||||
|
||||
return join '', map { sprintf "%02x", $_ } @grouped;
|
||||
}
|
Loading…
Reference in New Issue
Block a user