[Moscow.pm] YAPC::Russia::Golf
Ivan B. Serezhkin
ivan на serezhkin.com
Вс Май 18 13:37:31 PDT 2008
Vladimir V. Perepelitsa wrote:
> Может быть запостить в рассылку все решения?
> было-бы интересно обстоятельнее посмотреть на различные решения.
>
>
while ( <> ) {
chomp;
$i=10;
@D=map { [
map{$i=(1..10,0)[$i]}0..9
] } 0..10;
$i=0;
$i=$D[$i]->[$_] for split "",$_;
printf "%-80d %s\n", $_, $i ? "no" : "yes"
}
Но сначала я наполнил DFA вот так :
my @alphabet=(0..9);
my $divider=11;
my @modulus=(0..$divider-1);
my $DFA=[ map {[
map {undef} @alphabet
]} @modulus ];
$DFA->[0]->[0]=0;
my $counter=10;
my @q=([0,0]);
while (my $pass = shift @q) {
my ($str,$state)=@$pass;
for my $next (grep {!defined $DFA->[$state]->[$_]} @alphabet) {
my $modulus=($str.$next) % $divider;
$DFA->[$state]->[$next] = $modulus;
push @q, [$str.$next, $modulus];
}
}
Но потом регекс оказался такого размера .. что я просто обнаружив
закономерность в автомате оставил генератор автомата и переходы по нему.
Автомат ищет модуль от деления на дивайдер alphabet - это цифры, modulus
- это остатки от деления.
А вааще ... http://mathforum.org/kb/message.jspa?messageID=4614160&tstart=0
--
Ivan B. Serezhkin
Подробная информация о списке рассылки Moscow-pm