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

Nilai Tinta
sumber
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
nwellnhof
sumber
4
EVEN, apa fungsi yang aneh ..
tsh
13
@ tsh Saya pikir maksud Anda "fungsi aneh".
Negatif tujuh
2
@negativeseven Username memeriksa. :-P
Veky
9

R, 32 byte

x=scan()
sign(x)*ceiling(abs(x))
Pun intended
sumber
3
31 byte - jawaban yang sangat bagus!
Giuseppe
25 byte
Robin Ryder
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)
Jonathan Allan
sumber
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

Jitse
sumber
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)
caird coinheringaahing
sumber
ĊḞ>?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.

Olivier Grégoire
sumber
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)
DJMcMayhem
sumber
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

hessam hedieh
sumber
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.

Draco18s
sumber
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

Stax , 6 byte

å├╪∙Bß

Jalankan dan debug itu

Prosedur:

  1. Nilai mutlak
  2. Plafon
  3. Kalikan dengan tanda asli
rekursif
sumber
Alat yang saya gunakan mengatakan ini adalah 14 byte
Gust van de Wal
Alat Anda mungkin tidak mengetahui pengkodean karakter stax . Jika Anda masih tidak yakin, di bagian "Alat", ada tautan unduhan, tempat Anda dapat mengunduh file sumber dan memeriksa ukurannya sendiri.
Rekursif
3

C, 94 43 39 byte

terima kasih kepada ceilingcat untuk 39 byte

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

TIO

girobuz
sumber
48
ASCII
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.

Neil
sumber
2

05AB1E , 6 byte

ÄîI.±*

5-byter pastinya dimungkinkan ..

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

Ä       # The absolute value of the (implicit) input,
 î      # ceiled
     *  # And then multiplied by
      # the signum
  I     # of the input
        # (after which the result is output implicitly)
Kevin Cruijssen
sumber
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
Arnauld
sumber
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
nwellnhof
sumber
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
maks
sumber
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!

Night2
sumber
1

Brachylog , 7 byte

⌋₁ℤ₁|⌉₁

Cobalah online!

atau ⌉₁ℕ₁|⌋₁.

⌋₁         The input rounded down
  ℤ₁       is an integer less than -1
    |      and the output, or, the input
     ⌉₁    rounded up is the output.
String yang tidak terkait
sumber
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.
J. Sallé
sumber
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/\..*$//
sinar
sumber
1

Perl 5 -pF/\./ , 35 byte

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

Cobalah online!

Xcali
sumber
gagal 3.0. Untuk sakelar, -pF\.sudah cukup: //bersifat opsional.
Ya ampun,
juga 0.0benar
Oh Ya ampun
Memperbaiki keduanya.
Xcali
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!

Sagittarius
sumber
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

Jo King
sumber
0

Java (OpenJDK 8) , 43 byte

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

Cobalah online!

X1M4L
sumber
3
Fungsi lambda dapat ditulis tanpa menggunakan returnpernyataan eksplisit .
Joel
@ Joel memang benar. Dan Anda dapat menyimpan 4 byte tambahan dengan mengubah (int)a/a<1ke a%1!=0: 30 byte
Kevin Cruijssen
Ada juga BigDecimal.setScalemetode yang memberikan hasil luar biasa, seperti yang ditunjukkan oleh jawaban saya
Olivier Grégoire
33 byte
ceilingcat
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]
Galen Ivanov
sumber