Eşlenik permütasyonlar


17

N büyüklüğünde bir permütasyon , ilk n pozitif tamsayının yeniden sıralanmasıdır. (yani her tamsayı bir kez ve tam olarak bir kez görünür). Permütasyonlar, n boyutundaki öğelerin listesinin sırasını değiştiren işlevler gibi ele alınabilir . Örneğin

(4 1 2 3) ["a", "b", "c", "d"] = ["d", "a", "b", "c"]

Böylece permütasyonlar fonksiyonlar gibi oluşturulabilir.

(4 1 2 3)(2 1 3 4) = (4 2 1 3)

Bu birçok ilginç özellik getiriyor. Bugün konjugasiteye odaklanıyoruz . Y ve x permütasyonları (her ikisi de n boyutunda ) g ve g -1 (ayrıca n boyutunda ) permütasyonları varsa konjügatlardır .

x = gyg-1

ve gg -1 , kimlik permütasyonuna eşittir ( uygun sırayla ilk n sayısı).

Göreviniz, standart girdi yöntemleri ile aynı boyutta iki permütasyon almak ve bunların konjugat olup olmadığına karar vermektir. Biri konjugat ise diğeri değilse iki tutarlı değerden birini çıkarmalısınız.

Bu bu nedenle cevaplar daha az bayt daha iyi olacak şekilde bayt cinsinden puanlanır.

Elinizin altında olan eşlenik permütasyonlar hakkında birçok teorem var, çok iyi şanslar ve mutlu golf.

Girdiyi, yukarıdaki gibi bir permütasyonu temsil eden sıralı bir değerler kabı (1-n veya 0-n) veya sıralı bir kabı alan ve permütasyonu gerçekleştiren bir fonksiyon olarak alabilirsiniz. İşlev almayı seçerseniz, işlevi önceden tanımlanmış bir adda kullanmak yerine bir bağımsız değişken olarak almalısınız.

Test Durumları

(1) (1) -> True
(1 2) (2 1) -> False
(2 1) (2 1) -> True
(4 1 3 2) (4 2 1 3) -> True
(3 2 1 4) (4 3 2 1) -> False 
(2 1 3 4 5 7 6) (1 3 2 5 4 6 7) -> True

Girişi bir işlev olarak alabilir miyiz? Ayrıca n boyutunu da alabilir miyiz?
xnor

@xnor Her iki sayımdan da emin olun. İlkinin size nasıl yardımcı olacağından emin değilim.
Post Rock Garf Hunter

Varsayılan işlev giriş kuralları, işlevin önceden tanımlandığı varsayılarak izin verirse, baytları bağımsız değişken olarak yazarken kaydeder.
xnor

@xnor Bu kuraldan mı bahsediyoruz ? Bu, permütasyon olmayan kara kutu fonksiyonları içindir. Bu mantıklıdır, çünkü fikir birliği, işlev işaretçileri / nesneleri olmayan dillerin rekabet etmesine izin vermek için tasarlanırken, burada yapabilirler çünkü permütasyonlar başka türlü temsil edilebilir.
Post Rock Garf Hunter

Ben, onların kara kutu olma ayrımını düşünmedim. Yani, burada girdi bir işlev olabilir, ama sadece açık bir argüman olarak?
xnor

Yanıtlar:


6

Python 2 , 87 bayt

f=lambda P,k:k<1or len({sum([x==eval('L['*k+'x'+']'*k)for x in L])for L in P})&f(P,k-1)

Çevrimiçi deneyin!

PHer iki permütasyonun ve kuzunluklarının bir çifti olarak girdi alır . 1Konjugatlar için çıktılar , 0değil.

Bu sonucu kullanır:

İki x ve y permütasyonu , k- güçleri x k ve y k'nin 0 ila n arasındaki her k için eşit sayıda sabit noktaya sahip olması durumunda tam olarak eşleniktir .

İki eşlenik permütasyon bunu karşılar, çünkü k- güçleri aynı zamanda eşleniktir ve eşleniklik sabit noktaların sayısını korur.

İki eşlenik olmayan permütasyonun her zaman farklı olduğu daha az açıktır. Özellikle, konjüge, sıralı çevrim uzunlukları listesi ile belirlenir ve bunlar, sabit noktaların sayımlarından geri kazanılabilir. Bunu göstermenin bir yolu aşırı abartılı olsa da doğrusal cebirdir.

X , x için permütasyon matrisi olsun . Daha sonra, sabit nokta sayısı x k olan Tr (X k ) . Bu izler olan güç toplamı simetrik polinomlar eigen değerlerinin x k çokluğu. İçin bu polinomları k dan 0 ile n- bize gelen geri izin temel simetrik polinomları bu özdeğerler ve bu nedenle polinom karakteristik ve özdeğerler kendilerini çok.

Bu özdeğerler x döngülerine karşılık gelen birlik kökleri olduğundan , bunlardan döngü boyutlarını ve çokluklarını geri kazanabiliriz. Yani, bizim "imzamız", çekime kadar olan permütasyonu tanımlar.


6

J , 25 bayt 23 bayt 16 bayt

mil ' tacit çözümü:

-:&([:/:~#&>)&C.

OP'nin açık çözümü:

c=:4 :'-://:~"1#&>C.&>x;y'   

Bu, C.döngü gösterimleri oluşturmak için yerleşik işlevi kullanarak x ve y permütasyonlarının aynı döngü tipine sahip olup olmadığını kontrol eder.

   4 1 3 2   c   4 2 1 3
1
   3 2 1 4   c   4 3 2 1
0
   2 1 3 4 5 7 6   c   1 3 2 5 4 6 7
1

1
PPCG ve güzel ilk gönderiye hoş geldiniz. -:&([:/:~#&>)&C.Bir tacit formu kullanarak yönteminizi 16 bayta kısalttım . İşte bunu denemek için bir TIO bağlantısı.
mil

Teşekkür ederim. :) Ben hala bir J acemiyim ve açık formlarla kolayca iyi bir şekilde kullanmış gibi görünsem de, verimli zımni formlar oluşturmak benim için aşırı bir düşünce gerektiriyor. Çözümünüzü ekleyeceğim.
Mathias Dolidon

Not: Fonksiyon atamalarının karakterlerini de saymıyoruz? c=:
Mathias Dolidon

1
@MathiasDolidon Hayır, varsayılan konsensüs olarak, atama için gerekli karakterleri saymayız, çünkü işlev olduğu gibi kullanılabilir (parantez ile ama bunları saymayız).
Outgolfer Erik

1
TAMAM ! Bunu dikkate almak için başlıktaki açık çözümün sayılarını geriye dönük olarak güncelledim.
Mathias Dolidon

4

MATL , 20 19 17 16 bayt

xY@!"&G@)@b)X=va

Giriş: iki sütun vektörü ( ;ayırıcı olarak kullanılır ). Çıktı: 1eğer eşlenik ise,0 değilse.

Çevrimiçi deneyin! Veya tüm test senaryolarını doğrulayın .

açıklama

Kullanılan permütasyonlarla ilgili teoremler (sırf cehalet dışında); sadece kaba kuvvet ve bu iki gerçek:

  • İki p ve q permütasyonu için pq kompozisyonu , q elemanlarını indekslemek için p kullanımına eşdeğerdir .

  • Koşulu X = gyg -1 eşdeğerdir x g'de = gy .

Yorumlanan kod:

x      % Implicitly input first permutation, x. Delete it. Gets copied into clipboard G
Y@     % Implicitly input second permutation, y. Push a matrix with all permutations
       % of its elements, each permutation on a different row. So each matrix row is
       % a permutation of [1 2 ...n], where n is the size of y
!      % Transpose. Now each permutation is a column
"      % For each column
  &G   %   Push x, then y
  @    %   Push current column. This is a candidate g permutation
  )    %   Reference indexing. This gives g composed with y
  @    %   Push current column again
  b    %   Bubble up. Moves x to the top of the stack
  )    %   Reference indexing. This gives x composed with g
  X=   %   Are they equal as vectors? Gives true or false
  v    %   Concatenate stack so far. The stack contains the latest true/false result
       %   and possibly the accumulated result from previous iterations
  a    %   Any: gives true if any element is true. This is the "accumulating" function
       % Implicit end. Implicit display


2

Jöle , 11 bayt

Œ!©Ụ€ịị"®⁸e

Çevrimiçi deneyin!

Nasıl çalışır

Œ!©Ụ€ịị"®⁸e  Main link. Left argument: x. Right argument: y

Œ!©          Take all permutations g of x. Copy the result to the register.
   Ụ€        Grade up each; sort the indices of each permutation g by their
             corresponding values. For permutations of [1, ..., n], grading up
             essentially computes the inverse, g⁻¹.
     ị       Let each g⁻¹ index into y, computing g⁻¹y.
      ị"®    Let the results index into the corresponding g, computing g⁻¹yg.
         ⁸e  Test if x occurs in the result.

Anladığım kadarıyla, aslında yher birini endeksleyen g⁻¹şey, tersi değil. Örneğe bakın (4 1 2 3)(2 1 3 4) = (4 2 1 3),. Yaklaşımınızla, bunun (1 4 2 3)yerine ikinci endekslerden birincisine indekslenecektir. Bunu göz önünde bulundurarak, henüz bozmayacağım 12 baytlık bir çözümüm var. :-)
Outgolfer Erik

@EriktheOutgolfer Düzeltildi.
Dennis

@Dennis Ama açıklamaya dayanarak bu sonuca gelmedim, aynı yaklaşımlara vardım Œ!©Ụ€⁹ịЀ®ị"⁸e, ancak büyük değişiklikler yaptıktan sonra daha kısa bir süre dışında (temelde tersine çevrilmiş argümanlarla tüm indeksleme) bir şeyim vardı . Bence g⁻¹ygaynı şey değil gyg⁻¹. Ayrıca, cevabınızın bu değişikliklerden de faydalanabileceğini düşünüyorum, ancak daha önce de söylediğim gibi, eğlenceyi henüz mahvetmek istemiyorum.
Outgolfer Erik

Evet, tamamen aynı. Eğer x = g⁻¹ygöyleyse gxg⁻¹ = y, xve yeşlenikler.
Dennis

Hm, o zaman 12 baytlık çözümümü ortaya çıkarmam gerektiğini hissediyorum:eŒ!ị"Ụị@¥€¥¥
Outgolfer Erik

1

Kabuk , 9 bayt

¤¦ṠmöLU¡!

1Eşlenik ve eşlenik 0olmayan için döndürür . Çevrimiçi deneyin!

açıklama

Bir permütasyon eşlenik sınıfı P ve L = [1,2, .., n] her bir sayının en süresini içeren multiset belirlenir L altında P . Ne zaman P liste biçiminde alınır, ben yerine L ile P ve aynı MultiSet olsun. Program her bir giriş için karşılık gelen çoklu seti hesaplar ve birinin diğerinin alt çoklu setini kontrol eder. Aynı sayıda öğeye sahip oldukları için, bu aynı çoklu sete eşittir.

¤¦ṠmöLU¡!  Implicit inputs: two lists of integers.
¤          Apply one function to both and combine with another function.
  ṠmöLU¡!  First function. Argument: a list P.
  Ṡm       Map this function over P:
       ¡!  iterate indexing into P,
      U    take longest prefix with unique elements,
    öL     take its length.
 ¦         Combining function: is the first list a subset of the other, counting multiplicities?

1

Perl, 61 58 57 bayt

içerir +2içinap

STDIN'de 0 tabanlı permütasyonlar 2 satır olarak verin

perl -ap '$_=[@1]~~[@1=map{-grep$_-$G[$i++%@G],@F=@G[@F]}@G=@F,0]'
3 0 2 1
3 1 0 2
^D

Algoritma, xnor'un çözeltisindeki küçük bir varyasyondur

Kodun bu eski sürümü bir perl hatasını vurur ve en son perlimdeki birkaç giriş için çekirdeği döker 5.26.1, ancak daha eski bir perl üzerinde çalışır 5.16.3.

@{$.}=map{-grep$_==$F[$i++%@F],@G=@F[@G]}@G=@F,0}{$_=@1~~@2

Muhtemelen eski perlgolf düşmanımın başka bir örneği, perl yığınını düzgün bir şekilde ifade etmiyor.


1

JavaScript (ES6), 66 64 bayt

(a,b,g=a=>b+a.map(h=(e,i)=>e-i&&1+h(a[e],i)).sort())=>g(a)==g(b)

Diğer cevapları doğru okuduysam, sorun tüm öğelerin periyotlarını saymaya ve iki listenin her periyotta aynı sayıda olup olmadığını kontrol etmeye denktir. Edit: @Arnauld sayesinde noktadan bir tane daha az hesaplayarak 1 bayt kaydedildi Dizileri karşılaştırmak için JavaScript'in tuhaf baskı kurallarını kötüye kullanarak @Arnauld sayesinde başka bir bayt kaydetti. Başka bir bayt köri ile kurtarılabilir ama tavuk tikka masala olmadığı sürece köri sevmiyorum.

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.