Ile dni zajmie mu ukończenie N jednostek pracy?

10

Osoba musi ukończyć Njednostki pracy; charakter pracy jest taki sam.

Aby się zawiesić, wykonuje pierwszego dnia tylko jedną jednostkę pracy .

Chce uczcić zakończenie pracy, więc decyduje się wykonać jedną jednostkę pracy w ostatnim dniu .

Dozwolony jest tylko do wykonania x, x+1czyli x-1jednostek pracy w ciągu dnia , gdzie xjednostki pracy zostały ukończone poprzedniego dnia.

Twoim zadaniem jest stworzenie programu lub funkcji, która obliczy minimalną liczbę dni potrzebnych do ukończenia Njednostek pracy.

Przykładowe dane wejściowe i wyjściowe:

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]

Dane wejściowe mogą być pobierane za pomocą STDINlub jako argument funkcji lub w dowolny odpowiedni sposób.

Dane wyjściowe mogą być drukowane lub w wyniku funkcji lub w dowolny odpowiedni sposób.

To jest . Najkrótsze rozwiązanie wygrywa.

HarshGiri
źródło
1
Wskazówka: ta lista liczb całkowitych może być pomocna.
Leaky Nun
1
Czy dane wejściowe są ograniczone do dodatnich liczb całkowitych, skoro Kenny pokazał, że można osiągnąć ujemną liczbę prac? Czy praca dziennie jest ograniczona do minimum zero?
mbomb007
1
Dlaczego zaakceptowałeś odpowiedź Pyth? Moja odpowiedź na galaretkę jest o 3 bajty krótsza ...
Dennis,
Hej, @ Dennis Muszę zrozumieć podejście i @Kenny Lau pomóż mi je zrozumieć.
HarshGiri,
Jestem nowy w CodeGolf, więc pełne zrozumienie wszystkich rzeczy zajmie trochę czasu.
HarshGiri

Odpowiedzi:

3

Galaretka , 5 bajtów

×4’½Ḟ

To wykorzystuje zamkniętą formę podejścia @ LeakyNun .

Wypróbuj online!

Ze względu na szczęśliwy zbieg okoliczności jest przeciążony jako floor/ realdla liczb rzeczywistych / zespolonych. Jest to jeden z niewielu przeciążonych atomów w galarecie.

Jak to działa

×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).
Dennis
źródło
1
Nie można po prostu ...
Leaky Nun
1
„Szczęśliwy zbieg okoliczności”
Arcturus
4

Pyth , 8 bajtów

tfg/*TT4

Jak to działa:

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

Wypróbuj online!

W pseudokodzie:

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

bonus, 22 bajty

„powinien zwrócić 7 dla -1”

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

Wypróbuj online!

Leaky Nun
źródło
3

JavaScript (ES2016), 24 bajty

Skrócona wersja wariantu ES6 poniżej dzięki @Florent i Operatorowi wykładniczemu (obecnie tylko w Firefoxowych kompilacjach nocnych lub transpilatorach).

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

JavaScript (ES6), 30 bajtów

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

Na podstawie tej sekwencji .

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>

George Reith
źródło
Jeszcze krótszy w ES2016 (26 znaków):f=n=>(n-1)**.5+(n+1)**.5|0
Florent
@Florent Wow dzięki, nie byłem świadomy nadchodzącego operatora potęgowania.
George Reith,
2

JavaScript, 32 31 bajtów

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

Nieskluczony kod:

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

Wykorzystuje ten sam algorytm co anwser Kenny'ego Laua, ale został zaimplementowany jako rekurencyjne zamknięcie w celu zaoszczędzenia niektórych bajtów.

Stosowanie:

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

Rozwiązanie REPL, 23 bajty

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

Przygotuj się q=do uruchomienia fragmentu:

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
Florent
źródło
Używa nawet tych samych nazw zmiennych, co moja :)
Leaky Nun
Można zapisać jeden bajt, zwracając się >=do <: D
Dziurawy zakonnica
@KennyLau Thanks! Dawno nie grałem w golfa. Jestem trochę zardzewiały x)
Florent
for(t=1;;)if(t*t++/4>=q)return t-1;ma tylko 36 bajtów :)
Leaky Nun
1
@KennyLau Dodałem 23-bajtowe rozwiązanie :)
Florent
2

Python, 28 bajtów

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

Wysyła liczbę zmiennoprzecinkową. maxJest tam, aby dać 0do n<=0unikając błędu do pierwiastka kwadratowego z ujemną.

xnor
źródło
2

UGL , 30 25 bajtów

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

Wypróbuj online!

Nie działa dla negatywnych danych wejściowych.

Jak to działa:

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)

Poprzednie 30-bajtowe rozwiązanie:

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

Tłumacz online tutaj .

Nie działa dla negatywnych danych wejściowych.

Jak to działa:

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)
Leaky Nun
źródło
1

MATL, 11 bajtów

E:t*4/G<f0)

Algorytm podobny do @KennyLau z tym wyjątkiem, że zamiast zapętlać w nieskończoność, zapętlam od 1 ... 2n, aby zaoszczędzić trochę bajtów.

Wypróbuj online!

Wyjaśnienie

    % 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
źródło
@LuisMendo Dzięki za zwrócenie na to uwagi. Zaktualizowano!
Suever
0

Pyke, 8 bajtów

#X4f)ltt

Wypróbuj tutaj!

Używa tego samego algorytmu co @KennyLau

niebieski
źródło
0

Python, 43 bajty

f=lambda n,i=1:i-1if i*i>=n*4 else f(n,i+1)
orlp
źródło
1
można zapisać bajt, używając <zamiast> =
Leaky Nun
0

Java 8, 30 24 bajtów

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

Wypróbuj online.

Nie trzeba sprawdzać, czy njest większe niż 0, ponieważ Math.sqrtzwroty Javy NaNdla negatywnych danych wejściowych, które stają się 0z rzutowaniem do, intktórych już używamy dla pozytywnych danych wejściowych.

Kevin Cruijssen
źródło
0

Rubinowy , 30 bajtów

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

Wypróbuj online!

Zapisywanie bajtu tutaj za pomocą .to_izamiast .floor.

Wsparcie dla dodatnich nakładów pracy kosztuje 6 bajtów ( n<1?0:).

benj2240
źródło