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.
Voici une visualisation que mon ami de Wolfram a dessinée pour moi:
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.
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
Réponses:
Octave ,
414033 octets1 octet enregistré grâce à @Dennis
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!).la source
Python 3 , 35 octets
Essayez-le en ligne!
la source
Husk , 8 octets
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
la source
JavaScript, 30 octets
Une fonction récursive donc ça va se casser assez tôt.
Essayez-le en ligne
la source
Haskell, 38 octets
la source
Swift , 65 octets
Essayez-le en ligne!
Non golfé
la source
R , 39 octets
Essayez-le en ligne!
Force brute!
la source
Javascript (ES6), 34 octets
Non golfé
Cas de test
Afficher l'extrait de code
la source
eval
déclaration?eval
lai
variable serait nécessaire d'return
ed à la fin, au prix de quelques octets de plus.Gelée , 8 octets
C'est très lent.
Essayez-le en ligne!
la source
Haskell,
714948 octets@BMO m'a sauvé un énorme 22 octets!
la source
Julia 0,6 ,
3027 octetsEssayez-le en ligne!
Fonctionne uniquement jusqu'à
n = 6
, car Julia n'a pas d'optimisation d'appel de queue.-3 octets grâce à Dennis .
la source
TI-BASIC, 27 octets
Invite l'utilisateur à entrer et affiche la sortie à la fin. Remarque:
⁻¹
est le jeton -1 (inverse).la source
Ans
enN
immédiatement,Input N
ouPrompt N
est une méthode d'entrée qui vous fait gagner un octet surAns→N
. EtM
peut être remplacé parAns
, ce qui1→M
devient1
etM+1→M
devientAns+1
. (Mais je suis sceptique quant à une sortieAns
qui ne s'affiche pas - voyez ceci - donc peut-être que la fin:Ans
est appropriée: alors la valeur sera affichée à la place de "Terminé".)Ans→N
me sentais drôle. Belles optimisations. A également pris vos conseils sur la sortie juste pour être sûr.05AB1E , 11 octets
Essayez-le en ligne!
Explication
la source
Pyth , 10 octets
Essayez-le en ligne!
Extrêmement lent.
Pyth , 10 octets
Essayez-le en ligne!
la source
Japt , 12 octets
La même longueur que l'option récursive, mais légèrement plus efficace.
Essayez-le
Explication
la source
J, 22 octets
-6 octets grâce à frownyfrog
Essayez-le en ligne!
réponse originale
Réponse de Luis en J:
Non golfé
Généralement curieux de voir s'il peut être considérablement amélioré ( miles de recherche de toux )
Explication
Essayez-le en ligne!
la source
1+]i.~[:<.
->1+]I.~
->I.~0,
I.~0+/\@,
PHP, 35 octets
Exécutez-le à l'aide de la CLI:
la source
Wolfram Language (Mathematica) , 40 octets
Essayez-le en ligne!
la source
Java 8, 49 octets
Explication:
Essayez-le en ligne. (Délai d'attente pour les cas de test ci-dessus
n=7
.)la source
tinylisp , 98 octets
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,
N
est le numérateur,D
le dénominateur etk
l'indice de somme. Nous voulons que la nouvelle somme partielle soitN/D + 1/k
, ou(N*k + D)/(D*k)
. Ainsi, nous récursions avec un nouveau numérateur deN*K + D
, un nouveau dénominateur deD*k
et un nouvel indice dek+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 revenonsk-1
. La condition est1/2 * N/D < #
; multipliant le dénominateur, nous obtenonsN < 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 corrigerk
,N
etD
.la source