Tiếp tục phân số của số gốc vuông


10

Giới thiệu

Nhiệm vụ của bạn là tạo ra 1000 thuật ngữ đầu tiên trong biểu diễn phần tiếp theo của tổng số căn bậc hai của căn bậc 2 và căn bậc ba của 3.

Nói cách khác, tạo chính xác danh sách sau (nhưng định dạng đầu ra là linh hoạt)

[2, 6, 1, 5, 7, 2, 4, 4, 1, 11, 68, 17, 1, 19, 5, 6, 1, 5, 3, 2, 1, 2, 3, 21, 1, 2, 1, 2, 2, 9, 8, 1, 1, 1, 1, 6, 2, 1, 4, 1, 1, 2, 3, 7, 1, 4, 1, 7, 1, 1, 4, 22, 1, 1, 3, 1, 2, 1, 1, 1, 7, 2, 7, 2, 1, 3, 14, 1, 4, 1, 1, 1, 15, 1, 91, 3, 1, 1, 1, 8, 6, 1, 1, 1, 1, 3, 1, 2, 58, 1, 8, 1, 5, 2, 5, 2, 1, 1, 7, 2, 3, 3, 22, 5, 3, 3, 1, 9, 1, 2, 2, 1, 7, 5, 2, 3, 10, 2, 3, 3, 4, 94, 211, 3, 2, 173, 2, 1, 2, 1, 14, 4, 1, 11, 6, 1, 4, 1, 1, 62330, 1, 17, 1, 5, 2, 5, 5, 1, 9, 3, 1, 2, 1, 5, 1, 1, 1, 11, 8, 5, 12, 3, 2, 1, 8, 6, 1, 3, 1, 3, 1, 2, 1, 78, 1, 3, 2, 442, 1, 7, 3, 1, 2, 3, 1, 3, 2, 9, 1, 6, 1, 2, 2, 2, 5, 2, 1, 1, 1, 6, 2, 3, 3, 2, 2, 5, 2, 2, 1, 2, 1, 1, 9, 4, 4, 1, 3, 1, 1, 1, 1, 5, 1, 1, 4, 12, 1, 1, 1, 4, 2, 15, 1, 2, 1, 3, 2, 2, 3, 2, 1, 1, 13, 11, 1, 23, 1, 1, 1, 13, 4, 1, 11, 1, 1, 2, 3, 14, 1, 774, 1, 3, 1, 1, 1, 1, 1, 2, 1, 3, 2, 1, 1, 1, 8, 1, 3, 10, 2, 7, 2, 2, 1, 1, 1, 2, 2, 1, 11, 1, 2, 5, 1, 4, 1, 4, 1, 16, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 8, 1, 2, 1, 1, 22, 3, 1, 8, 1, 1, 1, 1, 1, 9, 1, 1, 4, 1, 2, 1, 2, 3, 5, 1, 3, 1, 77, 1, 7, 1, 1, 1, 1, 2, 1, 1, 27, 16, 2, 1, 10, 1, 1, 5, 1, 6, 2, 1, 4, 14, 33, 1, 2, 1, 1, 1, 2, 1, 1, 1, 29, 2, 5, 3, 7, 1, 471, 1, 50, 5, 3, 1, 1, 3, 1, 3, 36, 15, 1, 29, 2, 1, 2, 9, 5, 1, 2, 1, 1, 1, 1, 2, 15, 1, 22, 1, 1, 2, 7, 1, 5, 9, 3, 1, 3, 2, 2, 1, 8, 3, 1, 2, 4, 1, 2, 6, 1, 6, 1, 1, 1, 1, 1, 5, 7, 64, 2, 1, 1, 1, 1, 120, 1, 4, 2, 7, 3, 5, 1, 1, 7, 1, 3, 2, 3, 13, 2, 2, 2, 1, 43, 2, 3, 3, 1, 2, 4, 14, 2, 2, 1, 22, 4, 2, 12, 1, 9, 2, 6, 10, 4, 9, 1, 2, 6, 1, 1, 1, 14, 1, 22, 1, 2, 1, 1, 1, 1, 118, 1, 16, 1, 1, 14, 2, 24, 1, 1, 2, 11, 1, 6, 2, 1, 2, 1, 1, 3, 6, 1, 2, 2, 7, 1, 12, 71, 3, 2, 1, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 1, 3, 5, 5, 1, 1, 1, 1, 4, 1, 1, 1, 3, 1, 4, 2, 19, 1, 16, 2, 15, 1, 1, 3, 2, 3, 2, 4, 1, 3, 1, 1, 7, 1, 2, 2, 117, 2, 2, 8, 2, 1, 5, 1, 3, 12, 1, 10, 1, 4, 1, 1, 2, 1, 5, 2, 33, 1, 1, 1, 1, 1, 18, 1, 1, 1, 4, 236, 1, 11, 4, 1, 1, 11, 13, 1, 1, 5, 1, 3, 2, 2, 3, 3, 7, 1, 2, 8, 5, 14, 1, 1, 2, 6, 7, 1, 1, 6, 14, 22, 8, 38, 4, 6, 1, 1, 1, 1, 7, 1, 1, 20, 2, 28, 4, 1, 1, 4, 2, 2, 1, 1, 2, 3, 1, 13, 1, 2, 5, 1, 4, 1, 3, 1, 1, 2, 408, 1, 29, 1, 6, 67, 1, 6, 251, 1, 2, 1, 1, 1, 8, 13, 1, 1, 1, 15, 1, 16, 23, 12, 1, 3, 5, 20, 16, 4, 2, 1, 8, 1, 2, 2, 6, 1, 2, 4, 1, 9, 1, 7, 1, 1, 1, 64, 10, 1, 1, 2, 1, 8, 2, 1, 5, 4, 2, 5, 6, 7, 1, 2, 1, 2, 2, 1, 4, 11, 1, 1, 4, 1, 714, 6, 3, 10, 2, 1, 6, 36, 1, 1, 1, 1, 10, 2, 1, 1, 1, 3, 2, 1, 6, 1, 8, 1, 1, 1, 1, 1, 1, 1, 2, 40, 1, 1, 1, 5, 1, 3, 24, 2, 1, 6, 2, 1, 1, 1, 7, 5, 2, 1, 2, 1, 6, 1, 1, 9, 1, 2, 7, 6, 2, 1, 1, 1, 2, 1, 12, 1, 20, 7, 3, 1, 10, 1, 8, 1, 3, 1, 1, 1, 1, 2, 1, 1, 6, 1, 2, 1, 5, 1, 1, 1, 5, 12, 1, 2, 1, 2, 1, 2, 1, 1, 3, 1, 1, 1, 8, 2, 4, 1, 3, 1, 1, 1, 2, 1, 11, 3, 2, 1, 7, 18, 1, 1, 17, 1, 1, 7, 4, 6, 2, 5, 6, 4, 4, 2, 1, 6, 20, 1, 45, 5, 6, 1, 1, 3, 2, 3, 3, 19, 1, 1, 1, 1, 1, 1, 34, 1, 1, 3, 2, 1, 1, 1, 1, 1, 4, 1, 2, 1, 312, 2, 1, 1, 1, 3, 6, 6, 1, 2, 25, 14, 281, 4, 1, 37, 582, 3, 20, 2, 1, 1, 1, 2, 1, 3, 7, 8, 4, 1, 11, 2, 3, 183, 2, 23, 8, 72, 2, 2, 3, 8, 7, 1, 4, 1, 4, 1, 2, 2, 1, 2, 1, 8, 2, 4, 1, 2, 1, 2, 1, 1, 2, 1, 1, 10, 2, 1, 1, 5, 2, 1, 1, 1, 2, 1, 1, 2, 1, 3, 2, 9]

Thử thách

Giới thiệu chung sau đây về phân số tiếp tục được lấy từ thử thách Đơn giản hóa một phân số tiếp tục .

Các phân số tiếp tục là các biểu thức mô tả các phân số lặp đi lặp lại. Chúng có thể được biểu thị bằng đồ họa:

phần tiếp tục

Hoặc chúng có thể được biểu diễn dưới dạng danh sách các giá trị: [a0, a1, a2, a3, ... an]

Thách thức này là tìm ra phần tiếp theo của tổng số có chữ số sqrt(2)sqrt(3), tổng số có chữ số được xác định như sau,

Lấy các chữ số trong biểu diễn thập phân của sqrt(2)sqrt(3), và lấy chữ số tổng bằng chữ số:

    1.  4  1  4  2  1  3  5  6  2  3 ...
+   1.  7  3  2  0  5  0  8  0  7  5 ...
=   2. 11  4  6  2  6  3 13  6  9  8 ...

Sau đó, chỉ giữ chữ số cuối của tổng và biên dịch chúng trở lại biểu diễn thập phân của một số thực

    1.  4  1  4  2  1  3  5  6  2  3 ...
+   1.  7  3  2  0  5  0  8  0  7  5 ...
=   2. 11  4  6  2  6  3 13  6  9  8 ...
->  2.  1  4  6  2  6  3  3  6  9  8 ...

Tổng chữ số-khôn ngoan của sqrt(2)sqrt(3)do đó 2.1462633698..., và khi nó được thể hiện với phân số liên tục, 1000 giá trị đầu tiên (tức là đến ) thu được là những người được liệt kê trong phần giới thiệu.a0a999

Thông số kỹ thuật

  • Bạn có thể viết một chức năng hoặc một chương trình đầy đủ. Không nên lấy đầu vào. Nói cách khác, chức năng hoặc chương trình nên hoạt động đúng mà không có đầu vào. Nó không quan trọng chức năng hoặc chương trình làm gì nếu đầu vào không trống được cung cấp.

  • Bạn nên xuất ra STDOUT. Chỉ khi ngôn ngữ của bạn không hỗ trợ xuất ra STDOUT, bạn mới nên sử dụng ngôn ngữ tương đương gần nhất trong ngôn ngữ của mình.

  • Bạn không cần phải giữ STDERR sạch và dừng chương trình do lỗi được cho phép miễn là đầu ra được yêu cầu được thực hiện trong STDOUT hoặc tương đương.

  • Bạn có thể cung cấp đầu ra thông qua bất kỳ hình thức tiêu chuẩn .

  • Đây là , số byte thấp nhất sẽ thắng.

  • Như thường lệ, sơ hở mặc định áp dụng ở đây.

Câu trả lời:


2

Tập lệnh Kotlin 1.1 , 304 293 byte

import java.math.BigDecimal as b
import java.math.*
val m=MathContext(1022)
var B=b(2)
var A=b((""+B.sqrt(m)).zip(""+b(3).sqrt(m)).joinToString(""){(a,b)->if(a=='.')".";else ""+(a-'0'+(b-'0'))%10})
val g=b(1).setScale(1022)
repeat(1000){println(B);A=g/(A-B);B=A.setScale(0,RoundingMode.FLOOR)}

Thật không may một chút dài dòng: /

Phải được chạy với JDK 9, như sqrtđã được thêm vào BigDecimaltrong bản phát hành này. Thật thú vị, tôi không thể tìm thấy một trang web TIO có cả hai tính năng của Kotlin 1.1 và JDK 9 (Ideone và repl.it đều chạy Kotlin 1.0, không hỗ trợ phá hủy trong lambdas và TIO phàn nàn rằng điều sqrtđó không tồn tại.)

In từng phần tử cách nhau bởi một dòng mới.

Chỉnh sửa ( -11): di chuyển printlnđến phần đầu của thân vòng lặp và thêm một lần lặp bổ sung để tránh lặp lại lệnh gọi phương thức. Một tính toán bổ sung được thực hiện, nhưng nó không được sử dụng cho bất cứ điều gì.


2

Python 2 , 193 ... 179 178 byte

d=10
u=d**2000
v=u*u
def s(n,a=d,i=9):
 while a-i:i,a=a,(a+n/a)/2
 return a
p,q,r,t=s(2*v),s(3*v),1,0
while p:t+=(p+q)%d*r;p/=d;q/=d;r*=d
for i in range(1000):print t/u;t=v/(t%u)

Hãy thử trực tuyến!

Tính toán sqrt(2)sqrt(3)chính xác như vậy với một mã ngắn là một công việc khó khăn trong Python và các ngôn ngữ khác.

Cần 2000 chữ số để đảm bảo mở rộng là chính xác (1020 đủ, nhưng tôi sẽ không sửa đổi vì không cải thiện) và các dòng 4-6 là căn bậc hai số nguyên.

193> 180: Tổng modulo thông minh chữ số hiện được thực hiện bằng một vòng lặp thay vì thao tác mảng

180> 179: Đã thay thế 6 lần 10sử dụng dvới chi phí xác định bằng 5 byte, cắt tổng cộng 1 byte

179> 178: Chỉ cần nhận ra rằng a!=icó thể được thay thế bởia-i


1

Thạch , 32 byte

ȷ*`
%¢¢²¤:
2,3×Ñ×ÑƽDS%⁵ḌÇȷСṖ:Ñ

Hãy thử trực tuyến!


Về cơ bản sử dụng số học điểm cố định. M có thể hoạt động tốt hơn ở đây, nhưng bằng cách nào đó floor(HUGE_NUMBER × sqrt(2)không muốn đánh giá quá lớn HUGE_NUMBER. Dù sao, phân chia điểm cố định chắc chắn là tốt hơn.


Giải trình:

-------
ȷ*`       Calculate the base for fixed-point arithmetic.
ȷ         Number 1000.
 *        Raise to the power of...
  `       self. (so we have 1000 ** 1000 == 1e3000) Let B=1e3000.

-------
%¢¢²¤:    Given f × B, return a number approximately (1/frac(f)) × B.
          Current value: f × B.
%¢        Modulo by B. Current value: frac(f) × B.
  ¢²¤     B² (that is, 1e6000)
     :    integer-divide by. So we get B²/(frac(f)×B) ≃ 1/frac(f) × B.

-------
2,3×Ñ×ÑƽDS%⁵ḌÇȷСṖ:Ñ  Main link.
2,3                    The list [2,3].

    Ñ                  This refers to the next link as a monad, which is the
                       first link (as Jelly links wraparound)
   ×                   Multiply by. So we get [2,3]×1e3000 = [2e3000,3e3000]
     ×Ñ                Again. Current value = [2e6000,3e6000] = [2B²,3B²]

       ƽ              Integer square root.
                       Current value ≃ [sqrt(2B²),sqrt(3B²)]
                                     = [B sqrt(2),B sqrt(3)]

         DS            Decimal digits, and sum together.
           %⁵          Modulo 10.
             Ḍ         Convert back from decimal digits to integer.

                С     Repeatedly apply...
              Ç          the last link...
               ȷ         for 1000 times, collecting the intermediate results.
                  Ṗ    Pop, discard the last result.
                   :Ñ  Integer divide everything by B.

Thật không may ×⁺Ñ, không làm việc. Cách khác ×Ѳ$.
dùng202729

Nâng cao. Giải thích sẽ được nhiều đánh giá cao.
Weijun Zhou

1
@ WeijunZhou Xong, hãy cho tôi biết nếu bạn không hiểu điều gì đó.
dùng202729

1

Haskell 207 byte

Tôi không thể tìm thấy một cách dễ dàng để tính toán phần tiếp theo của lazilly, vì vậy tôi cũng đã làm việc với 2000 chữ số.

import Data.Ratio
r#y|x<-[x|x<-[9,8..],r>(y+x)*x]!!0=x:(100*(r-(y+x)*x))#(10*y+20*x)
c r|z<-floor r=z:c(1/(r-z%1))
main=print.take 1000.c$foldl1((+).(10*))(take 2000$(`mod`10)<$>zipWith(+)(3#0)(2#0))%10^1999

Thật đáng tiếc! Tôi đã mong đợi được thấy một câu trả lời của Haskell tạo ra danh sách vô hạn và đánh giá nó một cách lười biếng ...
Weijun Zhou

@ WeijunZhou Tôi sẽ thử lại sau khi tôi có thời gian. Ít nhất sqrt tạo danh sách vô hạn. Tôi chỉ cần tìm ra làm thế nào để đảo ngược số thập phân được viết dưới dạng danh sách infinte. Có lẽ ai đó có thể giúp đỡ
Damien
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.