ตรรกะไตรภาคที่สมดุล


11

ตรรกะไตรภาคที่สมดุล

ternary เป็นปกติอีกชื่อหนึ่งของฐานที่ 3 กล่าวคือแต่ละหลักคือ0, 1หรือ2และแต่ละสถานที่มีมูลค่า 3 เท่าของสถานที่ถัดไป

Balanced Ternary เป็นการปรับเปลี่ยน Ternary ซึ่งใช้หลักของ-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ในขณะที่xและyอาจได้มาจาก-3812798742493การ3812798742493รวม

ขั้นตอนแรกคือการแปลงxและyจากทศนิยมเป็นไตรภาคที่สมดุล สิ่งนี้จะทำให้คุณ 27 trits (TeRnary digITS) จากนั้นคุณจะต้องรวมการคำนวณจากxทั้งyคู่และคู่โดยใช้การดำเนินการแบบไตรภาคแล้วแปลงผลลัพธ์กลับเป็นทศนิยม

คุณสามารถเลือกค่าของzแผนที่สำหรับหนึ่งในสามของการดำเนินการประกอบไปด้วย:

  • A: รับสอง trits หากเป็นศูนย์ผลลัพธ์จะเป็นศูนย์มิฉะนั้นผลลัพธ์จะเป็น -1 หากพวกเขาต่างกันหรือ 1 ถ้าพวกเขาเหมือนกัน
  • B: กำหนดสอง trits หากเป็นศูนย์ผลลัพธ์จะเป็น trit อื่นมิฉะนั้นผลลัพธ์จะเป็นศูนย์หากมีความแตกต่างหรือการปฏิเสธหากพวกเขาเหมือนกัน
  • C: รับสอง trits ผลลัพธ์จะเป็นศูนย์หากพวกเขาแตกต่างหรือมูลค่าของพวกเขาหากพวกเขาเหมือนกัน

ตัวอย่าง. สมมติว่าxเป็น29และเป็นy 15ใน ternary สมดุลเหล่านี้กลายเป็นและ[1, 0, 1, -1] [1, -1, -1, 0](ส่วนที่เหลืออีก 23 ศูนย์ถูกทิ้งให้สั้นลง) หลังจากการดำเนินการแต่ละอย่างเสร็จสิ้นพวกเขาจะกลายเป็นA: [1, 0, -1, 0], B: [-1, -1, 0, -1], C:: [1, 0, 0, 0]. แปลงกลับไปเป็นทศนิยมผลลัพธ์ที่24, -37และ27ตามลำดับ ลองใช้การอ้างอิงต่อไปนี้สำหรับตัวอย่างเพิ่มเติม:

การใช้การอ้างอิงนั้นทำตามขั้นตอนที่ให้ไว้ข้างต้น แต่แน่นอนว่าคุณสามารถใช้อัลกอริทึมใดก็ได้ที่ให้ผลลัพธ์เหมือนกัน

นี่คือดังนั้นโปรแกรมหรือฟังก์ชั่นที่สั้นที่สุดที่ละเมิดช่องโหว่มาตรฐานไม่ชนะ!


2
หากรูปแบบดั้งเดิมของตัวเลขนั้นมีความสมดุลย์ประกอบไปด้วยไตรภาค (ตรงข้ามกับเลขฐานสอง) เราได้รับอนุญาตให้นำเข้าเป็นแบบปกติหรือไม่
wizzwizz4


1
จะzต้องเป็นหนึ่งใน-1,0,1หรือเราสามารถเลือกค่าที่สอดคล้องกันและแตกต่างกันสามค่า? ฉันเลือก1,2,3คำตอบแล้วและมีความสับสนบ้าง
Giuseppe

2
@Giuseppe ขออภัยอนุญาตให้ใช้เฉพาะตัวเลขสามหลักที่สมดุลเท่านั้น
Neil

2
ฉันอ่านอะไรบางอย่างผิดเพี้ยน ... คำพูดมากเกินไปและไม่มีสูตร
RosLuP

คำตอบ:


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

กำหนดฟังก์ชั่น@การสามและให้Int แผนที่ประกอบเป็น Int
1 -> A, 0 -> B, -1 -> C

ลองออนไลน์!

ฟังก์ชั่น$พับแลมบ์ดาเหนือสถานที่หลัก[0..26]ลงในรายการของตัวเลขประกอบไปด้วย มันใช้ส่วนหัวของรายการที่ให้ผลต่างเพื่อรักษาความแตกต่างทั้งหมดในปัจจุบันจากจำนวนสิ่งที่ต้องมี (ซึ่งเป็นสาเหตุที่มันถูกปรับก่อนที่จะส่งคืน) และsign(2*t/3^p)เพื่อกำหนดตัวเลขหลักที่จะให้ผลในปัจจุบัน if(abs(2*t)<3^p)0(sign t)เคล็ดลับการลงชื่อเข้าใช้เทียบเท่ากับ


ฉันไม่รู้ว่า Clean แต่ฉันสนใจที่คุณเปลี่ยนเป็นไตรภาคที่สมดุลด้วย$n(ฉันคิดว่า) คุณสามารถเพิ่มคำอธิบายสำหรับสิ่งนั้นได้ไหม
จูเซปเป้

@Giuseppe อย่างแน่นอนฉันจะเพิ่มคำอธิบายวันนี้เมื่อฉันมีเวลา
Janurous

@Giuseppe ตอบคำถามของคุณหรือไม่?
Janurous

ใช่ นั่นทำให้รู้สึก ฉลาดทีเดียว!
Giuseppe

1

เยลลี่ 39 ไบต์

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

โปรแกรมเต็มรูปแบบที่รับสองอาร์กิวเมนต์[x,y]และz
... โดยที่zจะ{A:-1, B:0, C:1}
พิมพ์ผลลัพธ์

ลองออนไลน์! หมายเหตุ: วิธี golfed ทำให้ช้า -เวอร์ชันที่เปลี่ยนแปลงนี้เร็วกว่า (บันทึก 3, เพดานและเพิ่มขึ้นก่อนผลิตภัณฑ์คาร์ทีเซียนแต่ละรายการ)

อย่างไร?

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

ฉันไม่สามารถอ่านภาษากอล์ฟได้ตลอดชีวิตดังนั้นเมื่อคุณพูดว่า 'ช้า' ความซับซ้อนของเวลาจะเลวร้ายแค่ไหน?
Janurous

เพื่อให้ได้ค่าไตรภาคที่สมดุลของ N มันจะสร้างรายการทั้งหมด (3 ^ n) ความยาว abs (N) รายการของ trits (0, -1 และ 1) ดังนั้น O (3 ^ สูงสุด (abs (X), abs (Y)))
Jonathan Allan

ขอขอบคุณและสำหรับคำอธิบายที่ฉันเห็นคุณก็เพิ่มเข้าไปเช่นกัน!
Janurous

1
นอกจากนี้ยังเพิ่มรุ่น speedier โดยใช้วิธีการเดียวกัน :)
Jonathan Allan

1

R , 190 172 151 bytes

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}

ลองออนไลน์!

คำนวณชุดค่าผสมทั้งหมดและเลือกชุดที่ถูกต้อง จริง ๆ แล้วมันจะโยนข้อผิดพลาดของหน่วยความจำด้วย27เนื่องจาก3^27มีจำนวนค่อนข้างมาก แต่ในทางทฤษฎี ลิงก์ TIO มีเพียง11รองรับจำนวนเต็มเท่านั้น ฉันไม่แน่ใจว่าจุดใดที่หมดเวลาหรือมีข้อผิดพลาดของหน่วยความจำก่อนและฉันไม่ต้องการให้เดนนิสโกรธฉันเพราะการใช้ 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, และสำหรับ1C

พอร์ตวิธีในคำตอบนี้สำหรับการแปลงเป็นไตรภาคแบบสมดุลแม้ว่าเราจะรับประกันว่าจะมีความสมดุลไม่เกิน 27 trits แต่ก็เหมาะสำหรับสิ่งนั้น

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}

ลองออนไลน์!

รุ่นนี้จะยุติอย่างช้ามาก bogosort ของการแปลงฐานฟังก์ชันนี้สุ่มเลือก trits จนกว่ามันอย่างใดอย่างน่าอัศจรรย์ ( 3^-54โอกาสที่มันเกิดขึ้น) พบ trits ที่เหมาะสมสำหรับaและbจากนั้นจะดำเนินการที่จำเป็นต้องใช้ โดยทั่วไปจะไม่จบ


ผมคิดว่าจะมีการz จำกัด {-1, 0, 1}
Erik the Outgolfer

@EriktheOutgolfer คุณสามารถเลือกค่าของzแผนที่สำหรับหนึ่งในสามของการดำเนินการแบบไตรภาคแต่ละอัน: [... ]
Dennis

@Dennis zเป็นอย่างใดอย่างหนึ่ง-1, 0หรือ1และฉันคิดว่าผู้ที่มี "คุณค่าของz" ถูกเรียกว่า
Erik the Outgolfer

มันเป็นความแตกต่างสองไบต์แทนที่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


ผมไม่คิดว่าการxและyใน ternary สมดุลที่ได้รับอนุญาต "x และ y สามารถจาก -3812798742493 เพื่อ 3812798742493 รวมขั้นตอนแรกคือการแปลง x และ y จากทศนิยม ternary สมดุล.."
Jonathan Allan


... แต่รูปแบบดั้งเดิมของตัวเลขนั้นไม่สมดุลย์ในไตรภาคในเยลลี่
Jonathan Allan

@JanathanAllan โอ้ดูเหมือนว่าฉันเข้าใจผิด ....
Erik the Outgolfer

@JonathanAllan eugh ... แก้ไขแล้ว
Erik the Outgolfer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.