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/}
Extiende a cualquier longitud que quieras
Se quedará rápidamente sin memoria ya que el uso de la memoria es como O (n ^ n). Sin embargo, sería fácil reemplazar el indexador de permutación por código O (n), solo por más tiempo. Solo estoy ilustrando la forma en que puede usar END{}
para esta tarea en perl. Todos los END{}
bloques se ejecutan al momento de la salida, pero solo el primero que se llama (el último en el código) generará algo debido a la /A/
prueba, que solo es cierta una vez
Tenga en cuenta que el $m
contador debe contar como una cadena porque como un número se desbordaría (más tarde que el final del universo, pero es el principio el que cuenta). Por la misma razón, "cuento" el número de líneas construyendo una cadena de A
s en lugar de usar un contador real, aunque este desbordamiento ocurriría incluso más tarde.
Otra forma de hacer esto en 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),
Esto usa el hecho de que in foo = bar
bar
se ejecuta después foo
. Por cierto, esta versión no se vuelve loca en el tiempo y el espacio, pero eso hace que el código sea más largo
Otra idea más es usar la DESTROY
que tiene la ventaja de que solo uno de ellos será ejecutado. No voy a repetir el código de indexación de permutación del cual ya di dos ejemplos.
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
? ¿Están todos empatados a una puntuación de ∞?