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
$mSayacı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 Abu 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 barsonra 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, DESTROYsadece 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ı?