Logarithmes entiers


12

Étant donné des entiers N , P > 1, trouvez le plus grand entier Mtel que P ^ M ≤ N.

E / S:

L'entrée est donnée sous la forme de 2 entiers Net P. La sortie sera l'entier M.

Exemples:

4, 5 -> 0
33, 5 -> 2
40, 20 -> 1
242, 3 -> 4 
243, 3 -> 5 
400, 2 -> 8
1000, 10 -> 3

Remarques:

L'entrée sera toujours valide, c'est-à-dire qu'il s'agira toujours d'entiers supérieurs à 1.

Crédits:

Le nom revient à @cairdcoinheringaahing. Les 3 derniers exemples sont de @Nitrodon et le crédit pour l'amélioration de la description va à @Giuseppe.


3
Je sais que nous (la communauté PPCG) pouvons sembler trop pointilleux sur de très petites choses, mais des commentaires comme le mien sont vraiment destinés, de bonne foi, à améliorer le défi! Maintenant que cela a été résolu, j'ai voté avec joie et supprimé mes commentaires précédents.
Giuseppe

9
C'est une autre raison pour laquelle nous suggérons de publier des défis dans The Sandbox en premier, afin que vous puissiez recevoir des commentaires utiles, publier un grand défi et obtenir beaucoup de réponses de haute qualité, avec beaucoup moins d'agitation (comme les votes serrés et les votes bas). :)
Giuseppe

2
Vous pouvez toujours publier dans le salon de discussion général de PPCG pour demander des commentaires sur vos défis de bac à sable pour les attirer un peu plus.
Giuseppe

12
Presque toutes les réponses actuelles basées sur des mathématiques à virgule flottante produisent des résultats erronés, même pour des cas simples comme (1000, 10) en raison d'une erreur d'arrondi, j'ai donc ajouté un autre cas de test.
nwellnhof

3
@MPW toutes les réponses ont été supprimées et les suggestions que j'ai faites ont été modifiées dans le message, elles n'étaient donc plus pertinentes.
Giuseppe

Réponses:


8

Brain-Flak , 74 octets

(({}<>)[()])({()<(({})<({([{}]()({}))([{}]({}))}{})>){<>({}[()])}{}>}[()])

Essayez-le en ligne!

Cela utilise le même concept que l'algorithme standard de division d'entiers positifs Brain-Flak.

# Push P and P-1 on other stack
(({}<>)[()])

# Count iterations until N reaches zero:
({()<

  # While keeping the current value (P-1)*(P^M) on the stack:
  (({})<

    # Multiply it by P for the next iteration
    ({([{}]()({}))([{}]({}))}{})

  >)

  # Subtract 1 from N and this (P-1)*(P^M) until one of these is zero
  {<>({}[()])}{}

# If (P-1)*(P^M) became zero, there is a nonzero value below it on the stack
>}

# Subtract 1 from number of iterations
[()])

7

JavaScript (ES6), 22 octets

8 octets enregistrés grâce à @Neil

Prend des entrées dans la syntaxe de curry (p)(n).

p=>g=n=>p<=n&&1+g(n/p)

Essayez-le en ligne!


6

Excel, 18 octets

=TRUNC(LOG(A1,A2))

Prend l'entrée "n" à A1 et l'entrée "p" à A2.


Je pense que vous pouvez utiliser la INTfonction au lieu d' TRUNCenregistrer 2 octets.
pajonk

4

Gelée , 3 octets

bḊL

Cela n'utilise pas d'arithmétique à virgule flottante, il n'y a donc pas de problème de précision.

Essayez-le en ligne!

Comment ça fonctionne

bḊL  Main link. Left argument: n. Right argument: p

b    Convert n to base p.
 Ḋ   Dequeue; remove the first base-p digit.
  L  Take the length.

3

Retina 0.8.2 , 35 octets

.+
$*
+r`1*(\2)+¶(1+)$
#$#1$*1¶$2
#

Essayez-le en ligne! Explication:

.+
$*

Convertissez les arguments en unaire.

+r`1*(\2)+¶(1+)$
#$#1$*1¶$2

Si le deuxième argument divise le premier, remplacez le premier argument par un #plus le résultat entier, en éliminant le reste. Répétez cette opération jusqu'à ce que le premier argument soit inférieur au second.

#

Comptez le nombre d'exécutions de la boucle.


3

Japt, 8 octets

@<Vp°X}a

Essayez-le


C'est vraiment bien, je n'ai pas encore vraiment vu une bonne utilisation des méthodes de fonction dans Japt, c'est un bon exemple.
Nit

@Nit, il m'a fallu un bon moment pour les maîtriser également - je n'ai commencé à trouver des utilisations que récemment F.g()- mais ils sont incroyablement utiles.
Shaggy


3

Perl 6 , 13 octets

&floor∘&log

Essayez-le en ligne!

La concaténation qui compose le journal et le sol, a implicitement 2 arguments car le premier journal de fonction en attend 2. Le résultat est une fonction.


3
Pour les arguments, 1000, 10cela renvoie 2.
Sean

@Sean: Huh, problème de précision intéressant là
Phil H


3

R , 25 octets

function(p,n)log(p,n)%/%1

Essayez-le en ligne!

Prenez le journal de Pbase Net faites une division entière avec 1, car il est plus court que floor(). Cela souffre un peu de la précision numérique, donc je présente également la réponse ci-dessous, qui ne devrait pas, à part un débordement d'entier possible.

R , 31 octets

function(p,n)(x=p:0)[n^x<=p][1]

Essayez-le en ligne!


1
Je ne sais pas à quel point le défi nous oblige à être sur une erreur d'arrondi, mais par exemple, f (243,3) est égal à 4 alors qu'il doit probablement être 5.
JDL

@JDL c'est un bon point; Je crois qu'une réponse parfaitement précise serait ~ 31 octets.
Giuseppe

1
Je pense que vous pouvez remplacer ppar p+.1dans la réponse de 25 octets et vous serez toujours d'accord, pour 28 octets
JDL

Une autre solution de 28 octets sans problèmes de précision numérique.
Robin Ryder


2

Rubis , 31 octets

OK, donc toutes ces approches basées sur les journaux sont sujettes à des erreurs d'arrondi, voici donc une autre méthode qui fonctionne avec des entiers et est exempte de ces problèmes:

->n,p{(0..n).find{|i|p**i>n}-1}

Essayez-le en ligne!

Mais revenons aux logarithmes, bien qu'il ne soit pas clair jusqu'à quelle précision nous devons prendre en charge l'entrée, mais je pense que cette petite astuce résoudrait le problème d'arrondi pour tous les nombres plus ou moins "réalistes":

Rubis , 29 octets

->n,p{Math.log(n+0.1,p).to_i}

Essayez-le en ligne!


2

C (gcc) + -lm, 24 octets

f(n,m){n=log(n)/log(m);}

Essayez-le en ligne!


Je sais long longmais c'est quoi bytes bytes? : P
totalement humain le

De plus, les drapeaux n'ajoutent plus à votre nombre d'octets, j'ai donc modifié pour refléter cela.
2018

5
Ne fonctionne pas pour (1000, 10) en raison d'une erreur d'arrondi.
nwellnhof

f(n,m){n=(float)log(n)/log(m);}semble fonctionner @ 31 octets
GPS



2

05AB1E , 6 octets

Lm¹›_O

Essayez-le en ligne!


cela semble juste injuste pour tout le monde
Floris

1
Les concours @Floris se font entre les soumissions dans chaque langue et non entre les langues, n'est-ce pas?
user202729

@ user202729 oui et non. Dans mon esprit, à la fin, "le code le plus court gagne". Mais j'ai remarqué qu'il y avait une solution à 2 octets plus bas ... Ces langages de golf m'époustouflent.
Floris

1
@Floris "Ne laissez pas les langages de golf de code vous décourager de publier des réponses avec des langages non-golfeurs de codes. Essayez de trouver une réponse aussi courte que possible pour" n'importe quel "langage de programmation."
user202729

1
@Floris Aussi ... même Excel peut le faire en 2 builtins . Les langues de golf peuvent également le faire dans 2 fonctions intégrées, seuls les noms intégrés sont plus courts. Rien à surprendre.
user202729

2

JavaScript , 40 33 octets

-3 octets grâce à DanielIndie

Prend des entrées dans la syntaxe de curry.

a=>b=>(L=Math.log)(a)/L(b)+.001|0

Essayez-le en ligne!



1
28 octets et peut-être si vous voulez une méthode au curry
DanielIndie



4
La toStringsolution ne fonctionne que pour les bases jusqu'à 36.
nwellnhof

2

Pari / GP, 6 octets

logint

(intégré dans la version 2.7, mars 2014. Prend deux arguments, avec une troisième référence facultative qui, si elle est présente, est définie sur la base élevée au résultat)


@StewieGriffin logint (x, y) de Pari / GP et Perl / ntheory donne les résultats corrects pour les 7 exemples actuellement présentés, y compris '3' pour 1000,10.
DanaJ

+1, mais je compterais cela comme 6 octets.
Charles

2
Vous n'êtes pas autorisé à utiliser des entrées codées en dur, il doit donc s'agir d'une fonction (par exemple, comme lambda ou définition). Cependant, vous pouvez simplement utiliser logintce qui est valide et compte 5 octets de moins.
ბიმო

2

Python 2, 3, 46 octets

-1 merci à jonathan

def A(a,b,i=1):
 while b**i<=a:i+=1
 return~-i

Python 1, 47 octets

def A(a,b,i=1):
 while b**i<=a:i=i+1
 return~-i

n~-iest un octet plus court que n i-1.
Jonathan Frech

Veuillez également indiquer la version de votre Python.
Jonathan Frech

Fonctionnera dans n'importe quelle version, n'est-ce pas?
Vedant Kandoi

Cela ne fonctionnera pas dans Python 1.
Jonathan Frech




1

Langue Wolfram (Mathematica) 15 10 octets

Floor@*Log 

(nécessite un ordre inversé sur l'entrée)

Soumission originale

⌊#2~Log~#⌋&

⌊Log@##⌋&est un octet plus court
Lukas Lang

@ Mathe172, c'est un caractère plus court, mais je compte 13 octets là-dessus. L'étage gauche et l'étage droit comptent pour 3 octets chacun en UTF-8.
Kelly Lowder

@StewieGriffin% [10,1000] donne 3. Les entrées sont traitées comme des entiers plutôt que comme des numéros de machine, sauf si vous placez une décimale après eux.
Kelly Lowder

1

Forth (gforth) , 35 octets

: f swap s>f flog s>f flog f/ f>s ;

Essayez-le en ligne!

Pourrait économiser 5 octets en échangeant les paramètres d'entrée attendus, mais la question spécifie que N doit être le premier (un argument pourrait être avancé que dans un langage de suffixe "Premier" signifie haut de la pile, mais je m'en tiendrai à la lettre des règles pour maintenant)

Explication

swap       \ swap the parameters to put N on top of the stack
s>f flog   \ move N to the floating-point stack and take the log(10) of N
s>f flog   \ move P to the floating-point stack and take the log(10) of P
f/         \ divide log10(N) by log10(P)
f>s        \ move the result back to the main (integer) stack, truncating in the process

1

Pyth, 6 4 octets

s.lF

Enregistré 2 octets grâce à Mmenomic
Essayez-le en ligne

Comment ça fonctionne

.lest log B (A)
Pour être honnête, je ne sais pas comment ça Fmarche. Mais si ça marche, ça marche.
stronque un flottant en un entier pour nous donner l'entier le plus élevé pour M.


2
1000,10 en entrée donne 2 en sortie
Stewie Griffin

Une autre solution similaire est/FlM
RK.

1

Wonder , 9 octets

|_.sS log

Exemple d'utilisation:

(|_.sS log)[1000 10]

Explication

Version détaillée:

floor . sS log

C'est un style écrit sans point. sStransmet des éléments de liste comme arguments à une fonction (dans ce cas, log).


1

Gforth , 31 octets

SWAP S>F FLOG S>F FLOG F/ F>S .

Usage

242 3 SWAP S>F FLOG S>F FLOG F/ F>S . 4 OK

Essayez-le en ligne!

Explication

Malheureusement, FORTH utilise une pile à virgule flottante dédiée. Pour cela, je dois SWAP(échanger) les valeurs d'entrée afin qu'elles arrivent à la pile à virgule flottante dans le bon ordre. Je dois également déplacer les valeurs vers cette pile avec S>F. Lors du déplacement du résultat en virgule flottante vers integer ( F>S), j'ai l'avantage d'obtenir la troncature gratuitement.

Version plus courte

En étendant les exigences et en fournissant l'entrée au format flottant et dans le bon ordre, il existe une version plus courte avec 24 octets.

FLOG FSWAP FLOG F/ F>S .
3e0 242e0 FLOG FSWAP FLOG F/ F>S . 4 OK

Essayez-le en ligne!


Généralement, pour les réponses CodeGolf, les extraits sont interdits (sauf indication contraire dans le défi). Cette réponse doit être soit enveloppée d'une fonction (Word in Forth), : f .... ;soit convertie en un programme qui KEYACCEPT
accepte les

@reffu Qu'est-ce qu'un extrait? À mon avis, une petite partie de code pour montrer quelque chose, qui, cependant, n'a rien de significatif pour lui-même. D'un autre côté, le code que j'ai fourni fonctionne sans modification sur "Essayez-le en ligne!". Faut-il aller méta?
Kitana

Dans ce cas particulier, le code que vous avez publié provoquera en fait un sous-dépassement de pile, sauf si vous placez les paramètres avant lui. Les réponses au code de golf doivent généralement être un programme ou une fonction autonome qui produit le résultat attendu s'il est appelé plus tard. Si vous suivez le lien vers le meta post dans mon commentaire précédent, il mentionne explicitement que la norme est que les réponses soient un programme ou une fonction, dont la vôtre n'est ni l'un ni l'autre. Pour le réparer, il ne faudrait que 4 octets
supplémentaires



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.