バランスのとれた三値論理


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

3つの入力がありx, y, zます。zいずれかである-1、0または1、しばらくxしてyから可能-3812798742493に3812798742493包括的。

最初のステップでは、変換することであるxとy小数から平衡三します。これにより、27個のトリット(TeRnary digITS)が得られます。あなたは、その後からトリットを結合する必要があるxとy三項演算を使用してペアにして、結果バックは、小数点に変換します。

zこれら3つの3項演算のそれぞれにマップする値を選択できます。

  • A:2つのトリットが与えられ、どちらかがゼロの場合、結果はゼロになります。それ以外の場合、結果は異なる場合は-1、同じ場合は1です。
  • B:2つのトリットが与えられ、どちらかがゼロの場合、結果は他のトリットです。そうでない場合、結果が異なる場合はゼロ、同じ場合は否定になります。
  • C:2つのトリットが与えられた場合、結果が異なる場合は結果はゼロになり、同じ場合は値はゼロになります。

例。仮定しxている29とyあります15。バランスの取れた三元で、これらはなる[1, 0, 1, -1]と[1, -1, -1, 0]。(残りの23個のゼロのトリットは、簡潔にするために省略されています。)それぞれの操作の後に、それらはA:[1, 0, -1, 0]、B:[-1, -1, 0, -1]、C:になり[1, 0, 0, 0]ます。結果を10進数に変換バックがあり24、-37そして27それぞれ。その他の例については、次のリファレンス実装を試してください。

リファレンス実装は上記の手順に従いますが、同じ結果を生成するアルゴリズムを自由に使用できます。

これはであるため、標準の抜け穴に違反しない最短のプログラムまたは関数が勝ちです!


2
数値のネイティブ形式が(バイナリではなく)バランスの取れた3進数の場合、通常の方法で入力として使用できますか(バランスの取れた3進数に変換されません)?
— wizzwizz4


1
んzの一つでなければならない-1,0,1か、我々は任意の3つの一貫して異なる値を選ぶことができますか?私は1,2,3答えで選択しましたが、それについていくつかの混乱があります。
— ジュゼッペ

2
@Giuseppe申し訳ありませんが、バランスの取れた3進数のみが許可されます。
— ニール

2
トラバースなものを読みます...言葉が多すぎて式がありません
— -RosLuP

回答:


2

Clean、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を知りませんが、あなたがどのようにバランスのとれた3進数に変換したかに興味を持っています$n。その説明を追加してもらえますか?
— ジュゼッペ

@Giuseppe絶対に、時間があるときに今日説明を追加します。
— 18年

@Giuseppeはあなたの質問に答えますか?
— Οurous

はい!それは理にかなっている。とても賢い!
— ジュゼッペ

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

私は一生ゴルフの言語を読むことができないので、「遅い」と言うと、時間の複雑さはどれほど悪いですか?
— Οurous

Nのバランスの取れた3項を取得するために、すべて(3 ^ n)の長さのabs(N)リストのリスト(0、-1、および1)を作成します。O(3 ^ max(abs(X)、abs(Y))))
— ジョナサンアラン

ありがとう、そして説明のために私もあなたが追加したのを見ます!
— Οurous

1
また、同じ方法を使用してより高速なバージョンを追加しました:)
— ジョナサンアラン

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}

オンラインでお試しください!

トリットのすべての組み合わせを計算し、正しいものを選択します。実際にはでメモリエラーがスローされますが27、これ3^27は数がやや大きいためですが、理論上は機能します。TIOリンクは、11trit整数のみをサポートしています。どの時点でタイムアウトになるのか、メモリエラーが最初に発生するのかわかりません。また、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。

バランスの取れた3成分に変換するためのこの回答のアプローチを移植しますが、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、それが発生する可能性)のために右トリットを発見aとbし、必要な動作を行います。これは基本的に終了しません。


にz制限されて{-1, 0, 1}いると思います。
— エリックアウトゴルファー

@EriktheOutgolfer これら3つの3項演算のいずれかにzマップの値を選択できます。[...]
— デニス

@Dennis zは-101、、またはのいずれかであり、これらはz参照される「値」です。
— エリックアウトゴルファー

これは2バイトの違いですが、に置き換えswitch(z,...)られるswitch(z+2,...)ので、とにかく些細な変更になります。
— ジュゼッペ

0

ゼリー、47バイト

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

オンラインでお試しください!

完全なプログラム。

-1= C、0= A、1=B

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


私は取ってないと思うxし、y許可されているバランスの取れた三に:「xとyは-3812798742493から包括的3812798742493にすることができ最初のステップは、バランスの取れた三元に10進数から、xとyを変換することです。」
— ジョナサンアラン


...しかし、数値のネイティブ形式は、Jellyでバランスの取れた3進数ではありません。
— ジョナサンアラン

@ジョナサンアランああ、私は誤解したように見えます....
— エリック・ザ・アウトゴルファー

@JonathanAllan eugh ... fixed
— エリック・ザ・アウトゴルファー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.