Komutacja 27 funkcji

22

Wprowadzenie

Zdefiniujmy funkcję trójskładnikową jako funkcję z zestawu trzech elementów S = {0,1,2}do siebie: wiąże się z każdym elementem Sinnego elementu S. Jednym z przykładów funkcji potrójnej fjest

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

Istnieją dokładnie 27 różnych funkcji trójskładnikowych i reprezentujemy je liczbami całkowitymi od 0 do 26: funkcja fjest zakodowana jako f(0) + 3*f(1) + 9*f(2). Powyższa przykładowa funkcja jest zakodowana jako liczba 6.

Możemy zastosować dwie funkcje trójskładnikowych fi gkolejno, a jeśli f(g(k)) == g(f(k))zachodzi dla wszystkich kIN S, a następnie funkcje dojeżdżać . Twoim zadaniem jest sprawdzenie, czy tak jest.

Wkład

Twoje dane wejściowe to dwie liczby całkowite z zakresu od 0 do 26. Reprezentują dwie funkcje trójskładnikowe fi g. Dane wejściowe muszą być pobierane w formacie dziesiętnym, binarnym lub jednoargumentowym (ciąg znaków 1s).

Wydajność

Jego wynik jest wartość truthy jeśli fi gdojazdy, a wartość falsey czy nie. Nie można zakładać, że dane wejściowe są uporządkowane.

Przykłady

Rozważmy wejścia 5 i 16. Kodują one funkcje trójskładnikowe

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

Mamy f(g(1)) == f(2) == 0i g(f(1)) == g(1) == 2tak fi gnie dojeżdża i prawidłowe wyjście jest falsey.

Z drugiej strony wejścia 3 i 10 kodują funkcje trójskładnikowe

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

i może zostać zweryfikowana, które f(g(k)) == g(f(k))odnosi się do wszystkich kin S. Zatem poprawne wyjście jest zgodne z prawdą.

Oto tabela 27 × 27 wszystkich możliwych danych wejściowych, z +zaznaczeniem prawdziwego wyniku i -wyniku falsey:

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

Zasady i punktacja

Możesz napisać pełny program lub funkcję. Wygrywa najniższa liczba bajtów, a standardowe luki są niedozwolone.

Zgarb
źródło
Czy wejściem może być tablica z dwiema liczbami?
Luis Mendo
1
@DonMuesli To dozwolone zgodnie z konsensusem w sprawie Meta .
Zgarb

Odpowiedzi:

4

Galaretka, 17 14 13 bajtów

+13ḃ3Um0ị2/⁼/

Wypróbuj online! lub sprawdź wszystkie przypadki 27 × 27 .

Jak to działa

+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.
Dennis
źródło
Skopiowałem twój pomysł weryfikacji wszystkich przypadków testowych i wyświetlenia matrycy :-)
Luis Mendo
3

MATL , 19 18 bajtów

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

Prawda to tablica ze wszystkimi. Falsy to tablica zawierająca co najmniej jedno zero.

Wypróbuj online! lub zweryfikuj wszystkie przypadki (zajmuje kilka sekund).

       % 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
Luis Mendo
źródło
Myślę, że zwykle tylko pusta lista jest uważana za fałsz.
Timtech
1
@Timtech To zależy od języka. W MATL macierze zawierające zera są fałszem.
Dennis
Okej, tylko sprawdzam ...
Timtech
@Timtech Sure! Oto bardziej szczegółowo: Wyrażenie jest prawdziwe, gdy jego wynik jest niepusty i zawiera tylko niezerowe elementy (logiczne lub rzeczywiste numeryczne)
Luis Mendo
3

Python 2, 61 bajtów

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

Biorąc pod uwagę wejście i, możemy realizować funkcję reprezentowaną przez nwykonując n/3**i%3wyodrębnić ith potrójny cyfrę n. Funkcja sprawdza, czy 0,1,2przy zastosowaniu funkcji w dowolnej kolejności uzyskuje się taki sam wynik . Właściwie, ponieważ robi się pierwszy krok 3**, testy [1,3,9]zamiast tego.

Ponowne użycie kodu wygląda na marnotrawstwo, ale nie widziałem lepszego sposobu. Porównać:

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])
xnor
źródło
1

JavaScript (ES7), 68 bajtów

(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)

Niestety konwersja podstawy 3 była zbyt droga:

(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))
Neil
źródło
0

Mathematica, 77 bajtów

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

Indeksowanie oparte na One Mathematica znów uderza!

murphy
źródło
1
Krótszy, aby przypisać {1,1,1}zmienną i użyć jej.
CalculatorFeline