Tôi muốn cuốn sách của tôi ở xa cái bàn này


21

Câu chuyện

Vì vậy, tôi có một cuốn sách mà tôi muốn tách khỏi bàn của mình mà không có gì ngoài những cuốn sách khác. Tôi muốn biết tôi cần bao nhiêu cuốn sách để đạt được điều này với độ dài cuốn sách.n

Đây là một hình dung mà bạn tôi ở Wolfram đã vẽ cho tôi:

một hình dung từ Wolfram

Thông tin thêm về chủ đề trong WolframWikipedia .

Thử thách

Cho một đầu vào số nguyên , xuất ra bao nhiêu sách cần thiết cho cuốn sách hàng đầu có độ dài n cuốn sách so với bảng theo chiều ngang. hoặc Tìm giá trị nguyên nhỏ nhất của m cho đầu vào n trong bất đẳng thức sau. m i = 1 1nn

mn

i=1m12in

Chỉnh sửa: đối với phân số sử dụng ít nhất một điểm nổi chính xác đơn của IEEE. xin lỗi vì đã chỉnh sửa thử thách sau khi đăng

( OEIS A014537 )

Các trường hợp thử nghiệm

 1          4
 2         31
 3        227
 5      12367
10  272400600


Có phải sử dụng cách sắp xếp sách đặc biệt này , mà IIRC không tối ưu?
dùng253751

Câu trả lời:


13

Octave , 41 40 33 byte

Lưu 1 byte nhờ @Dennis

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

Hãy thử trực tuyến!

Giải trình

Điều này sử dụng thực tế là các số hài có thể được giới hạn dưới bởi một hàm logarit.

Ngoài ra, sự >=so sánh có thể được thay thế bởi >vì các số hài không thể là số nguyên (cảm ơn, @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

Husk , 8 byte

V≥⁰∫m\İ0

Hãy thử trực tuyến!

Vì Husk sử dụng số hữu tỷ khi có thể, nên điều này không có vấn đề về dấu phẩy động

Giải trình

      İ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, nhưng trong bộ ký tự nào?
john16384

3
@ john16384 Husk có bộ riêng trong đó mỗi ký hiệu tương ứng với một byte đơn. Đây là hexdump tương ứng
H.PWiz





3

Javascript (ES6), 34 byte

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

Ung dung

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

Các trường hợp thử nghiệm


Đến với một giải pháp tương tự bằng cách sử dụng đệ quy cho 30 byte. Không biết có nên đăng nó hay không, sau khi nhìn thấy bạn.
Xù xì

1
Tôi có thể đang thiếu một cái gì đó, nhưng tại sao bạn cần phải bọc nó trong một evaltuyên bố?
caird coinheringaahing

1
@cairdcoinherigaahing, mà không có evalcác ibiến sẽ cần phải được returned ở cuối, với chi phí của một vài byte hơn.
Xù xì


2

Haskell, 71 49 48 byte

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

@BMO đã tiết kiệm cho tôi một con số khổng lồ 22 byte!



2

TI-BASIC, 27 byte

Nhắc người dùng nhập liệu và hiển thị đầu ra khi kết thúc. Lưu ý: ⁻¹là mã thông báo -1 (nghịch đảo).

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

2
Nếu bạn đang đi để tiết kiệm Anstrong Nngay lập tức, sau đó Input Nhoặc Prompt Nlà một phương pháp đầu vào giúp bạn tiết kiệm một byte trên Ans→N. Và Mcó thể được thay thế bởi Ans, vì vậy mà 1→Mtrở thành 1M+1→Mtrở thành Ans+1. (Nhưng tôi nghi ngờ về một đầu ra Anskhông được hiển thị - hãy xem điều này - vì vậy có thể kết thúc bằng :Anslà phù hợp: sau đó giá trị sẽ được hiển thị thay cho "Xong".)
Misha Lavrov

Cảm ơn bạn! Tôi biết Ans→Ncảm thấy buồn cười. Tối ưu hóa tốt đẹp. Cũng lấy lời khuyên của bạn về đầu ra chỉ để được an toàn. Vẫn xuất hiện với một mạng lưới -3 byte: D
kamoroso94



1

Japt , 12 byte

Độ dài tương tự, nhưng hiệu quả hơn một chút so với tùy chọn đệ quy.

@T¨(Uµ½÷X}a1

Thử nó


Giải trình

@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 nhờ vào frownyfrog

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

Hãy thử trực tuyến!

câu trả lời gốc

Câu trả lời của Luis trong J:

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

Ung dung

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

Chủ yếu là tò mò để xem nếu nó có thể được cải thiện đáng kể ( ho paging dặm)

Giải trình

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

Hãy thử trực tuyến!


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

tất nhiên rồi cảm ơn bạn cau mày
Jonah

Và sau đóI.~0+/\@,
FrownyFrog

Nếu bạn chỉnh sửa, bạn sẽ đánh bại Julia :)
FrownyFrog

@FrownyFrog, xong. nếu bạn có thời gian, tôi rất muốn thấy bạn giải quyết vấn đề này: codegolf.stackexchange.com/questions/154345/bracket-Exansion . tất cả các giải pháp tôi có thể nghĩ là quá dài dòng để đăng trong lương tâm tốt ...
Jonah

0

PHP, 35 byte

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

Chạy nó bằng 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;}

Giải trình:

Hãy thử trực tuyến. (Đã hết thời gian cho các trường hợp thử nghiệm ở trên 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

Dòng cuối cùng là một hàm lambda chưa được đặt tên, lấy số lượng thời lượng sách và trả về số lượng sách cần thiết. Hãy thử trực tuyến!

Giải trình

Tinylisp kiểu dữ liệu số duy nhất có số nguyên, vì vậy chúng tôi tính toán chuỗi hài dưới dạng phân số bằng cách theo dõi tử số và mẫu số. Ở mỗi bước, Nlà tử số, Dlà mẫu số và klà chỉ số tổng. Chúng tôi muốn tổng một phần mới được N/D + 1/k, hoặc (N*k + D)/(D*k). Do đó, chúng tôi lặp lại với một tử số mới của N*K + D, mẫu số mới củaD*k và chỉ số mới làk+1 .

Việc đệ quy nên tạm dừng khi tổng một phần lớn hơn hoặc bằng #, số lượng thời lượng sách mong muốn. Tại thời điểm này, chúng tôi đã đi một cuốn sách quá xa, vì vậy chúng tôi trở lại k-1. Điều kiện là 1/2 * N/D < #; nhân ra mẫu số, chúng ta nhận đượcN < D*#*2 , đó là cách tốt nhất để viết nó.

Hàm trợ giúp đệ quy _thực hiện tất cả các tính toán này; chức năng chính chỉ đơn thuần là một đối số wrapper rằng các cuộc gọi _với các giá trị khởi đầu chính xác cho k, ND.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.