#!/usr/bin/perl use integer; my $field ='800040103000500700130000000000206080500000004020407000000000031002004000604070005'; $field =~s/[^\d]//g; $field =~s/(\d)/$1,/g; $field =~s/([1-9]),/(2**($1-1)).","/eg; my %h; for (1..9){$h{2**($_-1)}=$_}$h{0} = "-"; my $old = 'init'; my $new = ' 2nd init'; while ($old ne $new){ $new = ''; my $z = 0; for my $i (0..80){ my ($cell) = $field =~ /(?:\d+?,){$i}(\d+)/; my $b=($i/27)*27+3*(($i%9)/3); my $c =($i%9); my $r = ($i/9)*9; if ((!($cell))or($cell & ($cell - 1))){ $field =~ s/((?:\d+?,){$i})(\d+)/$1$z/; my $hb; map{$hb.=$_}map{/(\d+,\d+,\d+,)(?:\d+,){6}(\d+,\d+,\d+,)(?:\d+,){6}(\d+,\d+,\d+,)/}$field=~/(?:\d+,){$b}(.*)/; my $hc; map{$hc.=$_}map{/(?:\d+,){$c}(\d+,)(?:\d+,){8}(\d+,)(?:\d+,){8}(\d+,)(?:\d+,){8}(\d+,)(?:\d+,){8}(\d+,)(?:\d+,){8}(\d+,)(?:\d+,){8}(\d+,)(?:\d+,){8}(\d+,)(?:\d+,){8}(\d+,)/}$field=~/(.*)/; my $hr; map{$hr.=$_}map{/((?:\d+,){9})/}$field=~/(?:\d+,){$r}(.*)/; my $ha = $hr.$hc.$hb; my $nset = 511; map{($_ & ($_ - 1))?():($nset = ($nset & (511 ^ $_)))}$ha =~/(\d+),/g; my $oset = 511; map{$oset = ($oset & (511 ^ $_))}$hr=~/(\d+),/g; ((!($oset & ($oset - 1)))and ($oset))?($nset = $oset):(); $oset = 511; map{$oset = ($oset & (511 ^ $_))}$hc=~/(\d+),/g; ((!($oset & ($oset - 1)))and ($oset))?($nset = $oset):(); $oset = 511; map{$oset = ($oset & (511 ^ $_))}$hb=~/(\d+),/g; ((!($oset & ($oset - 1)))and ($oset))?($nset = $oset):(); $field =~ s/((?:\d+?,){$i})(\d+)/$1$cell/; $cell = $nset; } $new .= "$cell,"; } $old = $field; $field = $new; } print "$field\n";