Rond comme un zéro


12

Objectif

Étant donné un nombre d'entrée, arrondissez-le au nombre le plus proche avec un chiffre significatif.

Exigences

Contribution

  • Un nombre à virgule flottante.
  • Supposons que le numéro d'entrée entraîne une sortie dans les limites du type de données (c.-à-d. Ignorer les erreurs de débordement.)
  • 0 est une entrée non valide.
  • Les nombres qui ne peuvent pas être représentés avec précision dans le type de données à virgule flottante (par exemple, "0.35"être stockés en tant que 0.3499999) ne doivent pas être pris en charge.

Production

  • Le nombre le plus proche composé d'un chiffre différent de zéro et d'un nombre quelconque de chiffres zéro.
  • Le résultat doit prendre en charge les nombres négatifs et les nombres fractionnaires.
  • Lorsque l'entrée se situe exactement entre deux sorties possibles, arrondissez à zéro.

Présentation

L'accent est mis sur le calcul plutôt que sur la présentation. La sortie peut être un type de données à virgule flottante. Il peut s'agir de texte en entier ou en notation scientifique. Si vous trouvez une faille où la présentation d'une certaine manière réduit votre nombre d'octets, bravo à vous!

Exemples

9
-3000
.2
0.2
-.2
7e12
5e-15
1e0

Cas de test

Input     Output
1         1
10        10
17        20
99        100
54321     50000
56789     60000
-123      -100
-789      -800
0.23      0.2
0.25      0.3
-0.25     -0.3
4.56e23   5e23
4.56e-23  5e-23

Notation

Le code avec le moins d'octets après une semaine gagne.


3
Je pense que "un chiffre significatif" est la phrase que vous recherchez.
Steve Bennett

2
La règle d'arrondi pour 0 est assez bizarre.
xnor

2
@xnor, vous avez raison. 0 est plus proche de 0,0001 que 1. Je pense que 0 devrait simplement être invalide.
Hand-E-Food

1
Oui, et cela ne correspond pas à la déclaration d'objectif.
Steve Bennett

Réponses:


6

MATL , 3 octets

1&V

Essayez-le en ligne! Ou vérifiez tous les cas de test .

Le cas de test 0.25échoue pour le compilateur exécuté dans Octave sur TIO, mais fonctionne dans Matlab sur Windows:

entrez la description de l'image ici

Le comportement différent est provoqué par la fonction d'Octave / Matlab sprintfutilisant soit "l'arrondi du banquier", soit ".5 loin de zéro", selon la plate-forme. Plus d'informations et de tests peuvent être trouvés ici .


Pour 6 octets ,

1t3$Yo

fonctionne à la fois sur Octave et sur Matlab. Vérifiez tous les cas de test .


1
"l'arrondissement bancaire" est à peu près ce qui m'a fait supprimer ma réponse Jelly. > _ <
Erik the Outgolfer

@EriktheOutgolfer Oui, j'ai compris que c'était aussi la raison. J'ai de la chance que Matlab ne fasse pas ça :-D
Luis Mendo


9

Javascript, 19 octets

x=>x.toPrecision(1)

Cela ne satisfait pas la spécification sur 0ou 25.
Anders Kaseorg

Intéressant. La spécification pour 0n'a pas de sens pour moi. Mais la 0.35chose ... ressemble à Javascript essaie d'éviter le biais dans l'arrondi, mais la spécification veut le biais.
Steve Bennett

Hé, tu as changé ton commentaire - tu n'as 0.35pas écrit 25avant. Je pense que cela satisfait les spécifications pour 25 - il renvoie "3e + 1" qui me semble juste.
Steve Bennett

Désolé, je l'ai changé 0.35car il 0.35n'a pas de représentation exacte en virgule flottante. Le comportement doit dépendre du navigateur; Je reçois 252e+1dans Firefox.
Anders Kaseorg

Oui, j'obtiens ces deux résultats différents dans Chrome vs Firefox. Sensationnel.
Steve Bennett

4

Rétine , 63 62 octets

1`[1-9]
$*#
#\.?[5-9]
#$&
T`d`0`#[\d.]+
0(\.?)#{10}
1$1
#+
$.0

Essayez-le en ligne!


Apparemment, vous n'avez pas à vous soucier de la fin des zéros, vous pouvez donc supprimer complètement la dernière étape (même si cela m'impressionne, ce n'est pas tous les jours que vous voyez trois points d'interrogation en l'espace de quatre caractères).
Neil

Malheureusement, cette réponse semble échouer 0.99.
Neil

Échoue également pour 0.099etc. Ma tentative de correction: essayez-la en ligne!
Neil

Échoue également 99.99, 100.001...
Neil

Toujours mal pour 0.099, désolé. Du bon côté, je pense que vous pouvez supprimer l' +after the ;sur la troisième ligne.
Neil

2

PHP , 45 octets

<?=round($x=$argv[1],-floor(log10(abs($x))));

Essayez-le en ligne!

Même méthode que ma réponse python 2.

Semble également gérer correctement 0.35, ce qui le place également au-dessus de la réponse JS: D


Fait intéressant, je pense que votre réponse Python 3 supprimée peut fonctionner dans Python 2.
Anders Kaseorg

Testé, et ça le fait! Modification et suppression de la réponse python maintenant
Skidsdev

2

T-SQL, 27 octets

SELECT FORMAT(i,'G1')FROM t

Utilisation du même code de formatage .Net que la réponse C # de Carlos Alejo . L'entrée provient de la colonne flottante i dans le tableau préexistant t , conformément à nos normes IO

Cas de test:

Input         Output
------------ --------
1             1
10            1E+01
17            2E+01
99            1E+02
54321         5E+04
56789         6E+04
-123         -1E+02
-789         -8E+02
0.23          0.2
0.25          0.3
-0.25        -0.3
4.56E+23      5E+23
4.56E-23      5E-23

(Assez pratique que je puisse pré-charger la table d'entrée avec toutes ces valeurs et les exécuter en même temps.)


1

Python 2 , 62 octets

lambda x:round(x,-int(floor(log10(abs(x)))))
from math import*

Essayez-le en ligne!

Pas habitué au golf en python, mais cela fonctionne.

Échec en 0.35raison d'inexactitudes en virgule flottante.

Merci à Anders Kaseorg d'avoir souligné que cela fonctionne correctement en Python 2


La sortie de 0.25est censée être 0.3.
Anders Kaseorg

@AndersKaseorg Je ne sais pas pourquoi, mais je peux seulement supposer que cela est dû aux mêmes inexactitudes en virgule flottante que la réponse Javascript.
Skidsdev

Hmm wait 25 a le même problème ... bizarre.
Skidsdev

Pour ceux qui se demandent, Python 2 roundarrondit à partir de zéro tandis que Python 3 arrondit à égal, c'est pourquoi cela fonctionne dans Py2 mais pas 3.
flornquake

vous pouvez jouer au golf quelques octets en utilisant log(x,10)au lieu de log10(abs(x)).
Alix Eisenhardt


1

Excel, 14 octets

=ROUNDUP(A1,1)

Bienvenue sur le site! C'est une bonne première réponse, avez-vous des liens vers un endroit où cela peut être testé, de préférence en ligne, afin que les autres utilisateurs n'aient pas à télécharger Excel?
caird coinheringaahing

Malheureusement, je ne pense pas qu'il existe de sites Microsoft gratuits en raison de la licence, désolé. J'ai vu d'autres réponses Excel sur Code Golf mais je ne sais pas comment elles sont validées depuis que je suis nouveau!
rew

Cela ne fonctionne pas pour la plupart des cas de test. Il arrondit à la position des "dixièmes". Il doit être arrondi (et non supérieur) à la position la plus importante.
Hand-E-Food



0

Forth (gforth) , 24 octets

: f 1 set-precision f. ;

Essayez-le en ligne!

Une entrée est attendue sur la pile à virgule flottante. La sortie est à stdout

Je n'aime pas apporter de modifications à la précision globale (pour cette instance) des fonctions de sortie en virgule flottante, mais cela économise beaucoup d'octets pour ne pas avoir à restaurer la valeur précédente à la fin. Ne sort pas en ingénierie ou en notation scientifique, quelle que soit l'entrée.

Remarque: Pour une raison quelconque, l'interpréteur tio se convertit 0.25en 0.2, tandis que mon installation locale se convertit 0.25en 0.3. Je ne sais pas exactement pourquoi c'est, mais comme j'obtiens le bon résultat localement, je laisse ma réponse telle quelle

: f                   \ start a new word definition
  1 set-precision     \ set the floating point output words to use 1 significant digit
  f.                  \ output the top of the floating point stack
;                     \ end the word definition
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.