Dies ist die ASCII-Version dieser Herausforderung . Der ursprüngliche Beitrag wurde auf Wunsch von Martin Ender getrennt
Einführung
Ähnlich wie die Fibonacci-Sequenz ist die Padovan-Sequenz ( OEIS A000931 ) eine Folge von Zahlen, die durch Hinzufügen vorheriger Terme in der Folge erzeugt wird. Die Anfangswerte sind definiert als:
P(0) = P(1) = P(2) = 1
Das 0., 1. und 2. Glied sind alle 1. Die Wiederholungsbeziehung ist unten angegeben:
P(n) = P(n - 2) + P(n - 3)
Somit ergibt sich folgende Reihenfolge:
1, 1, 1, 2, 2, 3, 4, 5, 7, 9, 12, 16, 21, 28, 37, 49, 65, 86, 114, 151, 200, 265, 351, ...
Wenn Sie diese Zahlen als Seitenlänge von gleichseitigen Dreiecken verwenden, erhalten Sie eine schöne Spirale, wenn Sie sie alle zusammen platzieren, ähnlich wie bei der Fibonacci-Spirale:
Bild mit freundlicher Genehmigung von Wikipedia
Aufgabe
Ihre Aufgabe ist es, ein Programm zu schreiben, das diese Spirale durch ASCII-Kunst nachbildet und dessen Eingabe dem jeweiligen Begriff entspricht. Da ein Dreieck mit der Seitenlänge 1 (1 Zeichen) in ASCII nicht gut darstellbar ist, wurden die Seitenlängen um den Faktor 2 erweitert. Das Dreieck mit der Seitenlänge 1 wird also tatsächlich folgendermaßen dargestellt:
/\
/__\
Wenn also zum Beispiel die Eingabe 5 war (das 5. Glied), sollte die Ausgabe sein:
/\
/ \
/ \
/______\
\ /\
\ /__\
\ /\ /
\/__\/
Die ersten 5 Terme waren 1, 1, 1, 2, 2, so dass das Dreieck aufgrund der Dilatation Seitenlängen von 2, 2, 2, 4, 4 aufwies. Ein weiteres Beispiel für Eingabe 8:
__________
/\ /\
/ \ / \
/ \ / \
/______\ / \
\ /\ / \
\ /__\/ \
\ /\ / \
\/__\/______________\
\ /
\ /
\ /
\ /
\ /
\ /
\ /
\ /
\ /
\/
Regeln
- Sie müssen das Ergebnis drucken und die Eingabe muss eine Ganzzahl sein, die der Termnummer entspricht
- Nachgestellte und führende Zeilen sind zulässig, nachstehende Leerzeichen nach Zeilen sind ebenfalls zulässig
- Ihr Beitrag muss mindestens bis zur 10. Amtszeit bearbeitet werden können (9)
- Ihre Einreichung muss ein vollständiges Programm oder eine vollständige Funktion sein, die Eingaben entgegennimmt und das Ergebnis druckt
- Rotationen der Ausgabe sind in 60-Grad-Vielfachen zulässig, aber die Größe der Dreiecke muss zusammen mit der Darstellung gleich bleiben
- Es ist auch erlaubt, gegen den Uhrzeigersinn zu fahren
- Standardlücken sind verboten
Sie können davon ausgehen, dass die Eingabe> 0 ist und das richtige Eingabeformat angegeben wird.
Wertung
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes. Ein frohes neues Jahr euch allen!
Antworten:
Befunge,
871836798 BytesProbieren Sie es online!
Wie so oft bei Befunge gibt es einen Algorithmus, mit dem wir das Muster von oben nach unten rendern können, da es aufgrund des begrenzten verfügbaren Speicherplatzes einfach nicht möglich ist, es zuerst in den Speicher zu rendern.
Das funktioniert, indem Sie zunächst eine einfache Datenstruktur aufbauen, die die Kanten darstellt, die zum Zeichnen der Spirale erforderlich sind. In der zweiten Stufe wird diese Struktur dann von oben nach unten analysiert, wobei die für jede Ausgabezeile erforderlichen Kantenfragmente gerendert werden.
Mit dieser Technik können wir bis zu n = 15 in der Referenzimplementierung unterstützen, bevor ein Überlaufproblem in den 8-Bit-Speicherzellen auftritt. Interpreter mit einer größeren Zellengröße sollten in der Lage sein, bis zu n = 25 zu unterstützen, bevor der Speicher voll wird.
quelle
go, 768 bytes
Das ist natürlich nicht optimal, aber es ist kein schlechter Start. Ich weiß, dass es für den Golfstandard wahrscheinlich ein bisschen einfach ist, aber es hat Spaß gemacht und ich hoffe, es macht nichts aus, wenn ich ein paar Notizen für das zukünftige Selbst hinterlasse.
Wie es funktioniert
Grundsätzlich simuliere ich eine 'Zeichenschildkröte' wie in LOGO auf einem ASCII-Pixelraster, aber die Schildkröte kann nur diese drei Befehle ausführen:
Nun gehe ich für jedes Dreieck so vor, wobei P 2x die n-te Padovan-Zahl ist:
Das vierte 'fd' bedeutet, dass ich die erste Seite jedes Dreiecks zurückverfolge. Dies hilft, zu einem schönen Ausgangspunkt für das nächste Dreieck zurückzukehren. Die halbe Rechtskurve stellt sicher, dass sich das nächste Dreieck in der richtigen Ausrichtung befindet.
Um die Schildkröte zu golfen, speichere ich 5 Zustandsvariablen in Array 态: x-Position, y-Position, x-Geschwindigkeit, y-Geschwindigkeit und 'Zeichenrune'. Bei jedem Animationsbild ist x + = x Geschwindigkeit, y + = y Geschwindigkeit und die Rune ist gezeichnet.
Dann habe ich den Tisch 表 aufgestellt, an dem steht, wie die Wende tatsächlich ausgeführt wird. Der Turncode ist aufgrund der Funktionsweise von ASCII-Grafiken schwierig. Es ist keine einfache Bewegung wie bei einer Pixelanzeige. Die Richtung der Schildkröte, die durch die x- und y-Geschwindigkeit bestimmt wird, bestimmt die Änderungen, die erforderlich sind, damit die Kurve richtig aussieht.
Zum Wenden werden die aktuellen x- und y-Geschwindigkeiten angezeigt und zu einem Index kombiniert.
Dieser Index wird zum Nachschlagen eines Satzes von 5 Werten in Tabelle look verwendet. Diese 5 Werte in Tabelle 表 werden dann zu jeder der 5 Variablen in Zustand 态 addiert. Die Schildkröte wird dann effektiv gedreht und ist bereit für das nächste 'fd'.
Für die rechte halbe Kurve gibt es einen separaten Abschnitt der 表-Tabelle. Es wird um 7 * 5 oder 35 Einträge aus der ersten Tabelle in 表 versetzt.
Zuletzt habe ich einige einfache Codierungen der Ganzzahlen der Tabelle in eine ASCII-Zeichenfolge vorgenommen.
Ich weiß, ich könnte 'Bytes sparen', indem ich das Hanzi entferne, aber wie gesagt, das ist nicht optimal und es ist mehr Golf möglich ... Ich werde sie entfernen, wenn es keine andere mögliche Optimierung gibt. Diese Hanzi haben tatsächlich eine lose Bedeutung, die auf ihrer tatsächlichen Bedeutung basiert, und obwohl ich kein Chinesisch kann, hilft es mir, über das Programm nachzudenken.
Zum Testen des Codes benötigen Sie eine vollständige Golang-Datei mit diesem Header
und diese Fußzeile
Vielen Dank
quelle