use 5.20.0; use warnings; use experimental qw/ signatures postderef /; use List::AllUtils qw/ pairmap minmax zip min/; use Term::Caca; my @points = map { [ map { [ split ', ' ] } /(?<=\<).*?(?=>)/g ] } <>; use DDP; my $width = 1E9; my $time = -1; while() { move(\@points); $time++; my $new_width = width(@points); # say $width; last if $new_width > $width; $width = $new_width; } # for part II # say $time; exit; move(\@points,-1); my $minx = min map { $_->[0][0] } @points; my $miny = min map { $_->[0][1] } @points; $_->[0] = [ $_->[0][0] - $minx, $_->[0][1] - $miny, ] for @points; my $caca = Term::Caca->new; for my $p ( @points ) { $caca->text( $p->[0], '*' ); } $caca->refresh; my $foo = <>; sub move($points,$dir=1) { $_->[0] = [ pairmap { $a + $dir * $b } zip $_->[0]->@*, $_->[1]->@* ] for @$points; } sub width(@points) { ( pairmap { $b - $a } minmax map { $_->[0][0] } @points )[0]; }