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으로 인코딩됩니다.

우리는 두 개의 원 기능을 적용 할 수 fg순서, 그리고 경우 f(g(k)) == g(f(k))모든 보유 k에서 S다음 기능은 통근 . 당신의 임무는 이것이 사실인지 확인하는 것입니다.

입력

입력 값은 0에서 26까지의 범위에있는 두 개의 정수입니다. 두 개의 삼항 함수 f와를 나타냅니다 g. 입력은 십진, 이진 또는 단항 ( 1s의 문자열 ) 형식으로 가져와야 합니다.

산출

귀하의 출력은입니다 truthy 값 경우 fg그렇지 않은 경우 출퇴근 및 falsey 값입니다. 입력이 주문되었다고 가정하지 않을 수 있습니다.

입력 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, 그래서 fg통근하지 않고 올바른 출력은 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. 그렇다면 올바른 결과는 진실입니다.

다음은 가능한 모든 입력 +의 27x27 표이며, 정확한 출력과 잘못된 출력 을 표시합니다 -.

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

규칙과 득점

전체 프로그램이나 함수를 작성할 수 있습니다. 가장 낮은 바이트 수가 이기고 표준 허점 은 허용되지 않습니다.


입력 값이 두 숫자의 배열 일 수 있습니까?
Luis Mendo

1
@DonMuesli Meta에 대한 합의에 따라 허용됩니다 .
Zgarb

답변:


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.

모든 테스트 사례를 확인하고 매트릭스를 표시하는 아이디어를 복사했습니다 :-)
Luis Mendo

3

MATL , 19 18 바이트

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

Truthy는 모든 것을 가진 배열입니다. Falsy는 하나 이상의 0을 포함하는 배열입니다.

온라인으로 사용해보십시오! 또는 모든 사례를 확인하십시오 (몇 초 소요).

       % 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에서 0을 포함하는 배열은 거짓입니다.
Dennis

좋아, 그냥 확인 ...
Timtech

@Timtech 물론! 자세한 내용 은 다음과 같습니다 . 결과가 비어 있지 않고 0이 아닌 요소 (논리 또는 실수) 만 포함하는 식은 사실입니다.
Luis Mendo

3

파이썬 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

자바 스크립트 (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)

불행히도 base 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,1}변수 에 할당 하고 사용하는 것이 더 짧습니다 .
CalculatorFeline
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.