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{}
ブロックは終了時に実行されますが、呼び出される最初のブロック(コードの最後のブロック)のみが、1 /A/
回だけtrueであるテストのために出力します
$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),
これは、in foo = bar
bar
がの後に実行されるという事実を使用していfoo
ます。ちなみに、このバージョンは時間と空間に夢中になりませんが、コードが長くなります
さらに別のアイデアはDESTROY
、そのうちの1つだけが実行されるという利点があるものを使用することです。既に2つの例を挙げた順列索引付けコードを繰り返すつもりはありません。
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
ですか?それらはすべて∞のスコアで結ばれていますか?