Recupera la prima del primer poder


13

Definición : una potencia prima es un número natural que se puede expresar en la forma p n donde p es un número primo yn es un número natural.

Tarea : Dada una potencia principal p n > 1, devuelve la potencia principal p.

Casos de prueba :

input output
9     3
16    2
343   7
2687  2687
59049 3

Puntuación : Este es el . La respuesta más corta en bytes gana.


1
Puede nser 1?
user202729

@ user202729: en el cuarto caso de prueba n = 1.
Emigna

15
Tal vez hubiera sido más difícil obtener la parte de poder en lugar de la parte principal. Tal como están las cosas, esto es solo "Obtenga el factor más bajo que no sea 1"
Jo King

Respuestas:




7

Java 8, 46 39 37 bytes

n->{int r=1;for(;n%++r>0;);return r;}

-7 bytes indirectamente gracias a @Tsathoggua .
-2 bytes gracias a JoKing

Pruébalo en línea.

Explicación:

n->{               // Method with integer as both parameter and return-type
  int r=1;         //  Start the result-integer `r` at 1
  for(;n%++r>0;);  //  Increase `r` by 1 before every iteration with `++r`
                   //  and loop until `n` is divisible by `r`
  return r;}       //  After the loop, return `r` as result

Siguiendo la respuesta de Luis Mendo en python3 , ¿sería posible escribir n->{for(int i=1;++i<=n;)if(n%i<1)return i;}para obtener 43 caracteres? (No hablo Java.)
Tsathoggua

@Tsathoggua Como lo tienes ahora, no, ya que los métodos Java siempre deben tener un retorno. n->{for(int i=1;++i<=n;)if(n%i<1)return i;return n;}funcionaría, pero desafortunadamente es más largo. Sin embargo, Java puede tener un solo retorno en bucles infinitos, lo que de hecho ahorra bytes, así que ¡gracias! n->{for(int i=1;;)if(n%++i<1)return i;}. Dado ique neventualmente se convertirá (como con el caso de prueba 2687) y n%n==0, i<=nno se requiere en este caso.
Kevin Cruijssen

1
¿Qué tal 37 bytes ? No estoy lo suficientemente familiarizado con Java para ver si se puede jugar más al golf
Jo King

@JoKing No veo nada más para jugar al golf, así que gracias por el -2.
Kevin Cruijssen

5

Python 3 , 36 35 bytes

-1 byte gracias a Mathmandan

f=lambda n,x=2:n%x and f(n,x+1)or x

Pruébalo en línea!

Función recursiva que encuentra el primer factor mayor que 1


1
Agradable. Puede (generalmente) guardar un byte si lo reemplaza if/elsecon and/or. Al igual, f=lambda n,x=2:n%x and f(n,x+1)or x.
Mathmandan


4

Espacio en blanco , 80 61 60 bytes

[S S T  T   N
_Push_-1][S S S N
_Push_0][T  N
T   T   _Read_STDIN_as_number][N
S S N
_Create_Label_LOOP][S S S T N
_Push_1][T  S S T   _Subtract][S N
S _Duplicate][S S S N
_Push_0][T  T   T   _Retrieve][S N
T   _Swap][T    S T T   _Modulo][N
T   T   N
_If_0_Jump_to_Label_LOOP][S S T T   N
_Push_-1][T S S N
_Multiply][T    N
S T _Print_as_number]

-20 bytes gracias a @JoKing .

Se agregaron letras S(espacio), T(tabulación) y N(nueva línea) solo como resaltado.
[..._some_action]agregado solo como explicación.

Pruébelo en línea (solo con espacios en bruto, pestañas y nuevas líneas).

Explicación en pseudocódigo:

Integer n = STDIN as integer
Integer i = -1
Start LOOP:
  i = i - 1
  if(n modulo-i is negative)
    Go to next iteration of LOOP
  else
    i = i * -1
    Print i
    Exit with error: No exit defined

Ejemplo de ejecución: input = 9

Command   Explanation                    Stack        Heap     STDIN    STDOUT    STDERR

SSTTN     Push -1                        [-1]
SSSN      Push 0                         [-1,0]
TNTT      Read STDIN as integer          [-1]         {0:9}    9
NSSN      Create Label_LOOP              [-1]         {0:9}
 SSSTN    Push 1                         [-1,1]       {0:9}
 TSST     Subtract top two (-1-1)        [-2]         {0:9}
 SNS      Duplicate top (-2)             [-2,-2]      {0:9}
 SSSN     Push 0                         [-2,-2,0]    {0:9}
 TTT      Retrieve                       [-2,-2,9]    {0:9}
 SNT      Swap top two                   [-2,9,-2]    {0:9}
 TSTT     Modulo top two (9%-2)          [-2,-1]      {0:9}
 NTSN     If neg.: Jump to Label_LOOP    [-2]         {0:9}

 SSTTN    Push -1                        [-2,-1]      {0:9}
 TSST     Subtract top two (-2-1)        [-3]         {0:9}
 SNS      Duplicate top (-2)             [-3,-3]      {0:9}
 SSSN     Push 0                         [-3,-3,0]    {0:9}
 TTT      Retrieve                       [-3,-3,9]    {0:9}
 SNT      Swap top two                   [-3,9,-3]    {0:9}
 TSTT     Modulo top two (9%-3)          [-3,0]       {0:9}
 NTSN     If neg.: Jump to Label_LOOP    [-3]         {0:9}
 SSTTN    Push -1                        [-3,-1]      {0:9}
 TSSN     Multiply top two (-3*-1)       [3]          {0:9}
 TNST     Print as integer               []           {0:9}             3
                                                                                  error

El programa se detiene con un error: no se encontró ninguna salida.


1
¿Necesitas el i == ncheque? n%nsería 0 de todos modos
Jo King

@JoKing Ah, por supuesto. Gracias, 19 bytes guardados allí mismo. :)
Kevin Cruijssen

¿Podría hacer un bucle si no es así n%iy llamar a la impresión después?
Jo King

1
@JoKing Estoy bastante seguro de que no. El espacio en blanco realmente no tiene bucles, solo tiene saltos a las etiquetas. Las únicas tres opciones que tengo son: 1. saltar a una determinada etiqueta incondicionalmente; 2. saltar a una determinada etiqueta si la parte superior de la pila es 0; 3. saltar a una determinada etiqueta si la parte superior de la pila es negativa. Desafortunadamente no hay un "salto a la etiqueta si es positivo" para continuar el ciclo. Podría lograr esto multiplicando por -1 antes de verificar si es negativo, pero dudo que sea más corto.
Kevin Cruijssen

1
Intenté hacerlo con un módulo negativo y terminó en <s> 62 </s> 60 bytes (yay). Resulta que no puede almacenar en direcciones de montón negativas (aunque 0 guardó un par de bytes)
Jo King






2

Adelante (gforth) , 34 bytes

: f 1 begin 1+ 2dup mod 0= until ;

Pruébalo en línea!

Explicación

  1. Iterar enteros a partir de 2
  2. Deténgase y regrese cuando encuentre uno que divida n sin resto

Explicación del código

: f               \ Define a new word
  1               \ place a 1 on the stack (to use as a counter/index)
  begin           \ start indefinite loop
    1+ 2dup       \ increment counter and duplicate counter and prime power
    mod           \ calculate power % index
  0= until        \ end the loop if modulus is 0 (no remainder)
;                 \ end word definition




1

Neim , 1 byte

𝐔

Pruébalo en línea!


U + 1D414 es un carácter, pero en UTF-8 y UTF-16 está representado por 4 bytes.
Ruud Helderman

1
@RuudHelderman Correcto, pero esto no está en UTF-8 ni UTF-16.
Okx

1
@RuudHelderman Es posible que desee ver la página de códigos de Neim .
JungHwan Min

@JungHwanMin Gracias; Al examinar las presentaciones anteriores de Okx Neim, noté que mi reacción ligeramente ignorante no fue la primera. Característica inteligente, pero lejos de ser obvia; justifica explicación (como se hace aquí ). Citando la información de la etiqueta de código de golf : "A menos que se especifique que la pregunta se puntúe por caracteres, se puntúa por bytes. Si no especifica una codificación de caracteres para usar en la puntuación, las respuestas que usen puntos de código Unicode fuera de 0 a 255 deberían indicar la codificación utilizada ".
Ruud Helderman

@RuudHelderman por meta consenso , si una respuesta no especifica una codificación, por defecto es la codificación predeterminada del idioma. Si eso no existe, entonces es UTF-8. En este caso, Neim tiene una codificación predeterminada definida, por lo que se supone que es la codificación de la respuesta, sin que el respondedor tenga que explicarlo como tal.
JungHwan Min


1

Mathematica, 17 bytes

Divisors[#][[2]]&

El segundo divisor más pequeño.





0

PowerShell , 31 bytes

param($a)(2..$a|?{!($a%$_)})[0]

Pruébalo en línea!

Construye un rango desde 2a entrada $a, extrae esos elementos where(? ), la operación del módulo %da como resultado un cero !(...)(es decir, aquellos que son divisores de $a), y luego toma el más pequeño de los [0]mismos. Eso queda en la tubería, la salida es implícita.


0

Perl 6 , 22 bytes

{grep($_%%*,2..$_)[0]}

Pruébalo en línea!

Bloque de código anónimo que filtra los factores del rango de 2 a la entrada y devuelve el primero. Intenté usar ^$para guardar 2 bytes, pero eso no funcionó en el caso de que la entrada fuera primo.


0

Visual Basic .NET (.NET Framework v4.5), 123 71 bytes

-52 bytes gracias a @Jo King

Function A(n)
For i=n To 2 Step-1
A=If(n Mod i=0,i,A)
Next
End Function

Pruébalo en línea!

Sin golf:

Function A(input As Long) As Long
    For i = input To 2 Step -1
        A = If (input Mod i = 0, i, A)
    Next
End Function

Explicación:

El ibucle busca hacia atrás desde el primer número y encuentra todos los números que lo dividen en partes iguales. Como vamos hacia atrás, lo más pequeño se almacena en lo deseable A.

VB le ofrece una variable libre que coincide con el nombre de su función (en mi caso, A). Al final de la ejecución de la función, se devuelve el valor en esa variable (salvo una Returndeclaración explícita .


1
No necesita el cheque principal en absoluto. Se garantiza que el factor más pequeño de un número (que no sea 1) es primo, de lo contrario habría un factor más pequeño
Jo King

@JoKing D'oh! Por supuesto, no puedo creer que me haya perdido eso. ¡Gracias!
Brian J






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.