Quero que meu livro fique longe desta mesa


21

História

Então, eu tenho um livro que quero separar da minha mesa com nada além de outros livros. Quero saber quantos livros eu preciso para conseguir isso com um comprimento de livros.n

Aqui está uma visualização que meu amigo da Wolfram desenhou para mim:

uma visualização da Wolfram

Mais informações sobre o tópico em Wolfram e Wikipedia .

Desafio

Dada uma entrada inteira , imprima quantos livros são necessários para que o livro superior fique com comprimento de livro da tabela horizontalmente. ou Encontre o menor valor inteiro de para a entrada na seguinte desigualdade. nnn

n m i = 1 1mn

i=1m12in

Editar: para frações, use pelo menos um ponto flutuante de precisão única IEEE. desculpe pelo desafio de edição após a postagem

( OEIS A014537 )

Casos de teste

 1          4
 2         31
 3        227
 5      12367
10  272400600


Precisa usar esse arranjo específico de livros, que o IIRC não é o ideal?
user253751

Respostas:


13

Oitava , 41 40 33 bytes

1 byte salvo graças a @Dennis

@(n)find(cumsum(.5./(1:9^n))>n,1)

Experimente online!

Explicação

Isso usa o fato de que os números harmônicos podem ser delimitados por uma função logarítmica.

Além disso, a >=comparação pode ser substituída por, >porque os números harmônicos não podem ser inteiros (obrigado, @Dennis!).

@(n)                                   % Anonymous function of n
                     1:9^n             % Range [1 2 ... 9^n]
                .5./(     )            % Divide .5 by each entry
         cumsum(           )           % Cumulative sum
                            >n         % Is each entry greater than n?
    find(                     ,1)      % Index of first true entry


10

Casca , 8 bytes

V≥⁰∫m\İ0

Experimente online!

Como Husk usa números racionais quando pode, isso não tem problemas de ponto flutuante

Explicação

      İ0    The infinite list of positive even numbers
    m\      Reciprocate each
   ∫        Get the cumulative sum
V           Find the index of the first element
 ≥⁰         that is greater than or equal to the input

8 bytes, mas em qual conjunto de caracteres?
precisa saber é o seguinte

3
@ john16384 O Husk possui sua própria página de códigos, onde cada símbolo corresponde a um único byte. Aqui está o hexdump correspondente
H.PWiz


4

Haskell, 38 bytes

k!n|n<=0=0|x<-n-1/(2*k)=1+(k+1)!x
(1!)

3

Rápido , 65 bytes

func f(n:Double){var i=0.0,s=i;while s<n{i+=1;s+=0.5/i};print(i)}

Experimente online!

Ungolfed

func f(n:Double) {
  var i = 0.0, s = 0.0
  while s < n {
    i += 1;
    s += 0.5 / i
  }
  print(i)
}


3

Javascript (ES6), 34 bytes

n=>eval("for(i=0;n>0;n-=.5/i)++i")

Ungolfed

n => {
    for(i = 0; n > 0; ++i)
        n -= .5 / i
    return i;
}

Casos de teste


Veio com uma solução semelhante usando recursão por 30 bytes. Não sei se publicá-lo ou não, depois de ver o seu.
Salsicha

1
Talvez esteja faltando alguma coisa, mas por que você precisa envolvê-la em uma evaldeclaração?
caird coinheringaahing

1
@cairdcoinherigaahing, sem evala ivariável terá de ser returned no final, à custa de mais alguns bytes.
Salsicha


2

Haskell, 71 49 48 bytes

f x=length.fst.span(<x).scanl(+)0$(0.5/)<$>[1..]

A @BMO me salvou 22 bytes!



2

TI-BASIC, 27 bytes

Solicita entrada ao usuário e exibe a saída na finalização. Nota: ⁻¹é o token -1 (inverso).

Input N
1
Repeat 2N≤Σ(I⁻¹,I,1,Ans
Ans+1
End
Ans

2
Se você estiver indo para salvar Ansno Nimediato, em seguida, Input Nou Prompt Né um método de entrada que você economiza um byte mais Ans→N. E Mpode ser substituído por Ans, para que 1→Mse torne 1e M+1→Mse torne Ans+1. (Mas eu sou cético sobre uma saída em Ansque não são exibidas - veja este - então talvez terminando com :Ansé apropriado:., Em seguida, o valor será exibido no lugar de "Done")
Misha Lavrov

Obrigado! Eu sabia que Ans→Nera engraçado. Otimizações agradáveis. Também tomou seu conselho sobre a saída apenas para ser seguro. Ainda sai com uma rede -3 bytes: D
kamoroso94

1

05AB1E , 11 bytes

XµN·zODI›}N

Experimente online!

Explicação

Xµ       }    # loop until counter is 1
  N·z         # push 1/(2*N)
     O        # sum the stack
      DI›     # break if the sum is greater than the input
          N   # push N


1

Japonês , 12 bytes

O mesmo comprimento, mas um pouco mais eficiente que, a opção recursiva.

@T¨(Uµ½÷X}a1

Tente


Explicação

@T¨(Uµ½÷X}a1
                 :Implicit input of integer U
@        }a1     :Return the first number X >=1 that returns truthy when passed through the following function
 T               :Zero
  ¨              :Greater than or equal to
    Uµ           :Decrement U by...
      ½÷X        :0.5 divided by X

1

J, 22 bytes

-6 bytes graças ao frownyfrog

I.~0+/\@,1%2*1+[:i.9&^

Experimente online!

resposta original

A resposta de Luis em J:

1+]i.~[:<.[:+/\1%2*1+[:i.9&^

Ungolfed

1 + ] i.~ [: <. [: +/\ 1 % 2 * 1 + [: i. 9&^

Principalmente curioso para ver se ele pode ser melhorado drasticamente ( tosse paging miles)

Explicação

1 +      NB. 1 plus... 
] i.~    NB. find the index of the arg in...
[: <.    NB. the floor of...
[: +/\   NB. the sumscan of...
1 %      NB. the reciprical of...
2 *      NB. two times...
1 +      NB. 1 plus...
[: i.    NB.  the integers up to 
9&^      NB. 9 raised to the power of the arg

Experimente online!


1+]i.~[:<.-> 1+]I.~->I.~0,
FrownyFrog

ofc! obrigado frownyfrog
Jonah

E entãoI.~0+/\@,
FrownyFrog

Se você editar, você vai bater Julia :)
FrownyFrog

@FrownyFrog, feito. se você tiver algum tempo, eu adoraria ver você resolver este: codegolf.stackexchange.com/questions/154345/bracket-expansion . todas as soluções que eu posso pensar são muito detalhado para postar em boa consciência ...
Jonas

0

PHP, 35 bytes

while($argv[1]>$s+=.5/++$i);echo$i;

Execute-o usando a CLI:

$ php -d error_reporting=0 -r 'while($argv[1]>$s+=.5/++$i);echo$i;' 5


0

Java 8, 49 bytes

n->{float r=0,s=0;for(;s<n;)s+=.5f/++r;return r;}

Explicação:

Experimente online. (Tempo limite para os casos de teste acima n=7.)

n->{             // Method with integer parameter and float return-type
  float r=0,     //  Result-float, starting at 0
        s=0;     //  Sum-float, starting at 0
  for(;s<n;)     //  Loop as long as the sum is smaller than the input
    s+=.5f/++r;  //   Increase the sum by `0.5/(r+1)`,
                 //   by first increasing `r` by 1 with `r++`
  return r;}     //  Return the result-float

0

tinylisp , 98 bytes

(load library
(d _(q((k # N D)(i(l N(* D # 2))(_(inc k)#(+(* N k)D)(* D k))(dec k
(q((#)(_ 1 # 0 1

A última linha é uma função lambda sem nome que pega o número de comprimentos de livros e retorna o número de livros necessários. Experimente online!

Explicação

O único tipo de dado numérico tinylisp é o número inteiro; portanto, calculamos a série harmônica como uma fração, acompanhando o numerador e o denominador. Em cada etapa, Né o numerador, Dé o denominador e ké o índice da soma. Queremos que a nova soma parcial seja N/D + 1/k, ou (N*k + D)/(D*k). Assim, recorremos a um novo numerador de N*K + D, um novo denominador de D*ke um novo índice de k+1.

A recursão deve parar quando a soma parcial for maior ou igual ao #número desejado de comprimentos de livros. Neste ponto, já fomos longe demais em um livro, então voltamos k-1. A condição é 1/2 * N/D < #; multiplicando o denominador, obtemos N < D*#*2, que é a maneira mais divertida de escrevê-lo.

A função auxiliar recursiva _faz todos esses cálculos; a principal função é apenas um de um argumento invólucro que as chamadas _com os valores iniciais corretos para k, N, e D.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.