Arrondi satisfaisant
Vous savez quand vous êtes en cours de science et que vous avez demandé d'arrondir à 2 figues sig, mais votre réponse est 5.2501...
? Vous devriez arrondir à 5.3
, mais c'est tellement insatisfaisant! En arrondissant à5.3
, vous avez un total de 0,05, ce qui est une grande quantité par rapport à 0,1 (la valeur de position à laquelle vous arrondissez)! Alors aidez-moi à tourner de manière satisfaisante.
Pour arrondir de manière satisfaisante, vous devez arrondir au premier chiffre que vous rencontrez, ce qui produit une erreur relativement faible - moins de la moitié de l'erreur maximale possible lors de l'arrondi. Fondamentalement, vous devez arrondir chaque fois que vous rencontrez 0, 1, 8 ou 9. Si cela ne se produit jamais, renvoyez l'entrée telle quelle. N'arrondissez pas les zéros ou les uns au début - cela ne semble tout simplement pas satisfaisant.
Contribution
Une chaîne ou une valeur flottante qui représente un nombre décimal non négatif.
Production
Le même nombre décimal arrondi de manière satisfaisante, au format chaîne ou flottant.
Exemples
Input -> Output
0 -> 0
0.5 -> 0.5
0.19 -> 0
0.8 -> 1
5.64511 -> 5.645
18.913 -> 20
88.913 -> 100
36.38299 -> 36.4
621 -> 620
803.22 -> 1000
547.4726 -> 547.4726
C'est un défi de code-golf , donc le code le plus court gagne!
la source
036.40000
considérées comme une sortie valide?.0
partie sera donnée pour les entiers? De plus, ce0
n'est pas positif.19
arrondit à20
mais0.19
arrondit à0
? Pourquoi?Réponses:
JavaScript (ES6),
100 99 9878 octetsPrend l'entrée sous forme de chaîne. Renvoie un flottant.
Essayez-le en ligne!
Comment?
Nous ajoutons d'abord un0 de début à la chaîne d'entrée, de sorte que nous sommes garantis d'avoir un chiffre avant un 8 ou 9 de début possible.9 , qui doit immédiatement déclencher l'arrondi.
Le drapeauj est mis à 1 tant que nous recherchons un chiffre sur lequel nous pouvons effectuer un arrondi satisfaisant, et mis à 0 par la suite.
Parce qu'un0 tête a été ajouté à la chaîne que nous parcourons mais que s est resté inchangé, d contient le caractère actuel et s[i] pointe vers le caractère suivant .
Nous utilisons le code suivant pour charger le chiffre suivant dansn , en sautant un séparateur décimal possible:
Bien que les chaînes soient immuables en JavaScript, l'expressions[i]+1 si elle contient une valeur numérique, même si s[i] n'est pas réellement incrémenté. Par conséquent, l'expression false (contraint à 0 ) pour tous les chiffres (y compris 0 ) et à true (contraint à 1 ) pour le séparateur décimal
++s[i]
renverra!++s[i]
est évaluée à"."
.d + --j
d + j--
la source
Rubis ,
7977696765 octetsEssayez-le en ligne!
Explication
->n
Prendre l'entrée comme une chaînez=n+".0"
Créer une chaîne temporairez
qui est garantie de contenir un point et un chiffre pertinent.i=z=~/\./
Déterminez la position du point décimalz
et attribuez-le ài
.z[i]=''
Déposez le point pour qu'il ne gêne pas plus loin.z=~/(?!^)[01]|8|9/
Déterminer la position de non-départ0-1
ou de tout8-9
événement, selon la première éventualité.(...)-i
Cette différence sera le nombre de décimales à conserver, négatif si nous arrondissons à gauche du point.n.to_f.round ...
Convertissez pour flotter et arrondissez.la source
Gelée , 34 octets
Essayez-le en ligne!
-1 merci à Jonathan Allan .
la source
ŒV
? Je pense que çaV
marchera aussi._>¥0ɓVær
comme le mien (j'ai manqué l'utilisation du rapide dyadique alors merci aussi!)Gelée ,
3029 octets-1 merci à Erik l'Outgolfer (utilisation rapide de dyadique
¥
de sa réponse)Un lien monadique acceptant une liste de caractères qui donne un flottant.
Essayez-le en ligne! Ou voir le suite de tests .
Comment
Notez d'abord que la chaîne d'entrée est composée exclusivement de caractères
0123456789.
qui ont des ordinaux[48,49,50,51,52,53,54,55,56,57,46]
, qui ont des restes lorsqu'ils sont divisés par huit[0,1,2,3,4,5,6,7,0,1,6]
. Les seuls caractères qui sont entre-1
et1
comprennent0
,1
,8
et9
.De plus, si l'on soustrait huit des ordinaux (
[40,41,42,43,44,45,46,47,48,49,38]
), la même chose (assez évidemment) est vraie. Si nous divisons par deux ces ([20,20.5,21,21.5,22,22.5,23,23.5,24,24.5,19]
) les seuls caractères qui ont des restes lorsqu'ils sont divisés par huit qui sont entre-1
et1
inclusifs sont8
et9
.la source
Retina 0.8.2 , 75 octets
Essayez-le en ligne! Le lien inclut des cas de test. Explication:
Gérer le cas d'un interligne
8
ou9
.S'il y a un non-leader
0
ou1
, puis zéro et le reste de la ficelle. De plus, s'il y a un8
ou9
, laissez-le, mais mettez à zéro le reste de la chaîne. (Mais laissez le point décimal inchangé dans les deux cas.)S'il y a encore un
8
ou un9
à ce point, mettez-le à zéro et incrémentez le chiffre précédent (éventuellement avant le point décimal).Supprimez les zéros de fin s'ils se trouvent après un point décimal, mais supprimez le point décimal uniquement s'il n'y a pas d'autres chiffres entre les deux.
la source
C (gcc) ,
111102 octetsEssayez-le en ligne!
la source
C # (Visual C # Interactive Compiler) , 280 octets
Essayez-le en ligne!
Il peut être plus court si j'utilise des doubles au lieu de décimales, mais j'utilise des décimales pour préserver la précision, sinon un nombre comme 547.4726 serait 547.472595214844.
C # (Visual C # Interactive Compiler) , 268 octets
Essayez-le en ligne! (Version moins précise)
la source