Сколько минимальных дней ему потребуется, чтобы выполнить 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
Подсказка: этот список целых может быть полезным.
Утренняя монахиня

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избегая ошибки для квадратного корня из отрицательного.


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


0

Python, 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, потому что Java Math.sqrtвозвращает NaNотрицательные входные данные, что происходит 0с приведением, которое intмы уже используем для положительных входных данных.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.