균형 잡힌 삼항 논리


11

균형 잡힌 삼항 논리

삼항 일반적으로 말을하는 것입니다 기본 3의 또 다른 이름이며, 각 숫자는 0, 1또는 2, 각각의 장소는 다음 장소만큼 3 배 가치가있다.

평형이 원계의 숫자를 사용하여 원의 변형이며 -1, 0그리고 1. 이것은 사인이 필요 없다는 장점이 있습니다. 각 장소는 여전히 다음 장소보다 3 배나 가치가 있습니다. 처음 몇 양의 정수이다 따라서 [1], [1, -1], [1, 0], [1, 1], [1, -1, -1]처음 몇 음수 인 반면 [-1], [-1, 1], [-1, 0], [-1, -1], [-1, 1, 1].

세 개의 입력이 x, y, z있습니다. z중 하나입니다 -1, 0또는 1동시에, xy에서 할 수 있습니다 -38127987424933812798742493포함.

첫 번째 단계는 변환하는 것입니다 xy소수점에서 균형 잡힌 원에. 이렇게하면 27 개의 속임수 (TeRnary digITS)가 제공됩니다. 그런 다음에서 trits을 결합해야 x하고 y삼항 작업을 사용하여 쌍으로하고 소수의 결과 등을 변환합니다.

z이 세 가지 삼항 연산 중 하나에 각각 매핑 할 값을 선택할 수 있습니다 .

  • A: 두 개의 trit이 주어지면 둘 중 하나가 0이면 결과는 0이고, 그렇지 않으면 결과가 -1이고 다른 경우 1입니다.
  • B: 두 개의 trit이 주어지면 둘 중 하나가 0이면 결과는 다른 trit입니다. 그렇지 않으면 결과가 다르면 0이되고, 같으면 부정이됩니다.
  • C: 두 개의 trit이 주어지면 결과가 다르면 0이되고 값이 같으면 값이 0입니다.

예. 가정하자가 x있다 29하고 y있습니다 15. 균형 잡힌 삼항에서는 이것들이 [1, 0, 1, -1]이고 [1, -1, -1, 0]. (나머지 23 trits 제로는 간결함을 위해 생략되어있다.)가되어, 각 작업마다 한 후 A: [1, 0, -1, 0], B: [-1, -1, 0, -1], C: [1, 0, 0, 0]. 변환 다시는 결과가 진수 24, -3727각각. 더 많은 예제를 보려면 다음 참조 구현을 시도하십시오.

참조 구현은 위에 제공된 단계를 따르지만 물론 동일한 결과를 생성하는 알고리즘을 자유롭게 사용할 수 있습니다.

이것은 이므로 표준 허점을 위반하지 않는 가장 짧은 프로그램이나 기능이 승리합니다!


2
숫자의 기본 형식이 이진이 아닌 삼항 균형 인 경우 일반적인 방식으로 입력으로 사용할 수 있습니까 (균형 삼항으로 변환되지 않음)?
wizzwizz4


1
않습니다 z중 하나가 될 필요가 -1,0,1또는 우리는 어떤 세 일관되고 고유 한 값을 선택할 수 있습니다? 나는 1,2,3내 대답에서 선택 했고 그것에 대해 약간의 혼란이 있습니다.
Giuseppe

2
@Giuseppe 죄송합니다. 밸런스 3 자리 만 사용할 수 있습니다.
Neil

2
나는 무언가를
가로 지르는

답변:


2

클린 , 231 ... 162 바이트

import StdEnv
$n=tl(foldr(\p[t:s]#d=sign(2*t/3^p)
=[t-d*3^p,d:s])[n][0..26])
@x y z=sum[3^p*[(a+b)/2,[1,-1,0,1,-1]!!(a+b+2),a*b]!!(z+1)\\a<- $x&b<- $y&p<-[0..26]]

함수를 정의하여 @3을 가져 Int와서을 제공합니다 Int.
연산자는로 매핑됩니다 1 -> A, 0 -> B, -1 -> C.

온라인으로 사용해보십시오!

이 함수 $는 숫자 자리에 람다 [0..26]를 3 자리 숫자 목록으로 접습니다 . 필요한 수와 현재의 총 차이 (반환하기 전에 꼬리가 나오는 이유)를 유지하고 산출 할 sign(2*t/3^p)현재 숫자를 결정 하기 위해 생성 된리스트의 헤드를 사용합니다 . 부호 트릭은와 같습니다 if(abs(2*t)<3^p)0(sign t).


나는 Clean을 모른다. 그러나 나는 당신이 $n(내 생각에) 균형 잡힌 삼항으로 어떻게 전환했는지에 흥미가있다 . 이에 대한 설명을 추가해 주시겠습니까?
Giuseppe

@Giuseppe 절대적으로 오늘 시간이되면 설명을 추가하겠습니다.
OUurous

@ 주세페가 그 질문에 대답합니까?
OUurous

예! 말이 되네요 아주 영리하다!
Giuseppe

1

젤리 , 39 바이트

×=
×
+ị1,-,0
A-r1¤ṗœs2ṚẎị@ȯµ€Uz0ZU⁹ŀ/ḅ3

두 개의 인수를 취하는 전체 프로그램 [x,y], 그리고 z
... where z{A:-1, B:0, C:1}
결과를 인쇄합니다

온라인으로 사용해보십시오! 참고 : 골프 방법으로 속도가 느려집니다- 이 변경된 버전 이 더 빠릅니다 (각 카티 전 곱 전에 3, ceil 및 증가로 로그)

어떻게?

×=       - Link  1 (1), B: list of trits L, list of trits R
×        - L multiplied by... (vectorises):
 =       -   L equal R? (vectorises)

×        - Link -1 (2), A: list of trits L, list of trits R
×        - L multiplied by R (vectorises)

+ị1,-,0  - Link  0 (3), C: list of trits L, list of trits R
+        - L plus R (vectorises)
  1,-,0  - list of integers = [1,-1,0]
 ị       - index into (vectorises) - 1-based & modular, so index -2 is equivalent to
         -                           index 1 which holds the value 1.

A-r1¤ṗœs2ṚẎị@ȯµ€Uz0ZU⁹ŀ/ḅ3 - Main link: list of integers [X,Y], integer Z
              µ€           - for each V in [X,Y]:
A                          -   absolute value = abs(V)
    ¤                      -   nilad followed by link(s) as a nilad:
 -                         -     literal minus one
   1                       -     literal one
  r                        -     inclusive range = [-1,0,1]
     ṗ                     -   Cartesian power, e.g. if abs(V)=3: [[-1,-1,-1],[-1,-1,0],[-1,-1,1],[-1,0,-1],[-1,0,0],[-1,0,1],[-1,1,-1],[-1,1,0],[-1,1,1],[0,-1,-1],[0,-1,0],[0,-1,1],[0,0,-1],[0,0,0],[0,0,1],[0,1,-1],[0,1,0],[0,1,1],[1,-1,-1],[1,-1,0],[1,-1,1],[1,0,-1],[1,0,0],[1,0,1],[1,1,-1],[1,1,0],[1,1,1]]
                           -                   (corresponding to: [-13       ,-12      ,-11      ,-10      ,-9      ,-8      ,-7       ,-6      ,-5      ,-4       ,-3      ,-2      ,-1      ,0      ,1      ,2       ,3      ,4      ,5        ,6       ,7       ,8       ,9      ,10      ,11     ,12     ,13     ] )
        2                  -   literal two
      œs                   -   split into equal chunks           [[[-1,-1,-1],[-1,-1,0],[-1,-1,1],[-1,0,-1],[-1,0,0],[-1,0,1],[-1,1,-1],[-1,1,0],[-1,1,1],[0,-1,-1],[0,-1,0],[0,-1,1],[0,0,-1],[0,0,0]],[[0,0,1],[0,1,-1],[0,1,0],[0,1,1],[1,-1,-1],[1,-1,0],[1,-1,1],[1,0,-1],[1,0,0],[1,0,1],[1,1,-1],[1,1,0],[1,1,1]]]
         Ṛ                 -   reverse                           [[[0,0,1],[0,1,-1],[0,1,0],[0,1,1],[1,-1,-1],[1,-1,0],[1,-1,1],[1,0,-1],[1,0,0],[1,0,1],[1,1,-1],[1,1,0],[1,1,1]],[[-1,-1,-1],[-1,-1,0],[-1,-1,1],[-1,0,-1],[-1,0,0],[-1,0,1],[-1,1,-1],[-1,1,0],[-1,1,1],[0,-1,-1],[0,-1,0],[0,-1,1],[0,0,-1],[0,0,0]]]
          Ẏ                -   tighten                            [[0,0,1],[0,1,-1],[0,1,0],[0,1,1],[1,-1,-1],[1,-1,0],[1,-1,1],[1,0,-1],[1,0,0],[1,0,1],[1,1,-1],[1,1,0],[1,1,1],[-1,-1,-1],[-1,-1,0],[-1,-1,1],[-1,0,-1],[-1,0,0],[-1,0,1],[-1,1,-1],[-1,1,0],[-1,1,1],[0,-1,-1],[0,-1,0],[0,-1,1],[0,0,-1],[0,0,0]]
                           -                   (corresponding to: [1      ,2       ,3      ,4      ,5        ,6       ,7       ,8       ,9      ,10     ,11      ,12     ,13     ,-13       ,-12      ,-11      ,-10      ,-9      ,-8      ,-7       ,-6      ,-5      ,-4       ,-3      ,-2      ,-1      ,0      ] )
           ị@              -   get item at index V (1-based & modular)
             ȯ             -   logical OR with V (just handle V=0 which has an empty list)
                U          - upend (big-endian -> little-endian for each)
                  0        - literal zero           }
                 z         - transpose with filler  } - pad with MSB zeros
                   Z       - transpose              }
                    U      - upend (little-endian -> big-endian for each)
                       /   - reduce with:
                      ŀ    -   link number: (as a dyad)
                     ⁹     -     chain's right argument, Z
                         3 - literal three
                        ḅ  - convert from base

나는 인생에서 골프 언어를 읽을 수 없기 때문에 '느리게'라고 말할 때 시간 복잡성이 얼마나 나쁜가?
OUurous

균형이 잡힌 삼항을 얻기 위해 모든 (3 ^ n) 길이의 abs (N) trit (0, -1, 1) 목록을 만듭니다. 그래서 O (3 ^ max (abs (X), abs (Y)))
Jonathan Allan

감사합니다. 설명도 추가했습니다.
Οurous

1
같은 방법으로 더 빠른 버전을 추가했습니다 :)
Jonathan Allan

1

R , 190 (172) 151 바이트

function(a,b,z){M=t(t(expand.grid(rep(list(-1:1),27))))
P=3^(26:0)
x=M[M%*%P==a,]
y=M[M%*%P==b,]
k=sign(x+y)
switch(z+2,x*y,k*(-1)^(x+y+1),k*!x-y)%*%P}

온라인으로 사용해보십시오!

모든 trit 조합을 계산하고 올바른 것을 선택합니다. 다소 큰 숫자 27이므로 실제로 메모리 오류가 발생 3^27하지만 이론적으로는 작동합니다. TIO 링크는 11삼중 정수만 지원합니다. 어떤 시점에서 시간이 초과되거나 메모리 오류가 발생했는지 확실하지 않으며 Dennis가 TIO를 악용하여 나에게 화 내지 않기를 바랍니다!

이전 답변, 170 바이트

32 비트 정수만 있으면 R이 자동으로로 변환하므로 부정확 할 가능성이 있습니다 double.

function(a,b,z){x=y={}
for(i in 0:26){x=c((D=c(0,1,-1))[a%%3+1],x)
y=c(D[b%%3+1],y)
a=(a+1)%/%3
b=(b+1)%/%3}
k=sign(x+y)
switch(z+2,x*y,k*(-1)^(x+y+1),k*!x-y)%*%3^(26:0)}

온라인으로 사용해보십시오!

소요 -1에 대한 A, 0대한 B, 및 1위해 C.

균형 잡힌 삼항으로 변환하기위한 이 답변 의 접근 방식을 포팅합니다 . 그러나 27 개의 균형 잡힌 트 라이트가 보장되지 않기 때문에 최적화되어 있습니다.

R , 160 바이트

function(a,b,z){s=sample
x=y=rep(0,27)
P=3^(26:0)
while(x%*%P!=a&y%*%P!=b){x=s(-1:1,27,T)
y=s(-1:1,27,T)}
k=sign(x+y)
switch(z+2,x*y,k*(-1)^(x+y+1),k*!x-y)%*%P}

온라인으로 사용해보십시오!

이 버전은 매우 느리게 종료됩니다. 기본 변환의보고 정렬 인이 함수는 어떻게 든 마술 적으로 ( 3^-54발생 가능성이 있음) ab에 대한 올바른 트릿을 찾을 때까지 임의의 트릿을 임의로 선택한 다음 필요한 작업을 수행합니다. 이것은 기본적으로 끝나지 않을 것입니다.


z에 제한되어 있다고 생각 합니다 {-1, 0, 1}.
Outgolfer Erik

@EriktheOutgolfer 이 세 가지 삼항 연산 중 하나 z매핑 할 값을 각각 선택할 수 있습니다 . [...]
Dennis

@Dennis는 z중입니다 -1, 0또는1 , 나는 사람들이 "의 값을 생각 z"이라고되어있다.
Outgolfer Erik

이것은 대체 2 바이트의 차이 switch(z,...)switch(z+2,...)관계없이 사소한 변경 될 수 있도록.
Giuseppe

0

젤리 , 47 바이트

×=
×
N0⁼?ȯȧ?"
ḃ3%3’
0Çḅ3$$⁼¥1#ḢÇṚµ€z0Z⁹+2¤ŀ/Ṛḅ3

온라인으로 사용해보십시오!

전체 프로그램.

-1= C, 0= A, 1=B

인수 1 : [x, y]
인수 3 :z


나는 복용 생각하지 않는다 xy허용되는 균형 삼항에서 "x와 y는 -3812798742493에서 포함 3,812,798,742,493에 할 수있는 첫 번째 단계는 균형 잡힌 원에 소수점에서 x와 y를 변환하는 것입니다.."
Jonathan Allan


...하지만 숫자의 기본 형식은 Jelly에서 삼항 균형이 아닙니다.
Jonathan Allan

@JonathanAllan 오, 내가 오해 한 것 같습니다 ....
Outgolfer Erik

@JonathanAllan eugh ... 고정
Outgolfer Erik
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.