sub bowl { ($_,$n)=@_; s#(\d)(\d|/(?=(.)))|X(?=(..))|.# ($3.$4?"X$3$4":$1.$2,"")[9<$n++]#ge; s#./|X#9#g+map{(3)x$_}/./g } chomp( @ARGV= ) if ! @ARGV; for my $line ( @ARGV ) { print "$line = ", bowl($line), "\n "; for( 0..9 ) { print " ",bowl($line,9-$_); } print $/; } __END__ 81633470434/72813/62 81633470434/72813/X18 X00X00X00X00X00 00X00X00X00X00X00 X11X11X11X11X11 11X11X11X11X11X11 5/63XX7043X4/813/6 #### 6/ 45 X 7/ X3/ 14 9 20 20 20 14 23 43 63 83 "6/45X7/X3/" "6/" matches; $1="6", $2="/", $3="4"; change to "X4" "45" matches; $1="4", $2="5"; change to "45" "X" matches; $4="7/"; change to "X7/" "7/" matches; $1="7", $2="/", $3="X"; change to "XX" "X" matches; $4="3/"; change to "X3/" "3" matches; change to "$1$2" eq "" "/" matches; change to "$1$2" eq "" (result: "X445X7/XXX3/") #### sub bowl { $_=pop; s#(\d\d|.(/))(?=(.))|X(?=(..))|.#$2.$4?"X$3$4":$1#ge; s#./|X#9#g+map{(7)x$_}/./g } chomp( @ARGV= ) if ! @ARGV; for my $line ( @ARGV ) { print "$line = ", bowl($line), $/; } __END__ 81633470434/72813/62-- 81633470434/72813/X18 X00X00X00X00X00-- 00X00X00X00X00X00 X11X11X11X11X11-- 11X11X11X11X11X11 5/63XX7043X4/813/6