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
счетчик должен считаться строкой, потому что как число он будет переполнен (позже, чем конец юниверса, но учитывается принцип). По той же причине я «подсчитываю» количество строк, создавая строку 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
выполняется после 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
? Все ли они связаны со счетом ∞?