Latar Belakang
The paritas permutasi , seperti yang didefinisikan oleh wikipedia , adalah sebagai berikut:
Tanda atau tanda tangan permutasi σ dilambangkan dengan sgn (σ) dan didefinisikan sebagai +1 jika σ genap dan −1 jika σ ganjil.
Tanda permutasi dapat secara eksplisit dinyatakan sebagai
sgn (σ) = (−1) ^ N (σ)
di mana N (σ) adalah jumlah inversi dalam σ.
Atau, tanda permutasi σ dapat didefinisikan dari dekomposisi menjadi produk transposisi sebagai
sgn (σ) = (−1) ^ m
di mana m adalah jumlah transposisi dalam dekomposisi.
Bagi Anda yang tidak suka sup alfabet Yunani dalam matematika mereka, saya akan mencoba dan menyederhanakan definisi sedikit dengan contoh (juga dicuri dari wikipedia).
Contoh
Pertimbangkan array input {1, 2, 3, 4, 5}
, dan permutasi, katakanlah {3, 4, 5, 2, 1}
,. Untuk mendapatkan dari array asli ke permutasi, Anda harus bertukar indeks 0
dan 2
, 1
dan 3
, lalu 2
dan 4
. Meskipun ini bukan solusi yang unik, paritasnya didefinisikan dengan baik sehingga ini bekerja untuk semua kasus.
Karena membutuhkan 3 swap, kami memberi label permutasi ini dengan odd
paritas. Seperti yang mungkin Anda harapkan, permutasi yang membutuhkan swap bahkan genap dikatakan memiliki even
paritas.
Tantangan
Tantangan Anda adalah menulis sebuah program sesedikit mungkin byte untuk menentukan paritas permutasi. Program atau fungsi Anda harus:
- Terima sebagai argumen, dua larik input (atau string) mewakili satu set sebelum dan sesudah permutasi.
- Kembalikan atau cetak karakter
e
untuk genap atauo
ganjil, diberi permutasi. - Harus mengasumsikan bahwa semua indeks dalam array atau string memiliki nilai unik.
Uji Kasus
Dengan asumsi Anda mendeklarasikan fungsi bernama f
:
f([10], [10]) == "e"
f([10, 30, 20], [30, 20, 10]) == "e"
f([10, 30, 20, 40], [30, 20, 40, 10]) == "o"
Ini adalah kode-golf , program terpendek dalam byte yang menang!
sumber
[10], [10] -> e
(nol transposisi).[10 30 20], [30 20 10] -> e
(dua transposisi).[10 30 20 40], [30 20 40 10] -> o
(tiga transposisi)Jawaban:
Jelly,
1312 byteCobalah online!
Bagaimana itu bekerja
sumber
MATL ,
1716 byte1 byte dihapus berkat saran dari Dennis
Ini berfungsi dalam versi bahasa saat ini (15.0.0) .
Cobalah online !
Penjelasan
Ini menggunakan definisi paritas dalam hal inversi. Inversi adalah sepasang elemen dalam array kedua yang berada dalam urutan "salah" dibandingkan dengan array pertama. Karena array pertama tidak perlu disortir, pertama-tama kita mengurutkannya dan penataan ulang yang sama diperlukan untuk pengurutan yang diterapkan ke array kedua. Kemudian inversi berhubungan dengan sepasang elemen yang tidak meningkat dalam array kedua.
Perhatikan juga bahwa kedua array input dapat ditukar dan hasilnya adalah sama. Jadi tidak penting array mana yang dianggap sebagai "asli" dan yang "permutasi".
sumber
x(1:end-2)
dll tanpa secara eksplisit menunjukkan ukuranx
. Tidak yakin apakah itu pilihan yang baik, tapi saya kira sudah terlambat untuk berubah sekarang :-) Mungkin saya akan menemukan cara yang kompatibel untuk menambahkan pengindeksan modular0
memang memiliki arti "entri terakhir", jadi saya dapat menyimpan byte (menghapus kenaikan). Terima kasih atas idenya!Oktaf,
5652 byteTampaknya tidak ada yang menggunakan pendekatan ini sejauh ini: Pada dasarnya saya hanya menggunakan determinan dari matriks permutasi yang sesuai. Ekspresi
det(eye(nnz(a))(a,:))
mengembalikan penentu matriks permutasi yang didefinisikan oleh vektora
. Maka itu hanya masalah mengekstraksi karakter yang tepat dari string, tergantung pada hasilnya.sumber
Haskell, 58 byte
Pemakaian:
Metode yang sama dengan jawaban Python saya . haskeller bangga menyimpan byte dengan
cycle
.sumber
cycle"eo"!!...
Alih-alih"eo"!!mod(...)2
, menghemat satu byte.Python 2, 68 byte
Pemakaian:
Menghitung jumlah pasangan inversi dari dua daftar yang di-zip, i, e. nilai
(a,A)
dan(b,B)
dari setiap daftar pada indeks yang sama dengana<b
danA>B
. Perbandingan ini digabungkan sebagaia<b<M>A>B
, menggunakan properti yang daftarnyaM
lebih besar dari angka apa pun. Jumlahnya kemudian diambil modulo 2 dan diubah menjadie
atauo
.sumber
JavaScript (ES6), 73 byte
Karena kami hanya tertarik pada paritas, transposisi duplikat hanya dibatalkan. Subskrip larik JavaScript yang nyaman bukan multidimensi.
sumber
Mathematica, 77 byte
Saya setuju!
sumber
Cycles
. Itu menabrak ukuranPermutationCycles
nama, dan bahkanPermutationCycles
bodoh, mengembalikanCycles
objek! `Mathematica, 31 byte
Kami dapat memesan ulang satu daftar ke yang lain, dengan terlebih dahulu memesan kembali satu daftar ke urutan apa pun (dalam hal ini urutan kanonik) dan menyusun ulang daftar ini ke daftar akhir. Tanda dari permutasi keseluruhan adalah genap, jika tanda dari dua sub-permutasi adalah sama.
sumber