四舍五入


24

四舍五入

回合趋于零的启发。

给定通过任何合理方法输入的数字,请将数字“远离零”四舍五入-正数向上取整,负数向下取整。

如果打算将输入作为字符串(例如通过STDIN),则应该能够处理带或不带小数点的数字。如果将其视为数字,则它至少应能够处理浮点精度(不需要双精度)或有理数。

如果需要,您可以输出带小数点的浮点数(例如42.0)。(或者甚至有一些测试用例输出浮点数,有一些输出整数,如果这会使您的答案更短)。

不允许有标准漏洞,等等。

测试用例

-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

沙盒链接


如果我们在字符串上下文(例如STDIN)中获取数字,那么我们是否需要支持.0测试用例所建议的?
Jo King

@JoKing是的-我将更新问题进行澄清。这实际上是原始情况,但随后沙盒中的人建议添加非十进制测试用例,所以,这是我们的全部,对不起
Value Ink

感到很鼓舞:)
connectyourcharger

有趣的是,在上一个挑战中通过采用整数输入和整数输出而表现出色的所有语言都不能很好地工作,因为它们无法区分-0.10.1
Jo King

Answers:


15

Excel,13个字节

=ROUNDUP(A1,)

另类

=EVEN(A1*2)/2

4
EVEN,有什么奇怪的功能..
TSH

13
@tsh我认为您的意思是“奇功能”。
7:7负

2
@negativeseven用户名检出。:-P
Veky


8

果冻,4 字节

ĊṠ¡Ḟ

单子链接接受一个产生整数的数字。

在线尝试!或见一个测试套件

怎么样?

ĊṠ¡Ḟ - Link: number, N
  ¡  - repeat...
 Ṡ   - ...number of times: sign of N (repeating -1 is the same as 0 times)
Ċ    - ...action: ceiling
   Ḟ - floor (that)

那么¡负数到底如何工作?我认为没有记录在案
Caird coinheringaahing

1
它没有记录在Jelly的Wiki上,但是其¡重复性是for index in range(repetitions)通过代码中的循环实现的。range([stop=]-1)为空,因为start默认为0step默认为1和“对于正向步骤,范围的内容r由公式r[i] = start + step*iwhere i >= 0和决定r[i] < stop。” docs
乔纳森·艾伦

¡的行为依赖于Python的行为range,并range(-1).__iter__().__next__()立即抛出StopIteration
不相关的字符串

6

Python 3,23个字节

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

在线尝试!

-1字节感谢xnor


1
您可以(1|-(i>0))保存一个字节(1,-1)[i>0]
xnor

@xnor很好,谢谢!
吉特

做得好。我有62个字节ಥ_ಥ:g=lambda r:0if r==0 else(int(r)+r/abs(r)if r/int(r)!=1 else r)
user14492

什么是“ |” 之前 '-'?
威廉

1
@jaaq我也很喜欢这种解决方案!我最初的方法也是24字节。
吉特

5

果冻5 4字节

AĊ×Ṡ

在线尝试!

这会将递归的Stax答案移植到Jelly中,因此请检查该答案以获取解释。

-1个字节感谢Nick Kennedy

果冻6 5字节

ĊḞ>?0

在线尝试!

-1字节感谢乔纳森·艾伦

这个如何运作

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

   ?  - If:
  > 0 -   x > 0
      - Then:
Ċ     -   ceil(x)
      - Else:
 Ḟ    -   floor(x)

ĊḞ>?0会像您的6一样工作。
乔纳森·艾伦

1
AĊ×Ṡ是4,并且在功能上与您的第一个答案相同。
尼克·肯尼迪

@NickKennedy和Jonathan,感谢您的建议,它们已经在
Caird coinheringaahing


5

Vim,36个字节/击键

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

在线尝试!验证所有测试用例!

说明:

: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)

使用$F-a <esc>,而不是在第一行和与宏/如的有条件:g:norm给出29个字节tio.run/##HczBCoJAFEZhWva/QpuLCNbizoxalBXRInqJMpjGCYVwmkx7/...
Kritixi LITHOS


4

C#(Visual C#编译器)41字节27字节 24字节

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

在线尝试!

在这里的第一篇文章,玩得开心,希望你喜欢它。有点感觉C#的地方在这里是空的

-14 tnx到@expired数据
-3 tnx到@ night2


1
欢迎来到该网站,并且是一个不错的第一答案!希望您喜欢Code Golf!
caird coinheringaahing

27个字节...可能还有一些要保存
过期的数据

@过期,是的,这种编码乍一看是如此奇怪,好像我忘了整个图书馆的东西,介意将其发布为答案
hessam hedieh

1
@ Night2,评论的tnx,我没有输入整个答案,我使用了Code golf submission功能,只是在结尾添加了一些我自己的词,但是为了编辑,我只是​​更改了该代码行,而在那儿,我忘了更新链接,这使我们回到第一步,只需修改一次,在这里有点SOLID,无论如何,也为提示提供了
tnx

1
您已将TIO链接编辑为24字节版本,但代码行本身仍为27字节版本。
价值墨水

4

符文附魔18 16字节

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

在线尝试!

“加”(远离零)0.999999,并将结果下限。µ是语言运算符中最接近于无穷小的事物。通过功能正常的Trunc(x)命令,现在支持答案0作为输入。


1
@JoKing Oof。接得好。这样做是divide by input为了获得输入值的“符号”,当然,当输入为0时,它会除以0。目前没有(好的)方法。首先需要此提交。我戳丹尼斯(附带好处,答案会更短)。
Draco18s

1
@JoKing Answer现在可以0正确处理。
Draco18s



2

视网膜0.8.2,38字节

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

在线尝试!链接包括测试用例。说明:

\.0+
.

删除小数点后的零,以确保该数字不是整数;如果小数点后没有数字,则接下来的两个匹配项将失败。

\b9+\..
0$&

如果整数部分全部为9s,则在前缀a之前0允许增量溢出。

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

递增数字的整数部分。

\..*

删除数字的小数部分。



2

JavaScript(ES6),20个字节

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

在线尝试!

已评论

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

我一直在写一个16字节答案(n=>(~~n-n%1)%1+n)的答案,直到我发现我的代码不适用于-1和1之间的数字。您可能能够弄清楚如何使最后3个字节有效剩下!
Gust van de Wal


2

MathGolf,5个字节

‼σ±ü*

在线尝试!

说明

很高兴为操作员找到用法。

‼       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

2

PHP,30字节

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

在线尝试!

如果数字不是整数,则将基于符号-1(用于负十进制)或1(用于正十进制)添加到其上,然后打印新数字的整数部分。


PHP,32字节

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

在线尝试!

floor如果输入小于0,则基本上是输出,否则ceil为0 。


PHP,34字节

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

在线尝试!





1

APL(Dyalog Unicode),15字节

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

在线尝试!

简单的Dfn。用途⎕IO←0

怎么样:

{⍎'⌈⌊'[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.

1

sed,131个字节+ 2个字节的-r标志

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

不打高尔夫球

#!/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/\..*$//


1

JavaScript(node.js),30 23 21字节

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

受到C#答案的启发。

感谢@Value Ink和@Gust van de Wal提供了-7个字节!

再次感谢@Gust van de Wal,再感谢-2个字节!


在这种情况下,为什么要用+=when +来解决问题?-1字节
值墨水

取而代之的是parseInt(),我只会~~在开头或像|0^0在结尾使用另一个按位运算符来保存另一字节块
Gust van de Wal

@ValueInk哇,我不知道为什么写+=,谢谢指出
射手座

您仍然可以删除外部括号
Gust van de Wal

@GustvandeWal哦,我不知道!谢谢
射手座





By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.