平衡三元逻辑


11

平衡三元逻辑

三元通常为基地3个,也就是另外一个名字,每一个数字是012和每一个地方是值得的3倍之多的下一个地方。

均衡三元是三元的变形例,它使用的位数-101。这具有不需要标志的优点。每个地方的价值仍然是下一个地方的3倍。因此,前几个正整数[1][1, -1][1, 0][1, 1][1, -1, -1]而前几个负整数是[-1][-1, 1][-1, 0][-1, -1][-1, 1, 1]

您有三个输入x, y, zz或者是-10,或1,而xy可以来自-38127987424933812798742493以下。

第一步是将十进制转换为平衡三进制x并转换y。这应该给您27个三叉戟(三重digITS)。然后,您必须使用三元运算来组合来自xy成对的Trits ,然后将结果转换回十进制。

您可以选择z映射到以下三个三元操作之一的值:

  • A:给定两个Trit,如果其中一个为零,则结果为零,否则,如果它们不同,则结果为-1,如果相同则为1。
  • B:给定两个Trit,如果其中一个为零,则结果为另一个Trit,否则,如果它们不同,则结果为零;如果它们相同,则为负数。
  • C:给定两个Trit,如果它们不同则结果为零,如果它们相同则结果为零。

例。假设x29y15。在平衡三元组中,它们变为[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-3727分别。请尝试以下参考实现以获取更多示例:

参考实现遵循上面给出的步骤,但是您当然可以自由使用任何产生相同结果的算法。

这是,因此最短的不违反标准漏洞的程序或函数将获胜!


2
如果数字的本机格式是平衡三进制(而不是二进制),我们是否可以按常规方式将其用作输入(这不会导致转换为平衡三进制)?
wizzwizz4


1
z必须是一个-1,0,1,或者我们可以任选3和一致的,不同的价值观?我选择1,2,3了答案,对此有些困惑。
朱塞佩

2
@Giuseppe对不起,仅允许平衡的三进制数字。
尼尔

2
我读了一些横断的东西...太多的话又没有公式
RosLuP

Answers:


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

在线尝试!

该函数$将lambda折叠到数字位上[0..26],变成三进制数字列表。它使用产生的列表的开头来保持当前与所需数字的总差(这就是为什么在返回之前将其加尾),并sign(2*t/3^p)确定要产生的当前数字。标志的技巧等同于if(abs(2*t)<3^p)0(sign t)


我不知道Clean,但是我对您如何使用$n(我认为)转换为平衡三元感到很感兴趣。您可以为此添加解释吗?
朱塞佩

@Giuseppe当然,今天有时间我要添加一个解释。
世纪

@Giuseppe会回答您的问题吗?
世纪

是! 那讲得通。相当聪明!
朱塞佩

1

果冻,39 个字节

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

一个完整的程序带有两个参数,[x,y]z
...这里z{A:-1, B:0, C:1}
打印出结果

在线尝试!注意:高尔夫球方法会使速度变慢-此更改的版本速度更快(对数乘以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

我一生都无法阅读高尔夫语言,所以当您说“慢”时,时间复杂度有多严重?
世纪

为了获得N的平衡三进制,它创建了所有(3 ^ n)长abs(N)的三叉戟(0,-1和1)列表。因此,O(3 ^ max(abs(X),abs(Y)))
乔纳森·艾伦

谢谢,我也为您提供了解释!
世纪

1
还使用相同的方法添加了更快的版本:)
Jonathan Allan '18

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}

在线尝试!

计算所有Trits的组合,然后选择正确的组合。实际上,它会引发内存错误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)}

在线尝试!

注意到-1A0B,和1C

将方法移植到 将此答案移植到转换为平衡三进制,尽管由于我们保证不超过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}

在线尝试!

此版本将终止得非常慢。基本转换的bogosort,此函数随机选择三叉戟,直到以某种方式神奇地(3^-54可能发生)为a和找到正确的三叉戟b,然后执行所需的操作。这基本上将永远不会结束。


我认为z仅限于{-1, 0, 1}
暴民埃里克(Erik the Outgolfer)

@EriktheOutgolfer 您可以选择z映射到以下三个三元操作之一的值:[...]
Dennis,

@Dennis z或者是-10,或1,我认为这些都是“的值z”被提及。
Erik the Outgolfer

这是两个字节的差异,用代替switch(z,...)switch(z+2,...)因此无论如何都将是微不足道的更改。
朱塞佩

0

果冻,47字节

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

在线尝试!

完整程序。

-1= C0= A1=B

参数1:[x, y]
参数3:z


我不认为服用x,并y在平衡三元是正确的:“x和y可以是从-3812798742493到3812798742493包容性的第一步是对x和y从十进制转换为平衡三元。”
乔纳森·艾伦


...但是数字的本机格式在Jelly中不是平衡的三进制。
乔纳森·艾伦

@JonathanAllan哦,看来我误解了……
Outgolfer的Erik,18年

@JonathanAllan eugh ...已修复
Outgolfer的Erik
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.