Nous avons eu quelques défis pour la conversion de base, mais tous semblent s'appliquer aux valeurs entières. Faisons-le avec de vrais chiffres!
Le défi
Contributions:
- Un vrai nombre x positif , exprimé en base 10. Il peut être pris comme un flottant double précision ou comme une chaîne. Pour éviter les problèmes de précision, le nombre peut être supposé supérieur à 10 −6 et inférieur à 10 15 .
- Une base cible b . Ce sera un entier de 2 à 36.
- Un certain nombre de chiffres fractionnaires n . Ce sera un entier de 1 à 20.
Sortie: la représentation de x dans la base b avec n chiffres fractionnaires.
Lors du calcul de l'expression de sortie, les chiffres au-delà du n -ième doivent être tronqués (non arrondis). Par exemple, x = 3.141592653589793
dans la base b = 3
est 10.0102110122...
, donc pour n = 3
la sortie serait 10.010
(troncature), pas10.011
(arrondi).
Pour x et b qui produisent un nombre fini de chiffres dans la partie fractionnaire, la représentation infinie équivalente (tronquée à n chiffres) est également autorisée. Par exemple, 4.5
en décimal peut également être représenté par 4.49999...
.
Ne vous inquiétez pas des erreurs en virgule flottante .
Format d'entrée et de sortie
x sera donné sans zéros de tête. Si x se trouve être un entier, vous pouvez supposer qu'il sera donné avec une partie décimale nulle ( 3.0
), ou sans partie décimale (3
).
La sortie est flexible. Par exemple, cela peut être:
- Une chaîne représentant le nombre avec un séparateur approprié (point décimal) entre les parties entières et fractionnaires. Les chiffres
11
,12
etc. (pour b au-delà de 10) peuvent être représentés par des lettresA
,B
comme d'habitude, ou comme tout autre caractère distinct (veuillez préciser). - Une chaîne pour la partie entière et une autre chaîne pour la partie fractionnaire.
- Deux tableaux / listes, un pour chaque partie, contenant les nombres de
0
à35
sous forme de chiffres.
Les seules restrictions sont que les parties entières et fractionnaires peuvent être différenciées (séparateur approprié) et utiliser le même format (par exemple, non [5, 11]
pour la liste représentant la partie entière et['5', 'B']
pour la liste représentant la partie fractionnaire).
Règles supplémentaires
- Les programmes ou fonctions sont autorisés, dans n'importe quel langage de programmation . Les failles standard sont interdites.
- Le code le plus court en octets gagne.
Cas de test
La sortie est disponible en tant que chaîne de chiffres 0
, ..., 9
, A
, ..., Z
en utilisant .
comme séparateur décimal.
x, b, n -> output(s)
4.5, 10, 5 -> 4.50000 or 4.49999
42, 13, 1 -> 33.0 or 32.C
3.141592653589793, 3, 8 -> 10.01021101
3.141592653589793, 5, 10 -> 3.0323221430
1.234, 16, 12 -> 1.3BE76C8B4395
10.5, 2, 8 -> 1010.10000000 or 1010.01111111
10.5, 3, 8 -> 101.11111111
6.5817645, 20, 10 -> 6.BCE2680000 or 6.BCE267JJJJ
0.367879441171442, 25, 10 -> 0.94N2MGH7G8
12944892982609, 29, 9 -> PPCGROCKS.000000000
la source
42, 13, 1
que nous pouvons avoir au33
lieu de33.0
?n
des chiffres décimauxRéponses:
Gelée , 16 octets
Essayez-le en ligne!
Notez que les singletons sont imprimés comme élément dans la sortie.
la source
JavaScript (ES8),
817471 octetsFonctionne
x
entre1e-6
et1e21
,b
de2
à36
(exactement comme requis) etn
de1
à quoi que ce soit de10
à en48
fonction de la base avant que les erreurs à virgule flottante ne s'introduisent. Edit: 7 octets enregistrés avec l'aide de @Birjolaxew. Enregistré 3 octets supplémentaires avec l'aide de @tsh. La version précédente de 74 octets fonctionnait également avec des nombres négatifs:la source
n
"chiffres" d'une chaîne..toString(b)
... stupide moi> _ <Python 2 ,
153149144137135109 octetsJe n'avais pas remarqué que je pouvais simplement renvoyer les chiffres sous forme de nombres, ce qui le rend beaucoup plus simple. Renvoie deux listes de chiffres, la première pour la partie entière, la seconde pour le fractionnaire.
Essayez-le en ligne!
la source
1e-6
(et inférieurs à1e15
, comme précédemment)Perl 6 , 25 octets
Essayez-le
Étendu:
Notez que l'espace est tel qu'il est analysé comme
(+x).base(b,n)
non
+( x.base(b,n) )
.la source
1e-6
(et inférieurs à1e15
, comme auparavant)Mathematica, 158 octets
puisque ce défi a déjà obtenu une très bonne réponse en mathématique par @KellyLowder, j'ai essayé de produire (avec une approche différente) les résultats exacts comme indiqué dans les cas de test
contribution
production
la source
Rubis , 45 octets
Pourquoi?
Puisque b ^ n dans la base b est 10 ^ n, nous multiplions x par ce nombre, puis ajoutons la virgule décimale à laquelle il appartient.
Essayez-le en ligne!
la source
.round
par.to_i
; cela corrige le dernier chiffre de la sortie pour ceux où il ne correspond pas aux sorties de test. -1 octet de plus en utilisant.insert ~n,?.
, sans parenthèses.C (gcc) ,
157152 octetsNécessite 64 bits
long int
pour que cela fonctionne avec des cas de test plus importants.-5 octets grâce à Peter Cordes
Essayez-le en ligne!
edit: quelques octets peuvent être rasés s'il est autorisé à sortir deux chaînes séparées par un séparateur de nouvelle ligne:
149 octets:
edit: cette soumission n'est pas la plus longue, yay!
la source
printf(z+r)
s'il ne contient aucun%
caractère. (Il s'agit de code-golf; la sécurité et les bonnes pratiques sortent par la fenêtre: P). Vous pouvez également utiliserputs(z+r)
pour obtenir une nouvelle ligne gratuitement (en l'enregistrantputs("")
dans la deuxième version).float
est plus court quedouble
, mais il semble que la question nécessite unedouble
entrée ou une chaîne.long
, et selon les règles de code-golf, c'est tout ce dont vous avez besoin pour que votre réponse soit valide. (De plus, il est courant que les réponses de code-golf C et C ++ supposent 64 bitslong
, car c'est ce que Try It Online utilise.) Je suggère de revenir en arrière et de simplement ajouter une note comme "long
doit être 64 bits pour ceci pour soutenir les plus grands cas de test. "Mathematica 47 octets
Appeler
RealDigits
deux fois pour déterminer le nombre de chiffres à gauche de la décimale.la source
1e-6
(et inférieurs à1e15
, comme auparavant)TakeDrop@@RealDigits[##]
& mais j'ai réalisé que j'avais mal lu les choses - votre solution semble optimale.SageMath , 68 octets
Essayez-le en ligne!
la source
1e-6
(et inférieurs à1e15
, comme auparavant)Haskell , 188 octets
Essayez-le en ligne!
g
convertit un nombre en une liste représentant ce nombre dans une base donnéez
mappe les entiers aux lettres (36 = .
)h
applique les fonctions précédentes à la partie entière et fractionnaire d'un nombre.la source
Axiome, 566 octets
il était particulièrement difficile cette question; après quelque temps pour écrire quelque chose, les bons résultats semblent générer en utilisant une macro pour conserver les chiffres () ... ce n'est pas trop joué ... résultats:
la cible réelle est une fonction qui se convertit en base 2..36 chaque Float [qui a k: = chiffres ()] ou chaque nombre calculé en% pi ou% e ou la division de deux float / int comme dans 1./3 . [chiffres «oo»]
la source
Axiome, 127 octets
résultats
Il y a un petit problème pour l'exemple final zéro
Renverrait «4,5» et non «4,50000»
la source