Logaritmos enteros

12

Dados enteros N , P > 1, encuentre el entero más grande Mtal que P ^ M ≤ N.

E / S:

La entrada se da como 2 enteros Ny P. La salida será el entero M.

Ejemplos:

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

Notas:

La entrada siempre será válida, es decir, siempre serán enteros mayores que 1.

Créditos

El crédito por el nombre va a @cairdcoinheringaahing. Los últimos 3 ejemplos son de @Nitrodon y el crédito por mejorar la descripción va a @Giuseppe.

Muhammad Salman
fuente
3
Sé que nosotros (la comunidad PPCG) puede parecer demasiado quisquilloso con cosas realmente pequeñas, ¡pero comentarios como los míos realmente tienen la intención, de buena fe, de mejorar el desafío! Ahora que eso se ha resuelto, felizmente he votado y eliminado mis comentarios anteriores.
Giuseppe
99
Esa es otra razón por la que sugerimos publicar desafíos en The Sandbox primero, para que pueda recibir comentarios útiles, publicar un gran desafío y obtener muchas respuestas de alta calidad, con mucho menos alboroto (como votos cerrados y negativos). :)
Giuseppe
2
Siempre puede publicar en la sala de chat general de PPCG solicitando comentarios sobre sus desafíos de sandbox para llamarlos un poco más.
Giuseppe
12
Casi todas las respuestas actuales basadas en matemáticas de punto flotante producen resultados incorrectos incluso para casos simples como (1000, 10) debido a un error de redondeo, por lo que agregué otro caso de prueba.
nwellnhof
3
@MPW se eliminaron todas las respuestas y las sugerencias que hice se editaron en la publicación, por lo que ya no eran relevantes.
Giuseppe

Respuestas:

8

Brain-Flak , 74 bytes

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

Pruébalo en línea!

Utiliza el mismo concepto que el algoritmo de división de enteros positivo Brain-Flak estándar.

# 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
fuente
7

JavaScript (ES6), 22 bytes

Guardado 8 bytes gracias a @Neil

Toma entrada en la sintaxis de curry (p)(n).

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

Pruébalo en línea!

Arnauld
fuente
6

Excel, 18 bytes

=TRUNC(LOG(A1,A2))

Toma la entrada "n" en A1 y la entrada "p" en A2.

qoou
fuente
Creo que puede usar la INTfunción en lugar de TRUNCguardar 2 bytes.
pajonk
4

Jalea , 3 bytes

bḊL

Esto no utiliza aritmética de punto flotante, por lo que no hay problemas de precisión.

Pruébalo en línea!

Cómo funciona

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
fuente
3

Retina 0.8.2 , 35 bytes

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

Pruébalo en línea! Explicación:

.+
$*

Convierta los argumentos a unario.

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

Si el segundo argumento divide el primero, reemplace el primer argumento con un resultado #más el entero, descartando el resto. Repita esto hasta que el primer argumento sea menor que el segundo.

#

Cuente la cantidad de veces que se ejecutó el ciclo.

Neil
fuente
3

Japt, 8 bytes

@<Vp°X}a

Intentalo

Lanudo
fuente
Esto es realmente bueno, todavía no he visto un buen uso de los métodos de función en Japt, este es un buen ejemplo.
Nit
@Nit, también me tomó un buen tiempo familiarizarme con ellos, solo recientemente comencé a descubrir los usos F.g(), pero son increíblemente útiles.
Shaggy
3

Haskell , 30 bytes

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

Pruébalo en línea!

Roman Czyborra
fuente
1
Ya sea until((>n).(p^))(1+)0-1o until(\x->p^x*p>n)(1+)0se pone manos a 27 bytes.
Lynn
3

Perl 6 , 13 bytes

&floor∘&log

Pruébalo en línea!

La concatenación que compone el registro y el piso, implícitamente tiene 2 argumentos porque el registro de la primera función espera 2. El resultado es una función.

Phil H
fuente
3
Para argumentos 1000, 10esto devuelve 2.
Sean
@Sean: Huh, interesante problema de precisión allí
Phil H
3

Haskell , 16 bytes

(floor.).logBase

Pruébalo en línea!

Haskell fue diseñado por matemáticos por lo que tiene un buen conjunto de funciones relacionadas con las matemáticas en Prelude.

totalmente humano
fuente
66
No funciona para (1000, 10) debido a un error de redondeo.
nwellnhof
3

R , 25 bytes

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

Pruébalo en línea!

Tome el registro de Pbase Ny haga una división entera con 1, ya que es más corto que floor(). Esto sufre un poco de precisión numérica, por lo que también presento la respuesta a continuación, que no debería, aparte de un posible desbordamiento de enteros.

R , 31 bytes

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

Pruébalo en línea!

Giuseppe
fuente
1
No sé cuán estricto el desafío requiere que estemos en el error de redondeo, pero por ejemplo, f (243,3) es igual a 4 cuando probablemente se requiera que sea 5.
JDL
@JDL ese es un punto justo; Creo que una respuesta perfectamente precisa sería ~ 31 bytes.
Giuseppe
1
Creo que puede reemplazar ppor p+.1en la respuesta de 25 bytes y aún estará bien, por 28 bytes
JDL
Otra solución de 28 bytes sin problemas de precisión numérica.
Robin Ryder
2

Ruby , 31 bytes

OK, entonces todos esos enfoques basados ​​en registros son propensos a errores de redondeo, por lo que aquí hay otro método que funciona con enteros y está libre de esos problemas:

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

Pruébalo en línea!

Pero volviendo a los logaritmos, aunque no está claro hasta qué precisión debemos apoyar la entrada, pero creo que este pequeño truco resolvería el problema de redondeo para todos los números más o menos "realistas":

Ruby , 29 bytes

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

Pruébalo en línea!

Kirill L.
fuente
2

C (gcc) + -lm, 24 bytes

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

Pruébalo en línea!

Betseg
fuente
Lo sé, long longpero ¿qué es bytes bytes? : P
totalmente humano
Además, las banderas ya no se agregan a tu recuento de bytes, así que edité para reflejar esto.
totalmente humano
55
No funciona para (1000, 10) debido a un error de redondeo.
nwellnhof
f(n,m){n=(float)log(n)/log(m);}parece funcionar a 31 bytes
GPS
2

APL (Dyalog Unicode) , 2 bytes

⌊⍟

Pruébalo en línea!

Muy claro.

Iniciar sesión

piso

J. Sallé
fuente
Haga diádico para guardar un byte:⌊⍟
Adám
Me da un poco de vergüenza que hayas tenido que decirme eso>.> ¡Gracias, sin embargo!
J. Sallé
2

05AB1E , 6 bytes

Lm¹›_O

Pruébalo en línea!

Emigna
fuente
esto parece injusto para todos los demás
Floris
1
Las competiciones de @Floris son entre presentaciones en cada idioma, no entre idiomas, ¿verdad?
usuario202729
@ user202729 sí y no. En mi opinión, al final, "el código más corto gana". Pero noté que había una solución de 2 bytes más abajo ... Estos lenguajes de golf me sorprenden.
Floris
1
@Floris "No permita que los lenguajes de código de golf lo desalienten de publicar respuestas con lenguajes que no sean de codegolf. Trate de encontrar una respuesta lo más breve posible para 'cualquier' lenguaje de programación".
user202729
1
@Floris también ... incluso Excel puede hacerlo en 2 incorporados . Los idiomas de golf también pueden hacer esto en 2 incorporados, solo los nombres incorporados son más cortos. Nada que sorprender.
usuario202729
2

Pari / GP, 6 bytes

logint

(incorporado en la versión 2.7, marzo de 2014. Toma dos argumentos, con una tercera referencia opcional que, si está presente, se establece en la base elevada al resultado)

DanaJ
fuente
@StewieGriffin logint (x, y) tanto de Pari / GP como de Perl / ntheory dan los resultados correctos para los 7 ejemplos que se muestran actualmente, incluido '3' para 1000,10.
DanaJ
+1, pero contaría esto como 6 bytes.
Charles
2
No puede usar entradas codificadas, por lo que debe ser una función (por ejemplo, como lambda o definición). Sin embargo, puede usar logintcuál es válido y cuenta 5 bytes menos.
ბიმო
2

Python 2, 3, 46 bytes

-1 gracias a Jonathan

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

Python 1, 47 bytes

def A(a,b,i=1):
 while b**i<=a:i=i+1
 return~-i
Vedant Kandoi
fuente
n~-ies un byte más corto que n i-1.
Jonathan Frech
Además, indique la versión de su Python.
Jonathan Frech
Funcionará en cualquier versión, ¿no?
Vedant Kandoi
No funcionará en Python 1.
Jonathan Frech
2

JavaScript (Node.js) , 22 bytes

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

Pruébalo en línea!

Función recursiva al curry. Usar como g(P)(N). Menos propenso a errores de coma flotante que el usoMath.log , y (creo) el código proporciona valores correctos siempre que ambas entradas sean enteros seguros (debajo 2**52).

Bubbler
fuente
1

Wolfram Language (Mathematica) 15 10 Bytes

Floor@*Log 

(requiere orden inverso en la entrada)

Presentación original

⌊#2~Log~#⌋&
Kelly Lowder
fuente
⌊Log@##⌋&es un byte más corto
Lukas Lang
@ Mathe172, eso es un carácter más corto, pero cuento 13 bytes en eso. El piso izquierdo y el piso derecho cuentan como 3 bytes cada uno en UTF-8.
Kelly Lowder
@StewieGriffin% [10,1000] da 3. Las entradas se tratan como números enteros en lugar de números de máquina a menos que coloque un decimal después de ellos.
Kelly Lowder
1

Adelante (gforth) , 35 bytes

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

Pruébalo en línea!

Podría ahorrar 5 bytes intercambiando los parámetros de entrada esperados, pero la pregunta especifica que N debe ser primero (se podría argumentar que en un lenguaje de postfijo "Primero" significa la parte superior de la pila, pero me atendré a la letra de las reglas para ahora)

Explicación

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
fuente
1

Pyth, 6 4 bytes

s.lF

Guardado 2 bytes gracias a Mmenomic
Pruébelo en línea

Cómo funciona

.les log B (A)
Para ser honesto, no tengo idea de cómo Ffunciona. Pero si funciona, funciona.
strunca un flotante a un int para darnos el entero más alto M.

fortraan
fuente
2
1000,10 como entradas da 2 como salida
Stewie Griffin
Otra solución similar es/FlM
RK.
1

Maravilla , 9 bytes

|_.sS log

Ejemplo de uso:

(|_.sS log)[1000 10]

Explicación

Versión detallada:

floor . sS log

Este es un estilo escrito sin puntos. sSpasa elementos de la lista como argumentos a una función (en este caso log).

Mama Fun Roll
fuente
1

Gforth , 31 bytes

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

Uso

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

Pruébalo en línea!

Explicación

Desafortunadamente, FORTH usa una pila de punto flotante dedicada. Para eso tengo que SWAP(intercambiar) los valores de entrada para que lleguen a la pila de coma flotante en el orden correcto. También tengo que mover los valores a esa pila con S>F. Al mover el resultado de coma flotante de nuevo a entero ( F>S) tengo el beneficio de obtener el truncamiento de forma gratuita.

Versión más corta

Extendiendo los requisitos y proporcionando la entrada en formato flotante y en el orden correcto, hay una versión más corta con 24 bytes.

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

Pruébalo en línea!

Kitana
fuente
En general, para las respuestas de CodeGolf, los fragmentos no están permitidos (a menos que se indique lo contrario en el desafío). Esta respuesta debe estar envuelta con una función (Word in Forth) : f .... ;o convertida a un programa que KEYACCEPT
reciba
@reffu ¿Qué es un fragmento? En mi opinión, un código pequeño parte para mostrar algo, que, sin embargo, no hace nada significativo por sí mismo. Por otro lado, el código que he proporcionado funciona sin cambios en "¡Pruébelo en línea!". ¿Deberíamos ir meta?
Kitana
En este caso particular, el código que publicó arrojará un desbordamiento de pila a menos que coloque los parámetros antes. Las respuestas de código de golf generalmente deben ser un programa o función autónomo que produzca el resultado esperado si se llama más tarde. Si sigue el enlace a la meta publicación en mi comentario anterior, menciona explícitamente que el estándar es que las respuestas sean un programa o una función, de las cuales la suya no lo es. Para solucionarlo solo requeriría otros 4 bytes
reffu