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.
Antworten:
Nutzen Sie den Deverbosifier
Mit dem Deverbosifier können Sie in ASCII schreiben (
--dv
oder--deverbosify
deverbosifizieren-v
oder--verbose
als 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
-vl
oder-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 .quelle
-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.Verwenden Sie Überladungen
Beispielsweise benötigen viele Befehle nur ein Argument:
Rectangle
,Oblong
undBox
machen Sie ein Quadrat, wenn nur ein Argument angegeben wirdReflect
Befehle standardmäßig nach rechts spiegelnRotate
Befehle standardmäßig auf 90 Grad gegen den UhrzeigersinnPolygon
undPolygonHollow
kann eine multidirektionale und eine Seitenlänge akzeptieren. Dies kann verwendet werden, wenn alle Seiten gleich lang sind.quelle
PolygonHollow
zufä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.ReflectButterfly dls
,ReflectButterfly
nach jeder Richtung zu rufen , aber (wie das Wiki richtig dokumentiert) ruft es tatsächlich aufReflectOverlap
.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⁺¹×ι²
undPlus(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.quelle
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.
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.
quelle
y
undf
bist andersherum von dem, was ich eingefügt habe? (Ich habe möglicherweise die griechischen Buchstaben falsch gelesen, als ich das ursprünglich schrieb.)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:
/
könnte a\
nach einem Drehen oder Umdrehen werden.Reflexionen
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
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.
quelle
Transform
das?Transform
irgendwo in der Antwort erklären, wie das funktioniert.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)
quelle
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.quelle
ReflectButtterflyOverlap(:¬, Modulo(g, 2));
.)Vollen Gebrauchen machen
Sum
Sum
hat viele nützliche Überladungen:Join(..., "")
stattdessen..
Zeichen enthält, die Summe der Ziffern.-
als Trennzeichen gilt).Ein nützlicher Nebeneffekt der letzten beiden Regeln ist, dass, wenn Sie
Sum
ein Zeichen verwenden, die Ziffern1-9
in ihren Wert umgewandelt werden und alles andere im Gegensatz zu Null zurückgegeben wirdCast
, was bei Nicht-Ziffern-Werten fehlschlägt.quelle
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.
quelle
Verwenden Sie Filter, um das erste Zeichen aus einem Array oder einer Zeichenfolge zu trennen
Selbst wenn Sie Glück haben, mit
Slice
nimmt 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 FallSlice
als 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.quelle