조화로운“수렴”


16

교류 고조파 시리즈는 잘 알려진 수렴 시리즈입니다.

1/1-1/2 + 1/3-1/4 + 1/5-1/6 + ...

"분명히", 2의 자연 로그에 수렴한다는 것이 분명합니다.

이 시리즈는 절대적으로 수렴 적이 지 않기 때문에 단순히 용어를 재 배열함으로써 원하는 것에 접근 할 수 있습니다. 시리즈가 e 에 수렴되기를 원한다고 가정하십시오 . 내가해야 할 일은 이것입니다.

1/1 + 1/3 + ... + 1/65-1/2 + 1/67 + ... + 1/175-1/4

패턴을 잡지 않으면 분명한 패턴이 없습니다. 작동 방식은 다음과 같습니다.

  1. 긍정적이고 부정적인 용어로 교류 고조파 계열의 용어를 고려하십시오.
  2. 목표를 초과 할만큼 긍정적 인 용어 만 합산하십시오 (e). (일명 sum > target)
  3. 다음 음수를 뺍니다.
  4. 2로 돌아갑니다.

2 단계에서이면 sum == target다른 긍정적 인 용어를 추가해야합니다.

이를 통해 다음과 같이 각 번호와 관련된 시퀀스를 정의 할 수 있습니다.

  • 위의 알고리즘을 따르십시오
  • 각 양의 항에 대해 1을 출력합니다.
  • 각 음의 항에 대해 0을 출력하십시오.

이 시퀀스를 숫자의 "하모니 비트 패턴"이라고하겠습니다. 예를 들어, e의 HBP는 다음과 같이 시작합니다.

1, 1, 1, 1, <32 times>, 0, 1, 1, <54 times>, 0, 1, 1, ...

당신의 도전 :

당신은 주어질 것입니다 :

  • [-10, 10] 범위 의 합리적인 입력 목표 (참고 : 고조파 계열을 통해 10에 도달하더라도 수백만 개의 용어가 필요함). 이것은 10 진수 (일명 1.1)이거나 직접 합리적 일 수 있습니다 (일명 12/100)
  • 출력 할 고조파 비트 패턴의 항 수를 지정 하는 양의 int n 입력.

대상 의 정확한 조화 비트 패턴을 지정된 수의 항 으로 출력 해야합니다. 공백으로 구분 된 값, 쉼표로 구분, 구분 없음 등을 출력 할 수 있습니다. 0과 1의 패턴이 명확하게 보이고 일정한 분리로 왼쪽에서 오른쪽으로 읽는 한.

테스트 사례

>>> 0, 1
1
>>> 0, 2
10
>>> 0, 7
1000010
>>> 1, 10
1101011011
>>> 1.01, 3
110
>>> 1.01, 24
110101101101101101101101
>>> 2.71, 32
11111111111111111111111111111111
>>> 2.71, 144
111111111111111111111111111111110111111111111111111111111111111111111111111111111111111101111111111111111111111111111111111111111111111111111111
>>> -9.8, 100
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

이후주의 -9.8첫 번째, 너무 커서 1출력 될 그 곳 주위에 149496620(값이 정확하지 않을 수 있으므로, 수레를 통해 계산 된) 일 임기가.

답변:


3

펄, 69 바이트

use bigrat;$s+=.5/($s>$ARGV[$_=0]?-++$n:++$p-++$_/2),print for 1..pop

입력을 명령 행 인수로 사용합니다.

설명 : bigrat정확한 계산을 위해 모든 곳에서 분수를 사용할 수 있습니다. $s용어 전류 합, $ARGV[0]목표 값이다 pop(동일 $ARGV[1]) 용어의 수를 나타내고, $p그리고 $n양 및 음의 장기 수를 나타낸다. $_인 하나 1또는 0양 또는 음의 용어가 첨가 여부에 따라.


3

하스켈, 92 91 90 바이트

import Data.Ratio
f=(.h 0 1 2).take
h a p q z|a>z=0:h(a-1%q)p(q+2)z|1<2=1:h(a+1%p)(p+2)q z

사용 예 : f 24 1.01-> [1,1,0,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1].

h네 개의 매개 변수를 전달하여 무한 비트 패턴을 빌드합니다 a. 현재 합계입니다. 음수 p항에 q대한 다음 양수 항의 분모입니다 . z대상 번호입니다. f모든 것을 시작하고 결과를 length로 자릅니다 n.

편집 : @ Zgarb는 저장할 바이트를 찾았습니다. 감사!


h a p q대신 정의 h p q a하면 바이트 가 저장됩니다.
Zgarb

무한 결과 목록을 길이 n 중 하나로 트리밍하는 데 7 바이트가 소비됩니다 . 실제로 결과로 무한 목록을 제공하는 것이 훨씬 더 좋습니다.
시계 반대 방향으로 돌리지

1

파이썬 3 128 124 바이트

from fractions import*
F=Fraction
*c,s=2,1,0
t=F(input())
for i in'x'*int(input()):w=s<=t;s+=F(w*2-1,c[w]);c[w]+=2;print(+w)

이것은 파이썬 Fraction클래스를 사용합니다.

from fractions import* 
F=Fraction
*c,s=2,1,0                # c = [2, 1]. s = 0
                          # c is my positive/negative term counter, s is the sum
t=F(input())              # input a fraction
for i in'x'*int(input()): # Do this for for the chosen number of terms, as per the spec
  w=s<=t;                 # "w" or which one do we choose? Positive or negative?
  s+=F(w*2-1,c[w]);       # w*2-1 gives 1 if w else -1. Gives 1 if we need to add, else -1
  c[w]+=2;                # Increment the coefficient we chose
  print(+w)               # Output that. The +w coerces the bool to an int.

1
'x'*int(input())?
FryAmTheEggman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.