Làm tròn từ số không


24

Làm tròn từ số không

Lấy cảm hứng từ Round về không .

Đưa ra một đầu vào số thông qua bất kỳ phương pháp hợp lý nào, làm tròn số "cách xa số 0" - số dương làm tròn và số âm làm tròn xuống.

Nếu bạn định lấy đầu vào dưới dạng một chuỗi (ví dụ thông qua STDIN), bạn sẽ có thể xử lý các số có hoặc không có dấu thập phân. Nếu bạn lấy nó làm số, ít nhất nó có thể xử lý độ chính xác của dấu phẩy động (không yêu cầu độ chính xác kép) hoặc số hữu tỷ.

Bạn có thể xuất số dấu phẩy động với dấu thập phân (ví dụ 42.0) nếu muốn. (Hoặc thậm chí có một số trường hợp kiểm tra đầu ra dấu phẩy động và một số nguyên đầu ra, nếu nó làm cho câu trả lời của bạn ngắn hơn.)

Lỗ hổng tiêu chuẩn không được phép, vv

Các trường hợp thử nghiệm

-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

Liên kết hộp cát


nếu chúng ta đang lấy số trong ngữ cảnh chuỗi, chẳng hạn như STDIN, chúng ta có cần hỗ trợ .0như các trường hợp thử nghiệm dường như đề xuất không?
Jo King

@JoKing có-- Tôi sẽ cập nhật câu hỏi để làm rõ. Đây thực sự là trường hợp ban đầu, nhưng sau đó mọi người trong hộp cát đề nghị thêm các trường hợp kiểm tra không thập phân, vì vậy, ở đây chúng tôi có cả hai, xin lỗi
Value Ink

Cảm thấy tốt để được truyền cảm hứng :)
Connectyourcharger

Thật buồn cười là tất cả các ngôn ngữ đã làm rất tốt cho thử thách trước đó bằng cách lấy đầu vào số nguyên và đầu ra số nguyên sẽ không hoạt động tốt, vì chúng không thể nói lên sự khác biệt giữa -0.10.1
Jo King

Câu trả lời:


15

Excel, 13 byte

=ROUNDUP(A1,)

Thay thế

=EVEN(A1*2)/2

4
EVEN, thật là một chức năng kỳ lạ ..
tsh

13
@tsh Tôi nghĩ bạn có nghĩa là "hàm lẻ".
âm bảy

2
@negativeeven Tên người dùng kiểm tra. :-P
Veky


8

Thạch , 4 byte

ĊṠ¡Ḟ

Một liên kết đơn âm chấp nhận một số mang lại một số nguyên.

Hãy thử trực tuyến! Hoặc xem một bộ thử nghiệm .

Làm sao?

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

Vì vậy, làm thế nào chính xác làm ¡việc cho số âm? Tôi không nghĩ rằng nó đã được ghi nhận
caird coinheringaahing

1
Nó không được ghi lại trên wiki của Jelly, nhưng ¡bản chất lặp đi lặp lại được thực hiện với một for index in range(repetitions)vòng lặp trong mã. range([stop=]-1)là trống vì startmặc định 0stepmặc định là 1và "Đối với một bước tích cực, nội dung của một phạm vi rđược xác định bởi công thức r[i] = start + step*iở đâu i >= 0r[i] < stop." tài liệu
Jonathan Allan

¡Hành vi của nó dựa vào hành vi của Python rangerange(-1).__iter__().__next__()ngay lập tức ném ra StopIteration.
Chuỗi không liên quan

6

Python 3 , 23 byte

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

Hãy thử trực tuyến!

-1 byte nhờ xnor


1
Bạn có thể làm (1|-(i>0))để tiết kiệm một byte (1,-1)[i>0].
xnor

@xnor Đẹp tìm, cảm ơn!
Jitse

Làm tốt. Tôi đã có nó ở mức 62 byte _ಥ:g=lambda r:0if r==0 else(int(r)+r/abs(r)if r/int(r)!=1 else r)
user14492

'|' Là gì trước '-'?
William

1
@jaaq Mình cũng thích giải pháp đó! Cách tiếp cận ban đầu của tôi cũng là 24 byte.
Jitse

5

Thạch , 5 4 byte

AĊ×Ṡ

Hãy thử trực tuyến!

Cổng này đệ quy câu trả lời Stax của Jelly vào Jelly, vì vậy hãy kiểm tra câu trả lời đó để được giải thích.

-1 byte nhờ Nick Kennedy

Thạch , 6 5 byte

ĊḞ>?0

Hãy thử trực tuyến!

-1 byte nhờ Jonathan Allan

Cái này hoạt động thế nào

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

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

ĊḞ>?0sẽ làm việc như 6 của bạn.
Jonathan Allan

1
AĊ×Ṡlà 4 và có chức năng giống hệt với câu trả lời đầu tiên của bạn.
Nick Kennedy

@NickKennedy và Jonathan, cảm ơn vì những gợi ý, họ đã được chỉnh sửa trong
caird coinheringaahing

5

Java (JDK) , 18 byte

d->d.setScale(0,0)

Hãy thử trực tuyến!

Giải thích

Sử dụng BigDecimalnhư là đầu vào và đầu ra. BigDecimalcó một phương pháp setScaleđặt tỷ lệ của số. Tham số đầu tiên là số chữ số sau dấu phân cách dấu chấm, thứ hai là chế độ làm tròn. ROUND_UPlà làm tròn "từ xa" và có giá trị 0vì vậy tôi mã hóa giá trị đó.


5

Vim, 36 byte / tổ hợp phím

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

Hãy thử trực tuyến! hoặc Xác minh tất cả các trường hợp thử nghiệm!

Giải trình:

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

Sử dụng $F-a <esc>thay vì dòng đầu tiên và một macro với /một điều kiện thay :g:normcung cấp cho 29 byte tio.run/##HczBCoJAFEZhWva/QpuLCNbizoxalBXRInqJMpjGCYVwmkx7/...
Kritixi Lithos


4

C # (Trình biên dịch C # Visual) , 41 byte 27 byte 24 byte

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

Hãy thử trực tuyến!

Bài viết đầu tiên ở đây, vui vẻ với nó, hy vọng bạn thích nó. Kinda cảm thấy nơi C # trống ở đây

-14 tnx đến @ dữ liệu đã hết hạn
-3 tnx đến @ night2


1
Chào mừng đến với trang web, và câu trả lời đầu tiên tốt đẹp! Hy vọng bạn thích Code Golf!
caird coinheringaahing

27 byte ... Có lẽ vẫn còn một vài thứ để lưu
Dữ liệu đã hết hạn

@Expired, yea rất tốt, loại mã hóa này rất kỳ lạ ngay từ cái nhìn đầu tiên trông giống như tôi đã quên toàn bộ thư viện, hãy đăng nó như một câu trả lời
hessam hedieh

1
@ Night2, tnx cho nhận xét, tôi đã không gõ toàn bộ câu trả lời, tôi đã sử dụng Code golf submissionchức năng, Chỉ cần thêm một chút từ của riêng tôi vào cuối, nhưng để chỉnh sửa tôi chỉ thay đổi dòng mã đó, và bạn đã quên cập nhật liên kết, đưa chúng ta trở lại bước đầu tiên, chỉ sửa đổi một lần, dù sao cũng RẮN ở đây, dù sao, tnx cho gợi ý quá
hessam hedieh

1
Bạn đã chỉnh sửa liên kết TIO của mình thành phiên bản 24 byte, nhưng bản thân dòng mã vẫn là phiên bản 27 byte.
Mực giá trị

4

Runic bùa mê , 18 16 byte

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

Hãy thử trực tuyến!

"Thêm" (cách xa 0) 0.999999 và kết quả. µlà điều gần gũi nhất với các nhà khai thác ngôn ngữ. Với một Trunc(x)lệnh hoạt động đúng , trả lời bây giờ hỗ trợ 0như đầu vào.


1
@JoKing Oof. Nắm bắt tốt. Đó là thực hiện divide by inputđể có được "dấu hiệu" của giá trị đầu vào, tất nhiên, chia cho 0 khi đầu vào bằng 0. Hiện tại không có cách nào (tốt) xung quanh đó. Sẽ cần cam kết này đầu tiên. Tôi sẽ chọc Dennis (lợi ích phụ, câu trả lời sẽ ngắn hơn).
Draco18

1
@JoKing Trả lời bây giờ xử lý 0chính xác.
Draco18

3

Stax , 6 byte

å├╪∙Bß

Chạy và gỡ lỗi nó

Thủ tục:

  1. Giá trị tuyệt đối
  2. Trần nhà
  3. Nhân với dấu hiệu ban đầu

Công cụ tôi đang sử dụng cho biết đây là 14 byte
Gust van de Wal

Công cụ của bạn có thể không nhận thức được mã hóa ký tự cứng . Nếu bạn vẫn chưa bị thuyết phục, trong phần "Công cụ", có một liên kết tải xuống, nơi bạn thực sự có thể tải xuống tệp nguồn và tự kiểm tra kích thước của nó.
đệ quy


2

Võng mạc 0.8.2 , 38 byte

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

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Giải trình:

\.0+
.

Xóa các số 0 sau dấu thập phân, để đảm bảo rằng số đó không phải là số nguyên; hai trận đấu tiếp theo sẽ thất bại nếu không có chữ số nào sau dấu thập phân.

\b9+\..
0$&

Nếu phần nguyên là tất cả 9s, tiền tố a0 để cho phép gia tăng tràn.

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

Tăng phần nguyên của số.

\..*

Xóa phần phân số của số.



2

JavaScript (ES6), 20 byte

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

Hãy thử trực tuyến!

Đã bình luậ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

Tôi đã viết một câu trả lời cho câu trả lời 16 byte của mình ( n=>(~~n-n%1)%1+n) cho đến khi tôi phát hiện ra rằng mã của tôi không hoạt động cho các số từ -1 đến 1. Bạn có thể tìm ra cách làm cho công việc này hoạt động với 3 byte cuối cùng trái!
Gust van de Wal


2

MathGolf , 5 byte

‼σ±ü*

Hãy thử trực tuyến!

Giải trình

Thật tuyệt khi tìm thấy cách sử dụng cho các nhà điều hành.

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

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

Hãy thử trực tuyến!

Nếu số không phải là số nguyên, dựa trên dấu -1 (đối với số thập phân âm) hoặc 1 (đối với số thập phân dương) được thêm vào số đó và sau đó phần nguyên của số mới được in.


PHP , 32 byte

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

Hãy thử trực tuyến!

Về cơ bản đầu ra floorcủa đầu vào nếu nó nhỏ hơn 0, khác ceilvới nó.


PHP , 34 byte

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

Hãy thử trực tuyến!





1

APL (Dyalog Unicode) , 15 byte

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

Hãy thử trực tuyến!

Dfn đơn giản. Công dụng ⎕IO←0.

Làm sao:

{⍎'⌈⌊'[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 byte + 2 byte cho -rcờ

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

Bị đánh cắp

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

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

Lấy cảm hứng từ câu trả lời C #.

Cảm ơn @Value Ink và @Gust van de Wal cho -7 byte!

Cảm ơn một lần nữa, @Gust van de Wal cho -2 byte khác!


Tại sao sử dụng +=khi nào +sẽ làm thủ thuật trong trường hợp này? -1 byte
Giá trị mực

Thay vì parseInt(), tôi chỉ sử dụng ~~lúc bắt đầu hoặc một toán tử bitwise khác như |0hoặc ^0ở cuối để lưu một đoạn byte khác
Gust van de Wal

@ValueInk wow, tôi không biết tại sao tôi lại viết +=, thx vì đã chỉ ra nó
Nhân Mã

Bạn vẫn có thể bỏ dấu ngoặc đơn bên ngoài
Gust van de Wal

@GustvandeWal oh, tôi không biết điều đó! cảm ơn
Nhân Mã

0

Perl 6 , 19 byte

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

Hãy thử trực tuyến!

Không phải là giải pháp ngắn nhất, nhưng tôi đang nghiên cứu nó. Về cơ bản, điều này cắt bớt số, sau đó thêm một số từ 0 nếu số đó không còn nguyên để bắt đầu


0

Java (OpenJDK 8) , 43 byte

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

Hãy thử trực tuyến!


3
Hàm lambda có thể được viết mà không cần sử dụng một returncâu lệnh rõ ràng .
Joel

@Joel thực sự đúng. Và bạn có thể lưu thêm 4 byte thay đổi (int)a/a<1thành a%1!=0: 30 byte
Kevin Cruijssen

Ngoài ra còn có BigDecimal.setScalephương pháp mang lại kết quả tuyệt vời, như câu trả lời của tôi chứng minh
Olivier Grégoire




Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.