Número positivo más pequeño cuya potencia enésima es divisible por x


15

Tarea

Dados enteros xy yque son ambos al menos 2, encuentre el número positivo más pequeño cuya yenésima potencia es divisible por x.

Ejemplo

Dado x=96y y=2, el resultado debería ser 24ya que 24es el más pequeño positivo nsatisfactorio n^2 is divisible by 96.

Casos de prueba

x  y output
26 2 26
96 2 24
32 3 4
64 9 2
27 3 3

Puntuación

Este es el . Solución con el menor recuento de bytes gana.

Referencias



1
Será Xsiempre mayor que Y?
Fatalize

@Fatalize ¿Qué tiene eso que ver con algo?
Leaky Nun

No hay ningún caso de prueba donde Xsea ​​menor que Y, y puede reducir la longitud de algunas respuestas (al menos la mía) si Xsiempre es mayor que Y. Prefiero que Xpueda ser más grande o más pequeño, pero un caso de prueba para este último sería genial.
Fatalize

1
Su lista de referencias es la mejor ilustración que he visto de la arbitrariedad ridícula de los pedidos de entrada OEIS.
Sparr

Respuestas:


7

Brachylog , 19 17 16 15 12 bytes

2 bytes guardados gracias a @LeakyNun.

:[I:1]*$r=#>

Pruébalo en línea!

Explicación

               Input = [X, Y]
:[I:1]*        Get a list [X*I, Y] (I being any integer at this point)
       $r=     Get the first integer which is the Yth root of X*I
          #>   This integer must be strictly positive
               This integer is the Output


@LeakyNun Gracias. Sin embargo, esto será mucho más lento.
Fatalize

¿Por qué será más lento?
Leaky Nun


44
Para citar al famoso Fatalize: "no me importa la complejidad"
Leaky Nun


6

JavaScript (ES7), 32 bytes

f=(x,y,i=1)=>i**y%x?f(x,y,i+1):i

Nunca lo definiste f. Creo que debes asignarle la función f.
kamoroso94

1
@ kamoroso94 Lo siento, siempre estoy haciendo eso.
Neil


5

Pitón 3, 60 43 39 bytes

Gracias a @LeakyNun y @ Sp3000 por su ayuda.

f=lambda x,y,i=1:i**y%x<1or-~f(x,y,i+1)

Una función que toma la entrada a través del argumento y devuelve la salida.

Cómo funciona

La función usa la recursión para verificar enteros repetidamente i, comenzando con i=1, hasta que se encuentre uno que satisfaga la condición requerida i**y%x<1. Esto se logra tomando la lógica orde la condición y el resultado de la expresión para i+1incremental, que aquí está -~f(x,y,i+1). Esta expresión se evalúa continuamente Falsehasta que jse encuentra un valor satisfactorio , en cuyo punto se evalúa Truey se detiene la recursividad. Dado que estos son respectivamente equivalentes 0y 1en Python, y la función se ha ido agregando repetidamente a 1través de la parte de incremento, la función devuelve(j-1)*False + True + (j-1)*1 = (j-1)*0 + 1 + (j-1)*1 = 1 + j-1 = j , según sea necesario.

Pruébalo en Ideone


1
def f(x,y,i=1):¶ while i**y%x:i+=1¶ print(i)
Leaky Nun

@LeakyNun Gracias. Solo pensé en una forma un poco más corta de hacerlo (43 contra 44) con recursión.
TheBikingViking

2
39:f=lambda x,y,z=1:z**y%x<1or-~f(x,y,z+1)
Sp3000

@ Sp3000 ¿No vuelve su función en Truelugar de z?
Leaky Nun

@LeakyNun Te estás perdiendo la -~parte, pero sí, volvería Truesi xfuera 1.
Sp3000

4

Haskell, 31 bytes

x#y=[n|n<-[1..],mod(n^y)x<1]!!0

Ejemplo de uso: 96#2 -> 24.

Implementación directa: pruebe todos los enteros n, conserve los que cumplan la condición y elija el primero.


2
También 31:x#y=until(\n->mod(n^y)x<1)(+1)0
xnor

4

05AB1E (10 bytes)

>GN²m¹ÖiNq

Pruébalo en línea

  • > Lee el primer argumento, lo incrementa y lo empuja a la pila
  • Gabre la pila ( a) e inicia un ciclo que contiene el resto del programa donde Ntoma el valor1, 2, ... a - 1 .
  • N²mempuja Ny la segunda entrada del historial de entrada, luego los saca a ambos y empuja el primero al poder del segundo.
  • ¹ empuja la primera entrada del historial de entrada a la pila.
  • Ö muestra las dos entradas anteriores de la pila, luego empuja a % b == 0 la pila.
  • isaca eso de la pila. Si es verdadero, ejecuta el resto del programa; de lo contrario, el ciclo continúa.
  • N empuja N en la pila.
  • q termina el programa

Cuando finaliza el programa, se imprime el valor superior de la pila.


Publique una explicación de cómo funciona este código para aquellos que no están familiarizados con su idioma, pero por lo demás es un buen trabajo y una buena primera publicación.
Rohan Jhunjhunwala

Ese enlace parece interesante.
Leaky Nun

2
Muy buena primera respuesta.
Emigna

3

MATL , 9 bytes

y:w^w\&X<

Pruébalo en línea!

Explicación

y       % Take x and y implicitly. Push x again
        % STACK: x, y, x
:       % Range from 1 to x
        % STACK: x, y, [1, 2, ..., x]
w       % Swap
        % STACK: x, [1, 2, ..., x], y
^       % Power, element-wise
        % STACK: x, [1^y,  2^y, ..., x^y]
w       % Swap
        % STACK: [1^y, 2^y, ..., x^y], x
\       % Modulo, element-wise
        % STACK: [mod(1^y,x), mod(2^y,x), ..., mod(x^y,x)]
        % A 0 at the k-th entry indicates that x^y is divisible by x. The last entry
        % is guaranteed to be 0
&X<     % Arg min: get (1-based) index of the first minimum (the first zero), say n
        % STACK: n
        % Implicitly display

Pila de manipulación mucho.
Leaky Nun

1
Sí. Sospecho que Jelly tendrá una gran ventaja aquí, ya que evita todas esas "copias" e "intercambios"
Luis Mendo

¿No tienes find?
Leaky Nun

@LeakyNun Sí, fpero eso encuentra todos los índices distintos de cero. Entonces, tendría que ser ~f1): negativo, encontrar, obtener la primera entrada
Luis Mendo

3

En realidad , 12 11 bytes

Muchas gracias a Leaky Nun por sus muchas sugerencias. Sugerencias de golf bienvenidas. Pruébalo en línea!

;)R♀ⁿ♀%0@íu

Enfoque original de 12 bytes. Pruébalo en línea!

1WX│1╖╜ⁿ%WX╜

Otro enfoque de 12 bytes. Pruébalo en línea!

w┬i)♀/♂K@♀ⁿπ

Un enfoque de 13 bytes. Pruébalo en línea!

k╗2`╜iaⁿ%Y`╓N

No golfista:

Primer algoritmo

       Implicitly pushes y, then x.
;      Duplicate x.
)      Rotate duplicate x to bottom of the stack.
R      Range [1, x] (inclusive).
♀ⁿ     Map a**y over the range.
♀%     Map a**y%x over the range.
0@í    new_list.index(0)
u      Increment and print implicitly at the end of the program.

Algoritmo original

       Implicitly pushes x, then y.
1WX    Pushes a truthy value to be immediately discarded 
         (in future loops, we discard a**y%x)
|      Duplicates entire stack.
         Stack: [y x y x]
1╖     Increment register 0.
╜      Push register 0. Call it a.
ⁿ      Take a to the y-th power.
%      Take a**y mod x.
W      If a**y%x == 0, end loop.
X      Discard the modulus.
╜      Push register 0 as output.

Tercer algoritmo

       Implicitly pushes y, then x.
w      Pushes the full prime factorization of x.
┬      Transposes the factorization (separating primes from exponents)
i      Flatten (into two separate lists of primes and exponents).
)      Rotate primes to the bottom of the stack.
♀/     Map divide over the exponents.
♂K     Map ceil() over all of the divided exponents.
@      Swap primes and modified exponents.
♀ⁿ     Map each prime ** each exponent.
π      Product of that list. Print implicitly at the end of the program.

Cuarto algoritmo

     Implicitly pushes x, then y.
k╗   Turns stack [x y] into a list [x, y] and saves to register 0.
2    Pushes 2.
  `    Starts function with a.
  ╜i   Pushes register 0 and flattens. Stack: [x y a]
  a    Inverts the stack. Stack: [a y x]
  ⁿ%   Gets a**y%x.
  Y    Logical negate (if a**y is divisible by x, then 1, else 0)
  `    End function.
╓    Push first (2) values where f(x) is truthy, starting with f(0).
N    As f(0) is always truthy, get the second value.
     Print implicitly at the end of the program.

@LeakyNun Esperando una de sus sugerencias de golf ganadoras: D
Sherlock9

@LeakyNun Me encantaría publicar esos enfoques, a menos que quieras publicarlos tú mismo.
Sherlock9

+1 para la sonrisa;)
Leaky Nun

2

R, 61 bytes , 39 bytes , 37 bytes , 34 bytes

Todavía soy un novato en la programación de R y resulta que esta es mi primera función que creo en R ( ¡! ), Así que creo que todavía hay margen de mejora.

function(x,y){for(n in 2:x){if(n^y%%x==0){cat(x,y,n);break}}}

La prueba en línea se puede realizar aquí: RStudio en rollApp .


Gran progreso:

function(x,y){which.max((1:x)^y%%x==0)}

which.maxfunciona porque devuelve el valor más alto en un vector y si hay varios devolverá el primero. En este caso, tenemos un vector de muchos FALSE (que son 0) y algunos VERDADEROS (que son 1), por lo que devolverá el primer VERDADERO.


Otro progreso:

function(x,y)which.max((1:x)^y%%x==0)

Finalmente, supera la respuesta usando Python por dos bytes. :)

Otro progreso: (¡Otra vez!)

function(x,y)which.min((1:x)^y%%x)

Muchas gracias a Axeman y user5957401 por la ayuda.


Creo que tu enlace de prueba está muerto.
TheBikingViking

@TheBikingViking Gracias por señalarlo. Lo editaré después de mi almuerzo tardío
Anastasiya-Romanova 秀

2
si lo usa which.min, podría deshacerse de él ==0. El módulo devolverá un número, que no será inferior a 0.
user5957401

1
@ user5957401 Editado.Bolshoe spasibo ...
Anastasiya-Romanova 秀

Para la misma longitud de 34 bytes también tuvo el mismo function(x,y)which(!(1:x)^y%%x)[1].
plannapus

2

corriente continua, 23 22 bytes

Gracias a Delioth por su consejo sobre los métodos de entrada, guardar un byte

sysxz[zdlylx|0<F]dsFxp

Utiliza el operador de profundidad de pila zpara incrementar el caso de prueba directamente en la pila, y el operador de exponenciación modular |para, bueno, exponenciación modular. Repita la prueba hasta que el resto no sea mayor que cero.


1
Técnicamente, no necesita ?al principio, ya que una forma estándar de invocar algunas cosas es > echo "x y [program]"|dcdónde xy dónde yson las mismas. Las preguntas x e y se colocarán en la pila de forma normal.
Delioth

@Delioth Interesante, gracias! Siempre usé la -eopción, pero la usaré de ahora en adelante.
Joe

@Delioth, para mí, usar comillas arroja errores recordándome que "no está implementado dc, mientras que no usar comillas obviamente da errores de shell. ¿Hay algo que hacer al respecto? Sé que stderrpuede ser ignorado, pero todavía me molesta.
Joe

1

05AB1E , 8 bytes

Lsm¹%0k>

Explicación

L         # range(1,x) inclusive
 sm       # each to the power of y
   ¹%     # each mod x
     0k   # find first index of 0 (0-based)
       >  # increment to 1-based

Pruébalo en línea


1

Perl 6 ,  26  25 bytes

{first * **$^y%%$^x,1..$x}
{first * **$^y%%$^x,1..*}

Explicación:

# bare block with two placeholder parameters 「$^y」 and 「$^x」
{
  # find the first value
  first

  # where when it 「*」 is taken to the power
  # of the outer blocks first parameter 「$^y」
  * ** $^y
  # is divisible by the outer blocks second parameter 「$^x」
  %% $^x,

  # out of the values from 1 to Inf
  1 .. *
}

0

Mathematica, 36 bytes

(i=1;While[n=i++;Mod[n^#2,#]!=0];n)&

0

Dyalog APL , 11 bytes

Traducción de esto .

0⍳⍨⊣|(⍳⊣)*⊢

0⍳⍨encuentra el primer cero en
⊣|los restos de la división cuando x divide
(⍳⊣)*los enteros uno a través de x , elevado a la potencia de
y

TryAPL en línea!


0

PowerShell v2 +, 48 bytes

param($x,$y)(1..$x|?{!(("$_*"*$y+1|iex)%$x)})[0]

Toma entrada $xy $y. Construye un rango de 1a $x, luego lo usa Where-Objectpara filtrar esos números. El filtro toma la cadena "$_*"(es decir, el número actual con un asterisco) y usa la multiplicación de la cadena para concatenar esos $ytiempos, luego agrega una final 1al final, luego los canaliza a iex(abreviatura Invoke-Expressiony similar a eval). Esto toma el lugar de [math]::Pow($_,$y), ya que PowerShell no tiene un operador de exponenciación, y es dos bytes más corto. Eso se alimenta al operador de módulo %con $x, por lo tanto, si es divisible, será el0 , así que encapsulamos eso en parens y tomamos el booleano-no!(...)del mismo. Por lo tanto, si es divisible, se incluirá en este filtro y se excluirán todos los demás números.

Finalmente, encapsulamos los números resultantes en parens (...)y tomamos el [0]índice. Como el rango ingresado está ordenado 1..$x, este será el más pequeño. Eso queda en la tubería y la impresión está implícita.

Casos de prueba

PS C:\Tools\Scripts\golfing> (26,2),(96,2),(32,3),(64,9),(27,3)|%{($_-join', ')+' -> '+(.\smallest-positive-number-divisor.ps1 $_[0] $_[1])}
26, 2 -> 26
96, 2 -> 24
32, 3 -> 4
64, 9 -> 2
27, 3 -> 3


0

Perl, 29 26 bytes

Incluye +3 para -p(no +1 ya que el código contiene ')

Ejecutar con la entrada en STDIN

power.pl <<< "96 2"

power.pl:

#!/usr/bin/perl -p
/ /;1while++$\**$'%$`}{

0

Pyth, 9 bytes

AQf!%^THG

Un programa que toma la entrada de una lista del formulario [x, y]en STDIN e imprime el resultado.

Pruébalo en línea

Cómo funciona

AQf!%^THG  Program. Input: Q
AQ         G=Q[0];H=Q[1]
  f        First truthy input T in [1, 2, 3, ...] with function:
     ^TH    T^H
    %   G   %G
   !        Logical not (0 -> True, all other modulus results -> False)
           Implicitly print

-1

PHP 59 bytes

Lo siento, pero no puedo probar esto desde mi móvil. :)

function blahblah($x,$y){
  for($i=0;1;$i++){
    if(!$i^$y%$x){
      return $i;
    }
  }
}

Golfed

function b($x,$y){for($i=0;1;$i++){if(!$i^$y%$x)return $i;}

Estás usando $ z donde deberías usar $ x y no creo que estés incrementando $ i en el ciclo
theLambGoat
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.