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/}
İstediğiniz herhangi bir uzunluğa genişletin
Bellek kullanımı O (n ^ n) gibi olduğundan bellekte hızla yer kalmaz. Ancak permütasyon indeksleyicisini O (n) koduyla değiştirmek daha kolay olacaktır. Sadece END{}
perl'de bu görev için nasıl kullanabileceğinizi gösteriyorum . Tüm END{}
nedeniyle denilen olsun çıkış zamanda çalıştırmak bloklar, ama sadece ilki (kodda bir son) çıktısı şey /A/
tek gerçek kez testten
$m
Sayacın bir dize olarak sayılması gerektiğine dikkat edin, çünkü bir sayı olarak taşacaktır (evrenin sonundan daha geç ama önemli olan prensiptir). Aynı nedenle A
bu taşma daha sonra gerçekleşecek olsa da, gerçek bir sayaç kullanmak yerine s dizesi oluşturarak satır sayısını "sayıyorum" .
Bunu perl'de yapmanın başka bir yolu:
@{$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),
Gerçek şu ki o bu kullanımlar foo = bar
bar
sonra yürütülür foo
. Bu arada bu sürüm zaman ve mekanda çıldırmıyor ancak bu da kodu daha uzun yapıyor
Yine başka bir fikir, DESTROY
sadece bir tanesinin idam edilme avantajına sahip kullanmaktır . Zaten iki örnek verdiğim permütasyon indeksleme kodunu tekrarlamayacağım.
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" }
Veya şunu kullanarak 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
? Hepsi ∞ skoruna mı bağlı?