27 fonksiyonun komütasyonu


22

Giriş

Üçlü bir işlevi, üç elemanlı kümeden S = {0,1,2}kendisine bir fonksiyon olarak tanımlayalım : Sbaşka bir elemanın her elemanına bağlanır S. Üçlü fonksiyonun bir förneği

f(0) = 0; f(1) = 2; f(2) = 0

Tam olarak 27 farklı üçlü fonksiyon vardır ve bunları 0 - 26 arasında tamsayılarla temsil ederiz: bir fonksiyon folarak kodlanır f(0) + 3*f(1) + 9*f(2). Yukarıdaki örnek fonksiyon 6 sayısı olarak kodlanmıştır.

Biz iki üçlü fonksiyonları uygulayabilir fve gsırayla ve eğer f(g(k)) == g(f(k))herkes için geçerlidir kin Sardından işlevleri gidip . Göreviniz bunun böyle olup olmadığını doğrulamak.

Giriş

Girişleriniz, 0 ile 26 arasındaki kapsamlı aralıktaki iki tamsayıdır. İki üçlü işlevi fve g. Giriş ondalık, ikili ya da tekli ( 1s dizesi ) biçiminde alınmalıdır .

Çıktı

Çıktınız eğer fve ggidip gelirse , ve eğer olmazsa bir falsey değeridir . Girişlerin sıralandığını varsaymayabilirsiniz.

Örnekler

5 ve 16 girişlerini dikkate alınız. Üçlü fonksiyonları kodlarlar.

f(0) = 2; f(1) = 1; f(2) = 0
g(0) = 1; g(1) = 2; g(2) = 1

Biz f(g(1)) == f(2) == 0ve g(f(1)) == g(1) == 2bu yüzden fve ggidip yok ve doğru çıkış Falsey olduğunu.

Öte yandan, 3 ve 10 girişleri üçlü fonksiyonları kodlamaktadır

f(0) = 0; f(1) = 1; f(2) = 0
g(0) = 1; g(1) = 0; g(2) = 1

ve doğrulanabilir f(g(k)) == g(f(k))herkes için geçerlidir kin S. O zaman doğru çıktı doğrudur.

Burada, olası bir girişin 27 × 27 tablosu, +bir truthy çıkışı ve falsey çıkışı işaretlenir -:

+ - - + - - + - - + - - + - - + - - + - - + - - + - -
- + - - - - - - - - - - + - - - - - - - - + - - - - -
- - + - - - - - - - - - - - - - - - - - - + - - + - -
+ - - + - - - - - - + - - + - - - - + - - + - - - - -
- - - - + - - - - - - - - + - - - - - - - + - - - - -
- - - - - + - - - - - - - + - - - - - - - + - - - - -
+ - - - - - + - - - - - - - - - - - - - - + - - - - -
- - - - - - - + - - - + - - - - - - - - - + - - - - -
- - - - - - - - + - - - - - - - - - + - - + - - - - -
+ - - - - - - - - + - - - - - - - - - - - + - - - - -
- - - + - - - - - - + - - - - - - - - - - + - - - - -
- - - - - - - + - - - + - - - - - - - - - + - - - - -
+ + - - - - - - - - - - + + - - - - - - - + + - - - -
- - - + + + - - - - - - + + + - - - - - - + + + - - -
- - - - - - - - - - - - - + + - - - - - - + - - - - -
+ - - - - - - - - - - - - - - + - - - - - + - - - - -
- - - - - - - - - - - - - - - - + - - - - + - + - - -
- - - - - - - - - - - - - - - - - + - - - + + - - - -
+ - - + - - - - + - - - - - - - - - + - - + - - - - +
- - - - - - - - - - - - - - - - - - - + - + - - - - +
- - - - - - - - - - - - - - - - - - - - + + - - - - +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
- - - - - - - - - - - - + + - - - + - - - + + - - - +
- - - - - - - - - - - - - + - - + - - - - + - + + - +
+ - + - - - - - - - - - - - - - - - - - - + - + + - +
- - - - - - - - - - - - - - - - - - - - - + - - - + +
- - - - - - - - - - - - - - - - - - + + + + + + + + +

Kurallar ve puanlama

Tam bir program veya bir fonksiyon yazabilirsiniz. En düşük bayt sayısı kazanır ve standart boşluklar izin verilmez.


Giriş, iki sayının olduğu bir dizi olabilir mi?
Luis Mendo

1
@DonMuesli Buna Meta üzerinde fikir birliğine göre izin verildi .
Zgarb

Yanıtlar:


4

Jöle, 17 14 13 bayt

+13ḃ3Um0ị2/⁼/

Çevrimiçi deneyin! veya 27 × 27 vakanın tümünü doğrulayın .

Nasıl çalışır

+13ḃ3Um0ị2/⁼/  Main link. Argument: [f, g] (encoded as integers)

+13            Add 13 ([1, 1, 1] in base 3) to f and g.
   ḃ3          Convert f + 13 and g + 13 to bijective base 3.
               Bijective base 3 uses the digits 1 to 3 instead of 0 to 2.
               This yields [[f(2)+1, f(1)+1, f(0)+1], [g(2)+1, g(1)+1, g(0)+1]].
               The increments account for 1-based indexing.
     U         Reverse each digit array.
               This yields [[f(0)+1, f(1)+1, f(2)+1], [g(0)+1, g(1)+1, g(2)+1]].
      m0       Concatenate the list with a reversed copy of itself.
        ị2/    Split the result into pairs, and reduce each one by indexing.
               This computes g○f and f○g.
          ⁼/   Reduce by match; return 1 iff g○f = f○g.

Tüm test durumlarını doğrulama ve matrisi görüntüleme fikrinizi kopyaladım :-)
Luis Mendo

3

MATL , 19 18 bayt

I:PII$YAZ{Y:)1Mw)=

Truthy, herkesin olduğu bir dizi. Falsy, en az bir sıfır içeren bir dizidir.

Çevrimiçi deneyin! veya tüm durumları doğrulayın (birkaç saniye sürer).

       % implicitly input an array of two numbers
I:P    % push [3 2 1]
I      % push 3
I$     % specify that the next function takes 3 inputs
YA     % convert input to base 3 with alphabet [3 2 1] and 3 digits. Gives 2x3 array
Z{     % convert into cell of two cells, one with each row
Y:     % split cell array. We have two arrays on the stack, one per function
)      % index operation to compute f ∘ g. Function composition is indexing
1M     % push the two arrays again
w      % swap the two arrays
)      % index operation to compute g ∘ f
=      % test for equality element-wise
       % implicitly display

Bence genellikle sadece boş liste sahte sayılır.
Timtech

1
@Timtech Bu dile bağlıdır. MATL'de, sıfır içeren diziler sahtedir.
Dennis,

Tamam, sadece kontrol
ediyorum

@Timtech Tabii! Burada daha ayrıntılı olarak açıklanmıştır: Bir ifade, sonucu boş olmadığında ve yalnızca sıfırdan farklı öğeler (mantıksal veya gerçek sayısal) içerdiğinde doğrudur
Luis Mendo

3

Python 2,61 bayt

lambda m,n:all(n/3**(m/i%3)%3==m/3**(n/i%3)%3for i in[1,3,9])

Bir giriş Verilen ibiz temsil fonksiyonunu uygulayabilirsiniz nyaparak n/3**i%3ayıklamak için ibir inci üçlü rakamn . İşlev 0,1,2, işlevleri her iki sırada uygularken her biri için aynı sonucun alındığını kontrol eder . Aslında, ilk adımın atılmasından bu yana, 3**bununla test yapıyor [1,3,9].

Kodun yeniden kullanımı savurgan görünüyor, ancak daha iyi bir yol görmedim. Karşılaştırmak:

q=lambda x,i:x/3**i%3;lambda m,n:all(q(m,q(n,i))==q(n,q(m,i))for i in[0,1,2])

1

JavaScript (ES7), 68 bayt

(a,b)=>![0,1,2].some(n=>t(a,t(b,n))-t(b,t(a,n)),t=(a,n)=>a/3**n%3|0)

Maalesef, temel 3 dönüştürme çok pahalıydı:

(a,b)=>[0,1,2].every(n=>a[b[n]]==b[a[n]],g=a=>(27+a).toString(3).slice(1),a=g(a),b=g(b))

0

Mathematica, 77 bayt

Reverse[#][[#2+{1,1,1}]]==Reverse[#2][[#+{1,1,1}]]&@@IntegerDigits[{##},3,3]&

Mathematica'nın Tek tabanlı endekslemesi tekrar grev!


1
{1,1,1}Bir değişkene atamak için kısa ve onu kullanın.
CalculatorFeline
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.