Redondear lejos de cero

24

Redondear lejos de cero

Inspirado por Round hacia cero .

Dado un ingreso numérico a través de cualquier método razonable, redondea el número "lejos de cero": los números positivos se redondean hacia arriba y los negativos se redondean hacia abajo.

Si tiene la intención de tomar la entrada como una cadena (a través de STDIN, por ejemplo), debería poder manejar números con o sin el punto decimal. Si lo toma como un número, al menos debería ser capaz de manejar la precisión de punto flotante (no se requiere precisión doble) o números racionales.

Puede generar un número de coma flotante con el punto decimal (por ejemplo, 42.0) si lo desea. (O incluso hacer que algunos casos de prueba generen coma flotante y algún número entero de salida, si acorta su respuesta).

Las lagunas estándar no están permitidas, etc., etc.

Casos de prueba

-99.9 => -100
-33.5 => -34
-7    => -7
-1.1  => -2
0     => 0
2.3   => 3
8     => 8
99.9  => 100
42.0  => 42
-39.0 => -39

Enlace de caja de arena

Tinta de valor
fuente
Si tomamos números en un contexto de cadena, como STDIN, ¿debemos admitir los .0que parecen sugerir los casos de prueba?
Jo King
@JoKing sí, actualizaré la pregunta para aclararla. Este fue en realidad el caso original, pero luego la gente en la caja de arena sugirió agregar casos de prueba no decimales, así que aquí estamos con ambos, lo siento
Value Ink
Se siente bien ser inspirador :)
connectyourcharger
Es curioso que todos los idiomas que lo hicieron tan bien en el desafío anterior al tomar la entrada entera y la salida entera no funcionen tan bien, ya que no pueden distinguir la diferencia entre -0.1y0.1
Jo King

Respuestas:

15

Excel, 13 bytes

=ROUNDUP(A1,)

Alternativa

=EVEN(A1*2)/2
nwellnhof
fuente
44
EVEN, qué extraña función ..
tsh
13
@tsh Creo que te refieres a "función extraña".
negativo siete
2
@negativeseven Nombre de usuario desprotegido. :-P
Veky
9

R, 32 bytes

x=scan()
sign(x)*ceiling(abs(x))
Castigado
fuente
3
31 bytes - muy buena respuesta!
Giuseppe
25 bytes
Robin Ryder
8

Jalea , 4 bytes

ĊṠ¡Ḟ

Un enlace monádico que acepta un número que produce un número entero.

Pruébalo en línea!O ver un conjunto de pruebas .

¿Cómo?

ĊṠ¡Ḟ - Link: number, N
  ¡  - repeat...
 Ṡ   - ...number of times: sign of N (repeating -1 is the same as 0 times)
Ċ    - ...action: ceiling
   Ḟ - floor (that)
Jonathan Allan
fuente
Entonces, ¿cómo funciona exactamente ¡para los números negativos? No creo que esté documentado
caird coinheringaahing
1
No está documentado en el wiki de Jelly, pero ¡la naturaleza repetitiva se implementa con un for index in range(repetitions)bucle en el código. range([stop=]-1)está vacío, ya que por startdefecto 0y por stepdefecto 1y "Para un paso positivo, el contenido de un rango restá determinado por la fórmula r[i] = start + step*idonde i >= 0y r[i] < stop". docs
Jonathan Allan
¡El comportamiento de él se basa en el de Python rangee range(-1).__iter__().__next__()inmediatamente arroja StopIteration.
Cadena no relacionada
6

Python 3 , 23 bytes

lambda i:i-i%(1|-(i>0))

Pruébalo en línea!

-1 byte gracias a xnor

Jitse
fuente
1
Puede hacer (1|-(i>0))para guardar un byte apagado (1,-1)[i>0].
xnor
@xnor Buen hallazgo, gracias!
Jitse
Bien hecho. Lo tenía a 62 bytes ಥ_ಥ:g=lambda r:0if r==0 else(int(r)+r/abs(r)if r/int(r)!=1 else r)
user14492
¿Qué es el '|' antes de '-'?
William
1
@jaaq ¡A mí también me gusta esa solución! Mi enfoque inicial también fue de 24 bytes.
Jitse
5

Jalea , 5 4 bytes

AĊ×Ṡ

Pruébalo en línea!

Esta respuesta Stax recursiva de puertos en Jelly, así que verifique esa respuesta para obtener una explicación.

-1 byte gracias a Nick Kennedy

Jalea , 6 5 bytes

ĊḞ>?0

Pruébalo en línea!

-1 byte gracias a Jonathan Allan

Como funciona este

ĊḞ>?0 - Monadic link. Takes a float, x, as argument

   ?  - If:
  > 0 -   x > 0
      - Then:
Ċ     -   ceil(x)
      - Else:
 Ḟ    -   floor(x)
caird coinheringaahing
fuente
ĊḞ>?0funcionaría como lo hace tu 6.
Jonathan Allan
1
AĊ×Ṡes 4 y funcionalmente idéntico a su primera respuesta.
Nick Kennedy
@NickKennedy y Jonathan, gracias por las sugerencias, que han sido editados en
caird coinheringaahing
5

Java (JDK) , 18 bytes

d->d.setScale(0,0)

Pruébalo en línea!

Explicaciones

Utiliza a BigDecimalcomo entrada y salida. BigDecimaltiene un método setScaleque establece la escala del número. El primer parámetro es el número de dígitos después del separador de puntos, el segundo es el modo de redondeo. ROUND_UPes el redondeo "lejos de cero" y tiene un valor de 0modo que codifico ese valor.

Olivier Grégoire
fuente
5

Vim, 36 bytes / pulsaciones de teclas

:s/-/-<Space>
:g/\..*[1-9]/norm <C-v><C-a>lD
:s/<Space><cr>

Pruébalo en línea! o verificar todos los casos de prueba!

Explicación:

:s/             " Replace...
   -            "   A dash
    /-<Space>   "   With a dash and a space

:g/                             " On Every line matching this regex...
   \.                           "   A dot
     .*                         "   Followed By anything
       [1-9]                    "   Followed by a digit other than 0
            /norm               " Run the following keystrokes...
                  <C-v><C-a>    "   Increment the number by 1
                                "   This also conveniently places our cursor just before the dot
                            l   "   Move one character right
                             D  "   Delete everything after the cursor

:s/             " Replace...
   <Space>      "   A space
                "   (With nothing)
DJMcMayhem
fuente
Usando en $F-a <esc>lugar de la primera línea y una macro con /como condicional en lugar de :gy :normda 29 bytes tio.run/##HczBCoJAFEZhWva/QpuLCNbizoxalBXRInqJMpjGCYVwmkx7/…
Kritixi Lithos
4

C # (compilador de Visual C #) , 41 bytes 27 bytes 24 bytes

s=>(int)s+Math.Sign(s%1)

Pruébalo en línea!

Primera publicación aquí, me divertí mucho, espero que les guste. Un poco sintió que el lugar de C # está vacío aquí

-14 tnx a @ datos vencidos
-3 tnx a @ night2

hessam hedieh
fuente
1
Bienvenido al sitio, y buena primera respuesta! Espero que disfrutes de Code Golf!
caird coinheringaahing
27 bytes ... Probablemente aún quedan algunos para guardar
Datos
@Expirado, sí, bueno, este tipo de codificación fue tan extraño a primera vista que parece que me olvidé de todo lo relacionado con la biblioteca, no olvide publicarlo como respuesta
hessam hedieh
1
@ Night2, tnx para el comentario, no escribí toda la respuesta, utilicé la Code golf submissionfuncionalidad, solo agregué un poco de mis propias palabras al final, pero para editar simplemente cambié esa línea de código, y ahí mismo, olvidé actualice el enlace, que nos lleva de vuelta al primer paso, para modificar solo una vez, un poco SOLIDO aquí, de todos modos, tnx para la pista también
hessam hedieh
1
Has editado tu enlace TIO a la versión de 24 bytes, pero la línea de código sigue siendo la versión de 27 bytes.
Value Ink el
4

Encantamientos rúnicos , 18 16 bytes

1µ-i:'-A{*+'.A@

Pruébalo en línea!

"Agrega" (lejos de cero) 0.999999 y muestra el resultado. µes lo más parecido a un infinitesimal en los operadores del lenguaje. Con un Trunc(x)comando que funcione correctamente , la respuesta ahora es compatible 0como entrada.

Draco18s
fuente
1
@JoKing Oof. Buena atrapada. Está haciendo un divide by inputpara obtener el "signo" del valor de entrada, que por supuesto, se divide por 0 cuando la entrada es 0. No hay forma (buena) de evitarlo en este momento. Necesitará este compromiso primero. Golpearé a Dennis (beneficio secundario, la respuesta se acortará).
Draco18s
1
@JoKing Answer ahora se maneja 0correctamente.
Draco18s el
3

Stax , 6 bytes

å├╪∙Bß

Ejecutar y depurarlo

Procedimiento:

  1. Valor absoluto
  2. Techo
  3. Multiplicar por signo original
recursivo
fuente
La herramienta que estoy usando dice que esto es 14 bytes
Gust van de Wal
Probablemente su herramienta no sea consciente de la codificación de caracteres stax . Si aún no está convencido, en la sección "Herramientas", hay un enlace de descarga, donde puede descargar el archivo fuente e inspeccionar su tamaño.
recursivo el
3

C, 94 43 39 bytes

gracias a ceilingcat por 39 bytes

#define f(n)(int)(n>0?ceil(n):floor(n))

TIO

girobuz
fuente
48
solo ASCII
2

Retina 0.8.2 , 38 bytes

\.0+
.
\b9+\..
0$&
T`9d`d`.9*\..
\..*

Pruébalo en línea! El enlace incluye casos de prueba. Explicación:

\.0+
.

Elimine los ceros después del punto decimal, para asegurarse de que el número no sea un entero; las siguientes dos coincidencias fallan si no hay dígitos después del punto decimal.

\b9+\..
0$&

Si la parte entera es todo 9s, prefija a 0para permitir que el incremento se desborde.

T`9d`d`.9*\..

Incremente la parte entera del número.

\..*

Eliminar la parte fraccionaria del número.

Neil
fuente
2

JavaScript (ES6), 20 bytes

n=>n%1?n<0?~-n:-~n:n

Pruébalo en línea!

Comentado

n =>        // n = input
  n % 1 ?   // if n is not an integer:
    n < 0 ? //   if n is negative:
      ~-n   //     return -(floor(-n) + 1) = -floor(-n) - 1
    :       //   else:
      -~n   //     return -(-(floor(n) + 1)) = floor(n) + 1
  :         // else:
    n       //   return n unchanged
Arnauld
fuente
Estaba escribiendo una respuesta para mi respuesta de 16 bytes ( n=>(~~n-n%1)%1+n) hasta que descubrí que mi código no funcionaba para números entre -1 y 1. Es posible que pueda descubrir cómo hacer que esto funcione con los últimos 3 bytes que hay ¡izquierda!
Gust van de Wal
2

Perl 6 , 18 bytes

{$_-.abs%-1*.sign}

Pruébalo en línea!

Explicación

{                }  # Anonymous block
    .abs  # Absolute value
        %-1  # Modulo -1
           *.sign  # Multiply by sign
 $_-  # Subtract from original
nwellnhof
fuente
2

MathGolf , 5 bytes

‼σ±ü*

Pruébalo en línea!

Explicación

Es bueno encontrar uso para el operador.

‼       apply next two operators to (implicit) input
 σ      sign (-1, 0, or 1)
  ±     absolute value
   ü    ceiling of that absolute value
    *   multiply the rounded absolute value with the sign
maxb
fuente
2

PHP , 30 bytes

<?=0^$argn-=0<=>fmod($argn,1);

Pruébalo en línea!

Si el número no es entero, se le agrega el signo -1 (para decimales negativos) o 1 (para decimales positivos) y luego se imprime una parte entera del nuevo número.


PHP , 32 bytes

<?=[ceil,floor][$argn<0]($argn);

Pruébalo en línea!

Básicamente salidas floorde entrada si es menor que 0, de lo contrario ceil.


PHP , 34 bytes

<?=($argn>0?:-1)*ceil(abs($argn));

Pruébalo en línea!

Noche2
fuente
1

Brachylog , 7 bytes

⌋₁ℤ₁|⌉₁

Pruébalo en línea!

o ⌉₁ℕ₁|⌋₁.

⌋₁         The input rounded down
  ℤ₁       is an integer less than -1
    |      and the output, or, the input
     ⌉₁    rounded up is the output.
Cadena no relacionada
fuente
1

APL (Dyalog Unicode) , 15 bytes

{⍎'⌈⌊'[0>⍵],⍕⍵}

Pruébalo en línea!

Dfn simple. Usos ⎕IO←0.

Cómo:

{⍎'⌈⌊'[0>⍵],⍕⍵}  Main function, argument ⍵.
            ⍕⍵   Stringified argument
           ,     Appended to
      [0>⍵]      This item... (0 if  is positive or 0, else 1)
  '⌈⌊'           of this string (which are the functions Ceiling and Floor, respectively)
                Executed as APL code.
J. Sallé
fuente
1

sed, 131 bytes + 2 bytes para -rbandera

/^-?[^.]*(\.0*)?$/bQ
s/^(-?)9/\109/
s/([0-8]9*)\..*$/_\1/
h
s/.*_//
y/0123456789/1234567890/
G
s/(.*)\n(.*)_(.*)/\2\1/
:Q
s/\..*$//

Sin golf

#!/bin/sed -rf

# identify integers
/^-?[^.]*(\.0*)?$/ b isInt

# add a leading 0 if we'll need it later
s/^(-?)9/\109/

# convert to format: -?[0-9]_[0-8]9*
s/([0-8]9*)\..*$/_\1/

# move the part that will remain constant into the hold buffer
h
s/.*_//

# [0-8]9* can be incremented via character substitution
y/0123456789/1234567890/

# reassemble parts
G
s/(.*)\n(.*)_(.*)/\2\1/

:isInt
# Get rid of anything after the decimal point
s/\..*$//
Rayo
fuente
1

Perl 5 -pF/\./ , 35 bytes

$_&&=$F[0]+($_!=int&&$_*(@F-1)/abs)

Pruébalo en línea!

Xcali
fuente
fracasa 3.0. Para los interruptores, -pF\.es suficiente: //son opcionales.
Oh Dios mío,
también 0.0es cierto
Oh Dios mío
Se corrigieron ambos.
Xcali
1

JavaScript (node.js), 30 23 21 bytes

s=>~~s+Math.sign(s%1)

Inspirado en la respuesta de C #.

¡Gracias a @Value Ink y @Gust van de Wal por -7 bytes!

Gracias de nuevo, @Gust van de Wal por otros -2 bytes.

Sagitario
fuente
¿Por qué usar +=cuándo +hará el truco en este caso? -1 byte
Value Ink
En lugar de eso parseInt(), solo lo usaría ~~al comienzo u otro operador bit a bit como |0o ^0al final para guardar otro fragmento de bytes
Gust van de Wal
@ValueInk wow, no tengo idea de por qué escribí +=, gracias por señalarlo
Sagitario
Todavía puedes soltar los paréntesis externos
Gust van de Wal
@ GustvandeWal ¡Oh, no lo sabía! Gracias
Sagitario
0

Perl 6 , 19 bytes

{$_+|0+.sign*?/\./}

Pruébalo en línea!

No es la solución más corta, pero estoy trabajando en ello. Básicamente, esto trunca el número, luego agrega uno lejos de cero si el número no estaba completo para empezar

Jo King
fuente
0

Java (OpenJDK 8) , 43 bytes

a->{return(int)((int)a/a<1?a>0?a+1:a-1:a);}

Pruébalo en línea!

X1M4L
fuente
3
La función lambda se puede escribir sin usar una returndeclaración explícita .
Joel
@Joel tiene razón. Y puede guardar 4 bytes adicionales cambiando (int)a/a<1a a%1!=0: 30 bytes
Kevin Cruijssen
También está el BigDecimal.setScalemétodo que da excelentes resultados, como lo demuestra mi respuesta
Olivier Grégoire,
33 bytes
techo
0

Rojo , 46 bytes

func[n][(pick[0 1]n = t: to 0 n)*(sign? n)+ t]

Pruébalo en línea!

La versión ligeramente más legible es 2 bytes más larga (¡esos nombres de funciones largos!):

func[n][to 1(sign? n)* round/ceiling absolute n]
Galen Ivanov
fuente