Membulatkan dari nol


24

Membulatkan dari nol

Terinspirasi oleh Round menuju nol .

Diberikan input angka melalui metode yang masuk akal, bulatkan angka "menjauh dari nol" - angka positif dibulatkan ke atas, dan angka negatif dibulatkan ke bawah.

Jika Anda ingin mengambil input sebagai string (misalnya melalui STDIN), Anda harus dapat menangani angka dengan atau tanpa titik desimal. Jika Anda menganggapnya sebagai angka, itu setidaknya harus mampu menangani presisi titik-mengambang (tidak diperlukan presisi ganda) atau bilangan rasional.

Anda dapat menampilkan angka titik-mengambang dengan titik desimal (mis. 42.0) jika diinginkan. (Atau bahkan ada beberapa test case output floating-point dan beberapa integer output, jika itu membuat jawaban Anda lebih pendek.)

Tidak ada celah standar, dll.

Uji kasus

-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

Tautan Kotak Pasir


jika kita mengambil angka dalam konteks string, seperti STDIN, apakah kita perlu mendukungnya .0seperti yang disarankan oleh kasus uji?
Jo King

@ Menjawab ya - Saya akan memperbarui pertanyaan untuk menjelaskan. Ini sebenarnya adalah kasus asli, tetapi kemudian orang-orang di kotak pasir menyarankan menambahkan kasus uji non-desimal jadi eh, di sini kita bersama keduanya, maaf
Nilai Tinta

Terasa menyenangkan menjadi inspiratif :)
connectyourcharger

Sangat lucu bahwa semua bahasa yang bekerja dengan baik pada tantangan sebelumnya dengan mengambil input integer dan output integer tidak akan bekerja dengan baik, karena mereka tidak dapat membedakan antara -0.1dan0.1
Jo King

Jawaban:


15

Excel, 13 byte

=ROUNDUP(A1,)

Alternatif

=EVEN(A1*2)/2

4
EVEN, apa fungsi yang aneh ..
tsh

13
@ tsh Saya pikir maksud Anda "fungsi aneh".
Negatif tujuh

2
@negativeseven Username memeriksa. :-P
Veky


8

Jelly , 4 byte

ĊṠ¡Ḟ

Tautan monadik yang menerima angka yang menghasilkan bilangan bulat.

Cobalah online! Atau lihat test-suite .

Bagaimana?

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

Jadi bagaimana tepatnya cara ¡kerjanya untuk angka negatif? Saya tidak berpikir itu didokumentasikan
caird coinheringaahing

1
Ini tidak didokumentasikan pada wiki Jelly, tetapi ¡sifat berulang diimplementasikan dengan for index in range(repetitions)loop dalam kode. range([stop=]-1)kosong karena startdefault ke 0dan stepdefault ke 1dan "Untuk langkah positif, isi rentang rditentukan oleh rumus di r[i] = start + step*imana i >= 0dan r[i] < stop." docs
Jonathan Allan

¡Perilaku bergantung pada perilaku Python range, dan range(-1).__iter__().__next__()segera melempar StopIteration.
String Tidak Terkait

6

Python 3 , 23 byte

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

Cobalah online!

-1 byte terima kasih kepada xnor


1
Anda dapat melakukannya (1|-(i>0))untuk menghemat satu byte (1,-1)[i>0].
xnor

@ xnor Temukan yang bagus, terima kasih!
Jitse

Sudah selesai dilakukan dengan baik. Saya memilikinya di 62 byte ಥ_ಥ:g=lambda r:0if r==0 else(int(r)+r/abs(r)if r/int(r)!=1 else r)
user14492

Apa itu '|' sebelum '-'?
William

1
@jaaq Saya sangat suka solusi itu! Pendekatan awal saya juga 24 byte.
Jitse

5

Jelly , 5 4 byte

AĊ×Ṡ

Cobalah online!

Port ini menjawab Stax rekursif ke dalam Jelly, jadi periksa jawaban itu untuk penjelasan.

-1 byte terima kasih kepada Nick Kennedy

Jelly , 6 5 byte

ĊḞ>?0

Cobalah online!

-1 byte terima kasih kepada Jonathan Allan

Bagaimana cara kerjanya?

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

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

ĊḞ>?0akan bekerja seperti 6 Anda.
Jonathan Allan

1
AĊ×Ṡadalah 4 dan secara fungsional identik dengan jawaban pertama Anda.
Nick Kennedy

@NickKennedy dan Jonathan, terima kasih atas sarannya, mereka telah diedit di
caird coinheringaahing

5

Java (JDK) , 18 byte

d->d.setScale(0,0)

Cobalah online!

Penjelasan

Menggunakan BigDecimalinput dan output sebagai. BigDecimalmemiliki metode setScaleyang mengatur skala angka. Parameter pertama adalah jumlah digit setelah pemisah titik, yang kedua adalah mode pembulatan. ROUND_UPadalah pembulatan "jauh-dari-nol" dan memiliki nilai 0jadi saya hardcode nilai itu.


5

Vim, 36 byte / penekanan tombol

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

Cobalah online! atau Verifikasi semua Uji Kasus!

Penjelasan:

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

Menggunakan $F-a <esc>alih-alih baris pertama dan makro dengan /sebagai bersyarat di tempat :gdan :normmemberikan 29 byte tio.run/##HczBCoJAFEZhWva/QpuLCNbizoxalBXRInqJMpjGCYVwmkx7/…
Kritixi Lithos


4

C # (Visual C # Compiler) , 41 byte 27 byte 24 byte

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

Cobalah online!

Posting pertama di sini, bersenang-senang dengannya, harap Anda menyukainya. Agak merasa C # tempatnya kosong di sini

-14 tnx ke @ data kadaluarsa
-3 tnx ke @ night2


1
Selamat datang di situs ini, dan jawaban pertama yang bagus! Semoga Anda menikmati Golf Code!
caird coinheringaahing

27 byte ... Mungkin masih sedikit yang harus disimpan
Data Kedaluwarsa

@Expired, ya bagus, pengkodean semacam ini sangat aneh pada pandangan pertama yang sepertinya saya lupa tentang seluruh hal perpustakaan, keberatan mempostingnya sebagai jawaban
hessam hedieh

1
@ Night2, tnx untuk komentar, saya tidak mengetik seluruh jawaban, saya menggunakan Code golf submissionfungsionalitas, Baru saja menambahkan sedikit kata-kata saya sendiri sampai akhir, tetapi untuk edit saya baru saja mengubah baris kode itu, dan ur di sana, saya lupa untuk perbarui tautan, yang membawa kita kembali ke langkah pertama, untuk hanya memodifikasi sekali, agak SOLID di sini, ngomong-ngomong, tnx untuk petunjuknya juga
hessam hedieh

1
Anda telah mengedit tautan TIO Anda ke versi 24 byte, tetapi baris kode itu sendiri masih versi 27 byte.
Nilai Tinta

4

Pesona Rise , 18 16 byte

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

Cobalah online!

"Tambah" (jauh dari nol) 0,999999 dan lantai hasilnya. µadalah hal yang paling dekat dengan operator bahasa yang sangat kecil. Dengan Trunc(x)perintah yang berfungsi dengan baik , jawab sekarang mendukung 0sebagai input.


1
@JoKing Oof. Tangkapan yang bagus. Melakukan divide by inputuntuk mendapatkan "tanda" dari nilai input, yang tentu saja, membaginya dengan 0 ketika inputnya 0. Tidak ada (yang baik) jalan keluar saat ini. Akan membutuhkan komit ini terlebih dahulu. Saya akan menyodok Dennis (manfaat samping, jawabannya akan semakin pendek).
Draco18s

1
@JoKing Answer sekarang menangani 0dengan benar.
Draco18s


3

C, 94 43 39 byte

terima kasih kepada ceilingcat untuk 39 byte

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

TIO



2

Retina 0.8.2 , 38 byte

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

Cobalah online! Tautan termasuk kasus uji. Penjelasan:

\.0+
.

Hapus nol setelah titik desimal, untuk memastikan bahwa angka tersebut bukan bilangan bulat; dua pertandingan berikutnya gagal jika tidak ada digit setelah titik desimal.

\b9+\..
0$&

Jika bagian integer adalah semua 9s, awalan a 0untuk memungkinkan kenaikan melimpah.

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

Tambahkan bagian bilangan bulat dari angka tersebut.

\..*

Hapus bagian pecahan dari nomor tersebut.



2

JavaScript (ES6), 20 byte

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

Cobalah online!

Berkomentar

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

Saya sedang menulis jawaban untuk jawaban 16-byte saya ( n=>(~~n-n%1)%1+n) sampai saya menemukan bahwa kode saya tidak berfungsi untuk angka antara -1 dan 1. Anda mungkin bisa mencari cara untuk membuat ini bekerja dengan 3 byte terakhir ada kiri!
Gust van de Wal

2

Perl 6 , 18 byte

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

Cobalah online!

Penjelasan

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

2

MathGolf , 5 byte

‼σ±ü*

Cobalah online!

Penjelasan

Sangat menyenangkan menemukan penggunaan untuk 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 byte

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

Cobalah online!

Jika angka bukan bilangan bulat, berdasarkan tanda -1 (untuk desimal negatif) atau 1 (untuk desimal positif) ditambahkan ke dalamnya dan kemudian bilangan bulat bagian dari angka baru dicetak.


PHP , 32 byte

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

Cobalah online!

Pada dasarnya output floorinput jika kurang dari 0, selain ceilitu.


PHP , 34 byte

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

Cobalah online!





1

APL (Dyalog Unicode) , 15 byte

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

Cobalah online!

Dfn Sederhana. Penggunaan ⎕IO←0.

Bagaimana:

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

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

Tidak disatukan

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

Terinspirasi oleh jawaban C #.

Berkat @ Value Ink dan @Gust van de Wal untuk -7 byte!

Terima kasih lagi, @Gust van de Wal untuk -2 byte lagi!


Mengapa menggunakan +=kapan +akan melakukan trik dalam kasus ini? -1 byte
Nilai Tinta

Alih-alih parseInt(), saya hanya akan menggunakan ~~di awal atau operator bitwise lain seperti |0atau ^0di akhir untuk menyimpan potongan byte lainnya
Gust van de Wal

@ NilaiInk wow, saya tidak tahu mengapa saya menulis +=, terima kasih untuk menunjukkannya
Sagitarius

Anda masih dapat menjatuhkan tanda kurung luar
Gust van de Wal

@ GustavandeWal oh, saya tidak tahu itu! terima kasih
Sagitarius

0

Perl 6 , 19 byte

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

Cobalah online!

Bukan solusi terpendek, tapi saya sedang mengusahakannya. Pada dasarnya ini memotong angka, kemudian menambahkan satu dari nol jika angka itu tidak lengkap untuk memulai




0

Merah , 46 byte

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

Cobalah online!

Versi yang sedikit lebih mudah dibaca adalah 2 byte lebih panjang (nama fungsi panjang itu!):

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.