パタン置換を繰り返す
|
$_ = "3223*4224*6666*3553*4014"; @pats = ( 's/220(..)221/022${1}122/', 's/022(..)122/220${1}221/', 's/01(...)22(...)22/22${1}22${2}01/', 's/22(...)22(...)01/01${1}22${2}22/', 's/30(...)41/03${1}14/', 's/03(...)14/30${1}41/', 's/0(....)3(....)4/3${1}4${2}0/', 's/1(....)3(....)4/3${1}4${2}1/', 's/3(....)4(....)0/0${1}3${2}4/', 's/3(....)4(....)1/1${1}3${2}4/', 's/55([01])/${1}55/', 's/([01])55/55${1}/', 's/01(...)55/55${1}01/', 's/55(...)01/01${1}55/', 's/60/06/', 's/61/16/', 's/06/60/', 's/16/61/', 's/0(....)6/6${1}0/', 's/1(....)6/6${1}1/', 's/6(....)0/0${1}6/', 's/6(....)1/1${1}6/', ); $states = 0; unlink 'hakoiri.pag', 'hakoiri.dir', 'hakoiri.db'; dbmopen(d,"hakoiri",0666); $d{'statestr',$states} = $_; $d{'strstate',$_} = $states; $states++; for($i=0;$i<$states;$i++){ $s = $d{'statestr',$i}; for $pat (@pats){ $_ = $s; if(eval $pat){ s/([01])(.*)([01])/0${2}1/; if($d{'strstate',$_} eq ''){ $d{'prev',$states} = $i; $d{'statestr',$states} = $_; $d{'strstate',$_} = $states; if(/22.$/){ print "$states\n"; dbmclose(d); exit; $states++; print STDERR "$states --\n" if $states % 1000 == 0