Das obige Bild wird als Hexaglyphe bezeichnet. Hexaglyphen sind einige coole Muster, die ich während meiner DiffEq-Klasse erstellt habe. So machst du eins:
- Betrachten Sie die folgenden Punkte, die wie ein reguläres Hexagramm geformt sind. Das innere Sechseck enthält die letzte Glyphe, während die äußeren 6 Punkte einen Stern bilden und dort beginnen, unsere Linien zu zeichnen.
- Wählen Sie aus den äußeren sechs Punkten zufällig ein Paar aus. Aus Effizienzgründen sollte mindestens ein weiterer Punkt zwischen den beiden ausgewählten Punkten liegen (andernfalls hat dies keine Auswirkungen auf die endgültige Zahl). Wirf dann von jedem der beiden Punkte einen Strahl auf den anderen. Dieser Strahl wird durch vorherige Zeilen blockiert .
- Wiederholen Sie diesen Vorgang, bis alle 9 Kanten gebildet wurden, wie in den nächsten Bildern gezeigt.
- Hier ist ein Beispiel für das Blockieren von Strahlen. Die Enden des Strahlsegments sind noch sichtbar, aber der mittlere Teil wird von den ersten beiden Segmenten, die wir gezeichnet haben, verdeckt.
- Diese beiden Strahlen werden ebenfalls "blockiert", dies verursacht jedoch keinen sichtbaren Unterschied, da sie von derselben anderen Linie blockiert werden.
- Schnellvorlauf, bis alle 9 Linien gezeichnet sind. Wenn Sie eine detailliertere Erläuterung dieser übersprungenen Schritte wünschen, kann ich dies erläutern.
- Zum Schluss entfernen Sie die Punkte des Sterns. Damit es schöner aussieht, werden auch die dicken Punkte entfernt.
Die Herausforderung
Sie müssen eine visuelle Darstellung eines zufälligen Hexaglyphen ausgeben. Das ist Code-Golf, die wenigsten Bytes gewinnen.
Alle möglichen Hexaglyphen sollten mit einer positiven Wahrscheinlichkeit erscheinen. Durch Ändern der Reihenfolge, in der die 9 Kanten gezeichnet werden, werden verschiedene Hexaglyphen erzeugt.
Außerdem müssen alle von Ihrem Programm ausgegebenen Bilder gültige Hexaglyphen sein. Bestimmte Muster (z. B. ein vollständiger Umriss des inneren Sechsecks) können möglicherweise nicht als Hexaglyphen dargestellt werden. Sie dürfen diese also nicht ausgeben.
Die Ausgabe sollte ein grafisches Bild sein (auf dem Bildschirm oder in einer Datei gedruckt).
Das Sechseck muss regelmäßig sein, kann aber in beliebiger Ausrichtung erscheinen.
Reflexionen / Rotationen werden nicht als einzigartig angesehen. (Dies könnte die Einhaltung von Anforderung 1 erleichtern.)
quelle
I made up while doodling during my DiffEq class
. So geschehen alle großen Entdeckungen ...: P'01'
von Space Interleaved anstelle von' *'
.Antworten:
Mathematica,
273268264242 BytesDas
rendertT
in Mathematica als hochgestellt und ist ein Postfix-Transponierungsoperator.Das Aussortieren der Fehler hat ewig gedauert ... gegen Ende habe ich ein paar Dinge zusammen gehackt, damit es funktioniert, also ist das definitiv nicht optimal. Ich frage mich auch, ob es insgesamt besser wäre, die Spezifikation wörtlich über die Linien im äußeren Sechseck zu implementieren und die Geometriefunktionen von Mathematica die Schnittpunkte handhaben zu lassen.
Beachten Sie, dass dies ein vollständiges Programm ist. Wenn Sie den Code innerhalb einer einzelnen REPL-Sitzung mehrmals ausführen möchten, müssen Sie ihm ein Präfix voranstellen
Clear[b]
.Hier sind die Ergebnisse von 20 Läufen:
Erläuterung
Bei dieser Lösung werden die äußeren Sternpunkte überhaupt nicht verwendet. Stattdessen wird direkt mit den Punkten gearbeitet, die Teil der Hexaglyphe sind, und mit den Linien, die jeweils drei davon abdecken.
Beschriften wir die Punkte:
1
beginnt in einer etwas seltsamen Ecke, ist aber auf das (auch etwas seltsame) Standardverhalten von zurückzuführenCirclePoints
. Das Sechseck von dort aus zu starten, stellte sich als am billigsten heraus.Nun wollen wir die relevanten Linien durch drei dieser Punkte finden, die den verbundenen Punkten des äußeren Sterns entsprechen. Die um das Sechseck herum sind natürlich nur 3 benachbarte Punkte (Modulo 12), beginnend mit einer ungeraden Zahl. Die , die in der Mitte bestehen aus einer geraden Zahl
n
,13
undn+6
.Darstellungen dieser Linien (in Form von Listen mit drei Punkten werden durch den folgenden Code generiert):
Das
Partition
erzeugt die Linien um das Sechseck undArray
die Linien durch die Mitte. Um beide Strahlen zu verarbeiten, ordnen wir diese Funktion der Linienliste zu:Jetzt mischen wir diese mit
RandomSample
, um sie in zufälliger Reihenfolge zu verarbeiten.Join @@
Reduziert die Liste der Paare, sodass wir eine Liste der Strahlen haben.Kurze Pause: Um zu verfolgen, welche Punkte bereits gesperrt sind, verwenden wir eine Lookup-Funktion
b
, dieTrue
für alle Werte von initialisiert wirdb@_=k=1>0;
. Bei der Bearbeitung eines Strahls behalten wir alle Punkte bis zum ersten Punkt bei, derb[n] == False
( einschließlich desjenigen) hat:Ich bin der Meinung, dass dies der derzeit am besten geeignete Teil ist. Die Verwendung von zwei temporären Variablen zum Spielen von Mastermind scheint sehr teuer zu sein. Das Ergebnis gibt uns jedenfalls die Punkte in einer Linie, die wir zeichnen dürfen. Diese Funktion wird nun auf jeden dieser Punkte abgebildet:
Der erste Teil generiert die Liste aller 13 Punkte unter Verwendung der verschachtelten Ergebnisse von zwei Aufrufen nach
CirclePoints
(mit unterschiedlichen Radien für die Kantenmitten und die Ecken des Sechsecks). Beachten Sie, dass dadurch derb@#=!k
Wert der Nachschlagetabelle für den aktuellen PunktFalse
so festgelegt wird, dass kein weiterer Strahl durch den Punkt treten kann. Schließlich wird der Wert als Index in die Koordinatenliste übernommen, um den richtigen 2D-Punkt zu erhalten.Dadurch werden alle Einzelelementlisten verworfen, da sie als einzelne (und sichtbare) Punkte gerendert werden. Zum Schluss rendern wir das Ergebnis:
quelle
b@_=1>0
=b=1>0&
Schuhe (Rubin) Rev. C 184 Bytes
Durch die Übertragung der Verantwortung für die Überprüfung, ob eine bestimmte halbe Linie vom Hauptprogramm zur Zeichenmethode gezogen werden soll, werden 12 Byte gespart. Das Hauptprogramm muss jedoch noch prüfen, ob die gesamte Leitung vollständig gesperrt ist.
Schuhe (Ruby)
205... Rev B 196 BytesShoes ist ein Ruby-basiertes Tool zum Erstellen von GUIs usw. Es ist das erste Mal, dass ich es verwendet habe. mothereff.in/byte-counter zählt meine Einsendung als 196 Bytes, aber aus irgendeinem Grund zählt Shoes sie als 202.
Außerdem können Sie mit Ruby Dinge tun
t[a=i.ord]
, die seltsamerweise nicht wie erwartet mit Schuhen funktionieren.Erläuterung
Ich betrachte die Teile der Linie außerhalb des Sechsecks nicht. Ich zeichne nur den Teil, der gezeichnet werden muss. Wichtig ist, ob die Linien die Schnittpunkte kreuzen (Wenn wir nur die Teile zeichnen, die gezeichnet werden müssen, bedeutet dies, dass sie an den Schnittpunkten beginnen / enden.)
Die Grundregel lautet, dass, wenn beide Endpunkte einer Linie besucht wurden, die Linie gesperrt ist und nicht gezeichnet werden soll. Da die Linien in zwei Hälften gezeichnet werden, müssen wir auch prüfen, ob der Mittelpunkt besucht wurde, um festzustellen, ob jede Hälfte gezeichnet werden soll oder nicht.
Ich verfolge, welche Punkte im Array besucht wurden
t[]
. Dies endet mit einem Eintrag für jede physikalische Koordinate im darunter liegenden Raster. Es gibt kein separates logisches Array mit 13 Elementen. Am Endet[]
können 87 Elemente vorhanden sein, obwohl nur bis zu 13 nützliche Daten enthalten.Intern werden die Koordinaten der Endpunkte der Linien durch eine einzelne Zahl z angegeben, wobei z% 6 die y-Koordinate und z / 6 die x-Koordinate ist. In diesem System ist das Sechseck abgeflacht. Wenn die Linien gezeichnet werden, wird die x-Skala mit 8 und die y-Skala mit 14 multipliziert, was eine sehr enge rationale Annäherung an das korrekte Verhältnis darstellt: 14/8 = 1,75 vs sqrt (3) = 1,732.
Das interne Koordinatensystem wird unten mit einigen Beispielausgaben gezeigt.
Ungolfed
Weitere Beispielausgaben
Diese wurden mit einer älteren Version des Programms durchgeführt. Der einzige Unterschied besteht darin, dass die Positionierung des Hexaglyphen im Fenster nun leicht abweicht.
quelle
mothereff.in/byte-counter counts my submission as 196 bytes, but for some reason Shoes counts it as 202.
Ich weiß nicht zu 100%, ob dies zutrifft, aber ich glaube, dass Shoes Ihren Code mit 202 Bytes anstatt mit 196 gezählt hat, weil Ihre Zeilenumbrüche tatsächlich eine zweistellige Folge "\ r \ n" sind. Dadurch wird jede neue Zeile zweimal gezählt. Hier ist eine Stapelüberlaufantwort bezüglich \ r und \ n.Python,
604591574561538531536534528493483452431420419415388385384 BytesIch habe die Idee von Level River St angepasst, zu überprüfen, ob eine Leitung blockiert wird, indem überprüft wird, ob beide Endpunkte der Leitung bereits zuvor besucht wurden. Das spart 27 Bytes. Golfvorschläge sind willkommen.
Edit: Bugfixing und Golfen
g(p,q)
für 3 Bytes. GolfL
für ein Byte.Ungolfing:
Die Hexaglyphen selbst sind recht klein, da wir ein 12-Pixel-Sechseck als Basis verwenden (aus Golfgründen). Hier sind einige Beispiele für Hexaglyphen (Entschuldigung für das schlechte Zuschneiden):
quelle
R=range;G=goto