調和のとれた「収束」


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に到達する場合でも、数百万の用語が必要です)。これは小数(別名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

Perl、69バイト

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

入力をコマンドライン引数として受け取ります。

説明bigrat正確な計算のためにどこでも分数を有効にします。$sは現在の用語の合計$ARGV[0]、ターゲット値、pop(と同じ$ARGV[1])は用語の数を表し、正と負の用語カウント$p$n表します。$_は、正または負の用語が追加されたかどうかのいずれ10です。


3

Haskell、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次の4つのパラメーターを実行することにより、無限ビットパターンを構築します:aは現在の合計です。負の項のp場合、次の正の項の分母ですqzターゲット番号です。fすべてを開始し、結果をlengthに切り捨てnます。

編集:@Zgarbは保存するバイトを見つけました。ありがとう!


バイトh a p qh p q a節約する代わりに定義すると。
ズガーブ

無限の結果リストを長さnの 1つにトリミングするために7バイトが費やされることに注意してください。実際には、結果として無限リストを指定する方がはるかに良いでしょう。
反時計回りを回すのをやめた

1

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

これはPythonの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.