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/}
Estendi quanto vuoi
La memoria si esaurirà rapidamente poiché l'utilizzo della memoria è come O (n ^ n). Sarebbe comunque facile sostituire l'indicizzatore di permutazione con il codice O (n), solo più a lungo. Sto solo illustrando il modo in cui puoi usare END{}
questo compito in perl. Tutti i END{}
blocchi vengono eseguiti al momento dell'uscita, ma solo il primo che viene chiamato (l'ultimo nel codice) produrrà qualsiasi cosa a causa del /A/
test che è vero solo una volta
Si noti che il $m
contatore deve contare come una stringa perché come numero traboccarebbe (più tardi della fine dell'universo ma è il principio che conta). Per lo stesso motivo, "conto" il numero di righe costruendo una stringa di A
s invece di usare un contatore reale sebbene questo overflow si verificherebbe anche più tardi.
Un altro modo per farlo in 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),
Questo utilizza quel fatto che in foo = bar
bar
viene eseguito dopo foo
. Questa versione non impazzisce nel tempo e nello spazio ma rende il codice più lungo
Un'altra idea è quella di utilizzare DESTROY
che ha il vantaggio che solo una di esse verrà eseguita. Non ripeterò il codice di indicizzazione di permutazione di cui ho già dato due esempi.
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" }
O 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
? Sono tutti legati con un punteggio di ∞?