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/}
Mở rộng đến bất kỳ độ dài nào bạn thích
Sẽ nhanh chóng hết bộ nhớ vì việc sử dụng bộ nhớ giống như O (n ^ n). Tuy nhiên, có thể dễ dàng thay thế bộ chỉ mục hoán vị bằng mã O (n), chỉ lâu hơn. Tôi chỉ minh họa cách bạn có thể sử dụng END{}
cho nhiệm vụ này trong perl. Tất cả END{}
các khối chạy tại thời điểm thoát, nhưng chỉ khối đầu tiên được gọi (khối cuối cùng trong mã) sẽ xuất ra bất cứ điều gì do /A/
thử nghiệm chỉ đúng một lần
Lưu ý rằng bộ $m
đếm phải được tính là một chuỗi bởi vì như một số, nó sẽ tràn ra (muộn hơn so với sự kết thúc của vũ trụ nhưng đó là nguyên tắc được tính). Vì lý do tương tự, tôi "đếm" số lượng dòng bằng cách xây dựng một chuỗi A
s thay vì sử dụng bộ đếm thực mặc dù việc tràn này sẽ xảy ra ngay cả sau đó.
Một cách khác để làm điều này trong 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),
Điều này sử dụng thực tế rằng trong foo = bar
bar
được thực hiện sau foo
. Tuy nhiên, phiên bản này không phát điên về thời gian và không gian nhưng điều đó làm cho mã dài hơn
Tuy nhiên, một ý tưởng khác là sử dụng DESTROY
có lợi thế là chỉ một trong số chúng sẽ được thực thi. Tôi sẽ không lặp lại mã lập chỉ mục hoán vị mà tôi đã đưa ra hai ví dụ.
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" }
Hoặc sử dụng 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
? Có phải tất cả đều được buộc ở một số điểm ∞?