โลหะความแม่นยำสูงหมายถึง


13

พื้นหลัง

หมายถึงโลหะเริ่มต้นด้วยการที่มีชื่อเสียงหมายถึงสีทองจะถูกกำหนดไว้สำหรับทุกจำนวนธรรมชาติ (จำนวนเต็มบวก) และแต่ละคนเป็นคงไม่ลงตัว (มันมีการขยายตัวที่ไม่มีที่สิ้นสุด Non-Recurring ทศนิยม)

สำหรับจำนวนธรรมชาติที่หมายถึงโลหะเป็นรากของสมการกำลังสอง

รากอยู่เสมอ

แต่ค่าเฉลี่ยโลหะมักจะได้รับเป็นรากบวก ดังนั้นสำหรับคำถามนี้มันจะถูกกำหนดโดย:

สำหรับผลลัพธ์คืออัตราส่วนทองคำที่มีชื่อเสียง:


ท้าทาย

รหัสของคุณควรใช้ 2 อินพุต: n และ p (ลำดับไม่สำคัญตราบใดที่สอดคล้องกัน)

  • n คือจำนวนธรรมชาติที่ระบุว่าหมายถึงโลหะใด
  • p คือจำนวนธรรมชาติที่ระบุจำนวนทศนิยมที่มีความแม่นยำ

รหัสของคุณควรเอาท์พุทเมทัลลิกที่ n หมายถึงตำแหน่งทศนิยมที่แม่นยำ

ความถูกต้อง

รหัสของคุณถูกต้องหากใช้กับค่าของ n และ p ตั้งแต่ 1 ถึง 65,535

คุณต้องแสดงทศนิยมในแบบฟอร์ม

หลัก. หลัก (s) (ไม่มีช่องว่าง)

ตัวอย่างเช่นค่าเฉลี่ยทองเป็นทศนิยม 9 ตำแหน่งคือ

1.618033988

แสดงตัวเลขสุดท้ายโดยไม่ต้องปัดเศษเนื่องจากจะปรากฏในการขยายทศนิยมอีกต่อไป ตัวเลขถัดไปในค่าเฉลี่ยสีทองคือ 7 แต่ 8 ตัวอย่างสุดท้ายไม่ควรปัดเศษขึ้นเป็น 9

จำนวนหลักทศนิยมต้องเป็น p ซึ่งหมายความว่าต้องรวมศูนย์ใด ๆ ต่อท้ายด้วย

คำตอบของแบบฟอร์ม

ไม่ถูกต้องคุณต้องใช้การขยายทศนิยม

คุณสามารถส่งออกขึ้นบรรทัดใหม่ได้สูงสุด 1 บรรทัดและขึ้นบรรทัดใหม่สูงสุด 1 บรรทัด คุณไม่สามารถส่งออกช่องว่างใด ๆ หรือตัวละครอื่น ๆ นอกเหนือจากตัวเลขและจุดเดียว / เต็มหยุด / ระยะเวลา

คะแนน

นี่คือมาตรฐานรหัสกอล์ฟ: คะแนนของคุณคือจำนวนไบต์ในรหัสของคุณ


ลีดเดอร์บอร์ด

(ใช้ตัวอย่างกระดานแต้มนำของ Martin )

คำตอบ:


17

dc, 12

?kdd*4+v+2/p
  • ? กด n และ p ลงบนสแต็ก
  • k ตั้งค่าความแม่นยำเป็น p
  • dd ซ้ำกันสองครั้ง (รวมสามชุด)
  • * คูณ n * n
  • 4+ เพิ่ม 4
  • v ใช้รากที่สอง
  • + เพิ่ม n (สำเนาล่าสุดบนสแต็ก)
  • 2/ หารด้วย 2
  • p พิมพ์

TestCase:

$ dc -f metalmean.dc <<< "1 9"
1.618033988
$

7
เครื่องมือที่เหมาะสมสำหรับงาน
Dennis

5
@ เดนนิสมันจะต้องเป็นครั้งแรกที่ CJam เกือบ 3 ครั้งตราบใดที่สิ่งอื่น ;-)
Digital Trauma

2

R, 116 ไบต์

library(Rmpfr);s=scan();n=mpfr(s[1],1e6);r=(n+(4+n^2)^.5)/2;t=toString(format(r,s[2]+2));cat(substr(t,1,nchar(t)-1))

สิ่งนี้จะอ่านจำนวนเต็มสองจำนวนจาก STDIN และพิมพ์ผลลัพธ์ไปที่ STDOUT คุณสามารถลองออนไลน์ได้

คำอธิบาย Ungolfed +:

# Import the Rmpfr library for arbitrary precision floating point arithmetic
library(Rmpfr)

# Read two integers from STDIN
s <- scan()

# Set n equal to the first input as an mpfr object with 1e6 bits of precision
n <- mpfr(s[1], 1e6)

# Compute the result using the basic formula
r <- (n + sqrt(4 + n^2)) / 2

# Get the rounded string representation of r with 1 more digit than necessary
t <- toString(format(r, s[2] + 2))

# Print the result with p unrounded digits
cat(substr(t, 1, nchar(t) - 1))

หากคุณไม่ได้Rmpfrติดตั้งห้องสมุดคุณสามารถinstall.packages("Rmpfr")และความฝันของคุณจะเป็นจริง


1

Mathematica ขนาด 50 ไบต์

SetAccuracy[Floor[(#+Sqrt[4+#^2])/2,10^-#2],#2+1]&

กำหนดฟังก์ชั่นที่ไม่ระบุชื่อที่ใช้nและเป็นpระเบียบ ฉันใช้Floorเพื่อป้องกันการปัดเศษSetAccuracyซึ่งฉันต้องการเพื่อรับเอาต์พุตทศนิยม


@Arcinde ฉันไม่สามารถใช้หมายเลขความแม่นยำของเครื่องจักรได้เนื่องจากพวกเขาไม่สามารถจัดการp>15ได้
2012rcampion

1

CJam, 35 ไบต์

1'el+~1$*_2#2$2#4*+mQ+2/1$md@+s0'.t

อ่านหน้าแรกแล้วn

ลองใช้ออนไลน์ในล่าม CJam

มันทำงานอย่างไร

เราแค่คำนวณสูตรจากคำถามสำหรับn × 10 p , รับจำนวนเต็มและเศษส่วนของผลลัพธ์หารด้วย10 p , วางส่วนที่เป็นเศษส่วนด้วยเลขศูนย์นำหน้าเพื่อรับตัวเลขpและพิมพ์ส่วนที่คั่นด้วยจุด

1'e  e# Push 1 and 'e'.
l+   e# Read a line from STDIN and prepend the 'e'.
~    e# Evaluate. This pushes 10**p (e.g., 1e3 -> 1000) and n.
1$*  e# Copy 10**p and multiply it with n.
_2#  e# Copy n * 10**p and square it.
2$   e# Copy 10**p.
2#4* e# Square and multiply by 4.
+    e# Add (n * 10**p)**2 and 4 * 10**2p.
mQ   e# Push the integer part of the square root.
+2/  e# Add to n * 10**p and divide by 2.
1$md e# Perform modular division by 10**p.
@+s  e# Add 10**p to the fractional part and convert to string. 
0'.t e# Replace the first character ('1') by a dot.

1

Python 2, 92 ไบต์

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

n,p=input()
e=10**p;r=0
while(n*n+4)*e*e>r*r:r+=1
s=str((n*e+r-1)/2);print s[:-p]+'.'+s[-p:]

1

PHP, 85 78 ไบต์

echo bcdiv(bcadd($n=$argv[bcscale($argv[2])],bcsqrt(bcadd(4,bcpow($n,2)))),2);

มันใช้นามสกุลคณิตศาสตร์ BC คณิตศาสตร์ซึ่งในบางระบบไม่สามารถใช้ได้ จำเป็นต้องรวมไว้ในเวลารวบรวมโดยการระบุ--enable-bcmathตัวเลือกบรรทัดคำสั่ง มันมีอยู่เสมอใน Windows และดูเหมือนว่ามันจะรวมอยู่ในเวอร์ชัน PHP ที่มาพร้อมกับ OSX ด้วย

อัปเดต :

ฉันใช้แฮ็กทั้งหมดที่แนะนำโดย @blackhole ในความคิดเห็นของพวกเขา (ขอขอบคุณ!) จากนั้นฉันบีบการเริ่มต้นของ$nการใช้ครั้งแรก (บันทึกอีก 3 ไบต์) และตอนนี้รหัสพอดีในบรรทัดเดียวในกล่องรหัสด้านบน


@หลุมดำ. 85 แน่นอน ฉันอาจจะอ่าน 86 (เลือกได้มากกว่าเล็กน้อย) และเขียน 68 โดยไม่ได้ตั้งใจ แก้ไขแล้ว
axiac

1
ไม่มีปัญหา :). คุณสามารถมีน้อยกว่า 1 ไบต์โดยวิธี: ลบวงเล็บรอบ ๆechoเพียงแค่ปล่อยให้ช่องว่างหลังจากนั้น
Blackhole

1
และเนื่องจากคุณคาดว่าbcscaleจะกลับมาtrueคุณสามารถใช้$n=$argv[bcscale($argv[2])];และบันทึกเพิ่มอีก 2 ไบต์
Blackhole

นั่นเป็นแฮ็คที่ดี
axiac

ความสกปรกของรหัสเป็นศิลปะ: หน้า โอ้คนสุดท้าย: bcpow($n,2)แทนที่จะbcmul($n,$n)ช่วยคุณ 1 ไบต์
Blackhole

1

J, 27 ไบต์

4 :'}:":!.(2+x)-:y+%:4+*:y'

คำอธิบาย:

4 :'                      '   | Define an explicit dyad
                       *:y    | Square y
                     4+       | Add 4
                   %:         | Square root
                 y+           | Add y
               -:             | Half
      ":!.(2+x)               | Set print precision to 2+x
    }:                        | Remove last digit, to fix rounding

เรียกว่าเป็นแบบนี้:

    9 (4 :'}:":!.(2+x)-:y+%:4+*:y') 1
1.618033988

อีกวิธีแก้ปัญหาที่เย็นกว่าเล็กน้อย:

4 :'}:":!.(2+x){.>{:p._1,1,~-y'

ซึ่งคำนวณรากของพหุนาม x ^ 2 - nx - 1 โชคไม่ดีที่รูปแบบ J ผลลัพธ์ทำให้การเรียกรูทที่ต้องการกลับมายาวขึ้นเล็กน้อย

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