Быстрая замена подстрок X→Y и Y→X в одной строке
by hackprime
Когда-то на чаны вбросили такую задачку: «в произвольной строке с любыми символами, используя только строковые замены, заменить символ X на символ Y и символ Y на символ X». И Анон нашёл решение:
my $line = $ARGV[0];
print($line , "\n\r");
$line =~ s/d/dd/g;
$line =~ s/x/xdx/g;
$line =~ s/y/ydy/g;
$line =~ s/xdx/y/g;
$line =~ s/ydy/x/g;
$line =~ s/dd/d/g;
print($line , "\n\r");
И оно даже работает:
$ perl ./replace.pl xdxddxdyddydxdddxxxyyydyxdx
xdxddxdyddydxdddxxxyyydyxdx
ydyddydxddxdydddyyyxxxdxydy
Как видно, цель достигается за 6 строковых замен. Однако есть алгоритм, который добивается тех же результатов за 4 замены:
$line =~ s/z/zz/g;
$line =~ s/x/zx/g;
$line =~ s/zz/x/g;
$line =~ s/zx/z/g;