Récupérez le premier de la puissance principale


13

Définition : une puissance première est un nombre naturel qui peut être exprimé sous la forme p n où p est un nombre premier et n est un nombre naturel.

Tâche : étant donné une puissance première p n > 1, renvoyer la puissance première p.

Testcases :

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

Notation : Il s'agit du . La réponse la plus courte en octets l'emporte.


1
Peut nêtre 1?
user202729

@ user202729: Dans le 4ème cas de test n = 1.
Emigna

15
Il aurait peut-être été plus difficile d'obtenir la partie puissance au lieu de la partie principale. En l'état, c'est juste "Obtenez le facteur le plus bas qui n'est pas 1"
Jo King

Réponses:




7

Java 8, 46 39 37 octets

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

-7 octets indirectement grâce à @Tsathoggua .
-2 octets grâce à JoKing

Essayez-le en ligne.

Explication:

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

Suite à la réponse de Luis Mendo en python3 , serait-il possible d'écrire n->{for(int i=1;++i<=n;)if(n%i<1)return i;}pour obtenir 43 caractères? (Je ne parle pas Java.)
Tsathoggua

@Tsathoggua Comme vous ne l'avez pas actuellement, car les méthodes Java doivent toujours avoir un retour. n->{for(int i=1;++i<=n;)if(n%i<1)return i;return n;}fonctionnerait, mais est malheureusement plus long. Java peut cependant avoir un seul retour dans des boucles infinies, ce qui permet effectivement d'économiser des octets, alors merci! n->{for(int i=1;;)if(n%++i<1)return i;}. Depuis ideviendra néventuellement (comme avec le cas de test 2687) et n%n==0, le i<=nn'est pas requis dans ce cas.
Kevin Cruijssen

1
Que diriez-vous de 37 octets . Je ne connais pas assez Java pour voir s'il est possible de jouer au golf
Jo King

@JoKing Je ne vois rien de plus pour jouer au golf, alors merci pour le -2.
Kevin Cruijssen

5

Python 3 , 36 35 octets

-1 octet grâce à mathmandan

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

Essayez-le en ligne!

Fonction récursive qui trouve le premier facteur supérieur à 1


1
Agréable. Vous pouvez (généralement) enregistrer un octet si vous le remplacez if/elsepar and/or. Comme f=lambda n,x=2:n%x and f(n,x+1)or x.
mathmandan


4

Espace , 80 61 60 octets

[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 octets grâce à @JoKing .

Lettres S(espace), T(tabulation) et N(nouvelle ligne) ajoutées uniquement en surbrillance.
[..._some_action]ajouté à titre d'explication uniquement.

Essayez-le en ligne (avec des espaces bruts, des tabulations et des nouvelles lignes uniquement).

Explication en pseudo-code:

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

Exemple d'exécution: 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

Le programme s'arrête avec une erreur: aucune sortie trouvée.


1
Avez-vous besoin du i == nchèque? n%nserait de toute façon 0
Jo King

@JoKing Ah, bien sûr. Merci, 19 octets enregistrés là. :)
Kevin Cruijssen

Pourriez-vous seulement boucler sinon n%iet appeler l'impression après?
Jo King

1
@JoKing Je suis sûr que non. L'espace blanc n'a pas vraiment de boucles, il a juste des sauts aux étiquettes. Les trois seules options dont je dispose sont les suivantes: 1. sauter sans condition à une certaine étiquette; 2. passez à une certaine étiquette si le haut de la pile est 0; 3. passez à une certaine étiquette si le haut de la pile est négatif. Malheureusement, il n'y a pas de "saut au label si positif" pour continuer la boucle. Je pourrais accomplir cela en multipliant par -1 avant de vérifier le négatif, mais je doute que ce sera plus court.
Kevin Cruijssen

1
J'ai essayé de le faire avec un module négatif et je me suis retrouvé à <s> 62 </s> 60 octets (yay). Il s'avère que vous ne pouvez pas stocker à des adresses de tas négatives (bien que 0 ait sauvé quelques octets)
Jo King






2

Forth (gforth) , 34 octets

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

Essayez-le en ligne!

Explication

  1. Itérer des entiers à partir de 2
  2. Arrêtez et revenez lorsque vous en trouvez un qui divise n sans reste

Explication du code

: 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 octet

𝐔

Essayez-le en ligne!


U+1D414 is one character, but in UTF-8 and UTF-16 this is represented by 4 bytes.
Ruud Helderman

1
@RuudHelderman Correct, but this isn't in UTF-8 nor UTF-16.
Okx

1
@RuudHelderman You may want to see Neim codepage.
JungHwan Min

@JungHwanMin Thanks; browsing Okx's earlier Neim submissions, I noticed my slightly ignorant reaction wasn't the first. Clever feature, but far from obvious; warrants explanation (as done here). Quoting code-golf tag info: "Unless the question is specified to be scored by characters, it is scored by bytes. If it doesn't specify a character encoding to use for scoring, answers which use Unicode code points outside 0 to 255 should state the encoding used."
Ruud Helderman

@RuudHelderman per meta consensus, if an answer does not specify an encoding, it defaults to the language's default encoding. If that doesn't exist, then it is UTF-8. In this case, Neim has a defined default encoding, so it is assumed to be the encoding of the answer, without the answerer having to explain as such.
JungHwan Min


1

Mathematica, 17 bytes

Divisors[#][[2]]&

The second smallest divisor.


1

R, 32 26 bytes

@Giuseppe with different logic and a shorter solution:

(x=2:(n=scan()))[!n%%x][1]

Try it online!

Original:

numbers::primeFactors(scan())[1]

Try it online!

This is obviously a much superior port of the 05AB1E solution.




0

PowerShell, 31 bytes

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

Try it online!

Constructs a range from 2 to input $a, pulls out those elements where (?) the modulo operation % results in a zero !(...) (i.e., those that are divisors of $a), and then takes the smallest [0] one thereof. That's left on the pipeline, output is implicit.


0

Perl 6, 22 bytes

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

Try it online!

Anonymous code block that filters the factors of the range of 2 to the input and returns the first one. I tried using ^$ to save 2 bytes, but that didn't work in the case that the input was prime.


0

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

-52 bytes thanks to @Jo King

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

Try it online!

Ungolfed:

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

Explanation:

The i loop searches backwards from the first number, and finds all numbers that divide it evenly. Because we are going backwards, the smallest is stored in the vairable A.

VB gives you a free variable that matches your function name (in my case, A). At the end of the function execution, the value in that variable is returned (barring an explicit Return statement.


1
You don't need the prime check at all. The smallest factor of a number (other than 1) is guaranteed to be a prime, otherwise there would be a smaller factor
Jo King

@JoKing D'oh! Of course, can't believe I missed that. Thanks!
Brian J






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.