펄 : ∞
$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{}
펄에서이 작업에 사용할 수있는 방법을 보여주고 있습니다 . 모든 END{}
블록은 종료 시간에 실행되지만 코드에서 마지막으로 호출되는 첫 번째 블록 만/A/
테스트 한 번만 출력됩니다.
주목하십시오 $m
카운터 때문에 오버 플로우 것이다 숫자로 문자열로 계산해야한다 (나중에보다 우주의 끝이 아니라 그것을 계산하는 원리이다). 같은 이유로 나는 A
이 오버플로가 나중에 발생할지라도 실제 카운터를 사용하는 대신에 s 문자열을 구성하여 행 수를 "계산"합니다 .
펄에서 이것을하는 또 다른 방법 :
@{$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),
이것은 in 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
어떻습니까? 그들은 모두 ∞의 점수에 묶여 있습니까?