チャコールでのゴルフのヒント


15

木炭は、ASCIIアートの課題に特化したASCII専用およびDLoscによって作成された言語です。

チャコールでゴルフをするためのヒントはありますか?明らかに、すべてではないにしてもほとんどの言語に適用できるものではなく、特に炭に関連するヒントを探しています。


それを台無しに、私は何かに炭の答えをしようとするつもりです、brb。たぶん、このスレッドに小さなポインタを与えることができます。
魔法のタコUr

回答:


5

デバーボファイザーを活用する

deverbosifierを使用することは、ASCIIで記述できることを意味します(--dvまたは--deverbosify、verbosifyする、-vまたは--verbose冗長コードとして実行する)。さらに、それはあなたのために文字列を圧縮します。これは、圧縮する文字列が長すぎるときに、いくつかのASCIIアートの挑戦で役に立つかもしれません。

@Neil-vlまたはを使用することをお勧めし-v --slます。これはの短縮形で--verbose --showlength、詳細な木炭として解釈され、通常の木炭コードの長さが表示されます。また、Charcoalは通常解析エラーを無視するため、デバーボス化するときは、出力をチェックして、入力が実際に正しく解析されていることを確認してください。構文エラーある場合-a--astify)または--oa--onlyastify)を使用して問題を特定します。


さらに、を使用することをお勧めし-v -slます。また、デバーボス化するときは、常に解析エラーが発生するわけではないため、出力をチェックして、入力が実際に正しく解析されたことを確認してください。
ニール

3

オーバーロードを使用する

たとえば、多くのコマンドに必要な引数は1つだけです。

  • RectangleOblongおよびBox引数が1つだけ指定されている場合は正方形を作成します
  • Reflect コマンドはデフォルトで右を反映します
  • Rotate コマンドのデフォルトは反時計回りに90度
  • PolygonそしてPolygonHollow多方向と辺の長さを受け入れることができます。これは、すべての辺の長さが同じ場合に使用できます。

その事実PolygonHollowを偶然発見しました。複数の方向を持つこともできますが、通常の矢印の前に来る必要があります(この制限が意図的なものかどうかはわかりません)。「キューブを描く」チャレンジへの回答でそれを使用しました。
ニール

うーん制限がちょっと意図的なものですが、私はそれがとにかく損はないので、私はそれを変更する必要がありますね
ASCIIのみ

矢印と多方向を任意の順序で受け入れるようにPolygonを修正したようです、ありがとう!私がここにいる間、私はそれぞれの方向ReflectButterfly dlsに電話ReflectButterflyすることを期待していましたが、(wikiが正しく文書化するように)実際に電話しますReflectOverlap
ニール

おっと笑@Neil、私はできるだけ早くそれを修正しようとするでしょう(私はそれが笑あまりにも偶然だと思う)
ASCIIのみ

3

同じタイプの連続した定数を避ける

例えば、Plus(Times(i, 2), 1)として変換さ⁺×鲦¹れていますが、パラメータを切り替えてバイトを保存することができますPlus(1, Times(i, 2))ように変換⁺¹×ι²し、Plus(Times(2, i), 1)として⁺ײι¹バイトを保存し、どちらも。Plus(1, Times(2, i))(と解釈される⁺¹×²ι)は、その後に別の数値定数があればさらに良いでしょう。


3

事前定義された変数を使用する

使用できるすべての変数のリストを以下に示します。簡潔なギリシャ文字とそれを表す冗長文字を示します。

α/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

入力が十分でない場合、入力を表す変数は空になりますが、ここに示されていない他のすべての変数は、使用する前に割り当てる必要があります。


これらは、あなたはそれが動作することを確認することができれば、それはいいだろう、今TIO上に固定されなければならない
ASCIIのみ

ASCIIのみ@あなたがいることを確認することができyそしてf私が貼り付けられてきたものから、他の方法で回避していますか?(最初にこれを書いたときにギリシャ文字を読み違えたかもしれません。)
ニール

うん、彼らは他の方法で回避している
ASCIIのみの

3

反射と回転を学ぶ

基本的な反射と回転には多くのバリエーションがありますので、微妙な違いが何であるかを知ることは有益です。テーブルのキー:

  • コマンド:詳細モードのコマンドの名前。
  • 変形:Charcoalがキャラクターをミラーリングまたは回転させるときに、キャラクターを反転または回転させようとするかどうか。たとえば、a /\回転または反転後になります。
  • オリジナルを保持:Charcoalが結果を元のキャンバスにマージするかどうか。
  • オーバーラップ:(オリジナルを保持がはいの場合にのみ適用されます。)反射/回転の軸の位置を境界から半角で決定します。反射の場合、影響を受けず、結果の途中で終わる行/列の数に相当します。ローテーションの場合、ローテーションされたコピーは元のクリア領域(スペースではない)を上書きできます。

反射

|         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       |

反射の方向はオプションです。デフォルトでは、右側に1回反映されます。オリジナルを維持する反射については、複数の方向が許可されます。これにより、各方向でコマンドが繰り返されます。(たとえば、ReflectMirror(:¬)実際には合計で4つのコピーが作成されることを意味します。)

カーソルは反射とともに移動します(オリジナルが保持されている場合でも)。

回転

|         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       |

オリジナルを保持する回転については、オプションの回転の原点があります。デフォルトは、キャンバスの右下です。許容値は、斜め方向のいずれかです。

回転量(45°刻み)はオプションです。デフォルトは2、つまり反時計回りに90°(反時計回り)です。オリジナルを維持する回転には、2つの代替オプションがあります。複数桁の整数は、各桁ごとにキャンバスを1回回転してから結果をマージすることを指定します。キャンバスはその間に変わります。


質問:どういうTransform意味ですか?
電卓

@CalculatorFeline良い質問です。Transformがnoの場合は、単に文字ごとのコピーです。たとえば、「4> 2」の標準的な反映は、逆順の文字、つまり「2> 4」だけです。これは常に望ましいとは限らないため、Transformは最も適切な方法で文字を切り替えようとするため、「4> 2」の反映は「2 <4」になります。変換はこれを最も適切に説明するものではない可能性がありますので、お気軽にもっと良いものを提案してください。
ニール

これ以上良いものは考えられないのでTransform、答えのどこかでどのように機能するかを説明する必要があります。
電卓

@CalculatorFeline他の列もクリアされない場合に備えて、テーブルにキーを追加しました。
ニール

バグは今修正する必要があります。また、この説明を書くのに時間を割いてくれてありがとう!
ASCIIのみ

2

コマンド文字なしでコマンドを使用する

コマンドの一部ではない式が出力されます。
方向の前にある場合、式は指定された方向に出力されます。
番号は、から選択された文字を使用して、指定された長さの行として印刷され\/-|ます。

方向の後に式が続かない場合は、指定された方向に1スペース移動するとカウントされます。

注:これは前のコマンドの一部としてカウントされる場合があるため、コマンド文字が実際に必要になる場合があります。(私に思い出させてくれたニールに感謝)


1
ただし、前のコマンドがオプションのパラメーターを受け入れる場合があるため、あいまいさに注意する必要があります。
ニール

2

多方向を使用する

一部のコマンドは多方向を受け入れることができます+X*|-\/<>^KLTVY7¬⌊⌈。彼らが拡張したものはここにあります。一般に、方向リストは上から始まり、時計回りに続きます。


一部のコマンドが多方向を受け入れ、他のコマンドが方向リストを必要とする特定の理由は何ですか?(これには、私が見落としている正当な理由があるかもしれませんが、やろうとしていましたReflectButtterflyOverlap(:¬, Modulo(g, 2));。)
ニール

私はそうは思わない@Neil、できるだけ早く変更されます
ASCIIのみ

0

を最大限に活用する Sum

Sum 便利なオーバーロードがたくさんあります:

  • 文字列のリストで、それらを連結します。ただし、リストが空である可能性がある場合、これによりNoneが得られるため、この場合はJoin(..., "")代わりに使用します。
  • 数字の空でないリストでは、単に合計を取ります。
  • 空でないリストのリストでは、それらを連結します(深さ1に平坦化します)。
  • 整数では、数字の合計を取ります。(浮動小数点値は整数に切り捨てられます。小数点以下の桁の合計が必要な場合は、最初に文字列にキャストしてください。)
  • 数字とオプションで1 .文字のみを含む文字列では、数字の合計を取ります。
  • 数字とセパレーターを含む文字列では、整数または浮動小数点数にキャストされた数字の合計を取ります(ただし-、セパレーターとしてカウントされることに注意してください)。

最後の2つのルールの便利な副作用は、Sum文字に使用すると、数字1-9がその値にキャストされ、数字以外の値Castに対して失敗するのとは異なり、他のすべてがゼロを返すことです。


0

文字列配列にはsplitを使用し、数値配列にはsplitおよびcastを使用します

文字列配列の分割は3文字のオーバーヘッドであり、分割とキャストは4文字のオーバーヘッドです。これを、配列の開始と終了、およびすべての配列要素間の区切り文字を必要とする配列を文字どおりに書き込むことと比較してください。

数値配列に95未満の数値しかない場合は、キャスト(すべての数値が10未満の場合)を使用するか、事前定義された変数のいずれかにインデックスを付けます。


0

Filterを使用して、配列または文字列から最初の文字をスライスします

運がよければ Slice、文字列から最初の文字をスライスするためするには2バイトかかりますSlice(..., 1)。スライスする式が数字で終わる場合、セパレータが必要な場合、または次のコードを式として解釈できる場合Sliceは、その場合、追加のパラメータとして使用するため、時間がかかります。

代わりに、を使用するだけでFilter(..., k)、最初の要素が削除され、目的の結果が得られます。(式が別のループ内にネストされている場合、明らかに適切なループインデックス変数を使用します。)これは常に2バイトであり、周囲のコードの影響を受けません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.