- 论坛徽章:
- 7
|
本帖最后由 rubyish 于 2013-10-28 23:46 编辑
成功~  - #!/usr/bin/perl
- my %V = qw/x 0 a 1 b 2 c 3 d 4 X 0 A 1 B 2 C 3 D 4/;
- my %uc = qw/A 1 B 1 C 1 D 1/;
- my ( @data, %X );
- sub MIN { @_[ $_[0] > $_[1] ] }
- while (<DATA>) {
- chomp;
- my @line = split //;
- my @X =
- grep { $line[$_] eq 'X' and push @{ $X{$_} }, $. - 1 } 0 .. $#line;
- for my $i ( 0 .. $#X ) {
- my $L = $i > 0
- ? MIN( $X[$i] - $X[ $i - 1 ], $V{ $line[ $X[$i] - 1 ] } )
- : $X[$i] ? MIN( $X[$i], $V{ $line[ $X[$i] - 1 ] } ) : 0;
- my $R = $i < $#X
- ? MIN( $X[ $i + 1 ] - $X[$i], $V{ $line[ $X[$i] + 1 ] } )
- : $#line != $X[$i]
- ? MIN( $V{ $line[ $X[$i] + 1 ] }, $#line - $X[$i] ) : 0;
- $line[$_] = lc $line[$_] for $X[$i] - $L .. $X[$i] + $R;
- }
- push @data, \@line;
- }
- for my $x ( sort { $a <=> $b } keys %X ) {
- my @Y = @{ $X{$x} };
- for my $j ( 0 .. $#Y ) {
- my $T = $j > 0
- ? MIN( $Y[$j] - $Y[ $j - 1 ], $V{ $data[ $Y[$j] - 1 ][$x] } )
- : $Y[$j] ? MIN( $Y[$j], $V{ $data[ $Y[$j] - 1 ][$x] } ) : 0;
- my $B = $j < $#Y
- ? MIN( $Y[ $j + 1 ] - $Y[$j], $V{ $data[ $Y[$j] + 1 ][$x] } )
- : $#data != $Y[$j]
- ? MIN( $V{ $data[ $Y[$j] + 1 ][$x] }, $#data - $Y[$j] ) : 0;
- $uc{ $data[$_][$x] } and $data[$_][$x] = lc $data[$_][$x]
- for $Y[$j] - $T .. $Y[$j] + $B;
- }
- }
- print @$_, $/ for @data;
- __DATA__
- ABDCDCDCAAXCXCDCCABABDCDCDCAABXBABDCDCDCAABBCDCCAXDBBXABDCDCDCAABBCDXCCA
- BBCDCCABBBABXCDCDCAABBCDXCCABBBBBABDCDCDCAABBCDCCAXBBBABCDAAAXBCDADCAXXX
- ABDXACDCAAXBBCCDCCABABDCDCDCAABXBABDABACCCAXCDCDCAABBCDCCABBBXABDCDCDCAA
- AACDCCAADCABDCDCDCAABXCDXCXABCDDBABDCDCDCAABBXBXCAABBBABCDAAAXBCDADCABBB
- ADCAAAAAXABCDCCCCCDCABXBBCCDCCABABDCDCDCAABXBABDABDCCCAXCDCDCAAAAABBCDCC
- XCCCAABDCAAXXAADCCCCCCAACCAAAAAAAAAXBBDCCXACDACDAAXCBBBBBBBAAABCADDCAAXC
- AAAAXDXBCDCDCAAXBBCCDCCABABDCDCDCAABXBABDABACCCAXCDCDCAABBCDCCABBBXDXAAA
复制代码
|
|