Сколько минимальных дней ему потребуется, чтобы выполнить 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или как аргумент функции, или любым подходящим способом.

Вывод может быть распечатан или как результат функции, или любым подходящим способом.

Это . Самое короткое решение побеждает.

HarshGiri
источник
1
Подсказка: этот список целых может быть полезным.
Утренняя монахиня
1
Итак, ограничен ли ввод положительными целыми числами, поскольку Кенни показал, что можно добиться отрицательного количества работы? Или работа в день ограничена минимумом нуля?
mbomb007
1
Почему вы приняли ответ Pyth? Мой ответ на желе на 3 байта короче ...
Деннис
Привет, @ Деннис. Мне нужно понять подход, и @ Кенни Лау поможет мне понять его.
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
Один не просто ...
Дрянная Монахиня
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 и Оператору экспонирования (в настоящее время только в 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
@Florent Wow спасибо, не знал о предстоящем операторе возведения в степень.
Джордж Райт
2

JavaScript, 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
}

Он использует тот же алгоритм, что и 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 Спасибо! Я давно не играю в гольф. Я немного заржавел х)
Флоран
for(t=1;;)if(t*t++/4>=q)return t-1;только 36 байтов :)
Leaky Nun
1
@KennyLau Я добавил 23-байтовое решение :)
Florent
2

Python, 28 байт

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

Выводит поплавок. maxЕсть дать 0для n<=0избегая ошибки для квадратного корня из отрицательного.

XNOR
источник
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.
Suever
источник
@ LuisMendo Спасибо за указание на это. Обновлено!
августа
0

Python, 43 байта

f=lambda n,i=1:i-1if i*i>=n*4 else f(n,i+1)
orlp
источник
1
можете сохранить байт, используя <вместо> =
Leaky Nun
0

Java 8, 30 24 байта

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

Попробуйте онлайн.

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

Кевин Круйссен
источник
0

Рубин , 30 байтов

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

Попробуйте онлайн!

Сохранение байта здесь с .to_iвместо .floor.

Поддержка неположительных объемов работы обходится в 6 байт ( n<1?0:).

benj2240
источник