Phương tiện kim loại chính xác cao


13

Lý lịch

Các phương tiện kim loại , bắt đầu bằng trung bình vàng nổi tiếng , được xác định cho mọi số tự nhiên (số nguyên dương) và mỗi số là một hằng số vô tỷ (nó có độ mở rộng thập phân không định kỳ vô hạn).

Đối với một số tự nhiên , trung bình kim loại là gốc của phương trình bậc hai

Rễ luôn

nhưng ý nghĩa kim loại thường được đưa ra là gốc tích cực. Vì vậy, đối với câu hỏi này, nó sẽ được xác định bởi:

Cho kết quả là tỷ lệ vàng nổi tiếng:


Thử thách

Mã của bạn phải có 2 đầu vào: n và p (thứ tự không quan trọng miễn là phù hợp)

  • n là số tự nhiên cho biết kim loại có nghĩa là gì
  • p là số tự nhiên cho biết có bao nhiêu vị trí thập phân chính xác

Mã của bạn sẽ xuất ra kim loại thứ n có nghĩa là độ chính xác p vị trí thập phân.

Hiệu lực

Mã của bạn là hợp lệ nếu nó hoạt động cho các giá trị của n và p từ 1 đến 65,535.

Bạn phải xuất một số thập phân trong mẫu

chữ số (s) .digit (s) (không có dấu cách)

Ví dụ: trung bình vàng đến 9 chữ số thập phân là

1.618033988

Hiển thị chữ số cuối cùng mà không làm tròn, vì nó sẽ xuất hiện trong một bản mở rộng thập phân dài hơn. Chữ số tiếp theo trong ý nghĩa vàng là số 7, nhưng số 8 cuối cùng trong ví dụ không được làm tròn thành số 9.

Số chữ số thập phân phải là p, có nghĩa là bất kỳ số 0 nào cũng phải được đưa vào.

Đáp án có dạng

không hợp lệ - bạn phải sử dụng mở rộng thập phân.

Bạn có thể xuất tối đa 1 dòng mới hàng đầu và tối đa 1 dòng mới. Bạn không được xuất bất kỳ dấu cách nào, hoặc bất kỳ ký tự nào khác ngoài các chữ số và điểm dừng / điểm dừng / thời gian duy nhất.

Ghi bàn

Đây là mã golf tiêu chuẩn: điểm của bạn là số byte trong mã của bạn.


Bảng xếp hạng

(Sử dụng đoạn trích bảng xếp hạng của Martin )

Câu trả lời:


17

đc, 12

?kdd*4+v+2/p
  • ? Đẩy n và p lên ngăn xếp
  • k đặt độ chính xác cho p
  • dd nhân đôi n hai lần (tổng cộng ba bản)
  • * nhân n * n
  • 4+ thêm 4
  • v lấy căn bậc hai
  • + thêm n (bản sao cuối cùng trên ngăn xếp)
  • 2/ chia cho 2
  • p in

Testcase:

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

7
Công cụ phù hợp cho công việc.
Dennis

5
@Dennis phải là lần đầu tiên CJam dài gần gấp 3 lần một thứ khác ;-)
Chấn thương kỹ thuật số

2

R, 116 byte

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

Điều này đọc hai số nguyên từ STDIN và in kết quả sang STDOUT. Bạn có thể thử nó trực tuyến .

Ungolfed + giải thích:

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

Nếu bạn chưa Rmpfrcài đặt thư viện, bạn có thể install.packages("Rmpfr")và tất cả những giấc mơ của bạn sẽ thành hiện thực.


1

Toán học, 50 byte

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

Xác định một hàm ẩn danh có nptheo thứ tự. Tôi sử dụng Floorđể ngăn ngừa làm tròn với SetAccuracy, mà tôi cần để có được đầu ra thập phân.


@Arcinde Tôi không thể sử dụng số chính xác của máy, vì chúng không thể xử lý p>15.
2012rcampion

1

CJam, 35 byte

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

Đọc p trước, sau đó n .

Hãy thử trực tuyến trong trình thông dịch CJam .

Làm thế nào nó hoạt động

Chúng tôi chỉ cần tính công thức từ câu hỏi cho n × 10 p , lấy phần nguyên và phần phân số của kết quả chia cho 10 p , đệm phần phân số với các số 0 đứng đầu để có được chữ số p và in các phần được phân tách bằng dấu chấm.

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 byte

Khi tôi đang xem các câu trả lời, có vẻ như câu trả lời của CJam sử dụng phương pháp cơ bản giống như phương pháp này. Nó tính toán câu trả lời n*10**pvà sau đó thêm vào dấu thập phân. Nó cực kỳ kém hiệu quả do cách tính phần nguyên của căn bậc hai (chỉ cần thêm 1 cho đến khi nó đến đó).

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 byte

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

Nó sử dụng phần mở rộng toán học BC Math , trên một số hệ thống, không thể có sẵn. Nó cần được đưa vào thời gian biên dịch bằng cách chỉ định--enable-bcmath tùy chọn dòng lệnh. Nó luôn có sẵn trên Windows và có vẻ như nó cũng được bao gồm trong phiên bản PHP đi kèm với OSX.

Cập nhật :

Tôi đã áp dụng tất cả các hack được đề xuất bởi @blackhole trong các bình luận của họ (cảm ơn bạn!) Sau đó tôi đã siết việc khởi tạo $nvào lần sử dụng đầu tiên (đã lưu thêm 3 byte) và bây giờ mã vừa với một dòng trong hộp mã ở trên.


@Hố đen. 85, thực sự. Tôi có thể đã đọc 86 (đã lựa chọn lớn hơn một chút) và viết 68 do nhầm lẫn. Đã sửa bây giờ.
axiac

1
Không vấn đề gì :). Bằng cách này, bạn có thể có ít hơn 1 byte: loại bỏ dấu ngoặc đơn xung quanh echo, chỉ để lại một khoảng trắng sau nó.
Hố đen

1
Và vì bạn sẽ bcscalequay trở lại true, bạn có thể sử dụng $n=$argv[bcscale($argv[2])];và lưu thêm 2 byte.
Hố đen

Đó là một hack tốt đẹp.
axiac

Mã bẩn là một nghệ thuật: P. Ồ, cái cuối cùng: bcpow($n,2)thay vì bcmul($n,$n)giúp bạn tiết kiệm 1 byte.
Hố đen

1

J, 27 byte

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

Giải trình:

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

Gọi nó như thế này:

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

Một giải pháp khác, hơi mát:

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

Tính toán gốc của đa thức x ^ 2 - nx - 1. Thật không may, cách J định dạng kết quả làm cho việc lấy lại gốc mong muốn lâu hơn một chút.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.