Perl: ∞
$z.="-1,";$_.=A;END{$m.=!!s/./{${z}B}/g,map(/B/||s/\d+\K/,/g*/(-\d*,).*\1/||($n{$_}||=$m++),sort glob),print$n{$z}if/A/}
$z.="-2,";$_.=A;END{$m.=!!s/./{${z}B}/g,map(/B/||s/\d+\K/,/g*/(-\d*,).*\1/||($n{$_}||=$m++),sort glob),print$n{$z}if/A/}
$z.="-3,";$_.=A;END{$m.=!!s/./{${z}B}/g,map(/B/||s/\d+\K/,/g*/(-\d*,).*\1/||($n{$_}||=$m++),sort glob),print$n{$z}if/A/}
Estenda o comprimento que desejar
A memória ficará rapidamente rapidamente, pois o uso da memória é como O (n ^ n). No entanto, seria fácil substituir o indexador de permutação pelo código O (n), apenas por mais tempo. Estou apenas ilustrando a maneira como você pode usar END{}
esta tarefa em perl. Todos os END{}
blocos são executados no momento da saída, mas apenas o primeiro chamado (o último no código) produzirá algo devido ao /A/
teste, que só é verdadeiro uma vez
Observe que o $m
contador deve contar como uma cadeia, porque, como número, transbordaria (mais tarde que o fim do universo, mas é o princípio que conta). Pela mesma razão, eu "conto" o número de linhas construindo uma sequência de A
s em vez de usar um contador real, embora esse estouro ocorra ainda mais tarde.
Outra maneira de fazer isso em perl:
@{$b.=A; if($a eq $b) {use bigint; $n=0;$n++for@F;$c=0;$c=$c*$n--+map{$z=$_;$a=grep$_&&$_>$z,@F;$_=0;}@F;print$c}}=()x push@F,"1".!($a.=A),
@{$b.=A; if($a eq $b) {use bigint; $n=0;$n++for@F;$c=0;$c=$c*$n--+map{$z=$_;$a=grep$_&&$_>$z,@F;$_=0;}@F;print$c}}=()x push@F,"2".!($a.=A),
@{$b.=A; if($a eq $b) {use bigint; $n=0;$n++for@F;$c=0;$c=$c*$n--+map{$z=$_;$a=grep$_&&$_>$z,@F;$_=0;}@F;print$c}}=()x push@F,"3".!($a.=A),
Isso usa o fato de que in foo = bar
bar
é executado depois foo
. Esta versão, a propósito, não fica louca no tempo e no espaço, mas isso torna o código mais longo
Ainda outra idéia é usar, DESTROY
que tem a vantagem de que apenas um deles será executado. Não vou repetir o código de indexação de permutação do qual já dei dois exemplos.
push@F,"1";bless\@F;DESTROY{print"Work out permutation index of @{$_[0]}\n" }
push@F,"2";bless\@F;DESTROY{print"Work out permutation index of @{$_[0]}\n" }
push@F,"3";bless\@F;DESTROY{print"Work out permutation index of @{$_[0]}\n" }
Ou usando BEGIN
:
BEGIN{push@F,"1"} print"Work out permutation index of @F\n"; exit;
BEGIN{push@F,"2"} print"Work out permutation index of @F\n"; exit;
BEGIN{push@F,"3"} print"Work out permutation index of @F\n"; exit;
n
? Todos eles estão empatados com score?