[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