Ziel dieser Herausforderung ist es, eine Animation eines Kettenantriebssystems zu erstellen , das aus einem Satz Kettenrädern besteht, die durch eine Kette miteinander verbunden sind .
Allgemeine Anforderungen
Ihr Programm erhält eine Liste von Kettenrädern , die als (x, y, radius)
Drillinge angegeben sind. Das sich ergebende Kettenantriebssystem ist dieser Kettenräder umfasst, von einem miteinander verbundenen geschlossenen gespannten Kette über jede von ihnen vorbei, um . Ihr Ziel ist es, eine Endlosschleifen-Animation zu erstellen , die das System in Bewegung zeigt. Zum Beispiel angesichts der Eingabe
(0, 0, 16), (100, 0, 16), (100, 100, 12), (50, 50, 24), (0, 100, 12)
sollte die Ausgabe ungefähr so aussehen
.
Das Koordinatensystem sollte so sein, dass die x-Achse nach rechts und die y-Achse nach oben zeigt. Sie können davon ausgehen, dass die Radien gerade Zahlen größer oder gleich 8 sind (wir werden später sehen, warum dies wichtig ist.) Sie können auch davon ausgehen, dass mindestens zwei Kettenräder vorhanden sind und dass sich die Kettenräder nicht schneiden . Die Einheitendes Eingangs sind nicht zu kritisch. In allen Beispielen und Testfällen in diesem Beitrag werden Pixel als Eingabeeinheiten verwendet (z. B. beträgt der Radius des mittleren Kettenrads in der vorherigen Abbildung 24 Pixel;). Versuchen Sie, nicht zu stark von diesen Einheiten abzuweichen. In der restlichen Herausforderung werden räumliche Größen in den gleichen Einheiten wie die Eingabe angegeben - achten Sie darauf, dass die Proportionen stimmen! Die Abmessungen des Abtriebs sollten geringfügig größer sein als der Begrenzungsrahmen aller Kettenräder und so groß sein, dass das gesamte System sichtbar ist. Insbesondere sollten die absoluten Positionen der Kettenräder die Leistung nicht beeinflussen; nur ihre relativen Positionen sollten (also, wenn wir zum Beispiel alle Kettenräder im obigen Beispiel um den gleichen Betrag verschoben, würde die Ausgabe gleich bleiben.)
Die Kette sollte an allen Berührungspunkten tangential zu den Kettenrädern und an allen anderen Stellen gerade sein . Die Kette sollte so über die Kettenräder geführt werden, dass sich benachbarte Kettensegmente (dh Teile der Kette zwischen zwei Kettenrädern, die sich am selben Kettenrad treffen) nicht schneiden .
.
Während beispielsweise das linke System oben gültig ist, ist das mittlere nicht gültig, da sich die beiden benachbarten Kettensegmente, die über das untere linke Kettenrad verlaufen, kreuzen. Beachten Sie jedoch, daß das richtige System ist gültig, da die beiden sich schneidende Kettensegmente nicht benachbart sind (dieses System durch einen anderen Eingang als die beiden anderen erzeugt wird, wenn.)
Um die Dinge einfach zu halten (r), können Sie annehmen, dass kein Kettenrad die konvexe Hülle der beiden benachbarten Kettenräder oder die konvexen Hüllen der Nachbarn und der anderen Nachbarn schneidet . Mit anderen Worten, das obere Kettenrad in der folgenden Abbildung schneidet möglicherweise keinen der schattierten Bereiche.
Kettensegmente können andere Kettenräder als die überfahrenen kreuzen (wie im letzten Testfall). In diesem Fall sollte die Kette immer vor den Kettenrädern erscheinen.
Visuelle Anforderungen
Die Kette sollte aus einer Reihe von Gliedern unterschiedlicher Breite bestehen. Die Breite des schmalen Glieds sollte ungefähr 2 betragen, und die Breite des breiten Glieds sollte ungefähr 5 betragen. Die Länge beider Gliedertypen sollte ungefähr gleich sein. Die Periodeder Kette, dh die Gesamtlänge eines breiten / schmalen Gliederpaares, sollte der 4π-Zahl am nächsten kommen, die eine ganzzahlige Anzahl von Malen in der Länge der Kette entspricht. Wenn die Länge der Kette beispielsweise 1.000 beträgt, sollte ihre Periode 12,5 betragen. Dies ist die Zahl, die 4π (12.566 ...) am nächsten kommt und eine ganzzahlige Anzahl von Malen (80) von 1.000 ergibt. Es ist wichtig, dass die Periode eine ganzzahlige Anzahl von Malen in die Kettenlänge passt, damit an der Stelle, an der sich die Kette wickelt, keine Artefakte vorhanden sind.
Ein Kettenrad mit Radius R sollte aus drei konzentrischen Teilen bestehen: eine zentrale Achse , die ein Kreis mit dem Radius sollte etwa 3 ist ; der Körper des Kettenrads um die Achse, der einen Radius von etwa R - 4,5 haben sollte; und die Felge des Kettenrads um den Körper, die einen Radius von etwa
R - 1,5 haben sollte. Die Felge sollte auch die Zähne des Kettenrads enthalten , die eine Breite von ungefähr 4 haben sollten; Die Größe und der Abstand der Zähne sollten mit den Größen der Kettenglieder übereinstimmen, damit sie gut ineinander greifen.
Die Periode der Zähne des Kettenrads, dh der Abstand zwischen zwei aufeinanderfolgenden Zähnen entlang des Umfangs des Kettenrads, sollte mit der Periode der Kette übereinstimmen. Da die Periode ungefähr 4 & pgr; beträgt und der Radius des Kettenrads garantiert gleichmäßig ist, sollte die Periode fast ganzzahlig in den Umfang des Kettenrads passen, damit an der Stelle, an der keine Artefakte auftreten, keine erkennbaren Artefakte auftreten Die Zähne des Kettenrads winden sich.
Sie können eine beliebige Kombination von Farben für die Kette, die verschiedenen Teile des Kettenrads und den Hintergrund verwenden, sofern diese leicht zu unterscheiden sind . Der Hintergrund kann transparent sein. Die Beispiele in diesem Beitrag gelten #202020
für die Kette, #868481
für die Achse und die Felge #646361
des Kettenrads und für den Körper des Kettenrads.
Animationsanforderungen
Das erste Kettenrad in der Eingabeliste sollte sich im Uhrzeigersinn drehen . Die übrigen Kettenräder sollten sich entsprechend drehen. Die Kette sollte sich mit einer Geschwindigkeit von ungefähr 16π (ungefähr 50) Einheiten pro Sekunde bewegen . Die Framerate liegt bei Ihnen, aber die Animation sollte glatt genug aussehen.
Die Animation sollte sich nahtlos wiederholen .
Konformität
Einige der visuellen Attribute und Proportionen werden absichtlich nur grob angegeben - Sie müssen nicht genau mit ihnen übereinstimmen . Die Ausgabe Ihres Programms muss keine Pixel-zu-Pixel-Kopie der hier angegebenen Beispiele sein, sie sollte jedoch ähnlich aussehen. Insbesondere sind die genauen Proportionen der Kette und der Kettenräder sowie die genaue Form der Kettenglieder und der Kettenradzähne flexibel.
Die wichtigsten Punkte, die zu beachten sind, sind folgende:
- Die Kette muss in der richtigen Reihenfolge über die Kettenräder geführt werden.
- Die Kette sollte an allen Berührungspunkten tangential zu den Kettenrädern sein.
- Die Glieder der Kette und die Zähne der Kettenräder sollten sauber ineinandergreifen, zumindest bis zum richtigen Abstand und der richtigen Phase.
- Der Abstand zwischen den Gliedern der Kette und den Zähnen der Kettenräder sollte so sein, dass an der Stelle, an der sie sich wickeln, keine erkennbaren Artefakte auftreten.
- Die Kettenräder sollten sich in die richtige Richtung drehen.
- Die Animation sollte sich nahtlos wiederholen.
Letztendlich ist es das Ziel dieser Herausforderung, technisch gesehen den kürzesten Code zu schreiben. Wenn Sie jedoch kreativ werden und eine aufwändigere Ausgabe erzielen möchten, sollten Sie sich auf jeden Fall dafür entscheiden!
Herausforderung
Schreiben Sie ein Programm oder eine Funktion , erstellen Sie eine Liste der Kettenräder und erstellen Sie eine entsprechende Animation des Kettenantriebssystems, wie oben beschrieben.
Ein- und Ausgang
Sie können die Eingabe über die Befehlszeile , über STDIN , als Funktionsargumente oder mit einer äquivalenten Methode vornehmen . Sie können jedes geeignete Format für die Eingabe verwenden, müssen es jedoch in Ihrem Beitrag angeben.
Als Ausgabe können Sie die Animation direkt anzeigen , eine Animationsdatei (z. B. ein animiertes GIF) oder eine Folge von Frame-Dateien erstellen (in diesem Fall ist jedoch ein kleiner Nachteil zu erwarten; siehe unten). Wenn Sie die Dateiausgabe verwenden, Stellen Sie sicher, dass die Anzahl der Frames angemessen ist (in den Beispielen in diesem Beitrag werden nur sehr wenige Frames verwendet;). Die Anzahl der Frames muss nicht minimal sein, Sie sollten jedoch nicht zu viele überflüssige Frames erstellen. Wenn Sie eine Folge von Frames ausgeben , müssen Sie die Framerate in Ihrem Beitrag angeben .
Ergebnis
Das ist Code-Golf . Die kürzeste Antwort in Bytes gewinnt.
+ 10% Strafe Wenn Ihr Programm eine Folge von Bildern als Ausgabe erstellt, anstatt die Animation direkt anzuzeigen oder eine einzelne Animationsdatei zu erstellen, erhöhen Sie Ihre Punktzahl um 10%.
Testfälle
Test 1
(0, 0, 26), (120, 0, 26)
Test 2
(100, 100, 60), (220, 100, 14)
Test 3
(100, 100, 16), (100, 0, 24), (0, 100, 24), (0, 0, 16)
Test 4
(0, 0, 60), (44, 140, 16), (-204, 140, 16), (-160, 0, 60), (-112, 188, 12),
(-190, 300, 30), (30, 300, 30), (-48, 188, 12)
Test 5
(0, 128, 14), (46.17, 63.55, 10), (121.74, 39.55, 14), (74.71, -24.28, 10),
(75.24, -103.55, 14), (0, -78.56, 10), (-75.24, -103.55, 14), (-74.71, -24.28, 10),
(-121.74, 39.55, 14), (-46.17, 63.55, 10)
Test 6
(367, 151, 12), (210, 75, 36), (57, 286, 38), (14, 181, 32), (91, 124, 18),
(298, 366, 38), (141, 3, 52), (80, 179, 26), (313, 32, 26), (146, 280, 10),
(126, 253, 8), (220, 184, 24), (135, 332, 8), (365, 296, 50), (248, 217, 8),
(218, 392, 30)
Antworten:
JavaScript (ES6),
2557191518971681 ByteDas ist wirklich kein Super-Duper- Golf ; Es wird teilweise von Hand verkleinert, aber das ist nichts Besonderes. Es könnte zweifellos kürzer sein, wenn ich vor dem Minimieren mehr Golf gespielt hätte, aber ich habe (mehr als) genug Zeit darauf verwendet.
Bearbeiten: Ok, also habe ich mehr Zeit darauf verwendet und den Code mehr golfen, bevor ich ihn minimierte (diesmal sehr manuell). Der Code verwendet immer noch den gleichen Ansatz und die gleiche Gesamtstruktur, aber trotzdem habe ich 642 Bytes gespart. Nicht zu schäbig, wenn ich es selbst sage. Vermutlich habe ich einige Möglichkeiten zum Speichern von Bytes verpasst, aber zu diesem Zeitpunkt bin ich mir nicht sicher, wie das funktioniert. Das einzige, was sich in Bezug auf die Ausgabe unterscheidet, ist, dass jetzt leicht unterschiedliche Farben verwendet werden, die knapper geschrieben werden könnten.
Edit 2 (viel später): 18 Bytes gespeichert. Vielen Dank an ConorO'Brien in den Kommentaren für den Hinweis auf die verblüffend offensichtliche Tatsache, die ich völlig verpasst hatte.
Bearbeiten 3: Also dachte ich, ich würde meinen eigenen Code zurückentwickeln, weil ich mich ehrlich gesagt nicht erinnern konnte, wie ich es gemacht hatte, und ich verlor die ungolften Versionen. Also ging ich durch und siehe da, ich fand weitere 316 Bytes, die ich durch Umstrukturierung und ein bisschen Mikrogolf sparen konnte.
Mit der obigen Funktion wird ein SVG-Element (einschließlich Animationen) an das Dokument angehängt. ZB um den 2. Testfall anzuzeigen:
Scheint ein Vergnügen zu sein - zumindest hier in Chrome.
Probieren Sie es im folgenden Snippet aus (durch Klicken auf die Schaltflächen werden die einzelnen OP-Testfälle gezeichnet).
Code-Snippet anzeigen
Der Code zeichnet die Ketten- und Zahnradzähne als gestrichelte Striche. Anschließend wird
animate
dasstroke-dashoffset
Attribut mithilfe von Elementen animiert . Das resultierende SVG-Element ist in sich geschlossen. Es gibt keine JS-gesteuerten Animationen oder CSS-Stile.Damit sich die Dinge gut aneinanderreihen, wird der Zahnkranz jedes Zahnrads als Pfad gezeichnet, der aus zwei Bögen besteht, sodass der Pfad genau an dem Tangentenpunkt beginnen kann, an dem sich die Kette berührt. Dies macht es viel einfacher, es aufzustellen.
Darüber hinaus scheint es eine Menge Rundungsfehler zu geben, wenn die gestrichelten Striche von SVG verwendet werden. Zumindest habe ich das gesehen; Je länger die Kette, desto schlimmer kämmte sie mit jedem weiteren Gang. Um das Problem zu minimieren, besteht die Kette tatsächlich aus mehreren Pfaden. Jeder Pfad besteht aus einem Bogensegment um einen Gang und einer geraden Linie zum nächsten Gang. Ihre Strich-Offsets werden passend berechnet. Der dünne "innere" Teil der Kette ist jedoch nur ein einziger Schleifenpfad, da er nicht animiert ist.
quelle
R=g=>...
<g>
, sondern es direkt in das SVG-Stammverzeichnis. Es wurde auch ein Ort gefunden, an dem Sie die Sweep-Flagge und die große Bogen-Flagge mit von Boolescher in Zahl verwandelt haben1*x
, aber Sie könnten+x
C # 3566 Bytes
Gar nicht golfen, aberfunktioniert (glaube ich)Ungolfed in der Editiergeschichte.
Verwendet Magick.NET zum Rendern von GIF.
Klasse P hat eine Funktion F; Beispiel:
quelle
public
Modifikator vor jedem Feld in Ihrer Klasse?using
Klauseln enthalten sein oder die Typen, die bei Verwendung vollständig qualifiziert sind, und der Verweis auf System.Drawing sollte beachtet werden in der Antwort (ob es zur Kerbe hinzufügen sollte, weiß ich nicht). Beeindruckende Antwort jedenfalls.JavaScript (ES6) 1626 Byte
Diese Lösung ist das Ergebnis des Reverse Engineerings von @ Flambinos Lösung, ich poste es mit seinem Einverständnis.
Die ungolfed Version:
quelle