Quanti giorni minimi impiegherà per completare N unità di lavoro?


10

Una persona deve completare le Nunità di lavoro; la natura del lavoro è la stessa.

Al fine di ottenere l'impiccagione del lavoro, completa una sola unità di lavoro nel primo giorno .

Desidera celebrare il completamento del lavoro, quindi decide di completare un'unità di lavoro nell'ultimo giorno .

Gli è permesso di completare solo x, x+1o x-1unità di lavoro in un giorno , in cui xle unità di lavoro sono state completate il giorno precedente.

Il tuo compito è creare un programma o una funzione che calcolerà il numero minimo di giorni che impiegherà per completare le Nunità di lavoro.

Esempio di input e output:

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]

L'input può essere preso attraverso STDINo come argomento di funzione o in qualsiasi modo appropriato.

L'output può essere stampato o come risultato di una funzione o in qualsiasi modo appropriato.

Questo è . Vince la soluzione più breve.


1
Suggerimento: questo elenco di numeri interi potrebbe essere utile.
Leaky Nun,

1
Quindi, l'input è limitato a numeri interi positivi, dal momento che Kenny ha dimostrato che è possibile ottenere un conteggio del lavoro negativo? O il lavoro al giorno è limitato a un minimo di zero?
mbomb007,

1
Perché hai accettato la risposta di Pyth? La mia risposta di Jelly è più corta di 3 byte ...
Dennis il

Ehi, @ Dennis, devo capire l'approccio e @Kenny Lau mi aiuta a capirlo.
HarshGiri,

Sono nuovo di CodeGolf, quindi ci vorrà del tempo per comprendere appieno tutte le cose qui.
HarshGiri,

Risposte:


3

Gelatina , 5 byte

×4’½Ḟ

Questo utilizza una forma chiusa dell'approccio di @ LeakyNun .

Provalo online!

A causa di una fortunata coincidenza, viene sovraccaricato come floor/ realper numeri reali / complessi. Questo è uno dei soli tre atomi sovraccarichi di Jelly.

Come funziona

×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
Uno semplicemente non ...
Leaky Nun,

1
"Fortunata coincidenza"
Arcturus il

4

Pyth , 8 byte

tfg/*TT4

Come funziona:

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

Provalo online!

In pseudo-codice:

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

bonus, 22 byte

"dovrebbe restituire 7 per -1"

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

Provalo online!


3

JavaScript (ES2016), 24 byte

Versione abbreviata della variante ES6 di seguito grazie a @Florent e all'Exponentiation Operator (attualmente solo nelle build o nei transpilers notturni di Firefox).

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

JavaScript (ES6), 30 byte

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

Basato su questa sequenza .

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>


Ancora più breve in ES2016 (26 caratteri):f=n=>(n-1)**.5+(n+1)**.5|0
Florent,

@Florent Wow grazie, non ero a conoscenza del prossimo operatore di esponenziale.
George Reith,

2

JavaScript, 32 31 byte

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

Codice non golfato:

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

Utilizza lo stesso algoritmo della risposta di Kenny Lau ma è implementato come chiusura ricorsiva per salvare alcuni byte.

Uso:

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

Soluzione REPL, 23 byte

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

Preparati q=a eseguire lo snippet:

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

Utilizza anche gli stessi nomi di variabili dei miei :)
Leaky Nun,

Può salvare un byte passando >=a <: D
Perdita suora

@KennyLau Grazie! È da tanto tempo che non gioco a golf. Sono un po 'arrugginito x)
Florent,

for(t=1;;)if(t*t++/4>=q)return t-1;è solo 36 byte :)
Leaky Nun

1
@KennyLau Ho aggiunto 23 byte di soluzione :)
Florent,

2

Python, 28 byte

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

Emette un float. L' maxè lì per dare 0per n<=0evitando un errore per radice quadrata di negativo.


2

UGL , 30 25 byte

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

Provalo online!

Non funziona per input negativi.

Come funziona:

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)

Precedente soluzione a 30 byte:

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

Interprete online qui .

Non funziona per input negativi.

Come funziona:

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 byte

E:t*4/G<f0)

Algoritmo simile a @KennyLau, tranne per il fatto che invece di eseguire il loop indefinitamente, eseguo il loop da 1 ... 2n per salvare alcuni byte.

Provalo online!

Spiegazione

    % 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 Grazie per averlo sottolineato. Aggiornato!
Suever,


0

Python, 43 byte

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

1
può salvare un byte usando <invece di> =
Leaky Nun il

0

Java 8, 30 24 byte

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

Provalo online.

Non c'è bisogno di controllare se nè maggiore di 0, perché Java Math.sqrtrestituisce NaNinput negativi, che diventano 0con il cast intche già utilizziamo per input positivi.


0

Rubino , 30 byte

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

Provalo online!

Salvare un byte qui con .to_iinvece di .floor.

Il supporto per quantità di lavoro non positive ha un costo di 6 byte ( n<1?0:).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.