Stelle die Primzahl von der Primkraft wieder her


13

Definition : Eine Primzahl ist eine natürliche Zahl, die in der Form p n ausgedrückt werden kann, wobei p eine Primzahl und n eine natürliche Zahl ist.

Aufgabe : Gib bei einer Primzahl p n > 1 die Primzahl p zurück.

Testfälle :

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

Wertung : Das ist . Kürzeste Antwort in Bytes gewinnt.


1
Kann n1 sein?
user202729

@ user202729: Im 4. Testfall n = 1.
Emigna

15
Vielleicht wäre es schwieriger gewesen, den Power- Teil anstelle des Prime-Teils zu bekommen. Wie es ist, ist dies nur "Holen Sie sich den niedrigsten Faktor, der nicht 1 ist"
Jo King

Antworten:




7

Java 8, 46 39 37 Bytes

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

-7 Bytes indirekt dank @Tsathoggua .
-2 Bytes dank JoKing

Probieren Sie es online aus.

Erläuterung:

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

Wäre es nach Luis Mendos Antwort in python3 möglich, zu schreiben n->{for(int i=1;++i<=n;)if(n%i<1)return i;}, um 43 Zeichen zu erhalten? (Ich spreche kein Java.)
Tsathoggua

@Tsathoggua Wie Sie es gerade nicht haben, da Java-Methoden immer einen Return haben müssen. n->{for(int i=1;++i<=n;)if(n%i<1)return i;return n;}würde funktionieren, ist aber leider länger. Java kann jedoch eine einzige Rückgabe in Endlosschleifen haben, was in der Tat Bytes spart, also danke! n->{for(int i=1;;)if(n%++i<1)return i;}. Da iwird nirgendwann (wie beim Testfall 2687) und n%n==0, das i<=nist in diesem Fall nicht erforderlich.
Kevin Cruijssen

1
Wie wäre es mit 37 Bytes . Ich kenne Java nicht gut genug, um zu sehen, ob noch mehr Golf gespielt werden kann
Jo King,

@JoKing Ich sehe nichts zum Golfen weiter, also danke für die -2.
Kevin Cruijssen

5

Python 3 , 36 35 Bytes

-1 byte dank mathmandan

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

Probieren Sie es online!

Rekursive Funktion, die den ersten Faktor größer als 1 findet


1
Nett. Sie können ( in der Regel) ein Byte speichern , wenn Sie ersetzen if/elsemit and/or. Wie f=lambda n,x=2:n%x and f(n,x+1)or x.
Mathmandan


4

Leerzeichen , 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 dank @JoKing .

Buchstaben S(Leerzeichen), T(Tabulator) und (Zeilenvorschub) werden Nnur als Hervorhebungen hinzugefügt.
[..._some_action]nur als Erklärung hinzugefügt.

Probieren Sie es online aus (nur mit Leerzeichen, Tabulatoren und Zeilenumbrüchen).

Erklärung im Pseudocode:

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

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

Programm stoppt mit Fehler: Kein Exit gefunden.


1
Benötigen Sie den i == nScheck? n%nwäre sowieso 0
Jo King

@JoKing Ah, natürlich. Danke, 19 Bytes genau dort gespeichert. :)
Kevin Cruijssen

Könntest du nur loopen wenn nicht n%iund den Print danach aufrufen?
Jo King

1
@JoKing Ich bin mir ziemlich sicher, nicht. Whitespace hat eigentlich keine Loops, sondern nur Sprünge zu Labels. Die einzigen drei Möglichkeiten, die ich habe, sind: 1. bedingungslos zu einem bestimmten Label zu springen; 2. zu einem bestimmten Label springen, wenn der obere Teil des Stapels 0 ist; 3. Zu einer bestimmten Beschriftung springen, wenn die Oberseite des Stapels negativ ist. Leider gibt es keinen "Sprung zu Label, wenn positiv", um die Schleife fortzusetzen. Ich könnte dies erreichen, indem ich mit -1 multipliziere, bevor ich auf Negativ prüfe, aber ich bezweifle, dass dies kürzer sein wird.
Kevin Cruijssen

1
Versuchte es mit einem negativen Modul und endete bei <s> 62 </ s> 60 Bytes (yay). Es stellt sich heraus, dass Sie nicht bei negativen Heap-Adressen speichern können (obwohl 0 ein paar Bytes gespeichert)
Jo King






2

Viertens (gviertens) , 34 Bytes

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

Probieren Sie es online!

Erläuterung

  1. Iteriere ganze Zahlen ab 2
  2. Stoppen Sie und kehren Sie zurück, wenn Sie eine finden, die n ohne Rest teilt

Code Erklärung

: 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

U + 1D414 ist ein Zeichen, aber in UTF-8 und UTF-16 wird dies durch 4 Bytes dargestellt.
Ruud Helderman

1
@RuudHelderman Richtig, aber das ist weder in UTF-8 noch in UTF-16.
Okx

1
@RuudHelderman Vielleicht möchten Sie die Neim-Codepage sehen .
JungHwan Min

@JungHwanMin Danke; Beim Durchsuchen von Okx 'früheren Neim-Beiträgen bemerkte ich, dass meine etwas unwissende Reaktion nicht die erste war. Clever, aber alles andere als selbstverständlich; rechtfertigt Erklärung (wie hier gemacht ). Zitieren von Code-Golf-Tag-Informationen : "Sofern die Frage nicht als nach Zeichen zu bewertende Frage angegeben ist, wird sie nach Bytes bewertet. Wenn keine für die Bewertung zu verwendende Zeichencodierung angegeben ist, sollten Antworten mit Unicode-Codepunkten außerhalb von 0 bis 255 beantwortet werden Geben Sie die verwendete Kodierung an. "
Ruud Helderman

@RuudHelderman Per- Meta-Konsens : Wenn in einer Antwort keine Kodierung angegeben ist, wird standardmäßig die Standardkodierung der Sprache verwendet. Wenn das nicht existiert, dann ist es UTF-8. In diesem Fall hat Neim eine definierte Standardkodierung, so dass davon ausgegangen wird, dass es sich um die Kodierung der Antwort handelt, ohne dass der Antwortende dies erklären muss.
JungHwan Min


1

Mathematica, 17 Bytes

Divisors[#][[2]]&

Der zweitkleinste Teiler.





0

PowerShell , 31 Byte

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

Probieren Sie es online!

Konstruiert einen Bereich von 2bis zur Eingabe $a, zieht die Elemente heraus where( ?), deren Modulo-Operation %eine Null ergibt !(...)(dh die, deren Teiler sind $a), und nimmt dann das kleinste [0]davon. Das bleibt in der Pipeline, die Ausgabe ist implizit.


0

Perl 6 , 22 Bytes

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

Probieren Sie es online!

Anonymer Codeblock, der die Faktoren des Bereichs 2 zur Eingabe filtert und den ersten zurückgibt. Ich habe versucht ^$, 2 Bytes zu speichern, aber das hat nicht funktioniert, wenn die Eingabe prim war.


0

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

-52 Bytes dank @Jo King

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

Probieren Sie es 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

Erläuterung:

Die iSchleife sucht ab der ersten Zahl rückwärts und findet alle Zahlen, die sie gleichmäßig teilen. Weil wir rückwärts gehen, wird das kleinste im vairable gespeichertA .

VB gibt Ihnen eine freie Variable, die Ihrem Funktionsnamen entspricht (in meinem Fall A). Am Ende der Funktionsausführung wird der Wert in dieser Variablen zurückgegeben (mit Ausnahme einer expliziten ReturnAnweisung).


1
Sie brauchen den Prime Check überhaupt nicht. Der kleinste Faktor einer Zahl (anders als 1) ist garantiert eine Primzahl, ansonsten gibt es einen kleineren Faktor
Jo King

@JoKing D'oh! Ich kann natürlich nicht glauben, dass ich das verpasst habe. Vielen Dank!
Brian J






Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.