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.

Muhammad Salman
la source
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
[()])
Nitrodon
la source
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!

Arnauld
la source
6

Excel, 18 octets

=TRUNC(LOG(A1,A2))

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

qoou
la source
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.
Dennis
la source
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.

Neil
la source
3

Japt, 8 octets

@<Vp°X}a

Essayez-le

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

Haskell , 30 octets

n!p=until((>n).(p^).(1+))(1+)0

Essayez-le en ligne!

Roman Czyborra
la source
1
Soit until((>n).(p^))(1+)0-1ou until(\x->p^x*p>n)(1+)0vous descend à 27 octets.
Lynn
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.

Phil H
la source
3
Pour les arguments, 1000, 10cela renvoie 2.
Sean
@Sean: Huh, problème de précision intéressant là
Phil H
3

Haskell , 16 octets

(floor.).logBase

Essayez-le en ligne!

Haskell a été conçu par des mathématiciens et dispose donc d'un bel ensemble de fonctions liées aux mathématiques dans Prelude.

totalement humain
la source
6
Ne fonctionne pas pour (1000, 10) en raison d'une erreur d'arrondi.
nwellnhof
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!

Giuseppe
la source
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!

Kirill L.
la source
2

C (gcc) + -lm, 24 octets

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

Essayez-le en ligne!

betseg
la source
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!

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

Oliver
la source
29 octets
DanielIndie
1
28 octets et peut-être si vous voulez une méthode au curry
DanielIndie
Ne fonctionne pas pour (999, 10) (devrait produire 2)
Herman L
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)

DanaJ
la source
@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
Vedant Kandoi
la source
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
2

JavaScript (Node.js) , 22 octets

m=>f=n=>n<m?0:f(n/m)+1

Essayez-le en ligne!

Fonction récursive curry. Utiliser comme g(P)(N). Moins sujet aux erreurs en virgule flottante qu'à l' utilisationMath.log , et (je crois) le code donne des valeurs correctes tant que les deux entrées sont des entiers sûrs (en dessous 2**52).

Bubbler
la source
1

Langue Wolfram (Mathematica) 15 10 octets

Floor@*Log 

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

Soumission originale

⌊#2~Log~#⌋&
Kelly Lowder
la source
⌊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
reffu
la source
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.

fortraan
la source
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).

Mama Fun Roll
la source
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!

Kitana
la source
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