자릿수 제곱근의 계속되는 분수


10

소개

당신의 임무는 2의 제곱근과 3의 제곱근의 연속적인 분수 표현으로 처음 1000 개의 항을 생성하는 것입니다.

즉, 다음 목록을 정확하게 생성하십시오 (그러나 출력 형식은 유연합니다)

[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]

도전

연속 분수에 대한 다음의 일반적인 소개 는 연속 분수 단순화 문제에서 발췌 한 것 입니다.

연속 분수는 분수를 반복적으로 설명하는 표현식입니다. 그것들은 그래픽으로 표현 될 수 있습니다 :

계속 분수

또는 값 목록으로 표시 될 수 있습니다. [a0, a1, a2, a3, ... an]

이 과제는의 숫자와 숫자의 합의 연속 된 부분을 찾는 것입니다. sqrt(2)그리고 sqrt(3)숫자의 합계는 다음과 같이 정의됩니다.

sqrt(2)및 의 십진수 표현으로 숫자를 가져 와서 sqrt(3)숫자로 숫자를 구하십시오.

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

그런 다음 합계의 마지막 숫자 만 유지하고 실수의 십진수 표현으로 다시 컴파일하십시오.

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

따라서 sqrt(2)와 의 자릿수 합계 sqrt(3)는이므로 2.1462633698...연속 분수로 표현할 때 처음 1000 개 값 (즉 ~ )은 소개 섹션에 나열된 값 입니다.a0a999

명세서

  • 함수 또는 전체 프로그램을 작성할 수 있습니다. 입력도받지 않아야합니다. 다시 말해, 기능이나 프로그램이 입력없이 제대로 작동해야합니다. 비어 있지 않은 입력이 제공되면 함수 나 프로그램의 기능은 중요하지 않습니다.

  • STDOUT으로 출력해야합니다. 귀하의 언어가 STDOUT으로의 출력을 지원하지 않는 경우에만 귀하의 언어에서 가장 가까운 것을 사용해야합니다.

  • STDERR을 깨끗하게 유지할 필요는 없으며 필요한 출력이 STDOUT 또는 이와 동등한 출력으로 작성되는 한 오류로 프로그램을 중지 할 수 있습니다.

  • 모든 표준 양식을 통해 출력을 제공 할 수 있습니다 .

  • 이것은 가장 적은 바이트 수의이기는 입니다.

  • 평소와 같이 기본 허점 이 여기에 적용됩니다.

답변:


2

Kotlin 1.1 스크립트 , 304 293 바이트

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

불행히도 조금 장황하다 : /

이 릴리스 sqrt에 추가 된 대로 JDK 9로 실행해야합니다 BigDecimal. 흥미롭게도 Kotlin 1.1과 JDK 9 기능을 모두 갖춘 TIO 사이트를 찾을 수 없었습니다 sqrt.

개행으로 구분 된 각 요소를 인쇄합니다.

편집 ( -11) : println루프 본문의 시작 부분으로 이동 하고 메소드 반복이 반복되지 않도록 추가 반복을 추가했습니다. 추가 계산이 수행되지만 아무것도 사용되지 않습니다.


2

파이썬 2 , 193 ... 179178 바이트

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)

온라인으로 사용해보십시오!

짧은 코드를 사용하여 정밀도를 계산 sqrt(2)하고 계산 sqrt(3)하는 것은 Python 및 기타 언어에서 어려운 작업입니다.

확장이 올바른지 확인하려면 2000 자리가 필요하며 (1020이면 충분하지만 개선되지 않으므로 수정하지 않을 것입니다) 4-6 행은 정수 제곱근입니다.

193> 180 : 자릿수 단위 모듈로 합은 이제 배열 조작 대신 루프에 의해 전달됩니다.

180> 179 : 6 명의 발생 대체 10하여 d5 바이트로 정의하는 비용을 총 1 바이트 절삭

179> 178 : 다음 a!=i으로 대체 할 수 있음을 깨달았습니다.a-i


1

젤리 , 32 바이트

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

온라인으로 사용해보십시오!


기본적으로 고정 소수점 산술을 사용하십시오. M은 여기서 더 잘 작동 할 수 있지만 어떻게 든 floor(HUGE_NUMBER × sqrt(2)너무 큰 평가하고 싶지 않습니다 HUGE_NUMBER. 어쨌든 고정 소수점 나누기가 더 좋습니다.


설명:

-------
ȷ*`       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.

불행히도 ×⁺Ñ작동하지 않습니다. 또는 ×Ѳ$.
user202729

공감. 설명 감사합니다.
Weijun Zhou

1
@WeijunZhou 완료, 이해가되지 않는 경우 알려주세요.
user202729

1

하스켈 207 바이트

연속 분수 lazilly를 계산하는 쉬운 방법을 찾을 수 없으므로 2000 자리로도 잘 작동했습니다.

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

얼마나 안타깝습니까! 나는 무한리스트를 생성하고 그것을 게으르게 평가하는 Haskell의 답변을 기대하고있었습니다.
Weijun Zhou

@WeijunZhou 시간이 있으면 나중에 다시 시도하겠습니다. 적어도 sqrt는 무한리스트를 생성합니다. 난 그냥 무한 목록으로 작성된 십진수를 반전하는 방법을 알아 내야합니다. 누군가 도울 수 있습니다
Damien
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.