Quantos dias mínimos ele levará para completar N unidades de trabalho?

10

Uma pessoa tem que completar Nunidades de trabalho; a natureza do trabalho é a mesma.

Para pegar o jeito do trabalho, ele conclui apenas uma unidade de trabalho no primeiro dia .

Ele deseja comemorar a conclusão do trabalho e decide concluir uma unidade de trabalho no último dia .

Ele só pode concluir x, x+1ou x-1unidades de trabalho em um dia , onde xestão as unidades de trabalho concluídas no dia anterior.

Sua tarefa é criar um programa ou função que calcule o número mínimo de dias que ele levará para concluir as Nunidades de trabalho.

Entrada de amostra e saída:

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]

A entrada pode ser obtida através STDINou como argumento de função, ou de qualquer maneira apropriada.

A saída pode ser impressa ou como resultado de uma função ou de qualquer maneira apropriada.

Isso é . A solução mais curta vence.

HarshGiri
fonte
11
Dica: essa lista inteira pode ser útil.
gotejante Nun
11
Então, a entrada é restrita a números inteiros positivos, pois Kenny mostrou que é possível obter uma contagem negativa de trabalho? Ou o trabalho por dia é restrito a um mínimo de zero?
mbomb007
11
Por que você aceitou a resposta Pyth? Minha resposta Jelly é de 3 bytes mais curto ...
Dennis
Ei, @ Dennis, preciso entender a abordagem e @Kenny Lau me ajudam a entendê-la.
HarshGiri #
Eu sou novo no CodeGolf, por isso levará algum tempo para entender todos os itens aqui.
precisa saber é o seguinte

Respostas:

3

Gelatina , 5 bytes

×4’½Ḟ

Isso usa um formulário fechado da abordagem do @ LeakyNun .

Experimente online!

Devido a uma coincidência de sorte, está sobrecarregado como floor/ realpara números reais / complexos. Este é um dos únicos três átomos sobrecarregados em Jelly.

Como funciona

×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
fonte
11
Não se faz simplesmente ...
Leaky Nun
11
"Coincidência de sorte"
Arcturus
4

Pitão , 8 bytes

tfg/*TT4

Como funciona:

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

Experimente online!

No pseudo-código:

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

bônus, 22 bytes

"deve retornar 7 para -1"

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

Experimente online!

Freira Furada
fonte
3

JavaScript (ES2016), 24 bytes

Versão reduzida da variante ES6 abaixo, graças ao @Florent e ao Operador de Exponenciação (atualmente apenas no Firefox, versões noturnas ou transpilers).

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

JavaScript (ES6), 30 bytes

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

Com base nesta sequência .

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
fonte
Ainda mais curto no ES2016 (26 caracteres):f=n=>(n-1)**.5+(n+1)**.5|0
Florent
@ Florent Wow, obrigado, não estava ciente do próximo operador de exponenciação.
George Reith
2

JavaScript, 32. 31 bytes

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

Código não destruído:

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

Ele usa o mesmo algoritmo que o analisador de Kenny Lau, mas é implementado como fechamento recursivo para economizar alguns bytes.

Uso:

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

Solução REPL, 23 bytes

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

Anexar q=para executar o 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
Florent
fonte
Ele ainda usa os mesmos nomes de variáveis como o meu :)
Leaky Nun
Pode salvar um byte, girando >=para< : D
Leaky Nun
@KennyLau Thanks! Faz muito tempo que não jogo golfe. Estou um pouco enferrujado x)
Florent
for(t=1;;)if(t*t++/4>=q)return t-1;é apenas 36 bytes :) #
Nun Leaky #
11
@KennyLau Adicionei 23 bytes solution :)
Florent
2

Python, 28 bytes

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

Produz um flutuador. O maxque há para dar 0para n<=0, evitando um erro de raiz quadrada do negativo.

xnor
fonte
2

UGL , 30 25 bytes

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

Experimente online!

Não funciona para entradas negativas.

Como funciona:

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)

Solução anterior de 30 bytes:

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

Intérprete online aqui .

Não funciona para entradas negativas.

Como funciona:

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)
Freira Furada
fonte
1

MATL, 11 bytes

E:t*4/G<f0)

Algoritmo semelhante ao @KennyLau, exceto que, em vez de fazer um loop indefinidamente, faço um loop de 1 ... 2n para salvar alguns bytes.

Experimente Online!

Explicação

    % 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
fonte
@LuisMendo Obrigado por apontar isso. Atualizada!
Suever
0

Pyke, 8 bytes

#X4f)ltt

Experimente aqui!

Usa o mesmo algoritmo que o @KennyLau

Azul
fonte
0

Python, 43 bytes

f=lambda n,i=1:i-1if i*i>=n*4 else f(n,i+1)
orlp
fonte
11
pode salvar um byte usando <em vez de> =
Leaky Nun
0

Java 8, 30 24 bytes

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

Experimente online.

Não é necessário verificar se né maior que 0, porque o Java Math.sqrtretorna NaNpara entradas negativas, que se tornam 0com o elenco intque já usamos para as entradas positivas.

Kevin Cruijssen
fonte
0

Ruby , 30 bytes

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

Experimente online!

Salvando um byte aqui com em .to_ivez de .floor.

O suporte para quantidades não positivas de trabalho tem um custo de 6 bytes ( n<1?0:).

benj2240
fonte