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/}
延伸至您喜欢的任何长度
由于内存使用量像O(n ^ n),将很快耗尽内存。但是,用O(n)代码替换置换索引器会很容易,只需更长的时间。我只是END{}
在perl中说明可用于此任务的方式。所有END{}
块都在退出时运行,但是由于/A/
测试,只有第一个被调用的块(代码中的最后一个)将输出任何内容,这仅是一次
请注意,$m
计数器必须计数为字符串,因为它会溢出(比Universe末尾晚,但这是计数的原理)。出于相同的原因,我通过构造A
s 字符串而不是使用实数计数器来“计数”行数,尽管这种溢出甚至会在以后发生。
在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),
这利用了在foo = bar
bar
之后执行in的事实foo
。顺便说一下,此版本不会在时间和空间上发疯,但这会使代码更长
还有另一种想法是使用DESTROY
,其优点在于将仅执行其中一个。我不会重复已经给出两个示例的置换索引代码。
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" }
或使用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
呢?他们是否都以∞分并列?