차콜에서의 골프 팁


15

은 ASCII 예술 과제를 전문으로하는 ASCII 전용 및 DLosc로 작성된 언어입니다.

차콜 골프에 대한 팁이 있습니까? 분명히 나는 ​​모든 언어가 아닌 대부분의 언어에 적용될 수있는 것이 아닌 숯과 관련된 팁을 찾고 있습니다.


망쳐, 내가 뭔가에 숯불 답변을 시도하려고합니다, brb. 이 스레드에 약간의 포인터를 줄 수 있습니다.
Magic Octopus Urn

답변:


5

디버 보시 파이어 활용

디버 보시 파이어를 사용한다는 것은 ASCII로 작성 ( --dv또는 --deverbosify디버 보 시즈 -v또는 --verbose자세한 코드로 실행) 할 수 있음을 의미합니다 . 또한 문자열을 압축하므로 압축 할 문자열이 너무 길면 일부 ASCII 기술 문제에 유용 할 수 있습니다.

@Neil-vl또는을 사용하는 것이 좋습니다 -v --sl. --verbose --showlength이의 줄임말은 장황한 숯으로 해석되고 일반 숯 코드의 길이가 표시됨을 의미합니다. 또한, 디버 보시 징 (deverbosifying)시, Charcoal은 일반적으로 구문 분석 오류를 무시하므로 출력이 입력이 실제로 올바르게 구문 분석되었는지 확인하십시오. 구문 오류 있으면 -a( --astify) 또는 --oa( --onlyastify)를 사용 하여 문제를 파악하십시오.


이 외에도을 사용하는 것이 좋습니다 -v -sl. 또한 디버 보 사이징 할 때 항상 구문 분석 오류가 발생하지 않으므로 출력을 확인하여 입력이 실제로 올바르게 구문 분석되었는지 확인하십시오.
Neil

3

과부하 사용

예를 들어, 많은 명령에는 하나의 인수 만 필요합니다.

  • Rectangle, Oblong그리고 Box단 하나의 인수가 주어지면 사각형을
  • Reflect 명령은 기본적으로 오른쪽 반영
  • Rotate 명령의 기본값은 시계 반대 방향으로 90 도입니다.
  • PolygonPolygonHollow다 방향과 측면의 길이를 수용 할 수 있습니다. 모든 변의 길이가 같은 경우 사용할 수 있습니다.

PolygonHollow우연히 그 사실을 발견했습니다 . 여러 방향을 가질 수도 있지만 정상적인 화살표 앞에 와야합니다 (이 제한이 의도적인지 여부는 모르겠습니다). "Draw a cube"챌린지에 대한 답변으로 사용했습니다.
Neil

흠 제한은 의도적 인 것이지만 어쨌든 아프지 않기 때문에 변경해야한다고 생각합니다.
ASCII 전용

화살표와 다 방향을 순서대로 받아들이도록 다각형을 고쳤습니다. 감사합니다! 내가 여기있는 동안, 나는 각 방향 ReflectButterfly dls을 요구할 ReflectButterfly것이지만 (위키가 올바르게 문서로) 실제로 호출합니다 ReflectOverlap.
Neil

@ Neil lol oops, 나는 최대한 빨리 그 문제를 고치려고 노력할 것입니다 (저도 우연의 일치라고 생각합니다)
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 만 해당를 확인할 수 있습니다 yf다른 방법은 내가 붙여 넣은 것과 주위에? (원본을 썼을 때 그리스 문자를 잘못 읽었을 수도 있습니다.)
Neil

그래, 그들은 다른 길입니다
ASCII 전용

3

당신의 반사와 회전을 배우십시오

기본 반사 및 회전에는 많은 변형이 있으므로 미묘한 차이점이 무엇인지 알아야합니다. 테이블 키 :

  • 명령 : 상세 모드의 명령 이름입니다.
  • 변형 : 숯이 캐릭터를 대칭 시키거나 회전시킬 때 캐릭터를 뒤집거나 회전시켜야하는지 여부. 예를 들어, 회전 또는 뒤집기 후에 /가 될 수 있습니다 \.
  • 원본 유지 : 숯이 결과를 원본 캔버스와 병합해야하는지 여부입니다.
  • 겹침 : (원본 유지가 예인 경우에만 적용됩니다.) 반사 / 회전 축의 위치를 ​​테두리에서 반자 단위로 결정합니다. 리플렉션의 경우 영향을받지 않고 결과 중간에있는 행 / 열 수와 같습니다. 회전하는 경우 회전 된 사본은 원본의 공백이 아닌 영역을 덮어 쓸 수 있습니다.

반사

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

반사 방향은 선택 사항입니다. 기본값은 오른쪽으로 한 번만 반영하는 것입니다. 원본을 유지하는 반사의 경우 여러 방향이 허용되며 각 방향에 대한 명령을 반복합니다. 예를 들어 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 °입니다. 원본을 유지하는 회전의 경우 두 가지 대체 옵션이 있습니다. 여러 자릿수 정수는 각 자릿수에 대해 캔버스를 한 번 회전 한 다음 결과를 병합하도록 지정하는 반면 정수 목록은 각 회전에 대한 명령을 반복하고 방법에 따라 다양한 결과를 표시합니다 캔버스가 사이에서 바뀝니다.


질문 : 무엇을 Transform의미합니까?
CalculatorFeline

@CalculatorFeline 좋은 질문입니다. 변환이없는 경우는 단순히 문자 별 사본입니다. 예를 들어, "4> 2"의 표준 반영은 역순으로 문자, 즉 "2> 4"입니다. 이것이 항상 바람직한 것은 아니므로 Transform은 문자를 가장 적절한 방식으로 전환하려고 시도하므로 "4> 2"가 "2 <4"가됩니다. 변환은 이것에 대한 가장 좋은 설명이 아닐 수 있으므로 더 나은 것을 제안하십시오.
Neil

더 나은 것을 생각할 수 없으므로 Transform어딘가에서 답이 어떻게 작동 하는지 설명해야합니다 .
CalculatorFeline

@CalculatorFeline 다른 열도 명확하지 않은 경우를 대비하여 테이블에 키를 추가했습니다.
Neil

버그가 수정되었습니다. 또한이 설명을 적어 주셔서 감사합니다!
ASCII 전용

2

명령 문자없이 명령 사용

명령의 일부가 아닌 표현식이 인쇄됩니다.
앞에 방향이 있으면 지정된 방향으로 표현식이 인쇄됩니다.
에서 선택한 문자를 사용하여 숫자가 지정된 길이의 줄로 인쇄됩니다 \/-|.

방향 뒤에 표현식이 없으면 지정된 방향으로 한 칸 이동 한 것으로 계산됩니다.

참고 : 때로는 이전 명령의 일부로 계산되어 명령 문자가 실제로 필요할 수 있습니다. ( 에게 상기시켜 줘서 고마워 )


1
이전 명령이 선택적 매개 변수를 승인 할 수 있기 때문에 모호성을주의해야합니다.
Neil

2

다 방향 사용

일부 명령은 다 방향을 허용 할 수 있습니다 +X*|-\/<>^KLTVY7¬⌊⌈.. 그들이 확장 한 것은 여기에 있습니다 . 일반적으로 방향 목록은 위로 시작하여 시계 방향으로 계속됩니다.


일부 명령이 다 방향을 허용하지만 다른 명령에 방향 목록이 필요한 특별한 이유는 무엇입니까? (이것에는 내가 간과하고 있지만 그럴만한 이유가있을 수 있습니다 ReflectButtterflyOverlap(:¬, Modulo(g, 2));.)
Neil

@Neil 그렇게 생각하지 않습니다. 최대한 빨리 변경됩니다
ASCII 전용

0

최대한 활용 Sum

Sum 편리한 과부하가 많이 있습니다.

  • 문자열 목록에서 함께 연결합니다. 그러나 목록이 비어있을 수 있으면 None을 제공하므로이 경우 Join(..., "")대신 사용하십시오.
  • 비어 있지 않은 숫자 목록에서는 단순히 합계를 가져옵니다.
  • 비어 있지 않은리스트의리스트에서, 그것들을 함께 연결합니다 (깊이 1로 평탄화).
  • 정수에서는 자릿수의 합을 취합니다. 부동 소수점 값은 정수로 잘립니다. 소수점 이하 자릿수의 합계를 원하면 먼저 문자열로 캐스트하십시오.
  • 숫자 만 포함하고 선택적으로 하나의 .문자를 포함하는 문자열에서는 숫자 의 합계를 가져옵니다.
  • 숫자와 구분 기호가 포함 된 문자열에서 int 또는 float로 캐스트 된 숫자의 합계를 취합니다 (그러나 -구분 기호로 간주 됨).

마지막 두 규칙의 편리한 부작용 Sum은 문자에 사용 하면 숫자 1-9가 해당 값으로 변환되고 다른 모든 숫자 는 0과 달리 Cast숫자가 아닌 값에 실패한다는 것입니다.


0

문자열 배열에 split을 사용하고 숫자 배열에 split 및 cast

문자열 배열의 분할은 오버 헤드가 3 자이며 분할 및 캐스트는 오버 헤드가 4 자입니다. 이것을 문자 그대로 배열을 작성하는 것과 비교하십시오. 배열 시작과 끝 모든 배열 요소 사이의 구분 기호 가 필요합니다 .

숫자 배열에 95보다 작은 숫자 만있는 경우 캐스트 (모든 숫자가 10보다 작은 경우)를 사용하거나 사전 정의 된 변수 중 하나로 색인하십시오.


0

필터를 사용하여 배열 또는 문자열에서 첫 번째 문자를 슬라이스

운이 좋더라도 Slice문자열에서 첫 번째 문자를 슬라이스하는 데 2 ​​바이트가 걸립니다 Slice(..., 1). 슬라이스 될 표현식이 숫자로 끝나고 분리자가 필요한 경우 또는 다음 코드를 표현식으로 해석 할 수있는 경우 Slice추가 매개 변수로 소비하려는 경우 시간이 더 걸립니다 .

대신 Filter(..., k)첫 번째 요소를 삭제하여 원하는 결과를 얻는을 사용하십시오. 식이 다른 루프 안에 중첩되어 있으면 적절한 루프 인덱스 변수를 사용해야합니다. 이것은 항상 2 바이트이며 주변 코드의 영향을받을 수 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.