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.


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).

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!


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>


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

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ą.


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)

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.

@LuisMendo Dzięki za zwrócenie na to uwagi. Zaktualizowano!
Suever


0

Python, 43 bajty

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

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.


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:).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.