ปัดเศษจากศูนย์


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

ลิงก์ Sandbox


หากเรารับตัวเลขในบริบทของสตริงเช่น STDIN เราจำเป็นต้องสนับสนุน.0ตามที่กรณีทดสอบดูเหมือนจะแนะนำหรือไม่
Jo King

@ โจกิ้งใช่ - ฉันจะอัปเดตคำถามเพื่อให้ความกระจ่าง นี่เป็นกรณีดั้งเดิมจริง ๆ แต่จากนั้นผู้คนในแซนด์บ็อกซ์แนะนำให้เพิ่มกรณีทดสอบที่ไม่ใช่ทศนิยมดังนั้นเอ่อที่นี่เรามีทั้งคู่ขออภัย
Value Ink

รู้สึกดีที่ได้รับแรงบันดาลใจ :)
connectyourcharger

มันตลกที่ภาษาทั้งหมดที่ทำได้ดีในการท้าทายครั้งก่อนโดยการป้อนจำนวนเต็มและเอาท์พุทจำนวนเต็มจะไม่ทำงานได้ดีเนื่องจากพวกเขาไม่สามารถบอกความแตกต่างระหว่าง-0.1และ0.1
โจคิง

คำตอบ:


15

Excel, 13 ไบต์

=ROUNDUP(A1,)

ทางเลือก

=EVEN(A1*2)/2

4
EVENสิ่งที่ฟังก์ชั่นที่แปลก ..
TSH

13
@tsh ฉันคิดว่าคุณหมายถึง "ฟังก์ชั่นคี่"
ลบเจ็ด

2
@negativeseven ตรวจสอบชื่อผู้ใช้ :-P
Veky


8

เยลลี่ขนาด 4 ไบต์

ĊṠ¡Ḟ

ลิงก์ monadic ยอมรับตัวเลขที่ให้จำนวนเต็ม

ลองออนไลน์! หรือดูการทดสอบในตัว

อย่างไร?

ĊṠ¡Ḟ - 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 แต่¡มีการใช้งานซ้ำ ๆ โดยfor index in range(repetitions)วนซ้ำในโค้ด range([stop=]-1)ว่างเปล่าตั้งแต่startค่าเริ่มต้นถึง0และstepค่าเริ่มต้น1และ "สำหรับขั้นตอนบวกเนื้อหาของช่วงrจะถูกกำหนดโดยสูตรr[i] = start + step*iที่i >= 0และr[i] < stop" docs
Jonathan Allan

¡พฤติกรรม 's อาศัยของงูใหญ่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 ดีพบขอบคุณ
Jitse

ทำได้ดี. ฉันมีเวลา 62 ไบต์ಥ_ಥ:g=lambda r:0if r==0 else(int(r)+r/abs(r)if r/int(r)!=1 else r)
user14492

'|' คืออะไร ก่อนหน้า '-'
วิลเลียม

1
@jaaq ฉันชอบโซลูชันนี้ด้วย! วิธีการเริ่มต้นของฉันคือ 24 ไบต์
Jitse

5

เยลลี่ , 5 4 ไบต์

AĊ×Ṡ

ลองออนไลน์!

พอร์ตนี้จะตอบคำตอบของ Stax ซ้ำใน Jelly ดังนั้นให้ตรวจสอบคำตอบนั้นเพื่อหาคำอธิบาย

-1 ไบต์ต้องขอบคุณNick Kennedy

เยลลี่ , 6 5 ไบต์

ĊḞ>?0

ลองออนไลน์!

-1 ไบต์ขอบคุณJonathan Allan

วิธีนี้ใช้งานได้

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

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

ĊḞ>?0จะทำงานเป็น 6 ของคุณ
Jonathan Allan

1
AĊ×Ṡเท่ากับ 4 และใช้งานได้เหมือนกับคำตอบแรกของคุณ
Nick Kennedy

@NickKennedy และ Jonathan ขอบคุณสำหรับคำแนะนำพวกเขาได้รับการแก้ไขใน
caird coinheringaahing

5

Java (JDK) , 18 ไบต์

d->d.setScale(0,0)

ลองออนไลน์!

คำอธิบาย

ใช้BigDecimalเป็นอินพุตและเอาต์พุต BigDecimalมีวิธีการsetScaleที่กำหนดขนาดของตัวเลข พารามิเตอร์แรกคือจำนวนหลักหลังตัวแยกจุดจุดที่สองคือโหมดการปัดเศษ ROUND_UPคือการปัดเศษ "ห่างจากศูนย์" และมีค่า0ดังนั้นฉันจึงฮาร์ดโค้ดค่านั้น


5

Vim, 36 bytes/keystrokes

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

Try it online! or Verify all Test Cases!

Explanation:

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

Using $F-a <esc> instead of the first line and a macro with / as a conditional in place of :g and :norm gives 29 bytes tio.run/##HczBCoJAFEZhWva/QpuLCNbizoxalBXRInqJMpjGCYVwmkx7/…
Kritixi Lithos


4

C# (Visual C# Compiler), 41 bytes27 bytes24 bytes

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

Try it online!

First post here, had fun with it, hope u like it. Kinda felt C# place is empty here

-14 tnx to @expired data
-3 tnx to @night2


1
Welcome to the site, and nice first answer! Hope you enjoy Code Golf!
caird coinheringaahing

27 bytes... Probably still a few to save
Expired Data

@Expired, yea nice, this kind of coding was so weird at first glance that looks like I forgot about whole library thing, mind to post it as an answer
hessam hedieh

1
@Night2, tnx for the comment, I didnt type the whole answer, I used the Code golf submission functionality, Just added a bit of my own words to the end, but for edit I just changed that code line, and u r right there, i forgot to update the link, which brings us back to the first step, to only modify once, kinda SOLID here, anyway, tnx for the hint too
hessam hedieh

1
You've edited your TIO link to the 24 byte version, but the code line itself is still the 27 byte version.
Value Ink

4

Runic Enchantments, 18 16 bytes

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

Try it online!

"Adds" (away from zero) 0.999999 and floors the result. µ is the closest thing to an infinitesimal in language's operators. With a properly functioning Trunc(x) command, answer now supports 0 as input.


1
@JoKing Oof. Good catch. It's doing a divide by input to get the "sign" of the input value, which of course, divides by 0 when the input is 0. There's no (good) way around that right now. Will need this commit first. I'll poke Dennis (side benefit, the answer will get shorter).
Draco18s

1
@JoKing Answer now handles 0 correctly.
Draco18s



2

Retina 0.8.2, 38 bytes

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

Try it online! Link includes test cases. Explanation:

\.0+
.

Delete zeroes after the decimal point, to ensure that the number is not an integer; the next two matches fail if there are no digits after the decimal point.

\b9+\..
0$&

If the integer part is all 9s, prefix a 0 to allow the increment to overflow.

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

Increment the integer part of the number.

\..*

Delete the fractional part of the number.



2

JavaScript (ES6), 20 bytes

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

Try it online!

Commented

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

I was writing an answer for my 16-byte answer (n=>(~~n-n%1)%1+n) until I found out that my code didn't work for numbers between -1 and 1. You might be able to figure out how to make this work with the last 3 bytes there's left!
Gust van de Wal


2

MathGolf, 5 bytes

‼σ±ü*

Try it online!

Explanation

It's nice to find usage for the operator.

‼       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 bytes

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

Try it online!

If number is not integer, based on the sign -1 (for negative decimals) or 1 (for positive decimals) is added to it and then integer part of the new number is printed.


PHP, 32 bytes

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

Try it online!

Basically outputs floor of input if it is less than 0, else ceil of it.


PHP, 34 bytes

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

Try it online!





1

APL (Dyalog Unicode), 15 bytes

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

Try it online!

Simple Dfn. Uses ⎕IO←0.

How:

{⍎'⌈⌊'[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 bytes + 2 bytes for -r flag

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

Ungolfed

#!/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 bytes

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

Inspired by the C# answer.

Thanks to @Value Ink and @Gust van de Wal for -7 bytes!

Thanks again, @Gust van de Wal for another -2 bytes!


Why use += when + will do the trick in this case? -1 byte
Value Ink

Instead of parseInt(), I'd just use ~~ at the start or another bitwise operator like |0 or ^0 at the end to save another chunk of bytes
Gust van de Wal

@ValueInk wow, I have no idea why I wrote +=, thx for pointing it out
Sagittarius

You can still drop the the outer parentheses
Gust van de Wal

@GustvandeWal oh, I didn't know that! thanks
Sagittarius





โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.