Permütasyon Paritesi


14

Arka fon

Bir permütasyon parite , wikipedia ile tanımlandığı gibi , aşağıdaki gibi:

Σ permütasyonunun işareti veya imzası sgn (σ) olarak gösterilir ve σ çiftse +1 ve σ tekse −1 olarak tanımlanır.

Bir permütasyon işareti açıkça şu şekilde ifade edilebilir:

sgn (σ) = (−1) ^ N (σ)

burada N (σ), σ cinsinden ters çevirme sayısıdır.

Alternatif olarak bir permütasyonun σ işareti, ayrışmasından transpozisyonların ürününe tanımlanabilir.

sgn (σ) = (−1) ^ m

burada m, ayrışmadaki transpozisyon sayısıdır.

Matematiklerinde Yunan alfabesi çorbasına düşmeyenler için, tanımı bir örnekle (wikipedia'dan da çalındı) basitleştirmeye çalışacağım.

Misal

Girdi dizisini {1, 2, 3, 4, 5}ve bunun bir permütasyonunu düşünelim {3, 4, 5, 2, 1}. Orijinal diziden permütasyonuna ulaşmak için, indeksleri değiştirmeli 0ve 2, 1ve 3, sonra 2ve 4. Bu benzersiz bir çözüm olmamasına rağmen, parite iyi tanımlanmıştır, bu nedenle bu tüm durumlar için geçerlidir.

3 değişim gerektirdiğinden, bu permütasyonu bir oddparite ile etiketliyoruz . Tahmin edebileceğiniz gibi, eşit miktarda takas gerektiren bir permütasyonun evenpariteye sahip olduğu söylenir .

Meydan okuma

Zorluğunuz, bir permütasyonun paritesini belirlemek için mümkün olduğunca az bayt içinde bir program yazmaktır. Programınız veya işleviniz:

  • Bağımsız değişken olarak kabul et, bir permütasyondan önce ve sonra bir kümeyi temsil eden iki girdi dizisi (veya dizeleri).
  • Permütasyon verildiğinde, karakteri eçift ​​veya otek için döndürün veya yazdırın .
  • Dizilerdeki veya dizelerdeki tüm indekslerin benzersiz değerleri olduğunu varsayalım.

Test Durumları

Şu adla bir işlev bildirdiğinizi varsayarsak f:

f([10], [10]) == "e"
f([10, 30, 20], [30, 20, 10]) == "e"
f([10, 30, 20, 40], [30, 20, 40, 10]) == "o"

Bu , bayt en kısa program kazanır!


4
İnsanlar katı çıktı biçimini sevmezler. Eşitlik için doğruluk ve gariplik için falsiye ne dersin? (ya da başka bir şekilde)
CalculatorFeline

Aslında, başkaları gerçekten rahatsız etmediği sürece, belirtilen çıktı biçimini korumayı umuyordum. Düzenlemeye devam et, uzlaşacağım.
Patrick Roberts

@CatsAreFluffy daha iyi mi?
Patrick Roberts

Sanırım göreceğiz!
CalculatorFeline

İyi geceler! İşte buna geri döndüğünüz zaman için bazı öneriler (ancak lütfen kendinizi kontrol edin): [10], [10] -> e(sıfır aktarım). [10 30 20], [30 20 10] -> e(iki aktarım). [10 30 20 40], [30 20 40 10] -> o(üç aktarım)
Luis Mendo

Yanıtlar:


5

Jöle, 13 12 bayt

żṗ2</€⁺Sị“oe

Çevrimiçi deneyin!

Nasıl çalışır

żṗ2</€⁺Sị“oe  Main link. Arguments: A, B (lists)

ż             Zip A with B. Yields an array of pairs [x, σ(x)].
 ṗ2           Generate all pairs [[x, σ(x)], [y, σ(y)]].
   </€        Reduce each pair by </€.
              This maps [[x, σ(x)], [y, σ(y)]] to [x < y, σ(x) < σ(y)].
      ⁺       Repeat the previous link, i.e., execute </€ once more.
              This maps [x < y, σ(x) < σ(y)] to ((x < y) < (σ(x) < σ(y))), which is
              true if and only if x > y and σ(x) < σ(y).
       S      Sum. This counts the number of inversions.
        ị“oe  Retrieve the letter at the corresponding index.
              Indexing is 1-based and modular, so an odd sum retrieves the first
              letter, an even sum the second.

1
Bu oldukça küçük. Kudos!
Patrick Roberts

6

MATL , 17 16 bayt

Dennis tarafından yapılan bir öneri sayesinde 1 bayt kaldırıldı

2$St!<Rz2\'oe'w)

Bu , dilin geçerli sürümünde (15.0.0) çalışır .

Çevrimiçi deneyin !

açıklama

Bu, parite tanımını tersine çevirme açısından kullanır. Ters çevirme, ikinci dizideki ilk diziye kıyasla "yanlış" sırada olan bir çift öğedir. İlk dizinin sıralanması gerekmediğinden, önce onu sıralarız ve bu sıralama için gereken aynı yeniden düzenleme ikinci diziye uygulanır. Daha sonra bir ters çevirme, ikinci dizide artmayan bir çift elemana karşılık gelir.

İki giriş dizisinin de değiştirilebileceğini ve sonucun aynı olduğunu unutmayın. Bu nedenle, hangi dizinin "orijinal" ve "izin verilen" olarak kabul edilmesi önemli değildir.

2$S     % implicitly take two row vectors. Sort second and apply the indices
        % of that sorting to the first
t!      % duplicate. Transpose into column vector
<       % true for elements of the column vector that exceed those of the 
        % row vector. Gives a 2D array with all pairs of comparisons
R       % keep only upper triangular part of that array
z       % number of nonzero elements. This is the number of inversions
2\      % parity of that number: gives 0 or 1
'oe'w   % push string 'eo' below the top of the stack
)       % apply index to produce 'e' or 'o'. An index 1 refers to the first
        % element, whereas 0 refers to the last. Implicitly display 

1
Bu gerçekten akıllı bir çözüm!
Alex

@AlexA. Teşekkürler! Ön sipariş parçasının ne yaptığını açıklığa kavuşturmak için cevabı düzenledim: bir diziyi sıralıyoruz ve daha sonra bu sıralama için gereken aynı yeniden düzenleme diğer diziye uygulanır.
Luis Mendo

1
MATL'ye modüler indeksleme eklemelisiniz. Bu 3 bayt tasarruf sağlayacaktır.
Dennis

@Dennis Evet, bunu sıklıkla düşündüm ... ama şu anda negatif değerlerin farklı bir anlamı olan bir format kullanıyor. Ben x(1:end-2)açıkça boyutunu belirtmeden formu vb endeksleri olması için seçti x. İyi bir seçim olup olmadığından emin değilim, ama şimdi değiştirmek için çok geç sanırım :-) Belki modüler indeksleme eklemek için uyumlu bir yol bulacağım
Luis Mendo

... ve geçerli uzunluğu aşan endeksler yeni değerler atamak için kullanılır. Ama indeks 0"son giriş" anlamı var, bu yüzden bir bayt kaydedebilirsiniz (artış kaldırmak). Fikir için teşekkürler!
Luis Mendo

5

Oktav, 56 52 bayt

Görünüşe göre hiç kimse bu yaklaşımı kullanmıyor: Temelde sadece karşılık gelen permütasyon matrislerinin belirleyicilerini kullanıyorum. İfade det(eye(nnz(a))(a,:)), vektör tarafından tanımlanan permütasyon matrisinin determinantını döndürür a. O zaman sonuca bağlı olarak dizeden doğru karakteri çıkartmak meselesidir.

p=@(v)eye(nnz(v))(v,:);@(a,b)'ole'(det(p(a)*p(b))+2)

2
Determinantları kullanmak iyi bir fikirdir. Ole!
Luis Mendo

5

Haskell, 58 bayt

k%l|m<-zip k l=cycle"eo"!!sum[1|(a,b)<-m,(c,d)<-m,a<c,b>d]

Kullanımı:

*Main> [8,3,5]%[5,3,8]
'o'

Python cevabımla aynı yöntem . gururla haskeller bir bayt kurtardı cycle.


1
cycle"eo"!!...Bunun yerine "eo"!!mod(...)2, bir bayt kaydederek yazabilirsiniz .
gururlu haskeller

4

Python 2, 68 bayt

lambda*M:"eo"[sum(a<b<M>A>B for a,A in zip(*M)for b,B in zip(*M))%2]

Kullanımı:

>>> f=lambda*M:"eo"[sum(a<b<M>A>B for a,A in zip(*M)for b,B in zip(*M))%2]
>>> f([8,3,5],[5,3,8])
'o'

Sıkıştırılmış iki listenin ters çifti çiftlerini sayar, i, e. değerleri (a,A)ve (b,B)her listeden ile aynı dizinde a<bve A>B. Bu karşılaştırmalar a<b<M>A>B, listenin Mherhangi bir sayıdan büyük olduğu özelliği kullanarak birleştirilir . Toplam, daha sonra modulo 2'ye alınır ve eveya haline dönüştürülür o.


3

JavaScript (ES6), 73 bayt

(a,b)=>"eo"[r=0,g=a=>a.map((e,i)=>a.slice(i).map(d=>r^=d<e)),g(a),g(b),r]

Yalnızca parite ile ilgilendiğimizden, yinelenen aktarımlar iptal olur. Uygun bir şekilde JavaScript'in dizi abonelikleri çok boyutlu değildir.


1
Virgül için ilginç bir yer .. Bunu yapabileceğini bilmiyordum. -1 bayt için kıvrılmayı unutmayın
Patrick Roberts

2

Mathematica, 77 bayt

If[Mod[Plus@@Length/@(Join[{0},#]&)/@PermutationCycles[#][[1]],2]==0,"e","o"]&

Katılıyorum!


Kullanışlı fonksiyon, ne yazık ki uzun isim!
Patrick Roberts

Can sıkıcı, değil mi? Nefret ediyorum Cycles. PermutationCyclesAdının büyüklüğünü şişiriyor ve hatta PermutationCyclesaptalca bir Cyclesnesne döndürüyor ! `
CalculatorFeline

2

Mathematica, 31 bayt

If[Tr[Signature/@{##}]==0,o,e]&

İmza [liste], liste öğelerini kanonik sıraya koymak için gereken permütasyonun imzasını verir

Önce bir listeyi herhangi bir sıraya (bu durumda standart düzen) yeniden sıralayarak ve bu listeyi son listeye göre yeniden sıralayarak bir listeyi diğerine yeniden sıralayabiliriz. Genel permütasyonun işareti, iki alt permütasyonun işaretleri eşitse bile.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.