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/}
Prolongez à n'importe quelle longueur que vous aimez
Manquera rapidement de mémoire car l'utilisation de la mémoire est comme O (n ^ n). Il serait cependant facile de remplacer l'indexeur de permutation par du code O (n), juste plus longtemps. J'illustre simplement la façon dont vous pouvez utiliser END{}
pour cette tâche en perl. Tous les END{}
blocs s'exécutent au moment de la sortie, mais seul le premier qui est appelé (le dernier dans le code) affichera quoi que ce soit en raison du /A/
test qui n'est vrai qu'une fois
Notez que le $m
compteur doit compter comme une chaîne car comme un nombre, il déborderait (plus tard que la fin de l'univers mais c'est le principe qui compte). Pour la même raison, je "compte" le nombre de lignes en construisant une chaîne de A
s au lieu d'utiliser un vrai compteur bien que ce débordement se produise encore plus tard.
Une autre façon de le faire 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),
Cela utilise ce fait que in foo = bar
bar
est exécuté après foo
. Cette version, en passant, ne devient pas folle dans le temps et l'espace, mais cela allonge le code
Encore une autre idée est d'utiliser DESTROY
ce qui a l'avantage de ne faire exécuter qu'une seule d'entre elles. Je ne vais pas répéter le code d'indexation de permutation dont j'ai déjà donné deux exemples.
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" }
Ou en utilisant 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
? Sont-ils tous à égalité avec un score de ∞?