Ich schaue aus meinem Dachfenster in den Hof meines Nachbarn. Sie haben einen Hund in der Mitte des Hofes an einen Pfosten gekettet. Der Hund rennt um den Hof, ist aber immer am Ende seiner Kette und hinterlässt am Ende eine Spur im Dreck. Normalerweise wäre diese Spur vollkommen kreisförmig, aber meine Nachbarn haben einige andere Stangen in ihrem Hof, an denen sich die Kette des Hundes verfängt. Jedes Mal, wenn die Hundekette auf eine Stange trifft, beginnt sich der Hund um die neue Stange zu drehen, wobei die Länge der Kette als Radius übrig bleibt. Da die Stangen, der Hund und die Kette alle null breit sind (meine Nachbarn sind Mathematiker), kann sich die Kette auf unbestimmte Zeit um eine Stange wickeln, ohne dass sich der Radius des Kreises verkürzt. Der Hund kann auch die Kette passieren (nur nicht das Halsband), wenn sich die Kette im Weg befindet. Nachdem ich diese Kuriosität eine Weile beobachtet habe, entscheide ich mich, einen Code zu schreiben, um den Hund meines Nachbarn zu simulieren. Der Code nimmt die Positionen eines Mittelpfostens, an den der Hund angekettet ist, die Positionen der anderen Pfosten in meinem Nachbarhof, die Länge der Kette und die Startposition des Hundes und gibt ein Diagramm aus, in dem die Weg, wo der Hund das Gras abgenutzt hat. Sie können davon ausgehen, dass eine beliebige Kombination der folgenden Elemente konstant ist (und sie daher nicht als Eingabe verwendet):
Position der Stange, an die der Hund angekettet ist
Länge der Kette
Startort des Hundes
Die Sonne geht auf, so dass der Raum auf dem Boden meines vom Fenster beleuchteten Dachbodens kleiner wird und ich immer weniger Platz habe, um meinen Code zu schreiben. Bitte versuchen Sie, die Byteanzahl Ihres Codes so gering wie möglich zu halten, damit ich auf meinem Dachboden Platz zum Zeichnen habe.
Testfälle
Hier gehe ich davon aus, dass der Hund 3 Einheiten südlich von der Stange beginnt, an der er angekettet ist (der rote Punkt) 0,0
. Ich habe aus Gründen der Klarheit angegeben, wo sich die Pole mit Punkten befinden. Sie müssen sie nicht in Ihre Ausgabe einbeziehen.
Poles at 1,2 -1,2
Poles at 0,.5
Poles at 0,1 1,1 -2,1 -1,-.5
Poles at 0,1 1,1
quelle
{0,-.5}
?{0,.5}
vertikal ohne den größten Kreis gespiegelt . Der Hund fängt im Wesentlichen an der zweiten Stange zu fangen.Antworten:
Python 3 mit matplotlib, 457 Bytes
Da Ihre Nachbarn Mathematiker sind, habe ich angenommen, dass der Garten Ihres Nachbarn den komplexen Bereich einnimmt und alle Koordinaten von Objekten im Garten daher komplexe Zahlen sind. Um diese Funktion nutzen zu können, müssen Sie ihm eine Liste komplexer Zahlen übergeben, die die Positionen der Pole im Garten Ihres Nachbarn angeben. Die Standarddarstellung des Koordinatensystems wurde gewählt, wobei rechts positive reelle Zahlen und aufwärts positive imaginäre Zahlen stehen. Das heißt, die Beispiele werden:
Außerdem geht das Programm von folgenden Dingen aus: Die Leine ist an den Punkt 0 gebunden, die Leine ist 3 Einheiten lang und die Plotfläche ist 10 mal 10 um 0 zentriert. Für diese Parameter stimmen die Ergebnisse genau mit den Beispielen überein. Und so sieht das Ergebnis aus (für das letzte Beispiel):
Der Algorithmus ist recht einfach und erfordert nur eine Bedingung, um die Suche im Uhrzeigersinn und gegen den Uhrzeigersinn zu unterscheiden. Der Status des Algorithmus wird durch den aktuellen Rotationspunkt und die Ausrichtung / verbleibende Länge der Leine beim Auftreffen auf den aktuellen Rotationspunkt definiert. Es funktioniert wie folgt:
Dieser Algorithmus wird dann zuerst im Uhrzeigersinn ausgeführt, wonach der Zustand zurückgesetzt und im Gegenuhrzeigersinn ausgeführt wird. Die Einfachheit des Algorithmus bedeutet, dass ungefähr die Hälfte des Programms bytecount für die Zeichenfunktionen aufgewendet wird. Wenn die Zeichenroutinen entfernt würden, würden 218 Bytes aus der Programmgröße entfernt.
Das Folgende ist eine ungolfed-Version, die auch Debug-Code enthält, der auch Punkte und Leinen-Kollisionen anzeigt:
Die Ausgabe sieht folgendermaßen aus:
quelle
Verarbeitung 3, 815
833835876879BytesDank @ZacharyT konnten zwei Bytes gespart werden, indem unnötige Klammern entfernt wurden
Führen Sie dieses Programm folgendermaßen aus:
(Die Funktion
s
nimmt in afloat[][]
). Dies ist im Wesentlichen Testfall Nr. 3, wird jedoch mit 100 multipliziert, um das Fenster anzupassen.Einige Dinge zu beachten:
pushMatrix()
undpopMatrix()
Operation nur 32 Matrizen aufnehmen können.Beispielausgabe für den obigen Testfall.
Wenn Sie die hübsche Ausgabe sehen möchten, fügen Sie diese Zeile direkt nach der
translate(w,w);
In-Funktion hinzus
.Und das gibt uns dieses Ergebnis:
Ungolfed
f()
und Erklärung(enthält auch Debug-Code)
Kurz gesagt, das Programm sendet zwei "Sucher", einer gegen den Uhrzeigersinn und der andere im Uhrzeigersinn. Jeder dieser Sucher findet den nächsten Pol und zeichnet einen Bogen, wenn die Kette lang genug ist, andernfalls zeichnet er einen Kreis. Sobald es einen Bogen gezeichnet hat, schickt es einen anderen Sucher an diesen Pol und der Prozess wird fortgesetzt.
f()
enthält den Prozess jedes Suchers. Eine ausführlichere Erklärung wird kommen, sobald ich mehr Golf spiele.quelle
L-d
?LOGO,
305298297293 BytesProbieren Sie den Code auf FMSLogo.
Definieren Sie eine Funktion
draw
(golfen alsd
), die als Liste der Polkoordinaten (zum Beispiel) eingegeben wirddraw [[0 100] [100 100] [-200 100] [-100 -50][0 0]]
das Ergebnis auf dem Bildschirm .Bedarf:
[0 0]
muss in die Poleliste aufgenommen werden. Wenn der Debug-Code (Zeichnen von Polen) aktiviert ist, dann[0 0]
muss dies das letzte Element sein.x=0, y=-300
(wie in der Problembeschreibung)Mögliche Optimierungen:
>=
mit>
Golf Code:
Ungolfed Code (
;
startet einen Inline-Kommentar (zur Erklärung) und:
startet einen Variablennamen):quelle
Python 2 + PIL, 310 Bytes
Das Skript liest die Liste der Punkte von stdin als Liste komplexer Zahlen.
quelle