Logique ternaire équilibrée
Ternaires est normalement un autre nom pour la base 3, c'est - à - dire, chaque chiffre est 0
, 1
ou 2
, et chaque endroit vaut 3 fois plus que l'endroit suivant.
Ternaire équilibrée est une modification de ternaire qui utilise les chiffres de -1
, 0
et 1
. Cela a l'avantage de ne pas avoir besoin d'un signe. Chaque place vaut encore 3 fois plus que la place suivante. Les premiers entiers positifs sont donc [1]
, [1, -1]
, [1, 0]
, [1, 1]
, [1, -1, -1]
alors que les premiers entiers négatifs sont [-1]
, [-1, 1]
, [-1, 0]
, [-1, -1]
, [-1, 1, 1]
.
Vous avez trois entrées x, y, z
. z
est soit -1
, 0
ou 1
, tout x
et y
peut être de -3812798742493
la 3812798742493
inclus.
La première étape consiste à convertir x
et y
de décimal en ternaire équilibré. Cela devrait vous donner 27 trits (chiffres TeRnary). Vous devez ensuite combiner les trits de x
et y
par paires à l'aide d'une opération ternaire, puis reconvertir le résultat en décimal.
Vous pouvez choisir les valeurs de z
mappage pour chacune de ces trois opérations ternaires:
A
: Étant donné deux trits, si l'un est nul, le résultat est nul, sinon le résultat est -1 s'ils sont différents ou 1 s'ils sont identiques.B
: Étant donné deux trits, si l'un est zéro, alors le résultat est l'autre trit, sinon le résultat est zéro s'ils sont différents ou la négation s'ils sont les mêmes.C
: Étant donné deux trits, le résultat est nul s'ils sont différents ou leur valeur s'ils sont identiques.
Exemple. Supposons x
est 29
et y
est 15
. En ternaire équilibré, ceux-ci deviennent [1, 0, 1, -1]
et [1, -1, -1, 0]
. (Les 23 zéros restants ont été omis par souci de concision.) Après chacune des opérations respectives, ils deviennent A
: [1, 0, -1, 0]
, B
: [-1, -1, 0, -1]
, C
: [1, 0, 0, 0]
. Convertis en décimal, les résultats sont 24
, -37
et 27
respectivement. Essayez l'implémentation de référence suivante pour plus d'exemples:
L'implémentation de référence suit les étapes ci-dessus, mais vous êtes bien sûr libre d'utiliser n'importe quel algorithme qui produit les mêmes résultats.
C'est le golf de code , donc le programme ou la fonction la plus courte qui ne viole aucune échappatoire standard gagne!
z
que ce soit une-1,0,1
ou pouvons-nous choisir trois valeurs cohérentes et distinctes? J'ai sélectionné1,2,3
dans ma réponse, et il y a une certaine confusion à ce sujet.Réponses:
Nettoyer ,
231... 162 octetsDéfinit la fonction
@
en prenant troisInt
s et en donnant unInt
.Les opérateurs mappent en tant que
1 -> A, 0 -> B, -1 -> C
.Essayez-le en ligne!
La fonction
$
replie un lambda sur les emplacements de chiffres[0..26]
, en une liste de chiffres ternaires. Il utilise le début de la liste qu'il génère pour conserver une différence totale actuelle par rapport au nombre requis (c'est pourquoi il est suivi avant de revenir) etsign(2*t/3^p)
pour déterminer le chiffre actuel à générer. L'astuce de signe est équivalente àif(abs(2*t)<3^p)0(sign t)
.la source
$n
(je pense). Pourriez-vous ajouter une explication à cela?Gelée , 39 octets
Un programme complet prenant deux arguments,
[x,y]
etz
... où
z
est{A:-1, B:0, C:1}
qui imprime le résultat
Essayez-le en ligne! Remarque: la méthode golfée le rend lent - cette version modifiée est plus rapide (journaux de 3, plafonds et incréments avant chaque produit cartésien)
Comment?
la source
R ,
190172151 151 octetsEssayez-le en ligne!
Calcule toutes les combinaisons de trits et sélectionne la bonne. Cela provoquera en fait une erreur de mémoire
27
, car il3^27
s'agit d'un nombre assez important, mais cela fonctionnerait en théorie. Le lien TIO ne11
prend en charge que les entiers trit; Je ne sais pas à quel moment cela arrive à expiration ou des erreurs de mémoire en premier, et je ne veux pas que Dennis se fâche contre moi pour avoir abusé de TIO!ancienne réponse, 170 octets
Celui-ci devrait fonctionner pour toutes les entrées, bien qu'avec seulement des entiers 32 bits, il y ait une possibilité d'imprécision car R les convertira automatiquement en
double
.Essayez-le en ligne!
Prend
-1
pourA
,0
pourB
et1
pourC
.Transmet l'approche dans cette réponse pour la conversion en ternaire équilibré, bien que puisque nous sommes garantis de ne pas avoir plus de 27 trits équilibrés, il est optimisé pour cela.
R , 160 octets
Essayez-le en ligne!
Cette version se terminera extrêmement lentement. Le bogosort de la conversion de base, cette fonction sélectionne au hasard les trits jusqu'à ce que d'une manière ou d'une autre (par
3^-54
chance qu'il se produise) trouve les bons trits poura
etb
, puis effectue l'opération requise. Cela ne se terminera pratiquement jamais.la source
z
se limite à{-1, 0, 1}
.z
mappage pour chacune de ces trois opérations ternaires: [...]z
est soit-1
,0
ou1
, et je pense que ce sont les « valeurs dez
» étant appelées.switch(z,...)
parswitch(z+2,...)
, ce serait donc un changement trivial.Gelée , 47 octets
Essayez-le en ligne!
Programme complet.
-1
=C
,0
=A
,1
=B
Argument 1:
[x, y]
Argument 3:
z
la source
x
ety
en ternaire équilibré soit autorisée: "x et y peuvent aller de -3812798742493 à 3812798742493 inclus. La première étape consiste à convertir x et y de décimal en ternaire équilibré."