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/}
Rozciągnij na dowolną długość
Szybko zabraknie pamięci, ponieważ użycie pamięci jest jak O (n ^ n). Łatwo byłoby jednak zastąpić indeksator permutacji kodem O (n), tylko dłużej. Właśnie ilustruję sposób, w jaki możesz użyć END{}
tego zadania w Perlu. Wszystkie END{}
bloki działają w momencie wyjścia, ale tylko pierwszy, który zostanie wywołany (ostatni w kodzie), wyświetli cokolwiek z powodu /A/
testu, który jest prawdziwy tylko raz
Zauważ, że $m
licznik musi się liczyć jako ciąg, ponieważ jako liczba przelałaby się (później niż koniec wszechświata, ale liczy się zasada). Z tego samego powodu „liczę” liczbę wierszy, konstruując ciąg A
s zamiast prawdziwego licznika, chociaż to przepełnienie nastąpiłoby nawet później.
Inny sposób, aby to zrobić w Perlu:
@{$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),
Wykorzystuje to fakt, że in foo = bar
bar
jest wykonywany później foo
. Nawiasem mówiąc, ta wersja nie oszaleje w czasie i przestrzeni, ale wydłuża kod
Jeszcze innym pomysłem jest użycie, DESTROY
które ma tę zaletę, że tylko jeden z nich zostanie wykonany. Nie zamierzam powtarzać kodu indeksującego permutację, którego już podałem dwa przykłady.
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" }
Lub używając 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
? Czy wszystkie są powiązane z wynikiem ∞?