Défi
Étant donné un nombre x
et un nombre n
, arrondissez le nombre x
à n
des chiffres significatifs et sortez le résultat.
Chiffres significatifs
Les chiffres significatifs d'un nombre sont des chiffres qui portent un sens contribuant à sa résolution de mesure. Cela inclut tous les nombres sauf les zéros non significatifs.
Gardez à l'esprit que les zéros non significatifs après un point décimal sont toujours des chiffres insignifiants .
Lorsque vous arrondissez un chiffre, vous devez arrondir à zéro si le chiffre suivant est supérieur ou égal à cinq.
Tous les zéros à la fin après un point décimal sont comptés comme significatifs.
Contribution
Le premier nombre sera x
, le nombre à arrondir. Le deuxième chiffre sera n
le nombre de chiffres significatifs que vous devez arrondir x
.
x
sera un nombre (votre code doit gérer à la fois des entiers et des virgules flottantes) compris entre -1 000 000 000 et 1 000 000 000 inclus. n
sera un entier positif compris entre 1 et 50 inclus. n
ne sera jamais supérieur au nombre de chiffres x
.
L'entrée ne sera jamais 0
ou sous aucune forme 0
, par exemple 0.000
ou 000
.
Exemples
Inputs: 2.6754, 2
Output: 2.7
Une sortie de 2.7000
ne serait pas valide car les zéros de fin après le point décimal sont comptés comme des chiffres significatifs.
Inputs: 0.00034551, 4
Output: 0.0003455
Inputs: 50237.1238, 3
Output: 50200
Notez que cela ne doit pas avoir de point décimal.
Inputs: 2374905, 1
Output: 2000000
Inputs: 543.0489, 4
Output: 543.0
Inputs: 15, 1
Output: 20
Inputs: 520.3, 3
Output: 520
Si vous le souhaitez, vous pouvez produire à la 520.
place mais pas 520.0
.
Inputs: -53.87, 2
Output: -54
Inputs: 0.0999, 2
Output: 0.10
Règles
Les fonctions et bibliothèques intégrées qui vous permettent d'arrondir un nombre à n
des chiffres significatifs sont interdites.
Gagnant
Le code le plus court en octets gagne.
Inputs: 520.3, 3
le point décimal de la réponse n'est-il pas520.
crucial?2.0 x 10^2
l'écririez réellement en affichant les 2 sigfigs.Réponses:
Python 3, 83 octets
(similaire à la réponse PHP)
Cas de test:
Production:
En plus d'être légèrement plus longue, une autre approche que j'ai envisagée:
... produit une sortie incorrecte pour l'entrée de (15, 1):
... en raison de l'imprécision en virgule flottante dans la
round()
fonction. Il me semble probable que je pourrais trouver des cas de test qui briseraient la méthode "arrondir à zéro décimale" également si je regardais assez fort.Ainsi, il me semble que ma solution n'est probablement pas 100% correcte pour tous les cas et ne le serait que si elle était calculée en décimal. Ce problème peut donc affecter les solutions dans n'importe quel langage utilisant l'arithmétique FP.
la source
s
sur la même ligne, puis en utilisant des points-virgules.def s(x,n):y=10**(ceil(log10(abs(x)))-n);return y*round(x/y)
import *
pour le rendreimport*
round()
fonction arrondit à lan
décimale, pas auxn
chiffres significatifs, donc elle a été autorisée pour cet événement de golf.PHP, 130 octets
PHP, 133 octets fonctionne avec des valeurs <1 pour les chiffres significatifs
PHP, 56 octets fonctionne mais ignore les zéros inutiles
Quelqu'un a volé ou supprimé la fonction round en PHP! Pour rendre le défi plus intéressant. 127 octets
la source
Lot,
660652 octetsExplication: commence par le suffixe a
.
du paramètre au cas où il n'en aurait pas déjà un, puis supprime le signe (qui est enregistré) et les zéros non significatifs. La variable résultantem
est enregistrée pour plus tard car elle nous indiquera la magnitude souhaitée du résultat. Tous les.
s sont ensuite supprimés, ce qui pourrait entraîner d'autres zéros non significatifs, ils sont donc également supprimés.n
les zéros sont suffixés pour garantir qu'il y a suffisamment de chiffres à arrondir, puis lesn
e et premiern
chiffres sont extraits. Si len
e chiffre n'est pas 4 ou moins, alors nous ajoutons fastidieusement1
à la chaîne. Si la chaîne déborde, nous augmentons l'amplitude en préfixant a1
, mais si elle était à l'origine inférieure à0.1
ce que nous faisons, en supprimant le1
nous venons d'ajouter et également un0
après la virgule décimale. Si la magnitude est encore inférieure à celle-ci,1
nous copions les zéros après la virgule décimale dans le résultat, mais si c'est le cas,1
nous extrayons la partie entière de la réponse, en ajoutant des zéros supplémentaires si nécessaire pour atteindre la virgule décimale (qui est alors supprimé car il afficherait une précision incorrecte). Enfin, le signe, la partie entière, le point décimal et la partie décimale sont concaténés.la source