Der Zweck dieser Herausforderung besteht darin, einen Gang in der Ebene grafisch darzustellen, wobei die Richtung jedes Schritts durch die Primalität von und die Parität seiner binären Expansion bestimmt wird. Speziell,
- Die anfängliche Richtung ist festgelegt, etwa nach Norden.
- Alle Stufen haben die gleiche Länge .
- Die Richtung von Schritt kann Nord, West, Süd oder Ost sein und wird wie folgt bestimmt:
- Wenn nicht prim ist, ändert sich die Richtung nicht.
- Wenn eine Primzahl ist und die binäre Expansion von eine gerade Anzahl von Einsen hat, biege nach rechts ab.
- Wenn eine Primzahl ist und die binäre Expansion von eine ungerade Anzahl von Einsen hat, biege links ab.
Nehmen Sie als Beispiel an , dass die Anfangsrichtung Nord ist. Die ersten Schritte sind:
- ist keine Primzahl. Wir bewegen uns also einen Schritt in Richtung Norden.
- ist eine Primzahl, und ihre binäre Expansion
10
hat eine ungerade Anzahl von Einsen. Also biegen wir links ab und sind jetzt nach Westen ausgerichtet. Wir gehen einen Schritt in diese Richtung. - ist eine Primzahl, und ihre binäre Expansion
11
hat eine gerade Anzahl von Einsen. Wir biegen also rechts ab und sind jetzt nach Norden ausgerichtet. Wir gehen einen Schritt in diese Richtung. - ist keine Primzahl. Wir bewegen uns also einen Schritt in Richtung Norden.
Die Herausforderung
Input : positive ganze Zahl .
Ausgabe : Darstellung des oben definierten Schritt-Wegs.
Zusätzliche Regeln
- Die Anfangsrichtung kann frei gewählt werden (nicht unbedingt Nord), sollte aber für alle .
- Die Wende-Regel kann der oben beschriebenen entgegengesetzt sein, dh für ungerade Parität nach rechts und für gerade nach links drehen; aber es muss für alle .
- Die Ausgabe muss eine grafische Darstellung des Weges sein. Zum Beispiel:
- Der Weg kann mit Liniensegmenten gezeichnet werden.
- Die besuchten Punkte können mit einer Markierung angezeigt werden, z. B. einem Punkt. mit oder ohne Verbindungsliniensegmente.
- Es kann ein zweifarbiges Rasterbild bereitgestellt werden, wobei eine Farbe besuchten Punkten und eine andere Farbe nicht besuchten Punkten entspricht.
- Die Maßstäbe der horizontalen und vertikalen Achse müssen nicht identisch sein. Auch Achsenbeschriftungen und ähnliche Elemente sind optional. Solange der Weg gut sichtbar ist, ist die Handlung gültig.
- Beachten Sie, dass einige Punkte mehrmals besucht werden. Die Handlung reagiert darauf nicht. Wenn zum Beispiel Liniensegmente im Plot angezeigt werden, wird jedes Einheitensegment gleich angezeigt, unabhängig davon, wie oft es durchlaufen wurde.
- Der Code sollte für alle
N
gegebenen unbegrenzten Ressourcen funktionieren . Es ist akzeptabel, wenn in der PraxisN
aufgrund von Zeit-, Speicher- oder Datentypbeschränkungen ein großer Fehler auftritt. - Ein- und Ausgabe sind wie gewohnt flexibel. Insbesondere kann jedes der Standardmittel zum Ausgeben von Bildern verwendet werden.
- Der kürzeste Code in Bytes gewinnt.
Testfälle
In den folgenden Darstellungen wird Nord als Anfangsrichtung verwendet. gerade Parität geht nach rechts; und der Weg ist mit Liniensegmenten dargestellt.
N = 7
:
N = 3000
:
N = 20000
:
N = 159000
:
N = 1200000
:
N = 11000000
:
code-golf
graphical-output
integer
primes
Luis Mendo
quelle
quelle
[graphical-output]
erlaubt ist? Gibt es einen Grund, wie meine jetzt gelöschte Charcoal-Antwort, die ASCII-Ausgabe zu deaktivieren?Antworten:
Vorschlaghammer 0,4 ,
2220 BytesDekomprimiert in diese Wolfram Language-Funktion:
Ungolfed
Zuerst definieren wir eine Funktion, die den Drehwinkel bei jedem Schritt zurückgibt:
ThueMorse
ist die Parität der Summe der Binärziffern. Wir verwenden dies-1^(...)
nicht2*...-1
aus einem etwas komplizierten Grund: Wolfram Language konvertiert arithmetische Ausdrücke in der Quelle automatisch in eine kanonische Form, sodass Ausdrücke wie2/x
gespeichert werden alsTimes[2, Power[x, -1]]
. Dies macht die FrequenzPower
sehr hoch und komprimiert sie daher sehr billig.(Das Multiplizieren mit
Boole@PrimeQ@
ist etwas länger und das impliziteBoole
Casting von Booleanern war zum Zeitpunkt der Challenge noch nicht implementiert.)Von hier aus Mathematica
AnglePath
undListPlot
tun genau das, was wir brauchen:In der interaktiven App ist die Ausgabe ein skalierbares Vektorgrafikobjekt.
quelle
MATL ,
252421 BytesProbieren Sie es bei MATL online
Vielen Dank an @LuisMendo für eine nette Golfsitzung im Chat, die letztendlich zu dieser 21-Byte-Version führte, indem sie vorschlug
Eq*^
Erläuterung
quelle
C (gcc) 179 Bytes
Probieren Sie es online!
0
1
C (gcc) , 219 Bytes
Probieren Sie es online!
Zugeschnittene Ausgabe für 20000:
Beide Versionen beginnen mit West und biegen rechts ab, ungerade links auf gerade.
Ich habe die größeren Testfälle mit keinem von beiden ausprobiert, da die Ausgabe mit 20000 ~ 1,5 GB betrug und 150000 ~ 90 GB gewesen wären. Dies alles wird gespeichert, während das Programm ausgeführt wird.
Erklärung der oberen:
quelle
0
im Fall von C als Mittelwert oder Nullzeiger interpretieren würde ).Wolfram Language (Mathematica) ,
989691777663 Bytes-14 Bytes: Vielen Dank an @lirtosiast, der mir gezeigt hat, wie man es benutzt
AnglePath
...-13 Bytes: ... und
ThueMorse
!Anwendungsbeispiel:
Schritt für Schritt Erklärung:
If[PrimeQ@#, 2 ThueMorse@# - 1, 0] &
ist eine Funktion, die den Schrittindex verwendet und 0 für nicht-Primzahlen, -1 für geradzahlige binäre Primzahlen und +1 für ungeradzahlige binäre Primzahlen zurückgibt.ThueMorse@#
Ersetzt die vorherige LösungTotal[#~IntegerDigits~2]
(die gleiche, Modulo 2).Array[Pi/2*%,#]
erstellt eine Liste dieser Funktion mit einem Index von 1 bis zum Funktionsargument (im Beispiel 20000) und multipliziert jedes Element mit π / 2, um einen Richtungsänderungswinkel (Bogenmaß) zu erhalten. Wir haben jetzt 0 für Nicht-Primzahlen, -π / 2 für gerade-binäre Primzahlen und + π / 2 für ungerade-binäre Primzahlen.AnglePath[%]
konvertiert diese Liste von Richtungsänderungswinkeln in einen Pfad. Diese Anweisung ersetzt die doppelte Verwendung der vorherigen Lösung vonAccumulate
.ListPlot[%]
konvertiert die Liste der Positionen in ein XY-Punktdiagramm. Wenn eine Linie bevorzugt wird, verwenden SieListLinePlot
stattdessen. Diese Plotfunktionen verfügen über zahlreiche Optionen, um die Darstellung der Plots zu verbessern.quelle
MATL,
31302826 Bytes3 Bytes gespart dank @LuisMendo
2 Bytes gespart dank @Sanchises
Probieren Sie es bei MATL Online aus
Erläuterung
Diese Lösung verwendet komplexe Zahlen, um die X- und Y-Komponenten der 2D-Ebene darzustellen
Zu diesem Zeitpunkt haben wir vier Punkte (
(0, 1), (-1, 0), (0, -1), (1, 0)
) in einem Array, das durch komplexe Zahlen dargestellt wird. Dies sind die vier Hauptrichtungen. Jetzt wollen wir diese verwenden, um "zu gehen".Im Wesentlichen funktioniert dies so, dass wir in die nullte Richtung (das nullte Element des Arrays, das ist
(-1, 0)
) fahren. Für jeden Schritt müssen wir die Änderung in dieser Überschrift bestimmen. Wir werden ganze Zahlen verwenden, um diese Änderung zu verfolgen. Wenn wir "nach rechts" drehen möchten, erhöhen wir diese Ganzzahl um 1 (wobei auf das nächste Element im 4-Punkt-Array verwiesen wird ), und wenn wir "nach links" gehen möchten, verringern wir diese Ganzzahl um 1 (wobei auf das vorherige Element im Feld verwiesen wird) 4-Punkt-Array). Wenn wir unseren Weg fortsetzen möchten, halten wir den ganzzahligen Wert konstant (wobei auf dasselbe Element im 4-Punkt-Array verwiesen wird ).Dieser Teil des Codes erzeugt ein Array von all jenen
0
,-1
und1
Werte.Jetzt haben wir ein Array der Unterschiede zwischen aufeinanderfolgenden ganzen Zahlen, so dass wir die kumulative Summe dieser berechnen können, um die Indizes zu erhalten, die wir dann verwenden können, um die Richtung bei jedem Schritt im ursprünglichen 4-Element-Array nachzuschlagen.
Praktischerweise verfügt MATL über eine Umlaufindizierung, sodass der Index
5
am Anfang eines Arrays mit 4 Elementen umläuft. Wir können dies zu unserem Vorteil nutzen, um diese Ganzzahl zu erhöhen und zu verringern, ohne uns Gedanken darüber zu machen, dass das Referenzrichtungs-Array nur aus 4 Elementen besteht.Jetzt haben wir eine Reihe von Richtungen für die Schritte, sodass wir die kumulative Summe dieser Richtungen berechnen können, um den eingeschlagenen Pfad zu verfolgen.
quelle
Perl 6 ,
213182 Bytes{my @p = [\ +] [\ *] ({{. is-prime ??. base (2) .comb (~ 1)% 2 ?? i !! - i !! 1 + 0i} (+ + $)} ... *) [^ $ _]; {"<svg viewBox = '{. min xx 2, .elems xx 2}' >>. & {" L {.re} {.im} " }} 'fill =' none 'stroke =' black '/> "} (minmax | @p» .reals)}Probieren Sie es online!
(Wirklich geschafft, dieses zu reduzieren!)
Diese Funktion gibt im SVG-Format aus.
{ -{ .is-prime * .base(2).comb(~1) R** -1 || i }(++$)i } ... *
ist eine unendliche Folge von Richtungsänderungen für jeden Schritt in Form von komplexen Zahlen, wobei1
"in die gleiche Richtung weitergehen"i
bedeutet, "nach links abbiegen" und-i
"nach rechts abbiegen" bedeutet.[^$_]
begrenzt diese Sequenz auf die Anzahl der Schritte, die als Argument der Funktion angegeben werden.[\*]
Durchsucht diese Sequenz mit (komplexer) Multiplikation und wandelt die Liste der relativen Richtungen in eine Liste der absoluten Richtungen um.[\+]
scannt diese Sequenz mit (komplexer) Addition und erstellt eine Liste der besuchten Koordinaten.».reals
wandelt diese Liste komplexer Zahlen in Listen mit zwei Elementen der Real- und Imaginärteile um.Das SVG-Bild ist nur ein einzelnes
path
Element.Ausgabe (umgerechnet in PNG) für N = 20000:
quelle
C 321 Bytes
Probieren Sie es online!
Ich fing an, daran zu arbeiten, bevor die andere C-Antwort veröffentlicht wurde, aber ich dachte, ich könnte meine sowieso genauso gut veröffentlichen. Diese ist viel länger, aber sie schneidet das Ausgabebild automatisch auf die Abmessungen des Ergebnisses ab.
Die Funktion wird als aufgerufen
f(n)
und die Ausgabe erfolgt im Netpbm-Format stdout.Beispielausgabe für n = 1000:
Der Primärtest ist im Wesentlichen derjenige, der in Lynns Antwort auf eine andere Herausforderung verwendet wird , die auf dem Satz von Wilson beruht .
Der Paritätstest verwendet eine Anpassung der Kernighan-Bitzählmethode .
Da der Primetest sehr langsam ist und der Algorithmus die gesamte Pfadgenerierungsfunktion für jedes gezeichnete Pixel erneut ausführt, ist jede Eingabe auf TIO viel höher als das 1000-fache.
quelle
LOGO,
177171 BytesGebrauch, so etwas wie dies :
Es tut mir leid, aber ich konnte keine Beispielausgabe erfassen. Erläuterung:
Dies ist eine rekursive Prozedur, die für jedes gesetzte Bit in ihrem Parameter um 180 ° gedreht wird, wodurch die Parität ihrer binären Expansion effektiv berechnet wird.
Dies ist ein sehr grundlegender Primalitätstest. Nach Sonderfall 1 kehrt die Prozedur vorzeitig zurück, wenn ein Faktor gefunden wird. Wenn sich jedoch herausstellt, dass der aktuelle Wert eine Primzahl ist, biegt er nach rechts ab und wandelt ihn dann wie oben beschrieben in eine Linkskurve um.
Dies ist nur eine einfache Schleife, um alle Zahlen bis auf ihre
n
Ursprünglichkeit zu testen und zwei Pixel nacheinander zu verschieben.quelle
Jelly , 41 Bytes
Probieren Sie es online!
quelle
JavaScript -
675668660632556534 BytesZum ersten Mal hier auf CodeGolf, zunächst mit ~ 1500 Bytes Code gestartet. Golf es zu
weniger als der Hälftefastmehr als ein Drittel davon. Fühlen Sie sich frei, weiter Golf zu spielen. Bytes Counted with: dieses ToolPrinzip:
Zeichnet in eine Leinwand mit fester Größe mit N und variabler Strichlänge als Eingabe.
Bearbeitungen:
-07 Bytes - Entfernen von verpassten if
-08 Bytes - Ändern des Schalters auf if / else
-28 Bytes - Ändern auf tenary if / else
-76 Bytes - Kürzere Primzahlprüfung (Laufzeit / 3)
-22 Bytes - Verwenden Sie diese Primzahlfunktion (Laufzeit) * 4)
Golf Code:
Ungolfed Code mit Leerzeichen:
Beispiele:
quelle
Rot ,
515480471 Bytes-1 Byte Danke an Kevin Cruijssen!
Ein wesentlicher Teil des Codes (~ 160 Byte) befasst sich mit der Normalisierung der Koordinaten, sodass die Grafiken unabhängig von der Größe der Eingabe vollständig in die Zeichenfläche passen.
Anfangsrichtung: Süden.
Hier ist das Ergebnis für
n = 3000
n = 20000
quelle
if j%(k + 1)
undif j% 2 = 1
, aber es gibt Räume , die für die meisten anderen Operatoren (+
,/
usw.). Kann der Raum auch im Modulo von entfernt werdenpick[-90 90]s% 2
? Warum braucht man eigentlich auch keine Plätzeas-pair k/1 - t * c k/2 - v * c
für die/
?s% 2
, danke! Ich weiß nicht warum, aber modulo%
ist der einzige Operator, für den das Leerzeichen davor entfernt werden kann, wenn ein Wort (Variable) vorangestellt wird. Inas-pair k/1 - t * c k/2 - v * c
den Schrägstrichen/
dienen ganz andere Zwecke - sie sindpath
s.k
ist einpair
undk/1
ist das erste Element (es kann auch mitk/x
, oder ausgewählt werdenpick k 1
). Fast überall werden Leerzeichen benötigt()[]{}
, es gibt Ausnahmen , da es keine Mehrdeutigkeiten gibt.word
Namen verwendet werden (Red
haben nichtvariables
, alles ist entweder einword
oder ein Wert (oder ein Syntaxblock wie[...]
oder(...)
). Also:a*4: 45
-> einem Worta*4
wird ein Wert zugewiesen 45.%
wird als Markierung für denfile!
Datentyp verwendet und vielleicht ist das der Grund, warum es nicht inword
Namen verwendet werden kann, aber die Regeln für die anderen arithmetischen Operatoren brechen kann./
dort einen anderen Zweck haben und die Symbole ohne Leerzeichen in Variablen verwendet werden können (oderwords
wie sie anscheinend für Rot genannt werden). Danke für die Erklärung. :) Und froh, dass ich (meistens aus Versehen) ein Byte für das speichern konntes% 2
. :)Verarbeitung, 140+ Bytes
Könnte nicht klar gesehen erfüllen
quelle