Arrondir vers zéro


14

C'est une tâche simple. Étant donné un nombre réel positif ou négatif, arrondissez-le au prochain entier proche de zéro.

Le défi

  • Prenez la saisie sous toute forme raisonnable (stdin, fonction, etc.) d'un nombre réel positif ou négatif.

  • Arrondissez ce nombre "vers zéro" - cela signifie que s'il est positif, vous arrondirez vers le bas, et s'il est négatif, vous arrondirez vers le haut.

  • Renvoyez le numéro ou envoyez-le à la console.

Cas de test

 1.1   =>  1
-1.1   => -1
 500.4 =>  500
-283.5 => -283
 50    =>  50
-50    => -50

Règles

S'amuser! d'autres défis Jimmy à venir


3
Puis-je produire 3.00pour 3.14?
tsh

1
@A_ Si les messages d'erreur sont dans stderr. Et vos sorties sont en sortie standard. Il est autorisé par défaut.
tsh

1
Aussi 0.01et -0.01devrait céder 0...
roblogic

2
Hmm, cela semble déraisonnablement trivial pour un golf à code. La plupart des langs auront une fonction intégrée pour cela, non? Il semble que nous devons supposer que toutes les entrées et sorties sont des chaînes?
Octopus

2
3.00 est certainement un entier. Plus précisément, dans la notation mathématique standard ainsi que dans de nombreux langages de programmation, la notation "3.00" désigne le nombre 3, qui est un entier; mais dans de nombreux langages de programmation, cela indique que le nombre doit être stocké dans un format à virgule flottante. (Mais c'est un entier quel que soit le format dans lequel il est stocké.)
Tanner Swett

Réponses:


13

Gelée , 1 octet

r

Un programme complet (en tant que lien monadique, il renvoie une liste de longueur un).

Essayez-le en ligne!

Comment?

r - Main Link: number, X           e.g. -7.999
r - inclusive range between left (X) and right (X) (implicit cast to integer of inputs)
  -  = [int(X):int(X)] = [int(X)]       [-7]
  - implicit (smashing) print            -7

40

Python 3 , 3 octets

int

Essayez-le en ligne!

Tronque les chiffres après la virgule décimale.

REMARQUE: il s'agit d'une réponse triviale. Veuillez consulter les autres réponses avant de voter


18
Cela démontre que Python 3 est plus populaire que Python 2.

1
Euh ... Pourquoi les votes positifs? C'est une réponse assez banale ...
MilkyWay90

Je pense que c'est votre excellente explication du code. :)
Chas Brown

3
@ChasBrown Je ne pense pas ... l'explication n'est même pas une explication standard de calibre.
MilkyWay90

Je suppose que @Chas souligne que l'explication est infiniment plus complète que la sienne.
prl


12

Perl 5 -p056l15 , 2 octets

<>

Essayez-le en ligne!

Comment ça marche?

-056   # (CLI) Make "." the input record separator
-l15   # (CLI) Make "\n" the output record separator
       # (otherwise it would use the input separator)
-p     # (CLI) Implicitly read $_ from STDIN
<>     # Read the second input field and do nothing with it
-p     # (CLI) Output $_ to STDOUT

Ou si vous préférez une réponse plus traditionnelle:

Perl 5 , 6 octets

$_=int

Essayez-le en ligne!


l15 n'est pas \n, c'est \r. \nserait l12. Il en va de même pour TIO.
Grimmy

pour la deuxième option, il y a aussi-Minteger -p $_/=1
Nahuel Fouilleul

4
La première solution est en fait 8 octets car vous devez inclure les indicateurs dans votre nombre d'octets
John Dvorak

2
@JohnDvorak selon le méta- codegolf.meta.stackexchange.com/questions/14337/… , les drapeaux n'ajoutent pas d'octets mais comptent comme une version différente de la langue.
Nick Kennedy

@NahuelFouilleul J'ai pensé à celui-là aussi, mais cela n'avait pas d'importance puisque je suis arrivé à 2 octets dans l'autre sens.
Xcali

6

Labyrinthe et hexagone , 3 octets

Merci à FryAmTheEggman d'avoir souligné que j'avais écrit de l'hexagonie!

?!@

Essayez-le en ligne! & Essayez-le en ligne!

Comment?

Labyrinth et Hexagony vous le diront tous les deux le plus tôt possible! ...

? - read and discard from STDIN until a digit, a - or a + is found. Then read as many characters as possible to form a valid (signed) decimal integer and push its value
! - pop a value and write its decimal representation to STDOUT
@ - exit the labyrinth

3
Cela peut être vrai pour certaines autres langues de Martin, mais le même programme fonctionne exactement dans Hexagony .
FryAmTheEggman

3
Hé, j'ai toujours voulu faire une réponse dans Hexagony. Le faire sans essayer était la dernière chose que je pensais pouvoir arriver!
Jonathan Allan

IO@dans Backhand fonctionne de la même manière, et &.@dans Befunge. Probablement beaucoup de langues avec entrée entière, et seule la gestion des entiers sera la même
Jo King

@JoKing Nous attendons donc que quelqu'un découvre une langue avec des E / S entières et lise également tous les nombres de stdin vers stack / list, puis les imprime sur stdout par défaut. Je pense qu'il pourrait y en avoir un, et ce serait une réponse en zéro octet.
tsh

@tsh très probablement!
Jonathan Allan

6

brainfuck , 26 octets

,[.+++++[->+++++<]>+[,>]<]

Essayez-le en ligne!

Sorties avec une fin .si le nombre était décimal

Il n'y a pas beaucoup de golf spéculaire, sauf qu'au lieu de soustraire 46 pour vérifier si un personnage est un ., j'ajoute 5 et je multiplie par 5 pour obtenir 255, puis j'en ajoute un de plus pour passer à zéro. Soustraire 3, multiplier par 6 et soustraire 2 équivaut au même nombre


6

C (tcc), 39 21 10 octets

J'étais en fait assez surpris que personne n'ait pensé à utiliser C.

f(float i){}

Ce n'est pas une fonction identitaire comme cela semble l'être. Le type int implicite de la fonction f ponctue le point flottant.

TIO

Moins susceptible de tromper les gens mais a une longueur d'octet plus courte:

f(int i){}

TIO


Ne travaillez pas floatcar cela utilise un registre différent pour l'entrée des valeurs à virgule flottante.
Hauleth



3

Java (OpenJDK 8) , 15 octets 9 octets

s->(int)s

Essayez-le en ligne!

merci à @ kevin-cruijssen


9 octets en utilisant une interface lambda afin que nous puissions utiliser des primitives et une simple conversion en (int). Et voici une alternative amusante de 15 octets utilisant une référence de méthode. :)
Kevin Cruijssen

1
@KevinCruijssen merci d'avoir indiqué la réponse de 9 octets! Et les solutions alternatives de 15 octets sont géniales! Aussi grand fan de vos réponses! Je me suis aussi inspiré de rejoindre la communauté pour vos contributions: D
Margon

Heureux d'avoir pu aider et amusant d'entendre que je suis une inspiration. : D Bienvenue! Oh, et si vous ne les avez pas encore vus, des astuces pour jouer au golf en Java et des astuces pour jouer au golf dans <toutes les langues> pourraient être intéressantes à lire. Profitez de votre séjour! :)
Kevin Cruijssen

Je vous remercie! :) J'ai déjà lu tous les conseils et je me suis beaucoup caché avant de poster! J'espère pouvoir répondre davantage à l'avenir!
Margon

3

Excel, 10 octets

=TRUNC(A1)

TRUNC tronque un nombre en un entier en supprimant la partie fractionnaire du nombre.




2

Ruby , 11 octets

proc &:to_i

J'ai choisi celui-ci car il se distingue des lambdas que nous, les golfeurs Ruby, utilisons généralement (heureusement, il avait le même nombre de bytec que la solution "traditionnelle"):

->n{n.to_i}

Essayez-le en ligne!


2

ReRegex , 12 octets

\..+//#input

Essayez-le en ligne!

ReRegex est un langage de programmation qui correspond et remplace encore et encore jusqu'à ce qu'il n'y ait aucune correspondance.

MATCH
    \.                                      The literal period/full stop char
    .+                                      Followed by one or more characters
REPLACE
    (nothing)                               Equivalent to removing the input
STRING TO REPEATEDLY MATCH/REPLACE UNTIL THERE ARE NO MATCHES
    #input                                  The input



2

Intel 8087 FPU machine code, 14 bytes

D9 2E 010C      FLDCW CW_RNDZ   ; modified CW register for round towards zero
D9 06 010E      FLD  A          ; load single precision value A into ST(0)
DF 16 0112      FIST B          ; store integer value of ST(0) into B

CW_RNDZ   DW    0F7FH           ; control word to round down

Input is single precision value in a memory location A (a DD), output is integer value at memory location B (a DW).

The 8087 must first be put into round towards zero mode by setting the control word (0F7FH). Then load the floating point value and store back to an integer.





2

Keg, 19 17 13 bytes

This outputs some trailing unprintable characters. Also, this exits with an error. (Now we need reversed input!)

?'(:\.>')"([,

Exiting with an error is allowed by default
EdgyNerd

2

Whitespace (with vii5ard compiler), 18 17 bytes

[S S N
_Push_0][S N
S _Duplicate_0][T   N
T   T   _Read_STDIN_as_integer][T   T   T   _Retrieve_input][T  N
S T _Print_as_integer]

Letters S (space), T (tab), and N (new-line) added as highlighting only.
[..._some_action] added as explanation only.

Try it online. You'll have to copy-paste the code yourself (note that SE converts the tabs to a bunch of spaces!) in order to run the code at the online Whitespace-compiler vii5ard. When clicking run, it will ask for an input (i.e. -285.5), and after clicking enter it will continue and output -283.

Explanation in pseudo-code:

Integer i = STDIN as integer
Print i as integer

Whitespace can only use I/O as integers or single characters, so in this case it would read the input as integer and ignore any other trailing characters. I.e. -283.5 or -283abc5 would both be input (and thus output) as -283.

Unfortunately this above doesn't work on TIO for two reasons (all Whitespace compilers are slightly different..):

  1. It will give a no parse error when we try to read an input as integer, which isn't an a valid integer. So, instead we'll read one character at a time, and stop (with an error) as soon as we've encountered the . or there is no more input (i.e. 50/-50).
  2. In the vii5ard compiler it's also possible to push 0 with just SSN, whereas on TIO it requires an additional S or T: SSSN/SSTN. The first S is Enable Stack Manipulation; the second S is Push what follows as integer; the third S/T is positive/negative respectively; and any S/T after that (followed by an N) is the number we want to push in binary, where S=0 and T=1. For integer 0 this binary part doesn't matter, since it's 0 by default. But on TIO we'd still have to specify the positive/negative, and with most other Whitespace compilers like vii5ard not.

Whitespace (with TIO compiler), 48 bytes

[N
S S N
_Create_Label_LOOP][S S S N
_Push_0][S N
S _Duplicate_0][T   N
T   S _Read_STDIN_as_character][T   T   T   _Retrieve_input][S N
S _Duplicate_input][S S S T S T T   T   S N
_Push_46_.][T   S S T   _Subtract][N
T   S S N
_If_0_Jump_to_Label_EXIT][T N
S S _Print_as_character][N
S N
N
_Jump_to_Label_LOOP]

Letters S (space), T (tab), and N (new-line) added as highlighting only.
[..._some_action] added as explanation only.

Try it online (with raw spaces, tabs and new-lines only).

Explanation in pseudo-code:

Start LOOP:
  Character c = STDIN as character
  If(c == '.'):
    Exit program
  Print c as character
  Go to the next iteration of LOOP




1

05AB1E, 1 byte

ï

In the legacy version (which is written in Python), the cast to integer builtin works as expected to truncate the decimal values.

Try it online.

In the new version of 05AB1E (written in Elixir) it only works on strings (even though integers/decimals/strings should all be interchangeable, unless sorting lexicographical vs numeric for example). Guess I can report a bug to @Adnan..

Try it online to compare integer/decimal input (giving incorrect result) vs string inputs (giving correct results).


1
ï works just fine on non-legacy 05AB1E. It's array input that works in a weird way.
Grimmy

@Grimy Ah, it's string vs integer/decimal. Strings work correct, but integers/decimals not.
Kevin Cruijssen

1

Aheui (esotope), 9 bytes

방망희

Try it online!

Basic idea from that of triangular answer (or any other languages takes numeric input as integer).

Fun fact. 방망희(pronounced bang-mang-heui(a of ark)) sounds almost same as 방망이(pronounced bang-mang-i(a of ark, i sounds like E), which means bat.

How does it works?

takes number as integer.

prints value as number.

terminates program.


1

PowerShell, 19 bytes

$args-replace'\..*'

Try it online!

PowerShell by default does bankers' rounding, which is pretty much the opposite of how many other languages do rounding. So, traditionally we'd use [Math]::Truncate() to strip the decimal point and any decimal part and achieve the "to zero" rounding we're interested in here. However, that's a bit long, so using this tip, we can round-toward-zero by implicitly casting the input to a string, performing a regex -replace to get rid of the period and anything after it, and leaving the output on the pipeline for implicit printing.


I don't think this would give the desired result for negative numbers.
Octopus

@Octopus Sure it does? It just trims off the decimal portion, which moves the number toward zero whether from positive or negative floats.
AdmBorkBork

Right, duh. Lol.
Octopus

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.