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/}
Erweitern Sie auf eine beliebige Länge
Der Speicher wird schnell knapp, da die Speichernutzung gleich O (n ^ n) ist. Es wäre jedoch einfach, den Permutationsindexer durch O (n) Code zu ersetzen, nur länger. Ich zeige nur, wie Sie END{}
diese Aufgabe in Perl ausführen können. Alle END{}
Blöcke werden zur Exit-Zeit ausgeführt, aber nur der erste, der aufgerufen wird (der letzte im Code), gibt aufgrund des /A/
Tests etwas aus, was nur einmal wahr ist
Beachten Sie, dass der $m
Zähler als Zeichenfolge zählen muss, da er als Zahl überlaufen würde (später als das Ende des Universums, aber es ist das Prinzip, das zählt). Aus dem gleichen Grund "zähle" ich die Anzahl der Zeilen, indem ich A
anstelle eines echten Zählers eine Zeichenfolge von s aufbaue, obwohl dieser Überlauf auch später auftreten würde.
Eine andere Möglichkeit, dies in Perl zu tun:
@{$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),
Dies nutzt die Tatsache, dass in foo = bar
bar
nach ausgeführt wird foo
. Diese Version ist übrigens zeitlich und räumlich nicht verrückt, aber das verlängert den Code
Es ist noch eine andere Idee zu verwenden, DESTROY
die den Vorteil hat, dass nur eine von ihnen ausgeführt wird. Ich werde den Permutationsindexcode, für den ich bereits zwei Beispiele gegeben habe, nicht wiederholen.
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" }
Oder mit 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
? Sind sie alle bei einer Punktzahl von ∞ gebunden?