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
? Чи всі вони зв'язані з рахунком ∞?