Golftipps in Charcoal


15

Charcoal ist eine Sprache, die ausschließlich von ASCII und DLosc entwickelt wurde und sich auf ASCII-Kunstherausforderungen spezialisiert hat.

Welche Tipps haben Sie zum Golfen in Charcoal? Offensichtlich bin ich auf der Suche nach Tipps, die sich speziell auf Holzkohle beziehen, und nicht auf diejenigen, die für die meisten, wenn nicht alle Sprachen gelten.


Mist, ich werde versuchen, eine Antwort auf etwas zu geben, brb. Vielleicht kann ich kleinere Hinweise zu diesem Thread geben.
Magic Octopus Urn

Antworten:


5

Nutzen Sie den Deverbosifier

Mit dem Deverbosifier können Sie in ASCII schreiben ( --dvoder --deverbosifydeverbosifizieren -voder --verboseals ausführlichen Code ausführen). Darüber hinaus werden Zeichenfolgen für Sie komprimiert, was bei einigen ASCII-art-Herausforderungen hilfreich sein kann, wenn die zu komprimierende Zeichenfolge zu lang ist.

@ Neil empfiehlt die Verwendung von -vloder -v --sl. Dies ist eine Abkürzung für --verbose --showlength, was bedeutet, dass es als ausführliche Kohle interpretiert wird und die Länge des normalen Kohlecodes angezeigt wird. Überprüfen Sie beim Deverbosifizieren auch die Ausgabe, um sicherzustellen, dass die Eingabe tatsächlich korrekt analysiert wurde, da Charcoal Syntaxanalysefehler im Allgemeinen ignoriert. Wenn es ist ein Syntaxfehler, Verwendung -a( --astify) oder --oa( --onlyastify) , um Hilfe das Problem herausfinden .


Darüber hinaus empfehle ich die Verwendung von -v -sl. Überprüfen Sie beim Deverbosifizieren auch die Ausgabe, um sicherzustellen, dass die Eingabe tatsächlich korrekt analysiert wurde, da nicht immer ein Analysefehler auftritt.
Neil

3

Verwenden Sie Überladungen

Beispielsweise benötigen viele Befehle nur ein Argument:

  • Rectangle, Oblongund Boxmachen Sie ein Quadrat, wenn nur ein Argument angegeben wird
  • Reflect Befehle standardmäßig nach rechts spiegeln
  • Rotate Befehle standardmäßig auf 90 Grad gegen den Uhrzeigersinn
  • Polygonund PolygonHollowkann eine multidirektionale und eine Seitenlänge akzeptieren. Dies kann verwendet werden, wenn alle Seiten gleich lang sind.

Ich habe diese Tatsache PolygonHollowzufällig entdeckt. Sie können sogar mehrere Multidirektionale verwenden, diese müssen jedoch vor den normalen Pfeilen stehen (ich weiß nicht, ob diese Einschränkung beabsichtigt ist). Das habe ich in meiner Antwort auf die Herausforderung "Zeichne einen Würfel" verwendet.
Neil

Hmm, die Einschränkung ist ein bisschen beabsichtigt, aber ich denke, ich sollte sie ändern, weil es sowieso nicht schaden würde
ASCII

Ich sehe, dass Sie Polygon so festgelegt haben, dass es Pfeile und Multidirektionale in beliebiger Reihenfolge akzeptiert, danke! Während ich hier bin, hatte ich erwartet ReflectButterfly dls, ReflectButterflynach jeder Richtung zu rufen , aber (wie das Wiki richtig dokumentiert) ruft es tatsächlich auf ReflectOverlap.
Neil

@Neil lol oops, ich werde versuchen, das so schnell wie möglich zu beheben (ich denke, das ist auch ein Zufall, haha)
ASCII

3

Vermeiden Sie aufeinanderfolgende Konstanten des gleichen Typs

Zum Beispiel Plus(Times(i, 2), 1)übersetzt als ⁺×鲦¹, aber Sie können ein Byte speichern, indem Sie die Parameter ändern: Plus(1, Times(i, 2))Übersetzt als ⁺¹×ι²und Plus(Times(2, i), 1)als, wobei ⁺ײι¹beide ein Byte speichern. Plus(1, Times(2, i))Es ⁺¹×²ιwäre sogar noch besser, wenn eine andere numerische Konstante darauf folgen würde.


3

Verwenden Sie die vordefinierten Variablen

Hier ist eine Liste aller Variablen, die verwendet werden können, mit dem kurzen griechischen Buchstaben und dem ausführlichen Buchstaben, der ihn darstellt.

α/a: The uppercase alphabet
β/b: The lowercase alphabet
γ/g: A string of all the ASCII characters from space to ~
δ/d: The fifth input
ε/e: The fourth input
ζ/z: The third input
η/h: The second input
θ/q: The first input
υ/u: An empty array
φ/f: 1000
χ/c: 10
ψ/y: The null character
ω/w: The empty string

Die Variablen, die Eingaben darstellen, sind leer, wenn nicht genügend Eingaben vorhanden sind. Alle anderen hier nicht gezeigten Variablen müssen jedoch vor der Verwendung zugewiesen werden.


Diese sollten jetzt auf TIO behoben sein. Es wäre schön, wenn Sie überprüfen könnten, ob sie funktionieren
ASCII

@ Nur ASCII Kannst du das bestätigen yund fbist andersherum von dem, was ich eingefügt habe? (Ich habe möglicherweise die griechischen Buchstaben falsch gelesen, als ich das ursprünglich schrieb.)
Neil

Ja, sie sind
ASCII

3

Lerne deine Überlegungen und Drehungen

Es gibt viele Variationen der Grundreflexion und -rotation, daher lohnt es sich, die subtilen Unterschiede zu kennen. Schlüssel zu den Tabellen:

  • Befehl: Name des Befehls im ausführlichen Modus.
  • Transformieren: Gibt an, ob Charcoal versuchen soll, die Zeichen umzudrehen oder zu drehen, während sie gespiegelt oder gedreht werden. Zum Beispiel /könnte a \nach einem Drehen oder Umdrehen werden.
  • Original behalten: Gibt an, ob Charcoal das Ergebnis mit der ursprünglichen Leinwand zusammenführen soll.
  • Überlappung: (Gilt nur, wenn "Original beibehalten" auf "Ja" gesetzt ist.) Bestimmt die Position der Reflexions- / Rotationsachse in halben Zeichen vom Rand entfernt. Bei Reflexionen entspricht dies der Anzahl der Zeilen / Spalten, die nicht betroffen sind und in der Mitte des Ergebnisses landen. Bei Rotationen darf die gedrehte Kopie freie Bereiche (aber keine Leerzeichen) im Original überschreiben.

Reflexionen

|         Command         | Transform | Keep Original | Overlap |
|-------------------------|-----------|---------------|---------|
| Reflect                 | No        | No            | n/a     |
| ReflectCopy             | No        | Yes           | 0       |
| ReflectOverlap          | No        | Yes           | 1       |
| ReflectOverlapOverlap   | No        | Yes           | n       |
| ReflectTransform        | Yes       | No            | n/a     |
| ReflectMirror           | Yes       | Yes           | 0       |
| ReflectButterfly        | Yes       | Yes           | 1       |
| ReflectButterflyOverlap | Yes       | Yes           | n       |

Die Reflexionsrichtung ist optional. Standardmäßig wird einmal nach rechts reflektiert. Für diejenigen Reflexionen, die das Original beibehalten, ist eine Mehrfachrichtung zulässig, bei der der Befehl einfach für jede Richtung wiederholt wird. (Dies bedeutet, dass beispielsweise ReflectMirror(:¬)insgesamt vier Kopien erstellt werden.)

Der Cursor wird mit der Reflektion mitbewegt (auch wenn das Original erhalten bleibt).

Drehungen

|         Command         | Transform | Keep Original | Overlap |
|-------------------------|-----------|---------------|---------|
| Rotate                  | No        | No            | n/a     |
| RotateCopy              | No        | Yes           | 0       |
| RotateOverlap           | No        | Yes           | 1       |
| RotateOverlapOverlap    | No        | Yes           | n       |
| RotateTransform         | Yes       | No            | n/a     |
| RotatePrism             | Yes       | Yes           | 0       |
| RotateShutter           | Yes       | Yes           | 1       |
| RotateShutterOverlap    | Yes       | Yes           | n       |

Für diejenigen Rotationen, die das Original behalten, gibt es einen optionalen Rotationsursprung. Die Standardeinstellung ist rechts unten auf der Leinwand. Zulässige Werte sind alle diagonalen Richtungen.

Der Betrag der Drehung (in Schritten von 45 °) ist optional. Die Standardeinstellung ist 2, dh 90 ° gegen den Uhrzeigersinn (gegen den Uhrzeigersinn). Für die Rotationen, bei denen das Original beibehalten wird, gibt es zwei alternative Optionen: Eine mehrstellige Ganzzahl gibt an, dass die Zeichenfläche für jede Ziffer einmal gedreht und die Ergebnisse dann zusammengeführt werden sollen, während eine Ganzzahlliste den Befehl für jede Rotation einfach wiederholt und je nach Art variable Ergebnisse liefert Die Leinwand wechselt dazwischen.


Frage: Was heißt Transformdas?
CalculatorFeline

@CalculatorFeline Gute Frage. Die Fälle, in denen Transform nein ist, sind nur eine zeichenweise Kopie. Zum Beispiel ist eine Standardreflexion von "4> 2" nur die Zeichen in umgekehrter Reihenfolge, dh "2> 4". Dies ist nicht immer wünschenswert, daher versucht Transform, die Zeichen auf die am besten geeignete Weise zu wechseln, sodass die Reflexion von "4> 2" zu "2 <4" wird. Transform ist möglicherweise nicht die beste Beschreibung dafür. Sie können also gerne etwas Besseres vorschlagen.
Neil

Kann mir nichts Besseres vorstellen, also solltest du einfach Transformirgendwo in der Antwort erklären, wie das funktioniert.
CalculatorFeline

@CalculatorFeline Ich habe der Tabelle einen Schlüssel hinzugefügt, für den Fall, dass auch die anderen Spalten nicht klar waren.
Neil

Die Fehler sollten jetzt behoben sein. Vielen Dank, dass Sie sich die Zeit genommen haben, diese Erklärung zu schreiben!
Nur ASCII

2

Verwenden Sie Befehle ohne Befehlszeichen

Ein Ausdruck, der nicht Teil eines Befehls ist, wird gedruckt.
Wenn eine Richtung vorangestellt ist, wird der Ausdruck in der angegebenen Richtung gedruckt.
Zahlen werden als eine Linie mit der angegebenen Länge unter Verwendung eines Zeichens gedruckt, das aus ausgewählt ist \/-|.

Wenn auf eine Richtung kein Ausdruck folgt, wird dies als Verschiebung um ein Leerzeichen in der angegebenen Richtung gewertet.

Hinweis: Dies kann manchmal als Teil des vorherigen Befehls gezählt werden, sodass das Befehlszeichen möglicherweise tatsächlich erforderlich ist. (Danke, Neil , dass du mich daran erinnert hast)


1
Sie müssen jedoch auf Mehrdeutigkeiten achten, da der vorherige Befehl möglicherweise einen optionalen Parameter akzeptiert.
Neil

2

Verwenden Sie Multidirektionale

Einige Befehle können multidirectionals akzeptieren: +X*|-\/<>^KLTVY7¬⌊⌈. Worauf sie sich ausdehnen, ist hier . Im Allgemeinen beginnt die Richtungsliste von oben und wird im Uhrzeigersinn fortgesetzt.


Gibt es einen bestimmten Grund, warum einige Befehle Multidirektionalität akzeptieren, andere jedoch eine Richtungsliste erfordern? (Es könnte einen guten Grund dafür geben, den ich übersehen habe, aber ich habe es versucht ReflectButtterflyOverlap(:¬, Modulo(g, 2));.)
Neil,

@Neil Ich glaube nicht, wird so schnell wie möglich ändern
ASCII

0

Vollen Gebrauchen machen Sum

Sum hat viele nützliche Überladungen:

  • Verketten Sie die Zeichenfolgen in einer Liste miteinander. Wenn es jedoch möglich ist, dass die Liste leer ist, gibt dies None aus. Verwenden Sie in diesem Fall Join(..., "")stattdessen.
  • Nimmt auf einer nicht leeren Liste von Zahlen einfach ihre Summe.
  • Verknüpfen Sie auf einer nicht leeren Liste von Listen diese miteinander (Abflachung auf Tiefe 1).
  • Nimmt für eine Ganzzahl die Summe ihrer Ziffern. (Gleitkommawerte werden auf eine Ganzzahl gekürzt. Wenn Sie die Summe der Dezimalstellen benötigen, müssen Sie zuerst in eine Zeichenfolge umwandeln.)
  • Nimmt für eine Zeichenfolge, die nur Ziffern und optional ein .Zeichen enthält, die Summe der Ziffern.
  • Nimmt für eine Zeichenfolge, die Zahlen und Trennzeichen enthält, die Summe der in int oder float umgesetzten Zahlen (beachtet jedoch, dass dies -als Trennzeichen gilt).

Ein nützlicher Nebeneffekt der letzten beiden Regeln ist, dass, wenn Sie Sumein Zeichen verwenden, die Ziffern 1-9in ihren Wert umgewandelt werden und alles andere im Gegensatz zu Null zurückgegeben wird Cast, was bei Nicht-Ziffern-Werten fehlschlägt.


0

Verwenden Sie split für ein Zeichenfolgenarray, split und cast für ein Zahlenarray

Die Aufteilung für ein Zeichenfolgenarray umfasst nur drei zusätzliche Zeichen, und die Aufteilung und Umwandlung umfasst nur vier zusätzliche Zeichen. Vergleichen Sie dies mit dem wörtlichen Schreiben des Arrays, für das Start und Ende des Arrays sowie ein Trennzeichen zwischen den einzelnen Array-Elementen erforderlich sind .

Wenn Ihr Zahlenarray nur Zahlen unter 95 enthält, verwenden Sie entweder eine Umwandlung (wenn alle Zahlen kleiner als 10 sind) oder einen Index für eine der vordefinierten Variablen.


0

Verwenden Sie Filter, um das erste Zeichen aus einem Array oder einer Zeichenfolge zu trennen

Selbst wenn Sie Glück haben, mit Slicenimmt das erste Zeichen aus einer Zeichenfolge schneiden 2 Bytes: Slice(..., 1). Es dauert länger, wenn der zu schneidende Ausdruck mit einer Zahl endet, für die ein Trennzeichen erforderlich ist, oder wenn der folgende Code als Ausdruck interpretiert werden kann, da er in diesem Fall Sliceals zusätzlicher Parameter verwendet werden soll.

Verwenden Sie stattdessen einfach Filter(..., k), wodurch das erste Element abfällt und das gewünschte Ergebnis erzielt wird. (Verwenden Sie natürlich die entsprechende Schleifenindexvariable, wenn sich Ihr Ausdruck in einer anderen Schleife befindet.) Dies sind immer 2 Byte und können vom umgebenden Code nicht beeinflusst werden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.