Комутація 27 функцій


22

Вступ

Давайте визначимо потрійну функцію як функцію від триелементного набору S = {0,1,2}для себе: вона асоціюється з кожним елементом Sіншого елемента S. Одним із прикладів потрійної функції fє

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

Існує рівно 27 різних потрійних функцій, і ми представляємо їх цілими числами від 0 до 26: функція fкодується як f(0) + 3*f(1) + 9*f(2). Прикладна функція кодується як число 6.

Ми можемо застосувати дві потрійні функції fі gв послідовності, а якщо f(g(k)) == g(f(k))виконується для всіх kв S, то функції комутуються . Ваше завдання - перевірити, чи це так.

Вхідні дані

Ваші входи - це два цілих числа в інклюзивному діапазоні від 0 до 26. Вони представляють дві потрійні функції fі g. Введення має бути зроблено у десятковому, двійковому чи одинарному (рядок 1s) форматі.

Вихідні дані

Вихід - це величина, що відповідає нормі, якщо fі gрухається, і значення фальси, якщо вони не мають. Ви можете не припускати, що входи впорядковані.

Приклади

Розглянемо входи 5 і 16. Вони кодують потрійні функції

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

У нас є f(g(1)) == f(2) == 0і g(f(1)) == g(1) == 2, так fі gНЕ комутують і правильний вихід falsey.

З іншого боку, входи 3 і 10 кодують потрійні функції

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

і це може бути перевірено, що f(g(k)) == g(f(k))справедливо для всіх kв S. Тоді правильний вихід - це правда.

Ось таблиця 27 × 27 всіх можливих входів, із +позначенням трикутного виходу та -фальсийного виходу:

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

Правила та оцінка

Ви можете написати повну програму або функцію. Виграє найменший кількість байтів, а стандартні лазівки заборонені.


Чи може вхід бути масивом з двома числами?
Луїс Мендо

1
@DonMuesli Це дозволено відповідно до консенсусу щодо Meta .
Згарб

Відповіді:


4

Желе, 17 14 13 байт

+13ḃ3Um0ị2/⁼/

Спробуйте в Інтернеті! або перевірити всі 27 × 27 випадків .

Як це працює

+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.

Я скопіював вашу ідею перевірити всі тестові справи та відобразити матрицю :-)
Луїс Мендо

3

MATL , 19 18 байт

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

Truthy - це масив із усіма ними. Falsy - це масив, що містить принаймні один нуль.

Спробуйте в Інтернеті! або перевірити всі випадки (займає кілька секунд).

       % 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

Я думаю, що зазвичай лише порожній список вважається хибним.
Timtech

1
@Timtech Це залежить від мови. У MATL масиви, що містять нулі, є хибними.
Денніс

Гаразд, просто перевіряємо ...
Timtech

@Timtech Звичайно! Ось це більш докладно: Вираз вірний, коли його результат не порожній і містить лише ненульові елементи (логічні чи дійсні числові)
Луїс Мендо

3

Python 2, 61 байт

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

З огляду на вхід i, ми можемо реалізувати функцію , представлену nроблячи n/3**i%3для вилучення iй троичной цифри n. Функція перевіряє, чи отримується однаковий результат для кожної з них 0,1,2при застосуванні функцій у будь-якому порядку. Насправді, оскільки перший крок робиться 3**, це тести [1,3,9]натомість.

Повторне використання коду виглядає марно, але я не бачив кращого способу. Порівняйте:

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 байт

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

На жаль, конверсія базової 3 була надто дорогою:

(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

Математика, 77 байт

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

Одне на основі індексації Mathematica знову вражає!


1
Коротше призначити {1,1,1}змінну і використовувати її.
CalculatorFeline
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.