Die "Primameise" ist ein hartnäckiges Tier, das durch die ganzen Zahlen navigiert und sie teilt, bis nur noch Primzahlen übrig sind!
Anfangs haben wir ein unendliches Array A, das alle ganzen Zahlen> = 2 enthält: [2,3,4,5,6,.. ]
Sei p
die Position der Ameise auf dem Array. Anfangs p = 0
(Array ist 0-indiziert)
In jeder Runde bewegt sich die Ameise wie folgt:
- Wenn
A[p]
es Prim ist, bewegt sich die Ameise zur nächsten Position:p ← p+1
- andernfalls, wenn
A[p]
es sich um eine zusammengesetzte Zahl handelt, seiq
ihr kleinerer Teiler> 1. Wir teilenA[p]
durchq
und addierenq
zuA[p-1]
. Die Ameise bewegt sich zur vorherigen Position:p ← p-1
Hier sind die ersten Züge für die Ameise:
2 3 4 5 6 7 8 9 ...
^
2 3 4 5 6 7 8 9 ...
^
2 3 4 5 6 7 8 9 ...
^
2 5 2 5 6 7 8 9 ...
^
2 5 2 5 6 7 8 9 ...
^
2 5 2 5 6 7 8 9 ...
^
2 5 2 5 6 7 8 9 ...
^
2 5 2 7 3 7 8 9 ...
^
Ihr Programm sollte nach n
Zügen die Position der Ameise ausgeben . (Sie können davon ausgehen n <= 10000
)
Testfälle:
0 => 0
10 => 6
47 => 9
4734 => 274
10000 => 512
Bearbeiten. Sie können auch 1-indizierte Listen verwenden. Es ist akzeptabel, die Ergebnisse 1, 7, 10, 275, 513 für den obigen Testfall anzuzeigen.
Das ist Code-Golf, also gewinnt der Code mit dem kürzesten Code in Bytes.
n
(oder ob der zusammengesetzte Fall die Ameise jemals nach links von der Initiale schieben könnte2
).1,7,10,275,513
Wird 1-Indizierung angegeben? Oder müssten sie noch mit Ihren Ausgaben übereinstimmen.Antworten:
Alice , 45 Bytes
Probieren Sie es online!
Meist unkomplizierte Implementierung.
Die Schleifenzeiten
n
in Alice werden in der Regel durch Drücken einer Rücksprungadressen-1
und anschließendes Zurückkehren am Ende jeder Iteration mit ausgeführtk
. Beim letzten Durchlauf der Schleife kann derk
Befehl nicht mehr zurückgegeben werden, und die Ausführung wird fortgesetzt.Dieses Programm verwendet den gleichen
k
Befehl, um vorzeitig anzuhalten, wenn die Zahl eine Primzahl ist. Infolgedessen bewegt die letzte Iteration die Ameise immer nach links. Um diesen Fehler zu kompensieren, führen wirn+1
Iterationen in einem 1-indizierten Array durch, das genau das gewünschte Ergebnis liefert (und den Falln=0
kostenlos zur Verfügung stellt).quelle
Python 2 , 120 Bytes
Probieren Sie es online!
Ah, die selten
for
-else
Schleife! Dieelse
Klausel wird nur ausgeführt, wenn derfor
Body nicht über beendet wirdbreak
. In unserem Fall bedeutet dies, dass wir alleq
s überprüft haben und keine gefunden haben, die sich teilenp
.quelle
Oktave ,
109 103 10194 BytesProbieren Sie es online!
Dieser Code gibt die Position in 1-Indizierung aus, sodass die Ausgaben für Testfälle wie folgt lauten:
Diese Version verwendet einige Octave-Optimierungen und ist daher nicht mit MATLAB kompatibel. Der folgende Code ist eine MATLAB-kompatible Version.
MATLAB,
130 123 118117 BytesVerwendet 1-Indexierung wie bei der Octave-Version. Ich habe es mit allen Testfällen in MATLAB getestet. Als Beispiel ist die Ausgabe bei 100000 3675 (eine Indizierung).
Eine kommentierte Version des obigen Codes:
Interessanterweise sind dies die Ameisenpositionen im Verhältnis zur Anzahl der Iterationen für die ersten 10000 Werte von n.
Scheint wahrscheinlich, dass die Ameise wahrscheinlich zur Unendlichkeit tendiert, aber wer weiß, das Aussehen kann täuschen.
for
anstelle vonwhile
und Entfernen von Klammern ausif
- Danke @ Giuseppe\=
und+=
Operationen - Danke @Giuseppei++
undi--
- Danke @LuisMendoquelle
end
funktioniert, muss die Funktionssignatur übereinstimmenend
optional.end
ist auch in Octave optional. Hier wird es nur benötigt, weil Sie Code nach der Funktion habenJavaScript (ES6), 91 Byte
Demo
NB: Möglicherweise müssen Sie die Standardstapelgröße Ihres Motors erhöhen, um alle Testfälle zu bestehen.
Probieren Sie es online!
quelle
Haskell ,
10810694 BytesProbieren Sie es online! Anwendungsbeispiel:
([0]#[2..]!!) 10
Renditen6
(0-indiziert).Die Funktion
#
arbeitet mit zwei Listen, der umgekehrten Vorderseite des Arrays[p-1, p-2, ..., 1]
und dem unendlichen Rest des Arrays[p, p+1, p+2, ...]
. Es wird eine unendliche Liste von Positionen erstellt, von denen dien
th-Position bei einer Eingabe zurückgegeben wirdn
.Das Muster ist
((a:b)#(p:q))
anp
den Wert der aktuellen Position der Ameise unda
an den Wert der vorherigen Position gebunden.b
ist das Präfix des Arrays von Position 1 bisp-2
undq
die unendliche Pause ab Positionp+1
.Wir konstruieren eine Liste von rekursiven Aufrufen auf folgende Weise: Wir betrachten jeden Divisor
d
vonp
(der größer als eins und kleiner alsp
) in aufsteigender Reihenfolge und addierenb#(a+d:div p d:q)
für jeden von ihnen, dh der aktuelle Wertp
wird durch dividiertd
und die Ameise bewegt sich einen Schritt nach links, wod
hinzugefügt wirda
. Dann hängen wir(p:a:b)#q
an das Ende dieser Liste an, die angibt, dass sich die Ameise einen Schritt nach rechts bewegt.Wir nehmen dann den ersten dieser rekursiven Aufrufe aus der Liste und stellen die aktuelle Position voran, die mit der Länge der Präfixliste übereinstimmt
b
. Da die Teiler in aufsteigender Reihenfolge sind, wird durch Auswahl des ersten aus der Liste der rekursiven Aufrufe sichergestellt, dass der kleinste verwendet wird. Da(p:a:b)#q
es am Ende der Liste hinzugefügt wird, wird es außerdem nur ausgewählt, wenn es keine Teiler gibt, undp
ist daher Primzahl.Bearbeitungen:
-2 Bytes durch Umschalten der Liste der Funktionen von absteigend nach aufsteigend.
-12 Bytes dank Zgarbs Idee, in eine unendliche Liste zu indizieren, anstatt einen Zähler zu behandeln, und durch Umschalten auf 0-Indizierung.
quelle
TI-BASIC,
10810310298 BytesEingabe und Ausgabe werden in gespeichert
Ans
. Die Ausgabe ist 1-indiziert.quelle
fPart(∟A(P)/F:
mitfPart(F¹∟A(P:
. Gleiches in der nächsten Zeile.not(fPart(7⁻¹7
ist 0, abernot(fPart(7/7
ist 1.MATL , 41 Bytes
Die Ausgabe ist 1-basiert. Das Programm läuft für den letzten Testfall im Online-Interpreter ab.
Probieren Sie es online!
Erläuterung
Das Programm wendet das in der Challenge beschriebene Verfahren an. Zu diesem Zweck werden die manuellen und automatischen Zwischenablagen von MATL ungewöhnlich häufig verwendet.
Der kleinste Divisor wird als erster Eintrag in der Primfaktorzerlegung erhalten.
Das "Teilen" -Update wird durchgeführt, indem der entsprechende Eintrag von Array A überschrieben wird . Das "Hinzufügen" -Update erfolgt durch elementweises Hinzufügen eines Arrays, das außer an der gewünschten Position Nullen enthält , zu A.
quelle
Pyth - 44 Bytes
Einfache prozedurale Umsetzung.
Test Suite .
quelle
PARI / GP, 87 Bytes
Ziemlich selbsterklärend (nicht so golfig). Wenn Sie den
f(n)=
Teil nicht zählen , sind das 82 Byte. Sie können auch mitn->
(85 Byte) beginnen.Es ist eine 1-indizierte Sprache.
Bearbeiten: Die Änderung
illustrate(n,m)=A=[2..m+1];p=1;for(i=1,n,for(j=1,m,printf("%5s",if(j==p,Str(">",A[j],"<"),Str(A[j]," "))));print();q=factor(A[p])[1,1];if(A[p]!=q,A[p]/=q;p--;A[p]+=q,p++))
druckt eine Illustration des Laufens der Ameise (mit einem ausreichend breiten Terminal). Zum Beispielillustrate(150,25)
werden die ersten 150 Schritte auf 25 Spalten wie folgt angegeben:quelle
Python 2 ,
142127 BytesProbieren Sie es online!
quelle
P(n)
n<=4
Mathematica,
118103 BytesProbieren Sie es online!
Martin Ender sparte 15 Bytes
quelle
Divisors
, für das Sie die Infixnotation verwenden könnenDo
, und Sie könnent
stattt-1
(1-basiertes Ergebnis) einfach zurückkehren .Python 3 ,
158149133 BytesDies ist eine einfache prozedurale Implementierung mit ein oder zwei Macken, um sicherzustellen, dass der Code für alle Testfälle funktioniert. Ich stelle
[*range(2,n+9)]
damit sicher, dass A groß genug ist (außern<3
, dassn+9
es mehr als genug ist). Dieelse
Klausel teilt das AlteA[p]
durchd
Dekrementep
und fügtd
dann das Neue hinzuA[p]
, was definitiv eine schlechte Codierungspraxis ist. Ansonsten ziemlich unkompliziert. Golfvorschläge willkommen!Edit: -9 Bytes ohne
sympy
Dank an Halvard Hummel. -14 Bytes von Felipe Nardi Batista, -6 Bytes von einigen Hinweisen aus Jonathan Frechs Python 2-AntwortProbieren Sie es online!
quelle
if d-m:A[p]...
undelse:p+=1
um ein Byte zu speichernelse
Anweisungelse
Anweisung gibt es keinen Unterschied in Bytes zur FunktionsversionPHP, 102 + 1 Bytes
Laufen Sie als Pipe mit
-R
oder versuchen Sie es online .Leere Ausgabe für Eingabe
0
; Einfügen+
nachecho
für ein Literal0
oder verwenden Sie diese 1-indizierte Version (103 + 1 Byte):
quelle
R , 123 Bytes
Eine unkomplizierte Implementierung. Es wird als eine Funktion bereitgestellt, die die Anzahl der Züge als Eingabe nimmt und die Position p zurückgibt.
Es durchläuft die Sequenz und bewegt den Zeiger gemäß den Regeln vor und zurück. Die Ausgabe ist 0-basiert.
Eine Anmerkung: Um den kleinsten Primfaktor einer Zahl x zu finden, wird der Modul von x relativ zu allen ganzen Zahlen von 0 bis x berechnet. Dann werden die Zahlen mit dem Modul 0 extrahiert, die immer [0,1, ..., x] sind. Wenn die dritte solche Zahl nicht x ist, dann ist es der kleinste Primfaktor von x.
Probieren Sie es online!
quelle
C (GCC),
152148 BytesMinimiert
Mit einigen Kommentaren formatiert
Hauptfunktion zum Testen
Zum Anzeigen jedes Schritts
Deklariere display () innerhalb von f ()
Anrufanzeige()
Anrufanzeige()
quelle
Clojure, 185 Bytes
Aua, das Bearbeiten eines "Status" ist in Clojure nicht ideal. Sie müssen den Exponenten für größere Eingaben erhöhen.
quelle
loop
? Sie sollten in der Lage sein, ein paar Bytes ohne das zu verlieren.first
Sache auch in einesome
Anweisung ändern .recur
zweimal wiederholen , eine für jedenif-let
Zweig. Auch(dec i)
würde dupliziert werden.some
braucht ein Prädikat, das ich verwenden könnte,+
da wir es mit Zahlen zu tun haben, aber dies ist ein Zeichen länger alsfirst
. CMIIWJava 8,
138135 BytesErläuterung:
Probieren Sie es hier aus.
quelle
Clojure,
198193191 BytesDies muss stark golfen werden ...
Golf 1 : 5 Bytes durch Ändern
(first(filter ...))
von gespeichert(some ...)
Golf 2 : 2 Bytes durch Ändern
(zero? ...)
von gespeichert(= ... 0)
Verwendungszweck:
Ungolfed-Code:
quelle