Les crédits pour l'idée de défi vont à @AndrewPiliser. Sa proposition originale dans le bac à sable a été abandonnée et comme il n'a pas été actif ici depuis plusieurs mois, j'ai relevé le défi.
Le ternaire équilibré est un système numérique non standard. C'est comme le ternaire dans la mesure où les chiffres augmentent en valeur d'un facteur 3 lorsque vous allez plus loin vers la gauche - il en100
est de même9
pour1001
28.
Cependant, au lieu d'avoir des valeurs de 0, 1 et 2, les chiffres ont des valeurs de -1, 0 et 1 . (Vous pouvez toujours l'utiliser pour exprimer n'importe quel entier.)
Pour ce défi, la signification des chiffres +1
sera écrite comme +
, -1
sera écrite comme -
, et 0
est juste 0
. Le ternaire équilibré n'utilise pas le -
symbole devant les nombres pour les nier comme le font d'autres systèmes numériques - voir les exemples.
Votre tâche consiste à écrire un programme complet qui prend en entrée un entier signé décimal 32 bits et le convertit en ternaire équilibré. Aucune fonction de conversion de base intégrée d'aucune sorte n'est autorisée (Mathematica en a probablement une ...). L'entrée peut être sur une entrée standard, des arguments de ligne de commande, etc.
Des zéros non significatifs peuvent être présents en entrée mais pas en sortie, sauf si l'entrée l'est 0
, auquel cas la sortie doit également l'être 0
.
Exemples
Ce sont des conversions du ternaire équilibré en décimal; vous devrez convertir dans l'autre sens.
+0- = 1*3^2 + 0*3^1 + -1*3^0 = 9 + 0 + -1 = 8
+-0+ = 1*3^3 + -1*3^2 + 0*3^1 + 1*3^0 = 27 + -9 + 0 + 1 = 19
-+++ = -1*3^3 + 1*3^2 + 1*3^1 + 1*3^0 = -27 + 9 + 3 + 1 = -14
la source
Réponses:
Python 2: 58 caractères
Génère le ternaire équilibré chiffre par chiffre à partir de la fin. Le dernier chiffre est donné par le résidu
n%3
étant-1
,0
ou+1
. Nous supprimons ensuite le dernier chiffre et divisons par 3 en utilisant la division au sol de Pythonn=(n+1)/3
. Ensuite, nous procédons récursivement avec le nouveau dernier chiffre jusqu'à ce que le nombre soit 0.Un cas spécial est nécessaire pour l'entrée
0
à donner0
plutôt que la chaîne vide.Les spécifications ne le permettent pas, mais si l'on pouvait écrire une fonction au lieu d'un programme et sortir la chaîne vide pour 0, une solution de 40 caractères serait possible.
la source
n*"."and
dans le cas de la fonction uniquement.print s or 0
s or 0
. J'avais essayén*"."and
, mais ça échoue quandn<0
.CJam, 24 octets
J'ai trouvé cela indépendamment et je pense que c'est probablement la seule façon de gérer cela.
Algorithmiquement, c'est similaire à la réponse de xnor.
Essayez-le en ligne ici
Comment ça marche :
la source
JavaScript (E6) 68
Un programme complet, comme demandé, avec E / S via popup. Le cœur est la fonction R, 49 octets.
Pas si différent des autres solutions récursives, je suppose. Profitant de la conversion automatique entre chaîne et nombre pour éviter un cas spécial pour "0"
Testez dans la console FireFox / FireBug, en utilisant uniquement la fonction R
Sortie
la source
d=(n%3+3)%3
quandd=n%3
la même valeurd
?Pyth,
712423Il s'agit d'une solution récursive, basée sur la fonction récursive de @ xnor à 40 caractères.
y
construit le ternaire équilibré de l'entrée, en recherchant le dernier chiffre à l'aide de l'index mod 3, puis utilise le fait que les autres chiffres sont égaux au ternaire équilibré pour (n + 1) / 3, en utilisant la division au sol. Ensuite, il appelle la fonction, renvoyant le résultat, ou 0 si l'entrée est 0.Essayez ici.
la source
Mathematica -
157154146128La version golfée:
Et avec une indentation pour la lisibilité:
Usage:
Sortie:
Un grand merci à Martin Büttner pour avoir réduit le nombre de caractères.
la source
Mathematica, 54 caractères
Similaire à la récursivité de Xnor
Symboles Unicode sont utilisés pour remplacer
Floor
,Part
,!=
Sortie
Stocké comme
f
pour la brièveté et écrit sans unicode au cas où vous ne pouvez pas voirla source
GNU sed, 236 octets
Essayez-le en ligne!
Explication
La première moitié du code (moins la première ligne) traduit la décimale en unaire et vient directement des « Conseils pour jouer au golf à Sed ». Ensuite, il se traduit unaire à ternaire équilibré un trit à la fois, ce que je démontrerai en travaillant manuellement un exemple.
Avant la sortie finale, les chiffres ternaires
-
,0
et+
sont représentés par!
,:
et+
, respectivement.Pour un résultat intéressant, nous commençons par
-48
, qui a été converti en unaire (avec l'-
intacte). Pour calculer le premier trit (le plus à droite), nous devons calculer le reste de 48 ÷ 3. Nous pouvons le faire en remplaçant le111
s par3
s:48 ÷ 3 n'a plus de reste, donc il ne reste plus de
1
s, et nous savons que notre premier trit est:
(pour 0), nous le remplaçons donc:Maintenant, nous avons notre «un endroit», nous savons donc que les
3
s restants représentent la place des trois. Pour que les mathématiques fonctionnent, nous devons les diviser par 3, c'est-à-dire les remplacer par1
s:Revérifions nos calculs: nous avons 16 (unaire
1111111111111111
) à la place des trois et zéro (:
) à la place des un. C'est 3✕16 + 1✕0 = 48. Jusqu'ici tout va bien.Nous recommençons maintenant. Remplacez
111
s par3
s:Cette fois, notre reste est
1
, nous mettons donc+
à la troisième place et remplaçons les3
s restants par1
s:Heure du contrôle de santé mentale: Nous avons un 5 (unaire
11111
) à la place des neuf, 1 (+
) à la place des trois et 0 (:
) à la place des un: 9✕5 + 3✕1 + 1✕0 = 48. Génial! Encore une fois, nous remplaçons le111
s par3
s:Cette fois, notre reste est de 2 (
11
). Cela prend deux trits (+!
), ce qui signifie que nous avons un report. Tout comme en arithmétique décimale, cela signifie que nous prenons le chiffre le plus à droite et ajoutons le reste à la colonne de gauche. Dans notre système, cela signifie que nous mettons!
à la place des neuf et ajoutons trois autres à sa gauche, puis remplaçons tous les3
s par1
s pour représenter la place des 27:Maintenant, nous n'avons plus de 3, nous pouvons donc remplacer tous les chiffres unaires restants par leurs trits correspondants. Deux (
11
) est+!
:Dans le code réel, cela se fait en deux étapes
s/1/+/
ety/1:/!0/
pour économiser des octets. La deuxième étape remplace également:
s par0
s, elle fait donc ceci:Maintenant, nous vérifions si nous avons un nombre négatif. Nous le faisons, nous devons donc nous débarrasser du signe, puis inverser chaque trit:
Enfin, nous remplaçons
!
s par-
s:C'est ça!
la source
Stax , 17 octets
Exécuter et déboguer
Réponse la plus courte jusqu'à présent, mais devrait être facilement battue par certaines langues de golf. L'algorithme est le même que la réponse Python de @ xnor.
Équivalent ASCII:
la source
JavaScript
108102 (ES6, pas d'appels récursifs)Entrée originale à 108
Pas aussi sophistiqué que la réponse de @ edc65 ... J'apprécierais toute aide pour réduire cela davantage ...
la source
Clojure, 242 octets
Est-ce la plus longue réponse de Clojure à ce jour?
Non golfé (avec commentaires):
la source
8ème ,
179171167 167 caractèresVoici un programme complet en 8ème qui prend en entrée un entier décimal signé et le convertit en ternaire équilibré
Tester
La première fois que le programme demande un nombre à convertir (selon les besoins). Ensuite, il est possible d'appeler le mot
f
pour convertir plus de nombres comme dans la ligne suivante:Sortie
Explication du code
Il s'agit du code de gestion des entrées. Le cœur du code est à l'intérieur du mot
f
. Loin du terrain de golf, j'aurais utilisé le mot>bt
au lieu def
. Voici une version non golfée def
(avec commentaires):la source
Java,
327269 caractèresMon premier essai de golf à code. Je ne connais aucun de ces langages vraiment courts, alors voici une solution en Java. J'apprécierais des conseils pour le raccourcir davantage.
Essayez-le ici: http://ideone.com/fxlBBb
MODIFIER
Remplacé
BufferedReader
parScanner
, me permettant de supprimer lathrows
clause, mais a dû modifier l'importation (+2 caractères). RemplacéInteger
parint
. Malheureusement, le programme ne compilera pas s'il n'y a pasString[] h
dansmain
.la source
Scanner
au lieu de votreBufferedReader
. De plus,String[] h
et cethrows java.lang.Exception
n'est probablement pas nécessaire, et vous pourriez économiser quelques octets de plus en utilisant à laint
place deInteger
.JavaScript (ES6), 51 octets
Parcourez les personnages. Multipliez d'abord le total des temps précédents par 3, puis si isNaN (caractère) est vrai, convertissez la chaîne (caractère + "1") en nombre et ajoutez-la, sinon zéro.
la source
Stax , 14 octets
Exécuter et déboguer
la source
05AB1E , 20 octets
Essayez-le en ligne!
la source
APL (NARS), 26 caractères, 52 octets
tester:
possible cela pourrait être moins si ⊥ est utilisé mais c'est interdit ...
la source