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


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


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

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


4

Haskell, 38 octets

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

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)
}


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


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!



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

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


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

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!


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


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

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 .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.