Khinchin không đổi đến càng nhiều số thập phân càng tốt trong 64 byte hoặc ít hơn


22

Hằng số Khinchin là hằng số toán học gây tò mò, theo Wolfram MathWold , "nổi tiếng là khó tính toán với độ chính xác cao" .

Đây là 100 chữ số:

2.685452001065306445309714835481795693820382293994462953051152345557218859537152002801141174931847697 ...

Viết chương trình bằng 64 byte hoặc ít hơn, đưa ra hằng số Khinchin đến số vị trí thập phân chính xác tối đa.

  • Bạn không được sử dụng bất kỳ hằng số hoặc hàm nào được xây dựng trong thư viện liên quan trực tiếp đến hằng số Khinchin. (ví dụ Math.Khinchin (độ chính xác) chắc chắn không được phép.)
  • Bạn có thể sử dụng các thư viện toán học để tính toán logarit, tổng, v.v.
  • Bạn có thể mã hóa tất cả hoặc một phần câu trả lời của bạn.
  • Chương trình của bạn phải tạo ra đầu ra hữu hạn và chạy trong vòng chưa đầy một giờ trên một máy tính hiện đại hợp lý (chẳng hạn như những máy tính được liệt kê ở đây ).
  • Bạn phải xuất ra thiết bị xuất chuẩn. Không có đầu vào.
  • Bạn có thể sử dụng bất kỳ ký tự nào bạn muốn miễn là http://otherseff.in/byte-corer đăng ký 64 byte hoặc ít hơn.

Chấm điểm

Điểm của bạn là số chữ số liên tiếp trong Khinchin không đổi chương trình của bạn xuất chính xác, bắt đầu bằng 2,68 ... Bạn có thể xuất các chữ số không chính xác nhưng chỉ chữ số chính xác cuối cùng được tính vào điểm của bạn.

Ví dụ: đầu ra của

2.68545200 2 0653064453097148354817956938383838229399446295305115234555721

sẽ ghi được 9 điểm. Một cho mỗi chữ số 2 6 8 5 4 5 2 0 0nhưng không có gì sau 2 nên là 1.


2
Tại sao bạn cho phép mã hóa toàn bộ câu trả lời?
William Barbosa

5
@WilliamBarbosa tại sao không? lý tưởng là nên có một giải pháp đạt điểm cao hơn 31. nếu không, thật không may.
Martin Ender

1
Là unicode được phép? Làm thế nào để đếm nó?
aditsu

3
Bạn nên cho phép 64b thay vì 32 và đếm tất cả các ký tự dưới dạng byte UTF-8 ( mẹeff.in/ byte- corer ) (= 1 đến 4 byte mỗi char tùy thuộc vào mặt phẳng Unicode). Ngoài ra, các giải pháp hiện tại có thể dễ dàng được điều chỉnh theo 64b
xem

3
@PeterTaylor Tôi đã mã hóa một giải pháp điểm nổi CJam và để tôi nói cho bạn biết, độ chính xác hạn chế không phải là vấn đề chính: p
aditsu 18/07/14

Câu trả lời:


11

Phong, hơn 200

Lệnh Maple sau đây tính hằng số Khinchin với độ chính xác được yêu cầu (ở đây, 200 chữ số):

evalf[200](exp(sum((-1)^k*(2-2^k)*ζ(1,k)/k,k=2..∞)/ln(2)));

Mã này sẽ hoạt động nếu bạn sao chép-dán nó vào giao diện đồ họa Maple. Cái ζnày lấy hai byte trong UTF-8 và ba, với tổng số 62 byte.

Viết ra các phiên bản ASCII của các ký hiệu đó, ngay cả với thủ thuật sử dụng min()thay vì infinity, than ôi, mang lại số byte lên tới 66:

evalf[200](exp(sum((-1)^k*(2-2^k)*Zeta(1,k)/k,k=2..min())/ln(2)));

Số chữ số được tính có thể dễ dàng điều chỉnh bằng cách thay đổi số trong ngoặc vuông sau evalf. Trên máy tính khá cũ của tôi, 200 chữ số dường như kết thúc sau khoảng nửa giờ; của bạn có thể có khả năng nhiều hơn. Lưu ý rằng Maple làm tròn kết quả với độ chính xác được yêu cầu thay vì cắt bớt nó, vì vậy số chữ số khớp thực tế có thể ít hơn một chút.

Phương pháp tính hằng số này dựa trên công thức (9) từ trang MathWorld , được trích dẫn ở đó cho Gosper (1996, Pers. Comm.):

            Phương trình

Đây là phương pháp hiệu quả nhất mà tôi quản lý (hầu như) ép thành 64 byte hoặc ít hơn.


Khá gọn gàng. Giá như tôi có Maple: /
Sở thích của Calvin

12

CJam - 118

2'."*;TeT?_aN{.i9B*ZEay
G`9~eW}nE=Lr-`B}    )D>9m9"136b

Dùng thử tại http://cjam.aditsu.net/

Vì stackexchange phá hủy một số ký tự, đây là chương trình tạo chương trình ở trên; chạy nó trước, sau đó chạy đầu ra của nó:

"2'.\""685452001065306445309714835481795693820382293994462953051152345557218859537152002801141174931847697995153465905288090 136b:c"\"136b"

Giải trình:

2đẩy 2
'.đẩy dấu chấm
"…"là một chuỗi chứa phần còn lại của các chữ số ở dạng được mã hóa
128bchuyển đổi chuỗi thành một số, coi các ký tự là chữ số trong cơ sở 128 (thông qua mã ASCII của chúng)


2
Rất đẹp. Bạn có thể giải thích một chút không?
Kyle Kanos

@KyleKanos thêm lời giải thích
aditsu 18/07/14

Thật tuyệt vời. Tôi nên học CJam một ngày ... Ngoài ra, tôi không thể để trình thông dịch trực tuyến của bạn hoạt động trong trình duyệt web Opera, mặc dù nó hoạt động trên Firefox của tôi. Có lẽ là một vấn đề Opera, nhưng tôi nghĩ tôi sẽ đề cập đến nó.
Kyle Kanos

1
@ Calvin'sHobbies Năm 1997 Xavier Gourdon đã tính toán 110.000 chữ số đầu tiên trong 22 giờ bằng cách sử dụng tối đa bộ xử lý 250 MHz. Vì vậy, bạn có thể tính toán gấp 1000 lần số chữ số của giải pháp này trong một giờ. web.archive.org/web/20120218093629/http://pi.lacim.uqam.ca/ Kẻ
Alex L

1
@ Calvin'sHob sở thích xem liên kết này cho một chương trình hoàn chỉnh được tính toán 2000 chữ số trong 7 giây.
aditsu

5

Kona 63

Câu trả lời đơn giản khó mã hóa:

2.68545200106530644530971483548179569382038229399446295305115234

Mmm không phải là 63?
xem

@xem: lỗi đánh máy nhỏ. Đã sửa. : D
Kyle Kanos

1
Cũng hoạt động trong GNU BC
Chấn thương kỹ thuật số

@DigitalTrauma: Có lẽ cũng hoạt động với một số ngôn ngữ khác, tôi chỉ bị mắc kẹt với Kona vì tôi đã trả lời trong đó trước đây.
Kyle Kanos

5

Haskell, 5

Chà, vì không ai đăng một giải pháp bằng toán học thực tế, tôi quyết định tôi sẽ làm, mặc dù nó không gần với các câu trả lời khác.

main=print$product[(1+1/r/(r+2))**2`logBase`r|r<-[1..99999999]]

Điều này tính toán 2.6854453689859192, đó là một con số khổng lồ gồm 5 ký tự. Wolfram đã đúng khi họ nói rằng "khó tính toán với độ chính xác cao".


Chương trình 63 byte - 1 byte dự phòng! Tốt đẹp!
Chấn thương kỹ thuật số

Các byte bổ sung có thể là một byte khác 9, nhưng máy tính của tôi không thể xử lý điều đó và thậm chí nếu có thể, tôi không chắc liệu nó có dẫn đến một chữ số chính xác khác hay không.
Zaq

Sử dụng Ruby, về cơ bản, tôi đạt được mức tối đa có thể làm bằng công thức này, chạy nó trong 60 giây. Tôi đã nhận 2.685451312659854: tio.run/##KypNqvz/P9vWkEvDUE/ khăn
Đơn giản là nghệ thuật đẹp

3

Toán học, 6

(Times@@Rest@ContinuedFraction[Pi,977])^(1.`9/976)

cho

2.68545843

và chỉ sử dụng 50 byte, vì vậy có một số chỗ để tìm thứ gì đó tốt hơn Pivà sử dụng phân số tiếp tục lớn hơn, nhưng tôi không chắc nó sẽ tốt hơn rất nhiều với thời gian chạy một giờ. (Đặc biệt là vì việc tìm kiếm một sự kết hợp tốt hơn có thể sẽ mất vài ngày nếu tôi chỉ sử dụng vũ lực.)

(Tất nhiên, bạn đủ thông minh để không cho phép Khinchin~N~2000, nơi 2000có thể được thay thế bằng bất kỳ số nào mang lại cho bạn kết quả trong vòng một giờ;).)


1
+1 để sử dụng ý nghĩa của hằng số, không chỉ là một công thức.
Vi.

2

wxMaxima 3

Một phương pháp tính toán thực sự!

bfloat(product((1+1/(n*(n+2)))^(log(n)/log(2)),n,1,10000));

Sau khoảng 25 phút, nó trở lại

2.681499686663101b0

Bây giờ tôi hiểu tại sao trang Mathicala nói rằng. Tôi có 6 ký tự để chơi cùng, nhưng tôi không thể tưởng tượng được việc thêm 6 0 sẽ (a) chạy trong <60 phút và (b) cho tôi một giải pháp chính xác hơn.


Nghi ngờ: Mỗi số 0 bổ sung thêm ít hơn một chữ số chính xác: '(
Đơn giản là nghệ thuật đẹp

1

GNU BC , 5 chữ số (chương trình 54 byte)

Một nỗ lực để thực sự tính toán. GNU BC chậm kinh khủng. Quá trình này diễn ra trong 53 phút trên máy ảo Ubuntu 14.04 chạy trên MacBook Pro Retina giữa năm 2012. Kỳ lạ là nó chạy nhanh hơn trong VM so với kim loại trần OSX - có lẽ phiên bản GNU được tối ưu hóa tốt hơn cho nhiệm vụ này so với phiên bản BSD.

for(k=r=1;r++<10^7;)k*=e(l(1/(r*(r+2))+1)*l(r)/l(2))
k

Đầu ra:

2.68544536902156538295

Chú thích:

bc -lcần được sử dụng cho e()và các l()chức năng (và thiết lập tỷ lệ = 20).


1

Tính toán điểm nổi CJam - 6

1e8{I{1.II2+*/)I2mL#*}1.?}fI

Nó phù hợp với 32 byte gốc :)

Chạy với trình thông dịch java bằng java 8, nó xuất kết quả này sau khoảng một phút trên máy tính xách tay của tôi:

2.6854513126595827

Thông dịch viên trực tuyến có thể sẽ mất quá nhiều thời gian.


1

Con trăn, 64 66

print"2.%i"%int('anljsgqif7gwwwsrntcz7zv2obv6gv5us7fzfwjcaj',36)

Đầu ra:

2.68545200106530644530971483548179569382038229399446295305115234555

Bạn có thể cắt không gian sau khi printép trong một nhân vật khác.
xnor

1

Hồng ngọc - 73

Thật không may, bạn chỉ có thể chuyển đổi tối đa cơ sở 36 bằng cách sử dụng to_itrong Ruby:

"2.#{"hmegxpkvliy1vaw4lb054ep8wsqwkz2yx9cm9jvc9yfd48j".to_i 36}"

trả về

"2.6854520010653064453097148354817956938203822939944629530511523455572188595"

1

RPL / 2, 7 chữ số được tính, 61 byte

'LN(FLOOR(1/X))/(X+1)/LN(2)' { 'X' 1e-9 1 } 1e-7 INT DROP EXP

trả về 2.68545210493822 trong một phút trên máy tính xách tay cũ (intel Core2) của tôi.

Không có chức năng Zeta nào trong RPL / 2 theo như tôi biết, đây là lý do tại sao tôi đã sử dụng tích hợp (công thức 15 từ trang Mathworld). Về nguyên tắc, độ chính xác có thể được cải thiện bằng cách thay thế 1e-9 và 1e-7 bằng số nhỏ hơn, nhưng rõ ràng tôi thiếu bộ nhớ cho điều đó.

Tất nhiên dùng đến sản phẩm vô hạn giải quyết điểm này, có vẻ như

1 1 1e9 FOR I 1 1 I dup 2 + * / + I LN 2 LN / ^ * NEXT

và sẽ hoạt động như trên HP RPL calc, nhưng hóa ra tốc độ chậm hơn hai bậc (trên máy tính xách tay, không thử trên HP của tôi!) và chỉ cung cấp 6 chữ số.

Vì vậy, thuật toán tích hợp trong RPL / 2 thực sự hoạt động khá tốt.


0

Nhiều ngôn ngữ thay thế, 61

xin lỗi, đã không tìm thấy một giải pháp tốt hơn.

"2.685452001065306445309714835481795693820382293994462953051152"

Các quy tắc không nói rằng chuỗi số chính xác không thể được đặt trước bằng dấu ngoặc kép, vì vậy tôi đang sử dụng chuỗi này. Ví dụ, bằng cách thực hiện điều đó trong bảng điều khiển JS, bạn sẽ nhận được cùng một chuỗi, bao gồm cả dấu ngoặc kép.


1
Vâng, điều này hợp lệ ngay cả với một trích dẫn ở phía trước. Nó chỉ là vấn đề mà 2.685 ... không bị gián đoạn.
Sở thích của Calvin

0

Con trăn (5)

x=3**.1
p=1
for _ in[1]*10**6:p*=(x//1)**1e-6;x=1/(x%1)
print(p)

Output: 2.6854396408091694

(Đầu ra mất ~ 2 giây.)

Để thống nhất với các giải pháp toán học khác, tôi sẽ đưa ra một giải pháp thậm chí còn tệ hơn, tính toán trung bình hình học của một triệu hệ số phân số tiếp tục đầu tiên của một số vô tỷ duy nhất không phải là loại không hoạt động. Trên thực tế, tôi đã gian lận con số đó bằng cách thử một vài con số cho đến khi tôi có được một con số trùng khớp với một chữ số phụ.

Điều buồn cười: Tôi đóng băng máy tính của tôi và đã phải làm một shutdown cứng sau khi cố gắng rút ngắn mã này với các golf thủ thuật Python thay thế for _ in[1]*10**6:codevới exec("code"*10**6).


0

ES7, 56

alert`2.6854520010653064453097148354817956938203822939944629531`
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.