Logic ternary cân bằng


11

Logic ternary cân bằng

Ternary là bình thường một tên khác cho cơ sở 3, có nghĩa là phải nói, mỗi chữ số là 0, 1hoặc 2, và mỗi nơi có giá trị 3 lần so với địa điểm tiếp theo.

Ternary cân bằng là một sửa đổi của ternary sử dụng các chữ số của -1, 01. Điều này có lợi thế là không cần một dấu hiệu. Mỗi nơi vẫn có giá trị gấp 3 lần so với nơi tiếp theo. Do đó, vài nguyên dương đầu tiên là [1], [1, -1], [1, 0], [1, 1], [1, -1, -1]trong khi vài số nguyên âm đầu tiên là [-1], [-1, 1], [-1, 0], [-1, -1], [-1, 1, 1].

Bạn có ba đầu vào x, y, z. zlà một trong hai -1, 0hoặc 1, trong khi xycó thể từ -3812798742493để 3812798742493toàn diện.

Bước đầu tiên là chuyển đổi xytừ thập phân sang ternary cân bằng. Điều này sẽ cung cấp cho bạn 27 trits (TeRnary digITS). Sau đó, bạn phải kết hợp các đặc điểm từ xytheo cặp bằng cách sử dụng thao tác ternary và sau đó chuyển kết quả trở lại thành số thập phân.

Bạn có thể chọn các giá trị của zbản đồ cho một trong ba hoạt động sau này mỗi:

  • A: Cho hai điểm, nếu một trong hai bằng 0, thì kết quả bằng 0, nếu không thì kết quả là -1 nếu chúng khác nhau hoặc 1 nếu chúng giống nhau.
  • B: Cho hai trits, nếu một trong hai bằng 0, thì kết quả là trit khác, nếu không thì kết quả bằng 0 nếu chúng khác nhau hoặc phủ định nếu chúng giống nhau.
  • C: Cho hai điểm, kết quả bằng 0 nếu chúng khác nhau hoặc giá trị của chúng nếu chúng giống nhau.

Thí dụ. Giả sử x29y15. Trong ternary cân bằng, những trở thành [1, 0, 1, -1][1, -1, -1, 0]. (23 điểm không còn lại đã bị bỏ qua vì ngắn gọn.) Sau mỗi thao tác tương ứng, chúng trở thành A: [1, 0, -1, 0], B: [-1, -1, 0, -1], C: [1, 0, 0, 0]. Chuyển đổi trở lại thập phân kết quả 24, -3727tương ứng. Hãy thử thực hiện tham chiếu sau đây để biết thêm ví dụ:

Việc thực hiện tham chiếu tuân theo các bước được đưa ra ở trên nhưng tất nhiên bạn có thể sử dụng bất kỳ thuật toán nào tạo ra kết quả tương tự.

Đây là , vì vậy chương trình hoặc chức năng ngắn nhất vi phạm không có sơ hở tiêu chuẩn nào thắng!


2
Nếu định dạng gốc cho các số là ternary cân bằng (trái ngược với nhị phân), chúng ta có được phép lấy nó làm đầu vào theo cách thông thường (dẫn đến không chuyển đổi thành ternary cân bằng) không?
wizzwizz4


1
không zphải là một trong -1,0,1hoặc chúng ta có thể chọn bất kỳ ba giá trị phù hợp và khác biệt? Tôi đã chọn 1,2,3trong câu trả lời của mình và có một số nhầm lẫn về nó.
Giuseppe

2
@Giuseppe Xin lỗi, chỉ cho phép các chữ số ternary cân bằng.
Neil

2
Tôi đã đọc một cái gì đó không phù hợp ... Quá nhiều từ và không có công thức
RosLuP

Câu trả lời:


2

Sạch , 231 ... 162 byte

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]]

Xác định hàm @, lấy ba Ints và đưa ra một Int.
Bản đồ khai thác như 1 -> A, 0 -> B, -1 -> C.

Hãy thử trực tuyến!

Hàm này $gấp một lambda trên các vị trí chữ số [0..26], thành một danh sách các chữ số thứ ba. Nó sử dụng phần đầu của danh sách mà nó mang lại để giữ tổng chênh lệch hiện tại so với số cần thiết (đó là lý do tại sao nó được nối trước khi quay trở lại) và sign(2*t/3^p)để xác định chữ số hiện tại mang lại. Các dấu hiệu lừa tương đương với if(abs(2*t)<3^p)0(sign t).


Tôi không biết Clean, nhưng tôi tò mò về cách bạn đã chuyển đổi thành ternary cân bằng, với $n(tôi nghĩ). Bạn có thể thêm một lời giải thích cho điều đó?
Giuseppe

@Giuseppe Hoàn toàn, tôi sẽ thêm một lời giải thích hôm nay khi tôi có thời gian.
Οurous

@Giuseppe có trả lời câu hỏi của bạn không?
Οurous

Đúng! Điều đó có ý nghĩa. Khá thông minh!
Giuseppe

1

Thạch , 39 byte

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

Một chương trình đầy đủ tính hai đối số, [x,y]z
... nơi z{A:-1, B:0, C:1}
có in kết quả

Hãy thử trực tuyến! Lưu ý: phương pháp đánh gôn làm cho nó chậm - phiên bản thay đổi này nhanh hơn (ghi 3, trần và tăng trước mỗi sản phẩm của Cartesian)

Làm sao?

×=       - 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

Cả đời tôi không thể đọc ngôn ngữ chơi gôn, vì vậy khi bạn nói 'chậm', độ phức tạp của thời gian tệ đến mức nào?
Οurous

Để có được ternary cân bằng của N, nó tạo ra một danh sách tất cả (3 ^ n) chiều dài abs (N) danh sách các trits (0, -1 và 1). Vì vậy, O (3 ^ max (abs (X), abs (Y)))
Jonathan Allan

Cảm ơn, và cho lời giải thích tôi thấy bạn thêm vào!
Οurous

1
Cũng đã thêm một phiên bản nhanh hơn bằng cách sử dụng cùng một phương pháp :)
Jonathan Allan

1

R , 190 172 151 byte

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}

Hãy thử trực tuyến!

Tính toán tất cả các kết hợp của trits và chọn đúng. Nó thực sự sẽ gây ra lỗi bộ nhớ 27, vì 3^27nó là một con số khá lớn, nhưng về mặt lý thuyết thì nó sẽ hoạt động. Liên kết TIO chỉ 11hỗ trợ số nguyên; Tôi không chắc chắn vào thời điểm nào nó bị lỗi hoặc lỗi bộ nhớ và tôi không muốn Dennis nổi giận với tôi vì lạm dụng TIO!

câu trả lời cũ, 170 byte

Cái này sẽ hoạt động cho tất cả các đầu vào, mặc dù chỉ với số nguyên 32 bit, có khả năng không chính xác vì R sẽ tự động chuyển đổi chúng thành 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)}

Hãy thử trực tuyến!

Đưa -1cho A, 0cho B1cho C.

Đưa ra cách tiếp cận trong câu trả lời này để chuyển đổi sang ternary cân bằng, mặc dù vì chúng tôi đảm bảo không có quá 27 điểm cân bằng, nên nó được tối ưu hóa cho điều đó.

R , 160 byte

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}

Hãy thử trực tuyến!

Phiên bản này sẽ chấm dứt cực kỳ chậm. Các bogosort chuyển đổi cơ sở, chức năng này chọn một cách ngẫu nhiên trits cho đến khi nó bằng cách nào đó kỳ diệu ( 3^-54khả năng nó sẽ xảy ra) tìm trits phù hợp với ab, và sau đó thực hiện các hoạt động cần thiết. Điều này về cơ bản sẽ không bao giờ kết thúc.


Tôi nghĩ rằng zbị hạn chế {-1, 0, 1}.
Erik the Outgolfer

@EriktheOutgolfer Bạn có thể chọn giá trị nào của zbản đồ cho một trong ba thao tác tạm thời này: [...]
Dennis

@Dennis zlà một trong hai -1, 0hoặc1 , và tôi nghĩ rằng đó là những "giá trị của z" được nhắc đến.
Erik the Outgolfer

Đó là một sự khác biệt hai byte, thay thế switch(z,...)bằng switch(z+2,...)nó sẽ là một thay đổi nhỏ bất kể.
Giuseppe

0

Thạch , 47 byte

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

Hãy thử trực tuyến!

Chương trình đầy đủ.

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

Đối số 1: [x, y]
Đối số 3:z


Tôi không nghĩ rằng việc lấy xytrong ternary cân bằng được cho phép: "x và y có thể từ -3812798742493 thành 3812798742493. Bước đầu tiên là chuyển x và y từ thập phân sang ternary cân bằng."
Jonathan Allan


... nhưng định dạng gốc cho các số không được cân bằng ternary trong Jelly.
Jonathan Allan


@Jonathan ALLan eugh ... đã sửa
Erik the Outgolfer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.