กลมเหมือนศูนย์


12

เป้าหมาย

กำหนดหมายเลขอินพุตให้ปัดเศษให้ใกล้กับตัวเลขที่มีค่ามากที่สุด

ความต้องการ

อินพุต

  • จำนวนจุดลอยตัว
  • สมมติว่าตัวเลขอินพุตส่งผลให้เกิดเอาต์พุตภายในขีด จำกัด ของชนิดข้อมูล (เช่นละเว้นข้อผิดพลาดมากเกินไป)
  • 0 คืออินพุตที่ไม่ถูกต้อง
  • ตัวเลขที่ไม่สามารถแสดงอย่างถูกต้องในประเภทข้อมูลจุดลอยตัว (เช่น"0.35"การจัดเก็บเป็น0.3499999) ไม่จำเป็นต้องได้รับการสนับสนุน

เอาท์พุต

  • ตัวเลขที่ใกล้ที่สุดซึ่งประกอบด้วยตัวเลขที่ไม่ใช่ศูนย์หนึ่งหลักและหมายเลขศูนย์ใด ๆ
  • ผลลัพธ์ต้องรองรับตัวเลขติดลบและเศษส่วน
  • เมื่ออินพุตอยู่ระหว่างสองเอาต์พุตที่เป็นไปได้ให้ปัดออกจากศูนย์

การเสนอ

โฟกัสอยู่ที่การคำนวณมากกว่าการนำเสนอ ผลลัพธ์อาจเป็นชนิดข้อมูลจุดลอย อาจเป็นข้อความทั้งแบบเต็มหรือในทางวิทยาศาสตร์ หากคุณพบช่องโหว่ที่การนำเสนอวิธีการลดจำนวนไบต์ของคุณรุ่งโรจน์กับคุณ!

ตัวอย่าง

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

กรณีทดสอบ

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

เกณฑ์การให้คะแนน

รหัสที่มีจำนวนไบต์น้อยที่สุดหลังจากหนึ่งสัปดาห์ชนะ


3
ฉันคิดว่า "ตัวเลขหนึ่งที่สำคัญ" คือวลีที่คุณกำลังมองหา
Steve Bennett

2
กฎการปัดเศษสำหรับ 0 นั้นค่อนข้างแปลก
xnor

2
@xnor คุณพูดถูก 0 ใกล้ถึง 0.0001 มากกว่า 1 ฉันคิดว่า 0 น่าจะไม่ถูกต้อง
Hand-E-Food

1
ใช่แล้วมันไม่ตรงกับคำแถลงเป้าหมาย
Steve Bennett

คำตอบ:


6

MATL , 3 ไบต์

1&V

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

กรณีทดสอบ0.25ล้มเหลวสำหรับคอมไพเลอร์ที่ทำงานใน Octave บน TIO แต่ทำงานใน Matlab บน Windows:

ป้อนคำอธิบายรูปภาพที่นี่

พฤติกรรมที่แตกต่างนั้นเกิดจากsprintfฟังก์ชั่นของ Octave / Matlab โดยใช้การปัดเศษ "banker rounding" หรือ ".5 ห่างจากศูนย์" ขึ้นอยู่กับแพลตฟอร์ม สำหรับข้อมูลเพิ่มเติมและการทดสอบสามารถพบได้ที่นี่


สำหรับ6 ไบต์ ,

1t3$Yo

ทำงานได้ทั้งคู่และบน Matlab ตรวจสอบกรณีทดสอบทั้งหมด


1
"การปัดเศษของนายธนาคาร" เป็นสิ่งที่ทำให้ฉันลบคำตอบ Jelly ของฉันออกไป > _ <
Erik the Outgolfer

@EriktheOutgolfer ใช่ฉันคิดว่านั่นเป็นเหตุผลเช่นกัน ฉันโชคดีที่ Matlab ไม่ทำเช่นนั้น :-D
Luis Mendo


9

Javascript, 19 ไบต์

x=>x.toPrecision(1)

นี้ไม่ได้ตอบสนองข้อกำหนดในหรือ0 25
Anders Kaseorg

น่าสนใจ สเป็คสำหรับ0ไม่สมเหตุสมผลกับฉัน แต่0.35สิ่งที่ ... ดูเหมือนว่าจาวาสคริปต์กำลังพยายามหลีกเลี่ยงอคติในการปัดเศษ แต่สเป็คต้องการอคติ
Steve Bennett

สวัสดีคุณเปลี่ยนความคิดเห็นของคุณ - คุณ0.35ไม่เคยเขียน25มาก่อน ฉันคิดว่ามันเป็นไปตามข้อกำหนดสำหรับ 25 - จะส่งกลับ "3e + 1" ซึ่งดูเหมือนว่าถูกต้องสำหรับฉัน
Steve Bennett

ขออภัยฉันเปลี่ยน0.35เนื่องจาก0.35ไม่มีการแสดงจุดลอยตัวที่แน่นอน พฤติกรรมจะต้องขึ้นอยู่กับเบราว์เซอร์ ฉันได้รับ252e+1ใน Firefox
Anders Kaseorg

ใช่ฉันได้ผลลัพธ์ทั้งสองอย่างนี้แตกต่างกันใน Chrome vs Firefox ว้าว.
Steve Bennett

4

เรติน่า , 63 62 ไบต์

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

ลองออนไลน์!


เห็นได้ชัดว่าคุณไม่ต้องกังวลเกี่ยวกับศูนย์ต่อท้ายเพื่อให้คุณสามารถลบขั้นตอนสุดท้ายออกได้อย่างสมบูรณ์ (แม้ว่าฉันจะรู้สึกประทับใจ แต่ก็ไม่ใช่ทุกวันที่คุณเห็นเครื่องหมายคำถามสามตัวในช่องว่างของอักขระสี่ตัว)
Neil

0.99แต่น่าเสียดายที่คำตอบนี้ดูเหมือนจะล้มเหลว
Neil

ก็ล้มเหลวสำหรับ0.099ฯลฯ ความพยายามของฉันในการแก้ไข: ลองออนไลน์!
Neil

ยังล้มเหลวสำหรับ99.99, 100.001...
Neil

ยังผิดอยู่0.099ขอโทษด้วย ในด้านสว่างฉันคิดว่าคุณสามารถลบเส้น+หลัง;ในบรรทัดที่สามได้
Neil

2

PHP , 45 ไบต์

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

ลองออนไลน์!

วิธีการเดียวกันกับคำตอบของฉันหลาม 2

ดูเหมือนว่าจะจัดการได้อย่างถูกต้อง0.35ซึ่งทำให้เป็นหมุดเหนือคำตอบของ JS ด้วย: D


น่าสนใจฉันคิดว่าคำตอบ Python 3 ที่ลบไปของคุณอาจใช้งานได้ใน Python 2
Anders Kaseorg

ผ่านการทดสอบแล้วมันก็ทำได้! แก้ไขและยกเลิกการลบคำตอบหลามตอนนี้
Skidsdev

2

T-SQL, 27 ไบต์

SELECT FORMAT(i,'G1')FROM t

โดยใช้รหัสเดียวกันการจัดรูปแบบสุทธิเป็นC # คำตอบที่คาร์ลอ การป้อนข้อมูลจากลอยคอลัมน์ฉันในที่มีอยู่ก่อนตารางที , ตามมาตรฐาน IO ของเรา

กรณีทดสอบ:

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

(มีประโยชน์มากที่ฉันสามารถโหลดตารางอินพุตล่วงหน้าด้วยค่าเหล่านี้ทั้งหมดและรันได้ในครั้งเดียว)


1

Python 2 , 62 ไบต์

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

ลองออนไลน์!

ไม่คุ้นเคยกับการเล่นหลามกอล์ฟ แต่ใช้งานได้

ล้มเหลว0.35เนื่องจากความไม่ถูกต้องของจุดลอย

ขอบคุณ Anders Kaseorg ที่ชี้ให้เห็นว่าวิธีนี้ทำงานได้อย่างถูกต้องใน Python 2


สำหรับการส่งออกควรจะเป็น0.25 0.3
Anders Kaseorg

@AndersKaseorg ฉันไม่แน่ใจว่าทำไม แต่ฉันสามารถสันนิษฐานได้ว่ามันเป็นเพราะความไม่ถูกต้องจุดลอยตัวเดียวกับ Javascript ตอบ
Skidsdev

อืมรอ 25 มีปัญหาเดียวกัน ... แปลก
Skidsdev

สำหรับทุกคนที่สงสัย Python 2 roundปัดเศษจากศูนย์ในขณะที่ Python 3 ปัดไปถึงเท่านั่นคือสาเหตุที่ทำให้ใช้งานได้ใน Py2 แต่ไม่ใช่ 3
flornquake

คุณสามารถกอล์ฟไม่กี่ไบต์ใช้แทนlog(x,10) log10(abs(x))
Alix Eisenhardt


1

Excel, 14 ไบต์

=ROUNDUP(A1,1)

ยินดีต้อนรับสู่เว็บไซต์! นี่เป็นคำตอบแรกที่ดีคุณมีลิงค์ไปยังที่ใดที่หนึ่งซึ่งสามารถทำการทดสอบออนไลน์ได้หรือไม่โดยเฉพาะเพื่อให้ผู้ใช้รายอื่นไม่ต้องดาวน์โหลด Excel?
caird coinheringaahing

น่าเสียดายที่ฉันไม่คิดว่าจะมีเว็บไซต์ของ Microsoft ฟรีเนื่องจากมีการให้สิทธิ์ใช้งานขออภัย ฉันเห็นคำตอบ Excel อื่น ๆ เกี่ยวกับ Code Golf แต่ฉันไม่แน่ใจว่าสิ่งเหล่านั้นผ่านการตรวจสอบตั้งแต่ฉันใหม่!
rew

ไม่สามารถใช้ได้กับกรณีทดสอบส่วนใหญ่ มันกำลังปัดเศษขึ้นสู่ตำแหน่ง "สิบ" มันจำเป็นต้องปัดเศษ (ไม่ขึ้น) ให้เข้ากับตำแหน่งที่สำคัญที่สุด
Hand-E-Food



0

Forth (gforth) , 24 ไบต์

: f 1 set-precision f. ;

ลองออนไลน์!

คาดว่าจะมีการป้อนข้อมูลในสแต็กจุดลอยตัว เอาต์พุตคือ stdout

ฉันไม่ชอบการเปลี่ยนแปลงความแม่นยำระดับโลก (สำหรับอินสแตนซ์นี้) ของฟังก์ชั่นเอาท์พุทจุดลอย แต่มันช่วยประหยัดไบต์จำนวนมากเพื่อไม่ต้องเรียกคืนค่าก่อนหน้าในตอนท้าย ไม่ส่งออกในทางวิศวกรรมหรือสัญลักษณ์ทางวิทยาศาสตร์โดยไม่คำนึงถึงการป้อนข้อมูล

หมายเหตุ: ด้วยเหตุผลบางอย่างที่ติ้วล่ามแปลง0.25ไป0.2ในขณะที่แปลงติดตั้งในพื้นที่ของฉันไป0.25 0.3ฉันไม่แน่ใจทั้งหมดว่าทำไมถึงเป็นเช่นนี้ แต่เนื่องจากฉันได้รับผลลัพธ์ที่ถูกต้องในท้องถิ่นฉันจึงทิ้งคำตอบตามที่เป็นอยู่

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