N 개의 작업 단위를 완료하는 데 최소 며칠이 걸립니까?


10

사람은 N작업 단위 를 완료 해야합니다. 일의 본질은 동일합니다.

업무를 중단시키기 위해 첫날에하나의 작업 단위 만 완료합니다 .

그는 작업 완료를 축하하기 위해 마지막 날에 한 작업 단위 를 완료하기로 결정합니다 .

그는 단지 완료 할 수있다 x, x+1또는 x-1하루에 작업 단위 , x전날에 완료된 작업의 단위입니다.

귀하의 작업은 작업 단위 를 완료하는 데 걸리는 최소 일수를 계산하는 프로그램 또는 기능을 작성하는 N것입니다.

샘플 입력 및 출력 :

input -> output (corresponding work_per_day table)
-1    -> 0      []
0     -> 0      []
2     -> 2      [1,1]
3     -> 3      [1,1,1]
5     -> 4      [1,1,2,1] or [1,2,1,1]
9     -> 5      [1,2,3,2,1]
13    -> 7      [1,2,2,2,3,2,1]

입력은 STDIN함수 인수를 통해 또는 적절한 방식 으로 수행 될 수 있습니다 .

출력은 기능의 결과로 또는 적절한 방법으로 인쇄 될 수 있습니다.

이것은 입니다. 최단 솔루션이 승리합니다.


1
힌트 : 이 정수 목록 이 도움이 될 수 있습니다.
Leaky Nun

1
케니가 부정적인 작업 수를 달성 할 수 있음을 보여 줬기 때문에 입력은 양의 정수로 제한됩니까? 아니면 하루 작업이 최소 0으로 제한됩니까?
mbomb007

1
Pyth 답변을 왜 수락 했습니까? 내 젤리 대답은 3 바이트 짧습니다 ...
Dennis

안녕하세요, @Dennis 저는이 접근 방식을 이해해야하며 @Kenny Lau가이를 이해하도록 도와줍니다.
HarshGiri

CodeGolf를 처음 사용하므로 여기에있는 모든 내용을 완전히 이해하려면 시간이 걸립니다.
HarshGiri

답변:


3

젤리 , 5 바이트

×4’½Ḟ

이것은 @LeakyNun의 접근 방식의 닫힌 형태를 사용합니다 .

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

운이 좋은 우연의 일치로 인해 실수 / 복소수에 대해 / 로 오버로드됩니다 . 이것은 젤리에서 유일하게 오버로드 된 3 개의 원자 중 하나입니다.floorreal

작동 원리

×4’½Ḟ  Main link. Argument: n (integer)

×4     Compute 4n.
  ’    Decrement; yield 4n - 1.
   ½   Square root; yield sqrt(4n - 1).
       If n < 2, this produces an imaginary number.
    Ḟ  If sqrt(4n - 1) is real, round it down to the nearest integer.
       If sqrt(4n - 1) is complex, compute its real part (0).

1
하나는 단순히 ...
Leaky Nun

1
"행운의 우연의 일치"
Arcturus

4

Pyth , 8 바이트

tfg/*TT4

작동 방식 :

tfg/*TT4   Q is implicitly assigned to the input.
 f         test for T=1,2,3,... returning the first successful case
   /*TT4   whether T * T / 4
  g     Q  is greater than or equal to the input (second argument implied)
t          and subtract 1 from the first successful case

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

의사 코드에서 :

for(int T=1;;T++)
    if(T*T/4 >= Q)
        return T-1;

보너스, 22 바이트

"-1이면 7을 반환해야합니다"

+tfg/*TT4?>Q0Q-2Q1*4g1

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


3

자바 스크립트 (ES2016), 24 바이트

@Florent지수 연산자 (현재 Firefox 야간 빌드 또는 트랜스 파일러에서만) 덕분에 아래의 ES6 변형 버전이 단축 되었습니다.

n=>(n-1)**.5+(n+1)**.5|0

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

n=>(s=Math.sqrt)(n-1)+s(n+1)|0

이 순서를 기반으로 합니다 .

f=n=>(s=Math.sqrt)(n-1)+s(n+1)|0

units.oninput = () => output.value = f(+units.value||0);
<label>Units: <input id="units" type="number" value="0" /></label>
<label>Days: <input id="output" type="number" value="0" disabled /></label>


ES2016에서 더 짧음 (26 자) :f=n=>(n-1)**.5+(n+1)**.5|0
Florent

@Florent 와우, 다가오는 지수 연산자를 알지 못했습니다.
George Reith

2

자바 스크립트, 32 31 바이트

f=(q,t=1)=>q>t*t/4?f(q,t+1):t-1

Ungolfed 코드 :

function f(q, t = 1) {
  return q > t * t / 4
    ? f(q, t + 1)
    : t - 1
}

Kenny Lau의 anwser와 동일한 알고리즘을 사용하지만 일부 바이트를 절약하기 위해 재귀 폐쇄로 구현됩니다.

용법:

f(-1)  // 0
f(0)   // 0
f(2)   // 2
f(3)   // 3
f(5)   // 4
f(9)   // 5
f(13)  // 7

REPL 솔루션, 23 바이트

for(t=1;t*t++/4<q;);t-2

앞에 추가 q=스 니펫을 실행합니다 :

q=-1;for(t=1;t*t++/4<q;);t-2 // 0
q=9;for(t=1;t*t++/4<q;);t-2  // 5
q=13;for(t=1;t*t++/4<q;);t-2 // 7

그것은 심지어 내 것과 같은 변수 이름을 사용합니다 :)
Leaky Nun

: D>=<
Leaky Nun

@KennyLau 감사합니다! 내가 골프를 타지 않은지 오래되었습니다. 나는 조금 녹슬었다 x)
Florent

for(t=1;;)if(t*t++/4>=q)return t-1;36 바이트입니다 :)
Leaky Nun

1
@KennyLau 나는 23 바이트 솔루션을 추가했습니다 :)
Florent

2

파이썬, 28 바이트

lambda n:max(4*n-1,0)**.5//1

플로트를 출력합니다. 는 max줄이 0에 대한 n<=0부정의 제곱근에 대한 오류를 피하면서.


2

UGL , 30 25 바이트

i$+$+dc^l_u^^$*%/%_c=:_do

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

마이너스 입력에는 작동하지 않습니다.

작동 방식 :

i$+$+dc^l_u^^$*%/%_c=:_do
i$+$+d                     #n = 4*input-1
      c                    #i=0
       ^l_     %/%_c=:_    #while      > n:
           ^^$*            #      i**2
          u                #                i = i+1
                       do  #print(i)

이전 30 바이트 솔루션 :

iuc^l_u^^$*cuuuu/%_u%/%_c=:_do

온라인 통역 여기 .

마이너스 입력에는 작동하지 않습니다.

작동 방식 :

iuc^l_u^^$*cuuuu/%_u%/%_c=:_do
iuc                             #push input; inc; i=0;
   ^l_u             %/%_c=:_    #while        > input:
       ^^$*cuuuu/%_             #      i**2/4
                   u            #                      i = i+1
                            do  #print(i)

1

MATL, 11 바이트

E:t*4/G<f0)

무한 반복하는 대신 1 ... 2n에서 반복하여 일부 바이트를 절약한다는 점을 제외하고 @KennyLau와 비슷한 알고리즘입니다.

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

설명

    % Implicitly grab the input
E   % Double the input
:   % Create an array from 1...2n
t*  % Square each element
4/  % Divide each element by 4
G<  % Test if each element is less than G
f   % Get the indices of the TRUE elements in the array from the previous operation
0)  % Get the last index (the first index where T*T/4 >= n)
    % Implicitly display the result.

@LuisMendo 지적 해 주셔서 감사합니다. 업데이트!
Suever


0

파이썬, 43 바이트

f=lambda n,i=1:i-1if i*i>=n*4 else f(n,i+1)

1
> = 대신 <를 사용하여 바이트를 저장할 수 있습니다.
Leaky Nun


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