Comutação de 27 funções

22

Introdução

Vamos definir uma função ternária como uma função do conjunto de três elementos S = {0,1,2}: ela se associa a cada elemento de Soutro elemento de S. Um exemplo de função ternária fé

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

Existem exatamente 27 funções ternárias diferentes, e as representamos com números inteiros de 0 a 26: uma função fé codificada como f(0) + 3*f(1) + 9*f(2). A função de exemplo acima é codificada como o número 6.

Podemos aplicar duas funções ternários fe gem seqüência, e se f(g(k)) == g(f(k))detém para todos kem S, em seguida, as funções comutar . Sua tarefa é verificar se esse é o caso.

Entrada

Suas entradas são dois números inteiros no intervalo inclusivo de 0 a 26. Eles representam duas funções ternárias fe g. A entrada deve ser feita no formato decimal, binário ou unário (sequência de 1s).

Saída

Sua saída é um valor verdadeiro se fe gcomutar, e um valor falsey se não o fizerem. Você não pode assumir que as entradas estão ordenadas.

Exemplos

Considere as entradas 5 e 16. Eles codificam as funções ternárias

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

Nós temos f(g(1)) == f(2) == 0e g(f(1)) == g(1) == 2, por isso, fe gnão comutar e a saída correta é Falsey.

Por outro lado, as entradas 3 e 10 codificam as funções ternárias

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

e pode-se verificar que f(g(k)) == g(f(k))vale para todo kem S. Então a saída correta é verdadeira.

Aqui está a tabela 27 × 27 de todas as entradas possíveis, com a +marcação de uma saída -verdadeira e uma saída falsey:

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

Regras e pontuação

Você pode escrever um programa completo ou uma função. A contagem de bytes mais baixa vence e as brechas padrão não são permitidas.

Zgarb
fonte
A entrada pode ser uma matriz com os dois números?
Luis Mendo
1
@ DonMuesli Isso é permitido de acordo com o consenso no Meta .
Zgarb

Respostas:

4

Geléia, 17 14 13 bytes

+13ḃ3Um0ị2/⁼/

Experimente online! ou verifique todos os casos 27 × 27 .

Como funciona

+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
fonte
Copiei a sua ideia de verificar todos os casos de teste e exibir a matriz :-)
Luis Mendo
3

MATL , 19 18 bytes

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

Verdade é uma matriz com todos os. Falsy é uma matriz que contém pelo menos um zero.

Experimente online! ou verifique todos os casos (leva alguns segundos).

       % 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
fonte
Eu acho que geralmente apenas a lista vazia é considerada falsa.
Timtech 24/03/16
1
@ Timtech Isso depende do idioma. No MATL, matrizes que contêm zeros são falsas.
24516 Dennis
Ok, apenas verificar ...
Timtech
@Timtech Sure! Aqui está ele com mais detalhes: Uma expressão é verdadeiro quando seu resultado é não vazio e contém apenas elementos diferentes de zero (numéricos lógica ou real)
Luis Mendo
3

Python 2, 61 bytes

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

Dada uma entrada i, podemos implementar a função representada nfazendo n/3**i%3para extrair o idígito ternário de n. A função verifica se o mesmo resultado é obtido para cada um 0,1,2ao aplicar as funções em qualquer ordem. Na verdade, desde que o primeiro passo está sendo realizado 3**, ele é testado em [1,3,9]vez disso.

A reutilização do código parece um desperdício, mas não vi uma maneira melhor. Comparar:

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
fonte
1

JavaScript (ES7), 68 bytes

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

Infelizmente, a conversão da base 3 foi muito cara:

(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
fonte
0

Mathematica, 77 bytes

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

A indexação baseada no One do Mathematica ataca novamente!

Murphy
fonte
1
Menor para atribuir {1,1,1}a uma variável e usá-la.
CalculatorFeline