Скільки мінімум днів йому знадобиться, щоб виконати 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
Отже, чи вхід обмежений на додатні цілі числа, оскільки Кенні показав, що можна досягти від'ємного числа робіт? Або робота в день обмежена мінімум до нуля?
mbomb007

1
Чому ви прийняли відповідь Піта? Моя відповідь на Jelly на 3 байти коротша ...
Dennis

Гей, @ Денніс, мені потрібно зрозуміти підхід і @ Кенні Лау допоможе мені зрозуміти його.
HarshGiri

Я новачок у CodeGolf, тому знадобиться деякий час, щоб повністю зрозуміти всі речі тут.
HarshGiri

Відповіді:


3

Желе , 5 байт

×4’½Ḟ

Для цього використовується закрита форма підходу @ LeakyNun .

Спробуйте в Інтернеті!

Через вдалий збіг обставин, перевантажується як floor/ realдля реальних / складних чисел. Це один з єдиних трьох перевантажених атомів у Желе.

Як це працює

×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
«Щасливий збіг»
Арктур

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 байти

"має повернути 7 за -1"

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

Спробуйте в Інтернеті!


3

JavaScript (ES2016), 24 байти

Скорочена версія варіанту ES6 нижче завдяки @Florent та Operator Exponentiation (наразі лише у нічних складах Firefox або транспіляторах).

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

JavaScript (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 Вау, дякую, не знав про майбутній оператор експоненції.
Джордж Рейт

2

JavaScript, 32 31 байт

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

Невикористаний код:

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

Він використовує той самий алгоритм, що і попередник Кенні Лау, але він реалізований як рекурсивне закриття для збереження деяких байтів.

Використання:

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 Дякую! Минуло давно, як я не гольфу. Я трохи іржавий х)
Флорент

for(t=1;;)if(t*t++/4>=q)return t-1;всього 36 байт :)
Leaky Nun

1
@KennyLau Я додав 23-байтне рішення :)
Флорент

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)

Аналогічний алгоритм для @KennyLau, за винятком того, що замість циклу нескінченно, я цикл від 1 ... 2n, щоб зберегти кілька байт.

Спробуйте в Інтернеті!

Пояснення

    % 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

0

Java 8, 30 24 байти

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

Спробуйте в Інтернеті.

Не потрібно перевіряти, чи nбільший він від 0, оскільки Math.sqrtвіддача Java NaNза негативними входами, що стає 0з накидом, який intми вже використовуємо для позитивних входів.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.