Logica ternaria bilanciata


11

Logica ternaria bilanciata

Ternario è normalmente un altro nome per la base 3, vale a dire, ogni cifra è 0, 1o 2, ed ogni posto vale 3 volte tanto quanto il prossimo luogo.

Ternario bilanciato è una modifica del ternario che utilizza cifre -1, 0e 1. Questo ha il vantaggio di non aver bisogno di un segno. Ogni posto vale comunque 3 volte di più di quello successivo. I primi numeri interi positivi sono quindi [1], [1, -1], [1, 0], [1, 1], [1, -1, -1]mentre i primi interi negativi sono [-1], [-1, 1], [-1, 0], [-1, -1], [-1, 1, 1].

Hai tre ingressi x, y, z. zè o -1, 0o 1, mentre xe ypuò essere da -3812798742493a 3812798742493inclusiva.

Il primo passo è quello di convertire xe yda decimale a ternario bilanciato. Questo dovrebbe darti 27 trits (cifre TeRnary). È quindi necessario combinare i trit da xe yin coppia utilizzando un'operazione ternaria e quindi riconvertire il risultato in decimale.

Puoi scegliere quali valori di zmappare per una di queste tre operazioni ternarie ciascuna:

  • A: Dati due trit, se uno è zero, il risultato è zero, altrimenti il ​​risultato è -1 se sono diversi o 1 se sono uguali.
  • B: Dati due trit, se uno è zero, allora il risultato è l'altro trit, altrimenti il ​​risultato è zero se sono diversi o la negazione se sono uguali.
  • C: Dati due trit, il risultato è zero se sono diversi o il loro valore se sono uguali.

Esempio. Supponiamo che xsia 29ed yè 15. In ternario equilibrato, questi diventano [1, 0, 1, -1]e [1, -1, -1, 0]. (I restanti 23 zero trits sono stati omessi per brevità.) Dopo ciascuna delle rispettive operazioni diventano A: [1, 0, -1, 0], B: [-1, -1, 0, -1], C: [1, 0, 0, 0]. Torna convertito in decimale i risultati sono 24, -37e 27, rispettivamente. Prova la seguente implementazione di riferimento per altri esempi:

L'implementazione di riferimento segue i passaggi sopra indicati, ma sei ovviamente libero di utilizzare qualsiasi algoritmo che produca gli stessi risultati.

Questo è , quindi vince il programma o la funzione più breve che non viola nessuna scappatoia standard!


2
Se il formato nativo per i numeri è ternario bilanciato (al contrario di binario), ci è permesso di prenderlo come input nel solito modo (il che si traduce in nessuna conversione in ternario bilanciato)?
wizzwizz4,


1
non zdobbiamo essere una delle -1,0,1o possiamo scegliere qualsiasi tre valori costanti ed evidenti? Ho selezionato 1,2,3nella mia risposta, e c'è un po 'di confusione al riguardo.
Giuseppe,

2
@Giuseppe Siamo spiacenti, sono consentite solo cifre ternarie bilanciate.
Neil,

2
Ho letto qualcosa di trasverso ... Troppe parole e nessuna formula
RosLuP

Risposte:


2

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

Definisce la funzione @, prendendo tre Intsecondi e dando un Int.
Mappa operatori come 1 -> A, 0 -> B, -1 -> C.

Provalo online!

La funzione $piega un lambda sui posti delle cifre [0..26], in un elenco di cifre ternarie. Utilizza la testa dell'elenco che produce per mantenere una differenza totale attuale dal numero richiesto (motivo per cui è messo in coda prima del ritorno) e sign(2*t/3^p)per determinare la cifra corrente da produrre. Il trucco del segno è equivalente a if(abs(2*t)<3^p)0(sign t).


Non conosco Clean, ma sono incuriosito da come ti sei convertito in ternario bilanciato, con $n(penso). Potresti aggiungere una spiegazione per questo?
Giuseppe,

@Giuseppe Assolutamente, aggiungerò una spiegazione oggi quando avrò tempo.
Οuroso

@Giuseppe risponde alla tua domanda?
Οuroso

Sì! Ha senso. Abbastanza intelligente!
Giuseppe,

1

Gelatina , 39 byte

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

Un programma completo prendendo due argomenti, [x,y]e z
... dove zè {A:-1, B:0, C:1}
che stampa il risultato

Provalo online! Nota: il metodo golfed lo rende lento - questa versione modificata è più veloce (registri di 3, ceils e incrementi prima di ogni prodotto cartesiano)

Come?

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

Per la mia vita non posso leggere le lingue del golf, quindi quando dici "lento", quanto è grave la complessità del tempo?
Οuroso

Per ottenere il ternario bilanciato di N, crea un elenco di tutte le liste (3) di abs (N) di lunghezza (0, -1 e 1). So O (3 ^ max (abs (X), abs (Y)))
Jonathan Allan

Grazie e per la spiegazione vedo che hai aggiunto anche tu!
Οuroso

1
Aggiunta anche una versione più veloce usando lo stesso metodo :)
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}

Provalo online!

Calcola tutte le combinazioni di tratti e seleziona quello giusto. In realtà genererà un errore di memoria 27, poiché 3^27è un numero piuttosto elevato, ma in teoria funzionerebbe. Il collegamento TIO ha solo il 11supporto intero trit; Non sono sicuro a che punto scada prima o errori di memoria, e non voglio che Dennis si arrabbi con me per aver abusato di TIO!

vecchia risposta, 170 byte

Questo dovrebbe funzionare per tutti gli ingressi, sebbene con soli numeri interi a 32 bit, c'è la possibilità di imprecisione poiché R li convertirà automaticamente 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)}

Provalo online!

Prende -1per A, 0per Be 1per C.

Ports l'approccio in questa risposta per la conversione in ternario bilanciato, anche se poiché siamo sicuri di non avere più di 27 trits bilanciati, è ottimizzato per questo.

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}

Provalo online!

Questa versione terminerà molto lentamente. Lo Stupid Sort di conversione di base, questa funzione preleva casualmente trits fino magicamente ( 3^-54probabilità che si verifichi) trova le trits giusti per ae b, e poi fa l'operazione richiesta. Questo praticamente non finirà mai.


Penso che zsia limitato a {-1, 0, 1}.
Erik the Outgolfer,

@EriktheOutgolfer Puoi scegliere quali valori della zmappa per una di queste tre operazioni ternarie ciascuna: [...]
Dennis

@Dennis zè o -1, 0o1 , e penso che questi siano i "valori di z" a cui si fa riferimento.
Erik the Outgolfer

È una differenza di due byte, sostituibile switch(z,...)con switch(z+2,...)quindi sarebbe una modifica banale a prescindere.
Giuseppe,

0

Gelatina , 47 byte

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

Provalo online!

Programma completo.

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

Argomento 1: [x, y]
Argomento 3:z


Non penso che sia consentito prendere xe yin ternario bilanciato: "xey può essere compreso tra -3812798742493 e 3812798742493 compresi. Il primo passo è convertire xey da decimale a ternario bilanciato".
Jonathan Allan,

Chiarimento dei commenti di
Erik the Outgolfer

... ma il formato nativo per i numeri non è bilanciato ternario in Jelly.
Jonathan Allan,

@JonathanAllan Oh, sembra che io abbia capito male ...
Erik the Outgolfer

@JonathanAllan eugh ... risolto
Erik the Outgolfer
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.