Uyumlu “Yakınsama”


16

Dalgalı Harmonik Seri tanınmış yakınsak dizisidir.

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

"Açıkça", 2'nin doğal günlüğüne yakınlaştığı açıktır. Yoksa öyle mi?

Dizi kesinlikle yakınsak olmadığından , terimleri yeniden düzenleyerek, istediğim her şeye yaklaşmasını sağlayabilirim. Dizinin e'ye yakınsamasını istiyorum . Tek yapmam gereken bu:

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

Deseni yakalamadıysanız, belirgin bir tane yok. Şöyle çalışır:

  1. Pozitif ve negatif terimler açısından alternatif harmonik serilerin terimlerini düşünün.
  2. Hedefimizi aşmaya yetecek kadar pozitif terim ekleyin (e). (aka sum > target)
  3. Bir sonraki negatif terimi çıkarın.
  4. 2'ye geri dönün.

2. adımda, eğer bizim ise sum == target, başka bir olumlu terim eklemeniz gerektiğini unutmayın.

Bundan, her sayı ile ilişkili bir diziyi aşağıdaki gibi tanımlayabiliriz:

  • Yukarıdaki algoritmayı izleyin
  • Her pozitif terim için çıktı 1.
  • Her negatif terim için çıktı 0.

Bu diziye bir sayının "Uyumlu Bit Deseni" diyelim. Örneğin, e'nin HBP'si şöyle başlar:

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

Zorluğunuz:

Size verilecek:

  • [-10, 10] aralığında rasyonel bir giriş hedefi (not: harmonik serisi ile 10'a ulaşmak bile milyonlarca terim alır). Bu ondalık (aka 1.1) olabilir veya doğrudan rasyonel (aka 12/100) olabilir
  • Çıktı için Uyumlu Bit Paterni terimlerinin sayısını belirten pozitif bir int n girişi.

Hedefin tam Uyumlu Bit Modelini belirtilen sayıda terime çıkarmanız beklenir . Boşlukla ayrılmış değerler, virgülle ayrılmış, ayırma vb. Çıktılar alabilirsiniz; 0'ların ve 1'lerin paterni açıkça görülebildiği ve tutarlı bir ayırma ile soldan sağa okunduğu sürece

Test Durumları

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

Çünkü bu Not -9.8: ilk olarak, büyük 1çıkış olacağını yerde civarındadır 149496620(değer tam olmayabilir, böylece yüzer ile hesaplandı) inci terim.

Yanıtlar:


3

Perl, 69 bayt

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

Girdileri komut satırı bağımsız değişkenleri olarak alır.

Açıklama : bigratdoğru hesaplamalar için her yerde kesirleri etkinleştirir. $sşu anda terimlerin toplamıdır $ARGV[0], hedef değerdir pop(aynı $ARGV[1]) terimlerin sayısını $pve $npozitif ve negatif terim sayılarını temsil eder. $_ya 1ya 0pozitif ya da negatif bir dönem ilave edildi bağlı olarak.


3

Haskell, 92 91 90 bayt

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

Kullanım örneği: 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].

hetrafında dört parametre taşıyarak sonsuz bit paterni oluşturur: ageçerli toplamdır. negatif terimler için bir psonraki pozitif terimin paydasıdır q. zhedef sayıdır. fher şeyi başlatır ve sonucu boyuna keser n.

Düzenleme: @Zgarb kaydedilecek bir bayt buldu. Teşekkürler!


Bayt h a p qyerine tanımlama yapar h p q a.
Zgarb

Sonsuz sonuç listesini n uzunluğundan birine kırpmak için 7 bayt harcandığına dikkat edilmelidir . Sonuç olarak sonsuz listeyi vermek aslında çok daha hoş olurdu.
Buna durdurdu counterclockwis

1

Python 3, 128 124 bayt

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)

Bu Python Fractionsınıfını kullanır.

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.