Combien de jours minimum faudra-t-il pour terminer N unités de travail?

10

Une personne doit terminer des Nunités de travail; la nature du travail est la même.

Afin de se familiariser avec le travail, il ne termine qu'une seule unité de travail le premier jour .

Il souhaite célébrer la fin des travaux, il décide donc de terminer une unité de travail le dernier jour .

Il n'est autorisé à terminer x, x+1ou x-1unités de travail dans une journée , où xsont les unités de travail achevées la veille.

Votre tâche consiste à créer un programme ou une fonction qui calculera le nombre minimum de jours qu'il faudra pour terminer les Nunités de travail.

Exemple d'entrée et de sortie:

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'entrée peut être effectuée via STDINou comme argument de fonction, ou de toute manière appropriée.

La sortie peut être imprimée ou à la suite d'une fonction, ou de toute manière appropriée.

C'est du . La solution la plus courte l'emporte.

HarshGiri
la source
1
Astuce: cette liste entière pourrait être utile.
Leaky Nun
1
Donc, l'entrée est-elle limitée aux entiers positifs, puisque Kenny a montré qu'il est possible d'obtenir un nombre de travaux négatif? Ou le travail par jour est-il limité à un minimum de zéro?
mbomb007
1
Pourquoi avez-vous accepté la réponse Pyth? Ma réponse Jelly est plus courte de 3 octets ...
Dennis
Hé, @ Dennis, j'ai besoin de comprendre l'approche et @Kenny Lau m'aide à la comprendre.
HarshGiri
Je suis nouveau sur CodeGolf, il faudra donc un certain temps pour bien comprendre toutes les choses ici.
HarshGiri

Réponses:

3

Gelée , 5 octets

×4’½Ḟ

Cela utilise une forme fermée de l'approche de @ LeakyNun .

Essayez-le en ligne!

En raison d'une heureuse coïncidence, est surchargé en tant que floor/ realpour les nombres réels / complexes. C'est l'un des trois seuls atomes surchargés de Jelly.

Comment ça fonctionne

×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
la source
1
On ne fait pas que ...
Leaky Nun
1
"Heureuse coïncidence"
Arcturus
4

Pyth , 8 octets

tfg/*TT4

Comment ça fonctionne:

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

Essayez-le en ligne!

En pseudo-code:

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

bonus, 22 octets

"devrait renvoyer 7 pour -1"

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

Essayez-le en ligne!

Leaky Nun
la source
3

JavaScript (ES2016), 24 octets

Version raccourcie de la variante ES6 ci-dessous grâce à @Florent et à l' Exponentiation Operator (actuellement uniquement dans les versions ou transpilers nocturnes de Firefox).

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

JavaScript (ES6), 30 octets

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

Basé sur cette séquence .

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
la source
Encore plus court dans ES2016 (26 caractères):f=n=>(n-1)**.5+(n+1)**.5|0
Florent
@Florent Wow merci, n'était pas au courant du prochain opérateur d'exponentiation.
George Reith
2

JavaScript, 32 31 octets

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

Code non golfé:

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

Il utilise le même algorithme que la réponse de Kenny Lau mais il est implémenté comme une fermeture récursive pour économiser quelques octets.

Usage:

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

Solution REPL, 23 octets

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

Préparez q=à exécuter l'extrait de code:

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
la source
Il utilise même les mêmes noms de variables que les miens :)
Leaky Nun
Peut économiser un octet en se tournant >=vers <: D
Leaky Nun
@KennyLau Merci! Cela fait longtemps que je n'ai pas joué au golf. Je suis un peu rouillé x)
Florent
for(t=1;;)if(t*t++/4>=q)return t-1;n'est que de 36 octets :)
Leaky Nun
1
@KennyLau J'ai ajouté une solution de 23 octets :)
Florent
2

Python, 28 octets

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

Sort un flottant. Le maxest là pour donner 0desn<=0 tout en évitant une erreur de racine carrée négative.

xnor
la source
2

UGL , 30 25 octets

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

Essayez-le en ligne!

Ne fonctionne pas pour les entrées négatives.

Comment ça fonctionne:

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)

Solution précédente de 30 octets:

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

Interprète en ligne ici .

Ne fonctionne pas pour les entrées négatives.

Comment ça fonctionne:

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
la source
1

MATL, 11 octets

E:t*4/G<f0)

Algorithme similaire à @KennyLau sauf que plutôt que de boucler indéfiniment, je boucle de 1 à 2n pour économiser quelques octets.

Essayez-le en ligne!

Explication

    % 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
la source
@LuisMendo Merci de l'avoir signalé. Mise à jour!
Suever
0

Pyke, 8 octets

#X4f)ltt

Essayez-le ici!

Utilise le même algorithme que @KennyLau

Bleu
la source
0

Python, 43 octets

f=lambda n,i=1:i-1if i*i>=n*4 else f(n,i+1)
orlp
la source
1
peut enregistrer un octet en utilisant <au lieu de> =
Leaky Nun
0

Java 8, 30 24 octets

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

Essayez-le en ligne.

Pas besoin de vérifier si nest supérieur à 0, car les Math.sqrtretours de Java NaNpour les entrées négatives, qui deviennent 0avec le cast que intnous utilisons déjà pour les entrées positives.

Kevin Cruijssen
la source
0

Rubis , 30 octets

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

Essayez-le en ligne!

Enregistrer un octet ici avec .to_i au lieu de .floor.

La prise en charge des volumes de travail non positifs coûte 6 octets ( n<1?0:).

benj2240
la source