Anh ấy sẽ mất bao nhiêu ngày để hoàn thành N đơn vị công việc?


10

Một người phải hoàn thành Ncác đơn vị công việc; tính chất công việc là như nhau.

Để có được công việc, anh ta chỉ hoàn thành một đơn vị công việc trong ngày đầu tiên .

Anh ấy muốn ăn mừng khi hoàn thành công việc, vì vậy anh ấy quyết định hoàn thành một đơn vị công việc vào ngày cuối cùng .

Anh ta chỉ được phép hoàn thành x, x+1hoặc x-1đơn vị công việc trong một ngày , nơi xđơn vị công việc hoàn thành vào ngày hôm trước.

Nhiệm vụ của bạn là tạo ra một chương trình hoặc chức năng sẽ tính toán số ngày tối thiểu anh ta sẽ thực hiện để hoàn thành Ncác đơn vị công việc.

Đầu vào mẫu và Ouput:

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]

Đầu vào có thể được thực hiện thông qua STDINhoặc như là đối số chức năng, hoặc theo bất kỳ cách thích hợp nào.

Đầu ra có thể được in hoặc là kết quả của một chức năng, hoặc theo bất kỳ cách thích hợp nào.

Đây là . Giải pháp ngắn nhất chiến thắng.


1
Gợi ý: danh sách số nguyên này có thể hữu ích.
Leaky Nun

1
Vì vậy, đầu vào có bị giới hạn ở các số nguyên dương không, vì Kenny cho thấy có thể đạt được số lượng công việc âm? Hay là công việc mỗi ngày bị giới hạn ở mức tối thiểu bằng không?
mbomb007

1
Tại sao bạn chấp nhận câu trả lời Pyth? Câu trả lời Jelly của tôi ngắn hơn 3 byte ...
Dennis

Này, @ Dennis Tôi cần hiểu cách tiếp cận và @Kenny Lau giúp tôi hiểu nó.
HarshGiri

Tôi chưa quen với CodeGolf nên sẽ mất một thời gian để hiểu tất cả mọi thứ ở đây.
HarshGiri

Câu trả lời:


3

Thạch , 5 byte

×4’½Ḟ

Điều này sử dụng một hình thức đóng của phương pháp @ LeakyNun .

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

Do một sự trùng hợp may mắn, bị quá tải như floor/ realcho các số thực / số phức. Đây là một trong ba nguyên tử quá tải duy nhất trong Jelly.

Làm thế nào nó hoạt động

×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
Một người không chỉ đơn giản là ...
Leaky Nun

1
"Sự trùng hợp may mắn"
Arcturus

4

Bình thường , 8 byte

tfg/*TT4

Làm thế nào nó hoạt động:

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

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

Trong mã giả:

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

tiền thưởng, 22 byte

"nên trả về 7 cho -1"

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

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


3

JavaScript (ES2016), 24 byte

Phiên bản rút gọn của biến thể ES6 bên dưới nhờ @FlorentToán tử lũy thừa (hiện chỉ có trong các bản dựng hoặc bộ chuyển mã hàng đêm của Firefox).

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

JavaScript (ES6), 30 byte

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

Dựa trên trình tự này .

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>


Thậm chí ngắn hơn trong ES2016 (26 ký tự):f=n=>(n-1)**.5+(n+1)**.5|0
Florent

@Florent Wow cảm ơn, đã không biết về toán tử lũy thừa sắp tới.
George Reith

2

JavaScript, 32 31 byte

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

Mã bị đánh cắp:

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

Nó sử dụng thuật toán tương tự như anwser của Kenny Lau nhưng nó được triển khai dưới dạng đóng đệ quy để lưu một số byte.

Sử dụng:

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

Giải pháp REPL, 23 byte

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

Chuẩn q=bị chạy đoạn trích:

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

Nó thậm chí còn sử dụng các tên biến giống như của tôi :)
Leaky Nun

Có thể lưu một byte bằng cách chuyển >=sang <: D
Leaky Nun

@KennyLau Cảm ơn! Lâu lắm rồi tôi không chơi gôn. Tôi hơi rỉ sét x)
Florent

for(t=1;;)if(t*t++/4>=q)return t-1;chỉ có 36 byte :)
Leaky Nun

1
@KennyLau Tôi đã thêm giải pháp 23 byte :)
Florent

2

Python, 28 byte

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

Đầu ra một float. Các maxlà có để cung cấp cho 0cho n<=0trong khi tránh một lỗi cho căn bậc hai của tiêu cực.


2

UGL , 30 25 byte

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

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

Không hoạt động cho đầu vào tiêu cực.

Làm thế nào nó hoạt động:

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)

Giải pháp 30 byte trước đây:

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

Phiên dịch trực tuyến tại đây .

Không hoạt động cho đầu vào tiêu cực.

Làm thế nào nó hoạt động:

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 byte

E:t*4/G<f0)

Thuật toán tương tự với @KennyLau ngoại trừ việc lặp đi lặp lại vô thời hạn, tôi lặp từ 1 ... 2n để lưu một số byte.

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

Giải trình

    % 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 Cảm ơn bạn đã chỉ ra điều đó. Đã cập nhật!
Suever


0

Python, 43 byte

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

1
có thể lưu một byte bằng cách sử dụng <thay vì> =
Leaky Nun

0

Java 8, 30 24 byte

n->(int)Math.sqrt(n*4-1)

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

Không cần kiểm tra xem ncó lớn hơn 0 hay không, bởi vì Math.sqrttrả về của Java NaNcho các đầu vào âm, điều này trở thành 0với việc intchúng ta đã sử dụng cho các đầu vào tích cực.


0

Ruby , 30 byte

->n{n<1?0:((4*n-1)**0.5).to_i}

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

Lưu một byte ở đây với .to_ithay vì .floor.

Hỗ trợ cho số lượng công việc không tích cực có chi phí là 6 byte ( n<1?0:).

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.