Quandle Quandary 1.Bölüm: Sonlu Quandles'ı Belirleme


20

Belirli bir matrisin bir quandle'ı temsil edip etmediğini belirleyecek bir program yazın. Bir quandle , aşağıdaki aksiyomlara uyan tek (değişmeli olmayan, ilişkisel olmayan) işlemle donatılmış bir settir:

  • Operasyon, yani kapalıdır a◃b = ceğer hep kümesinin bir elementtir ave bsetin unsurlarıdır.
  • Operasyon sağ kendinden dağıtıcı geçerli: (a◃b)◃c = (a◃c)◃(b◃c).
  • Operasyon sağ bölünebilir: herhangi seçilen çifti için ave btek bir benzersiz olduğunu cböylec◃a = b
  • Operasyon idempotenttir: a◃a = a

Sonlu bir dörtgen kare bir matris olarak temsil edilebilir. Aşağıda sıra-5 quandle ( kaynak ) örneği verilmiştir .

0 0 1 1 1
1 1 0 0 0
3 4 2 4 3
4 2 4 3 2
2 3 3 2 4

N. Satırda ve m. Sütunda (0 dizinli) bulunan değer n◃m değeridir. Örneğin, bu tutamda 4◃1 = 3,. Quandle özelliklerinden bazılarını bu matristen görmek kolaydır:

  • Bu 5x5 matriste yalnızca 0-4 değerleri göründüğü için kapalıdır.
  • Bu idempotenttir çünkü matris diyagonal 0 1 2 3 4
  • Hiçbir sütunda yinelenen değerler bulunmadığından sağ bölünebilir. (Satırlar olabilir ve genellikle de olur.)

Sağ-kendine-dağılma özelliğini test etmek daha zordur. Bir kısayol olabilir, ancak en basit yöntem bunu doğrulamak için her üç dizinin kombinasyonunu yinelemektir m[m[a][b]][c] = m[m[a][c]][m[b][c]].

Giriş

Girdi, 0-indeksleme veya 1-indeks (seçiminiz) kullanılarak bir kare matrisin satırlarının listesi olacaktır. Her giriş tek haneli bir numara olacaktır 0için 8(veya 1ile 9). Girdi biçiminde esnek olacağım. Kabul edilebilir bazı biçimler şunları içerir:

  • Gibi matrisleri veya listeleri, İçin dilin en doğal biçimlendirme [[0 0 0][2 1 1][1 2 2]]veya (0,0,0,2,1,1,1,2,2).
  • Boşluk, satırsonu, virgül vb. İle sınırlanan değerlerin listesi.
  • Birlikte birleştirilen tüm değerlerden oluşan tek bir dize 000211122.

Ayrıca matrisin geçişini girdi olarak almanıza izin verilir (satırları sütunlarla değiştirme). Bunu cevabınızda belirttiğinizden emin olun.

Çıktı

Matrisin bir quandle olarak durumunu gösteren tek bir doğruluk / falsey değeri.

Quandle örnekleri

0

0 0
1 1

0 0 0
2 1 1
1 2 2

0 0 1 1
1 1 0 0
3 3 2 2
2 2 3 3

0 3 4 1 2
2 1 0 4 3
3 4 2 0 1
4 2 1 3 0
1 0 3 2 4

Quandles olmayan örnekler

kapalı değil

1

0 0 0
2 1 1
1 9 2

kendi kendine dağıtıcı değil

0 0 1 0
1 1 0 1
2 3 2 2
3 2 3 3

(3◃1)◃2 = 2◃2 = 2
(3◃2)◃(1◃2) = 3◃0 = 3

doğru bölünemez

0 2 3 4 1
0 1 2 3 4
3 4 2 2 2
3 3 3 3 3
4 1 1 1 4

0 1 2 3
3 1 2 0
3 1 2 3
0 1 2 3

cesur değil

1 1 1 1
3 3 3 3
2 2 2 2
0 0 0 0

2 1 0 4 3
3 4 2 0 1
4 2 1 3 0
1 0 3 2 4
0 3 4 1 2

1
"Matris" kelimesi yanıltıcıdır, çünkü bu doğrusal cebir ile ilgisi yoktur. "Tablo" daha iyi olurdu (ya da belki "Cayley tablo", ama kesinlikle sadece bir grup için uygun olduğunu düşünüyorum).
Peter Taylor

Yanıtlar:


7

Piton 2 , 104 103 102 bayt

t=input();e=enumerate
[0%(a==A[a]in B>C[B[a]]==t[C[b]][C[a]])for(a,A)in e(t)for(b,B)in e(t)for C in t]

Giriş aktarılmıştır. Çıktı çıkış kodu ile yapılır, bu nedenle 0 (başarı) doğrudur ve 1 (başarısızlık) yanlıştır.

Çevrimiçi deneyin!

Nasıl çalışır

e(t)giriş matris numaralandırılmış satır döndürür t operatöre temsil eder - (indeks, satır) çiftleri olarak -. for(a,A)in e(t)Örneğin, içinde endeks kayıtlı bu üzerinde dolaşır bir ve içinde satır kendisi A böylece, Abir kısayol olur t[a].

Birincisi for(b,B)in e(t), ve arasında, Kartezyen gücünde t 3for C in t olası tüm sıralı tuplleri (a, b, c) yineliyoruz .

Bu grupların her biri için ifadeyi değerlendiriyoruz

0%(a==A[a]in B>C[B[a]]==t[C[b]][C[a]])

Parantez Boolean değeridir Yanlış şu bireysel karşılaştırmaların bir veya birden fazla aynı şeyi ancak ve ancak.

  • a==A[a]başarısız olursa ( a değerinin bir kısmı için ) iff idempotent değildir.

  • A[a]in BB , A'nın tüm indekslerini içermiyorsa başarısız olur .

    Bu yana bir sahiptir , n indisleri ve B bulunur , n elemanları elemanları dışı yetmezliği anlamına gelir B indislerine eşleştirmek A , yani kapalıdır ve sağ-bölünebilir.

  • B>C[B[a]] bir totolojidir, çünkü Python 2 sayıları tekrarlanabilirlerden daha küçük saymıştır.

  • C[B[a]]==t[C[b]][C[a]] sağ-kendine-dağıtıcı değilse bazı değerlerde başarısız olur .

Karşılaştırmalardan herhangi biri False değerini döndürürse , ifade (0%...)bir ZeroDivisionError atar . Ayrıca, kapalı değilse A[a]veya C[b]bir IndexError atabilirse . Her iki durumda da, program durum kodu 1 ( çıkış) ile çıkar .

Tüm testlerden geçtiyse, program durum kodu 0 (başarılı) ile normal şekilde çıkacaktır .


6

Haskell, 100 bayt

Bu cevap aktarılmış girdi kullanır .

q m=and$(elem<$>v<*>m)++[a#a==a&&a#b#c==a#c#(b#c)|a<-v,b<-v,c<-v]where v=[0..length m-1];i#j=m!!j!!i

Görünüşe göre bir infix operatörünü bağlamak için desen koruyucusu kullanamıyorum, bu yüzden wherebu durumda kullanıyorum .

(İlk sürüm 108 bayt, ancak kaçırılan idempotency testi, sabit sürüm 120 bayt, sonraki sürümlerde 108, 103 ve 98 bayt vardı ama @nimi sayesinde hepsinin yanlış olduğunu fark etmeliydim: tabii ki doğru yapmalıyım- herhangi bir tehlikeli !!işlem yapmadan önce bölünebilirlik testi (kapalılık anlamına gelir) , ancak daha sonraki golf fikirlerimin çoğunu hala kullanabilirim ve bir tane daha ile, 102 bayttı, şimdi işlenen sırasını değiştirerek iyileştirildi #. transpozisyon) sola olan ilişkisinden daha iyi yararlanmak için)

Bunun gibi kullanın:

*Main> q [[0,1,2,3],[0,1,3,2],[1,0,2,3],[0,1,2,3]]
False

4

Python 2 , 138 bayt

def f(m):R=range(len(m));return all(m[i][i]==i<set(zip(*m)[i])==set(R)>m[m[j][k]][i]==m[m[j][i]][m[k][i]]for i in R for j in R for k in R)

m tamsayıların bir listesidir.

Çevrimiçi deneyin!


4

JavaScript (ES6), 150 bayt

a=>!(a.some((b,i)=>b[i]-i)|a.some(b=>[...new Set(b)].sort()+''!=[...b.keys()])||a.some((_,i)=>a.some((_,j)=>a.some((b,k)=>b[a[j][i]]-a[b[j]][b[i]]))))

Girdiyi bir tamsayı sütun dizisi dizisi olarak alır.


3

Mathematica, 122 bayt

(n_±m_:=#[[m,n]];#&@@Union[Sort/@#]==Range@l==Array[#±#&,l=Length@#]&&And@@Flatten@Array[±##2±#==(#2±#)±(#3±#)&,{l,l,l}])&

Saf fonksiyon, giriş olarak bir 2D tamsayı dizisi (1 dizinli) alarak, sorudaki kuraldan tersine satırlar ve sütunlar döndürerek Trueveya veya döndürür False. İlk satır, ikili infix işlemini n_±m_quandle işlemi olarak tanımlar .

Bir lx ldizisi için, kapalı ve sağ bölünebilir her satırın (benim durumumda) bir miktar permütasyon olduğu {1, ..., l}ve idempotent ana diyagonalin tam olarak eşdeğeridir {1, ..., l}. Yani #&@@Union[Sort/@#]==Range@l==Array[#±#&,l=Length@#]bu üç durumu tespit eder. ( Sort/@#Burada kullanımı neden satırları ve sütunları değiştirmeyi seçtim.)

Doğru dağıtım için, tüm olasılıkları kullanarak kontrol ediyoruz Array[±##2±#==(#2±#)±(#3±#)&,{l,l,l}]). (Not bu ±##2±#otomatik olarak genişler (#2±#3)±#, çünkü ##2üzerinde dizilmiş olan üç değişken olarak saf fonksiyonu için ikinci ve üçüncü bir bağımsız değişken dizisini temsil eder.) Daha sonra &&And@@Flatten@kontrol her bir deney geçirildi olup. Bazı kapalı olmayan quandles için, bir matrisin var olmayan bir bölümüne erişmeye çalıştığında hatalar atılabilir, ancak doğru cevap yine de döndürülür.


±m__:=#[[m]];Bence. Ve bir Diagonalyerleşik var . Ve ±kullanabilirsiniz böylece ilişkisel-bırakılır #2±#±(#3±#), ancak o zaman bir hata yapmadım eğer Atanacak daha kısa #etmek #3ve yapılacak #±#2±#3==#±#3±±##2&. Ve tüm Flatten@parçayı yerine (...&~Array~{l,l,l}<>"")
Martin Ender

Acaba l=Lengthiçine taşımak zorunda olup olmadığını merak ediyorum, Range@lçünkü bu öncelikle değerlendirilmelidir, bu yüzden fonksiyonu tekrar tekrar kullanırsanız, Rangehala bir öncekini alır l, değil mi?
Martin Ender

0

C ++ 14, 175 bayt

İsimsiz lambda olarak varsayarak ngibi olmak std::vector<std::vector<int>>ve referans parametresi ile geri gönderilmesi. 0 yanlıştır, diğer her şey doğrudur.

#define F(x);for(x=-1;++x<s;){
[](auto m,int&r){int s=r=m.size(),a,b,c F(a)auto A=m[a];r*=s==A.size()&&A[a]==a;int u=0 F(b)u|=1<<m[b][a];r*=A[b]<s F(c)r*=m[A[b]][c]==m[A[c]][m[b][c]];}}r*=!(u-(1<<s)+1);}}

Ungolfed ve kullanımı:

#include<vector>
#include<iostream>

auto f=
#define F(x);for(x=-1;++x<s;){
[](auto m,int&r){
 int s=r=m.size(),a,b,c
 F(a)
  auto A=m[a];               //shortcut for this row
  r*=s==A.size()&&A[a]==a;   //square and idempotet
  int u=0                    //bitset for uniqueness in col
  F(b)
   u|=1<<m[b][a];            //count this item
   r*=A[b]<s                 //closed
   F(c)
    r*=m[A[b]][c]==m[A[c]][m[b][c]];
   }
  }
  r*=!(u-(1<<s)+1);          //check right-divisibility
 }
}
;

int main(){
 int r;
 std::vector<std::vector<int>>
  A = {
   {0, 0, 1, 1},
   {1, 1, 0, 0},
   {3, 3, 2, 2},
   {2, 2, 3, 3},
  },
  B = {
   {0, 2, 3, 4, 1},
   {0, 1, 2, 3, 4},
   {3, 4, 2, 2, 2},
   {3, 3, 3, 3, 3},
   {4, 1, 1, 1, 4},
  };
 f(A,r);
 std::cout << r << "\n";
 f(B,r);
 std::cout << r << "\n";
}

Öner int a,b,c,u,s=r=m.size()Fyerine int s=r=m.size(),a,b,c F, u=0;r*=s==A.size()&&a==A[a]Fyerine r*=s==A.size()&&A[a]==a;int u=0 F, r*=s>A[b]Fyerine r*=A[b]<s Fve ~u+(1<<s)yerineu-(1<<s)+1
ceilingcat
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.