Je veux que mon livre soit loin de cette table

21

Récit

J'ai donc un livre que je veux séparer de ma table avec rien d'autre que d'autres livres. Je veux savoir de combien de livres ai-je besoin pour y parvenir avec longueurs de livre.n

Voici une visualisation que mon ami de Wolfram a dessinée pour moi:

une visualisation de Wolfram

Plus d'informations sur le sujet dans Wolfram et Wikipedia .

Défi

Étant donné une entrée entière , affichez le nombre de livres nécessaires pour que le livre supérieur soit longueur de livre de la table horizontalement. ou Trouvez la plus petite valeur entière de pour l'entrée dans l'inégalité suivante. nn

mn

i=1m12in

Edit: pour les fractions, utilisez au moins un point flottant simple précision IEEE. désolé pour l'édition du défi après la publication

( OEIS A014537 )

Cas de test

 1          4
 2         31
 3        227
 5      12367
10  272400600
betseg
la source
1
youtube.com/watch?v=pBYPXsGka74 <- en rapport
streetster
Doit-il utiliser cet arrangement particulier de livres, que l'IIRC n'est pas optimal?
user253751

Réponses:

13

Octave , 41 40 33 octets

1 octet enregistré grâce à @Dennis

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

Essayez-le en ligne!

Explication

Cela utilise le fait que les nombres harmoniques peuvent être limités par une fonction logarithmique.

De plus, la >=comparaison peut être remplacée par >car les nombres harmoniques ne peuvent pas être des entiers pairs (merci, @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
Luis Mendo
la source
10

Husk , 8 octets

V≥⁰∫m\İ0

Essayez-le en ligne!

Étant donné que Husk utilise des nombres rationnels quand cela est possible, cela ne présente aucun problème de virgule flottante

Explication

      İ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
H.PWiz
la source
8 octets, mais dans quel jeu de caractères?
john16384
3
@ john16384 Husk a sa propre page de codes où chaque symbole correspond à un seul octet. Voici le hexdump correspondant
H.PWiz
5

JavaScript, 30 octets

Une fonction récursive donc ça va se casser assez tôt.

f=(n,x=0)=>n>0?f(n-.5/++x,x):x

Essayez-le en ligne

Hirsute
la source
4

Haskell, 38 octets

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

Swift , 65 octets

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

Essayez-le en ligne!

Non golfé

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

Javascript (ES6), 34 octets

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

Non golfé

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

Cas de test

Herman L
la source
Entré avec une solution similaire en utilisant la récursivité pour 30 octets. Je ne sais pas si je dois le poster ou non, après avoir vu le vôtre.
Shaggy
1
Je manque peut-être quelque chose, mais pourquoi avez-vous besoin de l'envelopper dans une evaldéclaration?
caird coinheringaahing
1
@cairdcoinherigaahing, sans evalla ivariable serait nécessaire d' returned à la fin, au prix de quelques octets de plus.
Shaggy
2

Haskell, 71 49 48 octets

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

@BMO m'a sauvé un énorme 22 octets!

BlackCap
la source
2

TI-BASIC, 27 octets

Invite l'utilisateur à entrer et affiche la sortie à la fin. Remarque: ⁻¹est le jeton -1 (inverse).

Input N
1
Repeat 2N≤Σ(I⁻¹,I,1,Ans
Ans+1
End
Ans
kamoroso94
la source
2
Si vous allez économiser Ansen Nimmédiatement, Input Nou Prompt Nest une méthode d'entrée qui vous fait gagner un octet sur Ans→N. Et Mpeut être remplacé par Ans, ce qui 1→Mdevient 1et M+1→Mdevient Ans+1. (Mais je suis sceptique quant à une sortie Ansqui ne s'affiche pas - voyez ceci - donc peut-être que la fin :Ansest appropriée: alors la valeur sera affichée à la place de "Terminé".)
Misha Lavrov
Merci! Je savais que je Ans→Nme sentais drôle. Belles optimisations. A également pris vos conseils sur la sortie juste pour être sûr.
Sort
1

05AB1E , 11 octets

XµN·zODI›}N

Essayez-le en ligne!

Explication

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

Japt , 12 octets

La même longueur que l'option récursive, mais légèrement plus efficace.

@T¨(Uµ½÷X}a1

Essayez-le


Explication

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

J, 22 octets

-6 octets grâce à frownyfrog

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

Essayez-le en ligne!

réponse originale

Réponse de Luis en J:

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

Non golfé

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

Généralement curieux de voir s'il peut être considérablement amélioré ( miles de recherche de toux )

Explication

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

Essayez-le en ligne!

Jonas
la source
1+]i.~[:<.-> 1+]I.~->I.~0,
FrownyFrog
ofc! merci frownyfrog
Jonah
Et puisI.~0+/\@,
FrownyFrog
Si vous éditez, vous allez battre Julia :)
FrownyFrog
@FrownyFrog, c'est fait. si vous avez un peu de temps, j'aimerais vous voir résoudre celui-ci: codegolf.stackexchange.com/questions/154345/bracket-expansion . toutes les solutions auxquelles je peux penser sont trop verbeuses pour être publiées en toute bonne conscience ...
Jonah
0

PHP, 35 octets

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

Exécutez-le à l'aide de la CLI:

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

Java 8, 49 octets

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

Explication:

Essayez-le en ligne. (Délai d'attente pour les cas de test ci-dessus 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
Kevin Cruijssen
la source
0

tinylisp , 98 octets

(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

La dernière ligne est une fonction lambda sans nom qui prend le nombre de longueurs de livre et renvoie le nombre de livres nécessaires. Essayez-le en ligne!

Explication

Le seul type de données numériques que possède tinylisp est les entiers, nous calculons donc la série harmonique sous forme de fraction en gardant une trace du numérateur et du dénominateur. À chaque étape, Nest le numérateur, Dle dénominateur et kl'indice de somme. Nous voulons que la nouvelle somme partielle soit N/D + 1/k, ou (N*k + D)/(D*k). Ainsi, nous récursions avec un nouveau numérateur de N*K + D, un nouveau dénominateur de D*ket un nouvel indice de k+1.

La récursivité doit s'arrêter une fois que la somme partielle est supérieure ou égale au #nombre de longueurs de livre souhaité. À ce stade, nous sommes allés un livre trop loin, alors nous revenons k-1. La condition est 1/2 * N/D < #; multipliant le dénominateur, nous obtenons N < D*#*2, qui est la façon la plus golfique de l'écrire.

La fonction d'aide récursive _effectue tous ces calculs; la fonction principale est simplement une enveloppe d' un argument selon lequel les appels _avec les valeurs de départ pour corriger k, NetD .

DLosc
la source