Bulat seperti Nol

12

Tujuan

Diberi nomor input, bulatkan ke nomor terdekat dengan satu angka signifikan.

Persyaratan

Memasukkan

  • Nomor titik mengambang.
  • Asumsikan nomor input menghasilkan output dalam batas tipe data (mis. Abaikan kesalahan luapan.)
  • 0 adalah input yang tidak valid.
  • Angka-angka yang tidak dapat direpresentasikan secara akurat dalam tipe data floating point (mis. "0.35"Disimpan sebagai 0.3499999) tidak harus didukung.

Keluaran

  • Nomor terdekat yang terdiri dari satu digit bukan nol dan sejumlah nol digit.
  • Hasilnya harus mendukung angka negatif dan angka fraksional.
  • Ketika input terletak tepat di antara dua output yang mungkin, bulatkan dari nol.

Presentasi

Fokusnya adalah pada perhitungan dan bukan pada presentasi. Output mungkin berupa tipe data floating point. Ini bisa berupa teks baik secara penuh atau dalam notasi ilmiah. Jika Anda menemukan celah di mana menyajikan cara tertentu mengurangi jumlah byte Anda, pujian untuk Anda!

Contohnya

9
-3000
.2
0.2
-.2
7e12
5e-15
1e0

Uji Kasus

Input     Output
1         1
10        10
17        20
99        100
54321     50000
56789     60000
-123      -100
-789      -800
0.23      0.2
0.25      0.3
-0.25     -0.3
4.56e23   5e23
4.56e-23  5e-23

Mencetak gol

Kode dengan byte terkecil dihitung setelah satu minggu menang.

Makanan Tangan
sumber
3
Saya pikir "satu tokoh penting" adalah ungkapan yang Anda cari.
Steve Bennett
2
Aturan pembulatan untuk 0 cukup aneh.
xnor
2
@ xnor, kamu benar. 0 lebih dekat ke 0,0001 dari 1. Saya pikir 0 seharusnya tidak valid.
Hand-E-Food
1
Ya, dan itu tidak cocok dengan pernyataan tujuan.
Steve Bennett

Jawaban:

6

MATL , 3 byte

1&V

Cobalah online! Atau verifikasi semua kasus uji .

Uji kasus 0.25gagal untuk kompiler yang berjalan di Oktaf pada TIO, tetapi berfungsi di Matlab pada Windows:

masukkan deskripsi gambar di sini

Perilaku yang berbeda disebabkan oleh sprintffungsi Octave / Matlab menggunakan pembulatan "bankir" atau ".5 dari nol", tergantung pada platform. Informasi dan tes lebih lanjut dapat ditemukan di sini .


Selama 6 byte ,

1t3$Yo

bekerja baik pada Oktaf dan Matlab. Verifikasi semua kasus uji .

Luis Mendo
sumber
1
"pembulatan bankir" adalah hal yang membuat saya menghapus jawaban Jelly saya. > _ <
Erik the Outgolfer
@EriktheOutgolfer Ya, saya tahu itu alasannya juga. Saya beruntung bahwa Matlab tidak melakukan itu :-D
Luis Mendo
11

C # (.NET Core) , 19 byte

n=>n.ToString("G1")

Cobalah online!

Contoh:

Input     Output
----------------
 54321     5E+04
-56789    -6E+04
 99        1E+02
 0.23      0.2
 0.25      0.3
-0.25     -0.3
 4.56e23   5E+23
 4.56e-23  5E-23
Charlie
sumber
9

Javascript, 19 byte

x=>x.toPrecision(1)
Steve Bennett
sumber
Ini tidak memenuhi spesifikasi 0atau 25.
Anders Kaseorg
Menarik. Spesifikasi untuk 0tidak masuk akal bagi saya. Tapi 0.35masalahnya ... sepertinya Javascript berusaha menghindari bias dalam pembulatan, tetapi spec menginginkan bias.
Steve Bennett
Hei, Anda mengubah komentar Anda - Anda 0.35tidak menulis 25sebelumnya. Saya pikir itu memenuhi spesifikasi untuk 25 - ia mengembalikan "3e +1" yang tampaknya benar bagi saya.
Steve Bennett
Maaf, saya mengubahnya dari 0.35karena 0.35tidak memiliki representasi floating-point yang tepat. Perilaku harus bergantung pada browser; Saya mendapatkan 252e+1di Firefox.
Anders Kaseorg
Yup, saya mendapatkan dua hasil berbeda di Chrome vs Firefox. Wow.
Steve Bennett
4

Retina , 63 62 byte

1`[1-9]
$*#
#\.?[5-9]
#$&
T`d`0`#[\d.]+
0(\.?)#{10}
1$1
#+
$.0

Cobalah online!

TwiNight
sumber
Tampaknya Anda tidak perlu khawatir tentang tertinggal nol sehingga Anda dapat menghapus tahap terakhir sepenuhnya (meskipun saya terkesan dengan itu, tidak setiap hari Anda melihat tiga tanda tanya dalam ruang empat karakter).
Neil
Sayangnya jawaban ini tampaknya gagal 0.99.
Neil
Gagal juga untuk 0.099dll. Upaya saya untuk memperbaiki: Coba online!
Neil
Juga gagal untuk 99.99,, 100.001...
Neil
Masih salah untuk 0.099, maaf. Sisi baiknya saya pikir Anda bisa menghapus +setelah ;pada baris ketiga.
Neil
2

PHP , 45 byte

<?=round($x=$argv[1],-floor(log10(abs($x))));

Cobalah online!

Metode yang sama dengan jawaban python 2 saya.

Tampaknya juga menangani dengan benar 0.35, yang menempatkannya pasak di atas jawaban JS juga: D

Skidsdev
sumber
Menariknya, saya pikir jawaban Python 3 Anda yang dihapus dapat bekerja dalam Python 2.
Anders Kaseorg
Diuji, dan ternyata! Mengedit dan membatalkan penghapusan jawaban python sekarang
Skidsdev
2

T-SQL, 27 byte

SELECT FORMAT(i,'G1')FROM t

Menggunakan kode pemformatan .Net yang sama dengan jawaban C # Carlos Alejo . Input berasal dari kolom float i pada tabel t yang sudah ada , sesuai standar IO kami

Kasus uji:

Input         Output
------------ --------
1             1
10            1E+01
17            2E+01
99            1E+02
54321         5E+04
56789         6E+04
-123         -1E+02
-789         -8E+02
0.23          0.2
0.25          0.3
-0.25        -0.3
4.56E+23      5E+23
4.56E-23      5E-23

(Cukup praktis bahwa saya dapat memuat tabel input dengan semua nilai ini dan menjalankannya sekaligus.)

BradC
sumber
1

Python 2 , 62 byte

lambda x:round(x,-int(floor(log10(abs(x)))))
from math import*

Cobalah online!

Tidak digunakan untuk python golf, tetapi ini berfungsi.

Gagal 0.35karena ketidakakuratan floating point.

Terima kasih kepada Anders Kaseorg untuk menunjukkan bahwa ini berfungsi dengan benar di Python 2

Skidsdev
sumber
Output untuk 0.25seharusnya 0.3.
Anders Kaseorg
@AndersKaseorg Saya tidak yakin mengapa, tapi saya hanya bisa berasumsi itu karena ketidakakuratan titik-mengambang yang sama dengan jawaban Javascript.
Skidsdev
Hmm tunggu 25 punya masalah yang sama ... aneh.
Skidsdev
Bagi siapa pun yang bertanya-tanya, roundputaran Python 2 menjauh dari nol, sedangkan putaran Python 3 menjadi genap, itu sebabnya ini bekerja di Py2 tetapi tidak 3.
flornquake
Anda dapat menggunakan beberapa byte golf log(x,10)sebagai gantinya log10(abs(x)).
Alix Eisenhardt
1

Excel, 14 byte

=ROUNDUP(A1,1)
rew
sumber
Selamat datang di situs ini! Ini adalah jawaban pertama yang bagus, apakah Anda memiliki tautan ke suatu tempat yang dapat diuji, sebaiknya online, sehingga pengguna lain tidak perlu mengunduh Excel?
caird coinheringaahing
Sayangnya saya tidak berpikir ada situs Microsoft gratis karena lisensi, maaf. Saya telah melihat jawaban Excel lainnya pada Code Golf tetapi saya tidak yakin bagaimana itu divalidasi karena saya baru!
rew
Itu tidak berfungsi untuk sebagian besar kasus uji. Ini pembulatan ke posisi "persepuluh". Perlu membulatkan (tidak naik) ke posisi apa pun yang paling signifikan.
Hand-E-Food
0

Keempat (gforth) , 24 byte

: f 1 set-precision f. ;

Cobalah online!

Input diharapkan pada tumpukan floating point. Output adalah ke stdout

Saya tidak suka membuat perubahan pada presisi global (untuk contoh ini) fungsi output floating point, tetapi menghemat banyak byte agar tidak harus mengembalikan nilai sebelumnya di akhir. Tidak menghasilkan dalam rekayasa atau notasi ilmiah, terlepas dari input.

Catatan: Untuk beberapa alasan, juru bahasa dikonversi 0.25ke 0.2, sementara instalasi lokal saya mengkonversi 0.25ke 0.3. Saya tidak sepenuhnya yakin mengapa ini terjadi, tetapi karena saya mendapatkan hasil yang benar secara lokal, saya membiarkan jawaban saya apa adanya

: f                   \ start a new word definition
  1 set-precision     \ set the floating point output words to use 1 significant digit
  f.                  \ output the top of the floating point stack
;                     \ end the word definition
reffu
sumber