Saya ingin buku saya jauh dari meja ini


21

Cerita

Jadi saya punya buku yang ingin saya pisahkan dari meja saya dengan buku lain. Saya ingin tahu berapa banyak buku yang saya perlu untuk mencapai hal ini dengan panjang buku.n

Berikut visualisasi yang dibuat oleh teman saya di Wolfram:

visualisasi dari Wolfram

Informasi lebih lanjut tentang topik di Wolfram dan Wikipedia .

Tantangan

Diberikan input bilangan bulat , output berapa banyak buku yang dibutuhkan untuk buku teratas menjadi panjang buku dari tabel secara horizontal. atau Temukan nilai integer terkecil untuk input dalam ketidaksetaraan berikut. n m n m i = 1 1nn

mn

i=1m12in

Sunting: untuk fraksi, gunakan setidaknya floating point presisi-tunggal IEEE. maaf karena mengedit tantangan setelah posting

( OEIS A014537 )

Uji kasus

 1          4
 2         31
 3        227
 5      12367
10  272400600


Apakah itu harus menggunakan ini pengaturan tertentu buku, yang IIRC tidak optimal?
user253751

Jawaban:


13

Oktaf , 41 40 33 byte

1 byte disimpan berkat @Dennis

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

Cobalah online!

Penjelasan

Ini menggunakan fakta bahwa bilangan harmonik dapat dibatasi oleh fungsi logaritmik.

Juga, >=perbandingan dapat diganti oleh >karena angka harmonik tidak dapat bahkan bilangan bulat (terima kasih, @ 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

Sekam , 8 byte

V≥⁰∫m\İ0

Cobalah online!

Karena Sekam menggunakan bilangan rasional ketika bisa, ini tidak memiliki masalah floating point

Penjelasan

      İ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 byte, tetapi di mana charset?
john16384

3
@ john16384 Husk memiliki codepage sendiri di mana setiap simbol sesuai dengan satu byte. Berikut adalah hexdump yang sesuai
H.PWiz



3

Swift , 65 byte

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

Cobalah online!

Tidak disatukan

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 byte

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

Tidak disatukan

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

Uji Kasus


Datang dengan solusi serupa menggunakan rekursi selama 30 byte. Tidak tahu apakah akan mempostingnya atau tidak, setelah melihat milik Anda.
Shaggy

1
Saya mungkin kehilangan sesuatu, tetapi mengapa Anda perlu membungkusnya dalam sebuah evalpernyataan?
caird coinheringaahing

1
@cairdcoinherigaahing, tanpa evalyang ivariabel akan perlu returned di akhir, pada biaya beberapa byte lagi.
Shaggy


2

Haskell, 71 49 48 byte

f x=length.fst.span(<x).scanl(+)0$(0.5/)<$>[1..]

@BMO menyelamatkan saya 22 byte!



2

TI-BASIC, 27 byte

Meminta pengguna untuk input dan menampilkan output saat penghentian. Catatan: ⁻¹adalah token -1 (terbalik).

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

2
Jika Anda akan menyimpan Ansdi Nsegera, maka Input Natau Prompt Nmerupakan metode input yang menghemat satu byte lebih Ans→N. Dan Mdapat digantikan oleh Ans, sehingga 1→Mmenjadi 1dan M+1→Mmenjadi Ans+1. (Tapi saya skeptis tentang output Ansyang tidak ditampilkan - lihat ini - jadi mungkin diakhiri dengan :Anstepat: maka nilainya akan ditampilkan di tempat "Selesai".)
Misha Lavrov

Terima kasih! Saya tahu Ans→Nmerasa lucu. Optimasi yang bagus. Juga mengambil saran Anda tentang output hanya agar aman. Masih keluar dengan net -3 byte: D
kamoroso94

1

05AB1E , 11 byte

XµN·zODI›}N

Cobalah online!

Penjelasan

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 byte

Panjangnya sama, tetapi sedikit lebih efisien daripada, opsi rekursif.

@T¨(Uµ½÷X}a1

Cobalah


Penjelasan

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

-6 byte terima kasih kepada frownyfrog

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

Cobalah online!

jawaban asli

Jawaban Luis dalam J:

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

Tidak disatukan

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

Kebanyakan penasaran untuk melihat apakah itu dapat ditingkatkan secara drastis ( batuk paging mil)

Penjelasan

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

Cobalah online!


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

ofc! terima kasih frownyfrog
Jonah

Dan kemudianI.~0+/\@,
FrownyFrog

Jika Anda mengedit, Anda akan mengalahkan Julia :)
FrownyFrog

@FrownyFrog, sudah selesai. jika Anda punya waktu, saya ingin melihat Anda menyelesaikan yang ini: codegolf.stackexchange.com/questions/154345/bracket-expansion . semua solusi yang dapat saya pikirkan terlalu bertele-tele untuk dikirim dengan hati nurani yang baik ...
Jonah

0

PHP, 35 byte

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

Jalankan menggunakan CLI:

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


0

Java 8, 49 byte

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

Penjelasan:

Cobalah online. (Waktu habis untuk kasus uji di atas 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 byte

(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

Baris terakhir adalah fungsi lambda tanpa nama yang mengambil jumlah panjang buku dan mengembalikan jumlah buku yang dibutuhkan. Cobalah online!

Penjelasan

Satu-satunya tipe data numerik yang dimiliki tinylisp adalah bilangan bulat, jadi kami menghitung seri harmonik sebagai fraksi dengan melacak pembilang dan penyebut. Pada setiap langkah, Nadalah pembilang, Dadalah penyebut, dan kmerupakan indeks penjumlahan. Kami ingin jumlah parsial yang baru menjadi N/D + 1/k, atau (N*k + D)/(D*k). Dengan demikian, kami berulang dengan pembilang baru N*K + D, penyebut baru untukD*k , dan indeks baruk+1 .

Rekursi harus berhenti setelah jumlah parsial lebih besar atau sama dengan #, jumlah panjang buku yang diinginkan. Pada titik ini, kami sudah terlalu jauh membaca satu buku, jadi kami kembali k-1. Kondisinya1/2 * N/D < # ; mengalikan penyebutnya, kita dapatkan N < D*#*2, yang merupakan cara paling golf untuk menulisnya.

Fungsi pembantu rekursif _melakukan semua perhitungan ini; fungsi utama hanyalah satu-argumen pembungkus yang panggilan _dengan nilai-nilai awal yang benar untuk k, N, dan D.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.