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/}
Perpanjang hingga panjang yang Anda suka
Akan cepat kehabisan memori karena penggunaan memori seperti O (n ^ n). Namun akan lebih mudah untuk mengganti pengindeks permutasi dengan kode O (n), lebih lama. Saya hanya menggambarkan cara yang dapat Anda gunakan END{}untuk tugas ini di perl. Semua END{}blok berjalan pada waktu keluar, tetapi hanya yang pertama yang dipanggil (yang terakhir dalam kode) yang akan menghasilkan apa saja karena /A/pengujian yang hanya berlaku sekali
Perhatikan bahwa $mpenghitung harus dihitung sebagai string karena sebagai angka itu akan meluap (lebih lambat dari akhir jagat raya tetapi prinsip yang diperhitungkan). Untuk alasan yang sama saya "menghitung" jumlah baris dengan membangun string As alih-alih menggunakan penghitung nyata meskipun ini melimpah akan terjadi bahkan kemudian.
Cara lain untuk melakukan ini di 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),
Ini menggunakan fakta bahwa in foo = bar bardijalankan setelah foo. Versi ini omong-omong tidak gila waktu dan ruang tetapi itu membuat kode lebih lama
Namun ide lain adalah menggunakan DESTROYyang memiliki keuntungan bahwa hanya satu dari mereka yang akan dieksekusi. Saya tidak akan mengulangi kode pengindeksan permutasi yang sudah saya berikan dua contoh.
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" }
Atau menggunakan 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? Apakah mereka semua terikat pada skor ∞?