Kitabımın bu masadan uzak durmasını istiyorum.


21

Öykü

Bu yüzden diğer kitaplardan başka bir şey olmadan masamdan ayırmak istediğim bir kitabım var. Bunu kitap uzunluğu ile başarmak için kaç tane kitaba ihtiyacım olduğunu bilmek istiyorum .n

İşte Wolfram'daki arkadaşımın benim için çizdiği bir görselleştirme:

Wolfram'dan bir görselleştirme

Wolfram ve Wikipedia'daki konu hakkında daha fazla bilgi .

Meydan okuma

bir tamsayı verilirse , üst kitabın kitap uzunluğu kadar yatay olması gerektiğine dair kitabın kaç kitap için gerekli olduğunu belirtin. veya Aşağıdaki eşitsizlikte girişi için en küçük tamsayı değerini bulun . nn

mn

i=1m12in

Düzenleme: kesirler için en az bir IEEE tek duyarlıklı kayan nokta kullanın. gönderdikten sonra düzenleme zorluğu için özür dilerim

( OEIS A014537 )

Test durumları

 1          4
 2         31
 3        227
 5      12367
10  272400600


IIRC'nin optimal olmadığı bu özel kitap düzenlemesini kullanmak zorunda mı ?
kullanıcı253751

Yanıtlar:


13

Octave , 41 40 33 bayt

@Dennis sayesinde 1 bayt kurtarıldı

@(n)find(cumsum(.5./(1:9^n))>n,1)

Çevrimiçi deneyin!

açıklama

Bu, harmonik sayıların logaritmik bir fonksiyonla daha düşük sınırlandırılabileceği gerçeğini kullanır.

Ayrıca, harmonik sayılar tam sayılar bile >=olamayacağı için karşılaştırma değiştirilebilir >(teşekkürler, @Dennis!).

@(n)                                   % Anonymous function of n
                     1:9^n             % Range [1 2 ... 9^n]
                .5./(     )            % Divide .5 by each entry
         cumsum(           )           % Cumulative sum
                            >n         % Is each entry greater than n?
    find(                     ,1)      % Index of first true entry


10

Kabuğu , 8 bayt

V≥⁰∫m\İ0

Çevrimiçi deneyin!

Husk yapabildiği zaman rasyonel sayılar kullandığından, bunun kayan nokta sorunu yoktur.

açıklama

      İ0    The infinite list of positive even numbers
    m\      Reciprocate each
   ∫        Get the cumulative sum
V           Find the index of the first element
 ≥⁰         that is greater than or equal to the input

8 bayt, ancak hangi karakter kümesi?
john16384

3
@ john16384 Husk, her sembolün tek bir bayta karşılık geldiği kendi kod sayfasına sahiptir . İşte karşılık gelen
hexdump



3

Swift , 65 bayt

func f(n:Double){var i=0.0,s=i;while s<n{i+=1;s+=0.5/i};print(i)}

Çevrimiçi deneyin!

Ungolfed

func f(n:Double) {
  var i = 0.0, s = 0.0
  while s < n {
    i += 1;
    s += 0.5 / i
  }
  print(i)
}


3

Javascript (ES6), 34 bayt

n=>eval("for(i=0;n>0;n-=.5/i)++i")

Ungolfed

n => {
    for(i = 0; n > 0; ++i)
        n -= .5 / i
    return i;
}

Test Kılıfları


30 byte için özyineleme kullanarak benzer bir çözüm geldi. Dunno, sizinkini gördükten sonra postalayıp göndermeme konusunda.
Shaggy

1
Bir şey eksik olabilir, ama neden bir evalifadeye sarmanız gerekiyor ?
caird coinheringaahing

1
@cairdcoinherigaahing olmadan değişken gerekecektir birkaç bayt pahasına, sonunda ed. evalireturn
Shaggy




2

TI-BASIC, 27 bayt

Kullanıcıyı girdi ister ve sonlandırıldığında çıktıyı görüntüler. Not: ⁻¹olduğu -1 (ters) belirteci.

Input N
1
Repeat 2N≤Σ(I⁻¹,I,1,Ans
Ans+1
End
Ans

2
Kaydetmek gidiyoruz Ansiçinde Nhemen ardından Input Nya da Prompt Nüzerinde size bir bayt kazandırır bir giriş yöntemidir Ans→N. Ve Mile değiştirilebilir Ans, böylece 1→Molur 1ve M+1→Molur Ans+1. (Ama bir çıkış şüphe duyuyorum Ansgörüntülenen almaz - bakınız bu - belki biten :Ansuygundur. Sonra değer "Done" yerine gösterilir)
Misha Lavrov

Teşekkür ederim! Ans→NKendimi komik hissettim biliyordum . Güzel optimizasyonlar. Ayrıca sadece güvenli olması için çıktı konusundaki tavsiyenizi aldı. Hala net -3 bayt ile geliyor: D
kamoroso94

1

05AB1E , 11 bayt

XµN·zODI›}N

Çevrimiçi deneyin!

açıklama

Xµ       }    # loop until counter is 1
  N·z         # push 1/(2*N)
     O        # sum the stack
      DI›     # break if the sum is greater than the input
          N   # push N


1

Japt , 12 bayt

Özyinelemeli seçenek ile aynı uzunluk, ancak biraz daha verimli.

@T¨(Uµ½÷X}a1

Dene


açıklama

@T¨(Uµ½÷X}a1
                 :Implicit input of integer U
@        }a1     :Return the first number X >=1 that returns truthy when passed through the following function
 T               :Zero
  ¨              :Greater than or equal to
    Uµ           :Decrement U by...
      ½÷X        :0.5 divided by X

1

J, 22 bayt

-Prownyfrog sayesinde -6 bayt

I.~0+/\@,1%2*1+[:i.9&^

Çevrimiçi deneyin!

orijinal cevap

Luis'in J'deki cevabı:

1+]i.~[:<.[:+/\1%2*1+[:i.9&^

Ungolfed

1 + ] i.~ [: <. [: +/\ 1 % 2 * 1 + [: i. 9&^

Büyük ölçüde iyileştirilip geliştirilemeyeceğini görmek çok merak uyandıran ( öksürük disk belleği milleri)

açıklama

1 +      NB. 1 plus... 
] i.~    NB. find the index of the arg in...
[: <.    NB. the floor of...
[: +/\   NB. the sumscan of...
1 %      NB. the reciprical of...
2 *      NB. two times...
1 +      NB. 1 plus...
[: i.    NB.  the integers up to 
9&^      NB. 9 raised to the power of the arg

Çevrimiçi deneyin!


1+]i.~[:<.-> 1+]I.~->I.~0,
FrownyFrog

ofc! teşekkür ederim frownyfrog
Jonah 5

Ve sonraI.~0+/\@,
FrownyFrog

Eğer düzenlerseniz Julia'yı
yenersiniz

@ FrownyFrog, yapıldı. Eğer biraz zamanın varsa, bunu çözmeni görmek isterim: codegolf.stackexchange.com/questions/154345/bracket-expansion . aklıma gelen bütün çözümler iyi bir vicdanla yayınlanmayacak kadar ayrıntılı ...
Jonah

0

PHP, 35 bayt

while($argv[1]>$s+=.5/++$i);echo$i;

CLI'yi kullanarak çalıştırın:

$ php -d error_reporting=0 -r 'while($argv[1]>$s+=.5/++$i);echo$i;' 5


0

Java 8, 49 bayt

n->{float r=0,s=0;for(;s<n;)s+=.5f/++r;return r;}

Açıklama:

Çevrimiçi deneyin. (Yukarıdaki test durumları için zaman aşımına uğradı n=7.)

n->{             // Method with integer parameter and float return-type
  float r=0,     //  Result-float, starting at 0
        s=0;     //  Sum-float, starting at 0
  for(;s<n;)     //  Loop as long as the sum is smaller than the input
    s+=.5f/++r;  //   Increase the sum by `0.5/(r+1)`,
                 //   by first increasing `r` by 1 with `r++`
  return r;}     //  Return the result-float

0

tinylisp , 98 bayt

(load library
(d _(q((k # N D)(i(l N(* D # 2))(_(inc k)#(+(* N k)D)(* D k))(dec k
(q((#)(_ 1 # 0 1

Son satır, kitap uzunluklarını alan ve ihtiyaç duyulan kitap sayısını döndüren adsız bir lambda işlevidir. Çevrimiçi deneyin!

açıklama

Tinylisp'nin tek veri tipi tamsayıdır, bu yüzden harmonik serileri pay ve paydayı takip ederek kesir olarak hesaplıyoruz. Her adımda, Npay, Dpayda ve ktoplam indeksidir. Yeni kısmi toplamın olmasını istiyoruz N/D + 1/kveya (N*k + D)/(D*k). Böylece, yeni bir payda N*K + D, yeni bir payda D*kve yeni bir endeks ile yineleniriz.k+1 .

Kısmi toplam, #istenen kitap uzunluğuna eşit veya ondan daha büyük olduğunda özyineleme durmalıdır . Bu noktada, çok fazla bir kitap gittik, bu yüzden geri döndük k-1. Durum 1/2 * N/D < #; paydayı çarparak alırızN < D*#*2 , ki bu onu yazmak için en hızlı yoldur.

Özyinelemeli yardımcı işlevi _tüm bu hesaplamaları yapar; ana işlevi, sadece, aramalar sargı, bir tek argümandır _için doğru bir başlangıç değerleri ile k, Nve D.

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.