내 책이이 테이블에서 떨어지길 원합니다


21

이야기

그래서 나는 다른 책들과 함께 내 테이블에서 분리하고 싶은 책이 있습니다. 권의 책 길이로 이것을 달성하기 위해 얼마나 많은 책이 필요한지 알고 싶습니다 .

Wolfram의 친구가 나를 위해 그린 시각화는 다음과 같습니다.

Wolfram의 시각화

의 항목에 대한 자세한 내용은 볼프람위키 백과 .

도전

정수 입력 주어지면 , 상위 도서가 테이블에서 가로 방향 으로 권의 길이 를 갖기 위해 필요한 도서 수를 출력합니다 . 또는 다음 부등식에서 입력 에 대해 의 최소 ​​정수 값을 찾으십시오 .

n m i = 1 1

나는=112나는

편집 : 분수의 경우 적어도 IEEE 단 정밀도 부동 소수점을 사용하십시오. 게시 후 챌린지 수정에 대해 죄송합니다

( OEIS A014537 )

테스트 사례

 1          4
 2         31
 3        227
 5      12367
10  272400600


특정 도서 배열 을 사용해야 하는데 어떤 IIRC가 최적이 아닙니까?
user253751 2019

답변:


13

옥타브 , 41 40 33 바이트

@Dennis 덕분에 1 바이트 절약

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

온라인으로 사용해보십시오!

설명

이것은 로그 함수에 의해 고조파 숫자가 하한값이 될 수 있다는 사실을 사용합니다.

또한 고조파 숫자는 정수일 수도 없기 때문에 >=비교를 대체 할 수 있습니다 >(감사합니다, @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

껍질 , 8 바이트

V≥⁰∫m\İ0

온라인으로 사용해보십시오!

Husk는 가능한 경우 유리수를 사용하므로 부동 소수점 문제가 없습니다.

설명

      İ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 바이트이지만 어떤 문자 세트입니까?
john16384

3
@ john16384 Husk에는 각 기호가 단일 바이트에 해당하는 자체 코드 페이지 가 있습니다. 해당 hexdump
H.PWiz





3

자바 스크립트 (ES6), 34 바이트

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

언 골프

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

테스트 사례


30 바이트의 재귀를 사용하는 비슷한 솔루션을 생각해 냈습니다. 귀하의 게시물을 본 후 게시할지 여부를 모르겠습니다.
얽히고 설킨

1
뭔가 빠졌을 수 있지만 왜 eval성명서 에 포장해야 합니까?
caird coinheringaahing

1
@cairdcoinherigaahing의없이 변수가 될 필요가 몇 바이트의 비용으로, 마지막에 에드. evalireturn
얽히고 설킨


2

하스켈, 71 49 48 바이트

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

@BMO는 무려 22 바이트를 절약했습니다!



2

TI-BASIC, 27 바이트

사용자에게 입력을 요청하고 종료시 출력을 표시합니다. 주 : ⁻¹은 IS -1 (역) 토큰.

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

2
당신은 저장 위하여려고하는 경우 AnsN즉시 다음, Input N또는 Prompt N이상 당신에게 한 바이트를 저장하는 입력 방법은 다음과 같다 Ans→N. 그리고 M로 대체 될 수있다 Ans즉, 그래서 1→M하게 1M+1→M된다 Ans+1. (그러나 나는 Ans표시되지 않는 출력에 대해 회의적입니다 - 이것을 참조 하십시오 -아마도 끝나는 :Ans것이 적절합니다 : 그 값은 "완료"대신에 표시됩니다.)
Misha Lavrov

고맙습니다! 나는 Ans→N재미 있음을 느꼈다. 좋은 최적화. 또한 안전을 위해 출력에 대한 조언을 받았습니다. 아직도 그물 나오는 -3 바이트 : D
kamoroso94



1

Japt , 12 바이트

재귀 옵션과 길이는 같지만 약간 더 효율적입니다.

@T¨(Uµ½÷X}a1

시도 해봐


설명

@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 바이트

frownyfrog 덕분에 -6 바이트

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

온라인으로 사용해보십시오!

원래 답변

J의 Luis의 답변 :

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

언 골프

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

대폭 개선 될 수 있는지 궁금합니다 ( 기침 페이징 마일)

설명

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

온라인으로 사용해보십시오!


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

ofc! frownyfrog 감사합니다
Jonah

그리고I.~0+/\@,
FrownyFrog

편집하면 Julia를 이길 것입니다 :)
FrownyFrog

@FrownyFrog가 끝났습니다. 시간이 있다면 codegolf.stackexchange.com/questions/154345/bracket-expansion과 같은 문제를 해결하고 싶습니다 . 내가 생각할 수있는 모든 솔루션은 양심에 게시하기에는 너무 장황하다 ...
Jonah

0

PHP, 35 바이트

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

CLI를 사용하여 실행하십시오.

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


0

자바 8, 49 바이트

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

설명:

온라인으로 사용해보십시오. (위의 테스트 케이스의 시간이 초과되었습니다 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 바이트

(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

마지막 줄은 명명되지 않은 람다 함수로 책 길이를 가져와 필요한 책 수를 반환합니다. 온라인으로 사용해보십시오!

설명

tinylisp에있는 숫자 형 데이터 유형은 정수뿐이므로 분자와 분모를 추적하여 고조파 계열을 분수로 계산합니다. 각 단계 N에서 분자 D는 분모이며 k합은 인덱스입니다. 우리는 새로운 부분합이 N/D + 1/k또는 을 원한다 (N*k + D)/(D*k). 따라서 우리는 새로운 분자 N*K + D, 새로운 분모 D*k및 새로운 인덱스로 재귀 k+1합니다.

부분 합이 #원하는 장부 길이 보다 크거나 같으면 재귀가 중단 됩니다. 이 시점에서 한 권의 책을 너무 많이 갔으므로으로 돌아갑니다 k-1. 조건은 1/2 * N/D < #; 분모를 곱하면 N < D*#*2을 쓰는 가장 골치 아픈 방법입니다.

재귀 도우미 함수 _는 이러한 모든 계산을 수행합니다. 주요 기능은 단순히 해당 통화 래퍼 한 인자이다 _대한 정확한 시작 값 k, ND.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.