37 lines
1.1 KiB
Raku
37 lines
1.1 KiB
Raku
for './nonogram_problems.txt'.IO.lines.rotor(3, :partial) {
|
|
|
|
my (@rpats,@cpats) := @_[0,1]>>.&makepatterns;
|
|
my @rows = ( '.' x +@cpats ) xx +@rpats ;
|
|
|
|
loop (my $prev = ''; $prev ne ~@rows; ) {
|
|
$prev = ~@rows;
|
|
try(@rows, @rpats);
|
|
my @cols = (^+@cpats).map: { [~] @rows.map: { ~ s/.// } }
|
|
try(@cols, @cpats);
|
|
@rows = (^+@rpats).map: { [~] @cols.map: { ~ s/.// } }
|
|
}
|
|
say();
|
|
@rows ~~ /\./ ?? say "Failed" !! say TR/01/.@/ for @rows
|
|
}
|
|
|
|
sub try(@lines, @patterns) {
|
|
for ^+@lines -> $i {
|
|
my $pos = 0;
|
|
while ( @lines[$i] ~~ m:g/\./ and $pos < @lines[$i].chars ) {
|
|
for 0, 1 -> $try {
|
|
with @lines[$i] { S:pos($pos)/\./$try/ ~~ /<{@patterns[$i]}>/ or
|
|
s:pos($pos)/./{ 1 - $try }/ }
|
|
}
|
|
$pos++;
|
|
}
|
|
}
|
|
}
|
|
|
|
sub makepatterns($input) {
|
|
$input ==> split( ' ' )
|
|
==> map( *.comb )
|
|
==> map( *>>.&{ .ord - 64 } )
|
|
==> map( '<[1.]>**' <<~<< * )
|
|
==> map( *.join: '<[0.]>+' )
|
|
==> map( '^<[0.]>*' ~ * ~ '<[0.]>*$' )
|
|
}
|