공백에서의 골프 팁


14

Whitespace에서 골프를 할 때 어떤 일반적인 팁이 있습니까? 코드 골프 문제에 적용 할 수 있고 공백과 관련이있는 아이디어를 찾고 있습니다 (예 : "댓글 제거"는 답이 아닙니다).

답변 당 하나의 팁을 게시하십시오.


82
불필요한 공백을 제거하십시오.
KSFT

1
s / [^ [: space :]] // g
Digital Trauma

답변:


11

나는 이것이 농담 질문인지 아닌지 완전히 확신하지 못하기 때문에 진지하게 받아들이려고 조롱하지 않기를 바랍니다.

팁 1 : 프로그램을 끝내지 마십시오

스펙은 프로그램이 세 개의 줄 바꿈으로 끝나야하는데 [LF][LF][LF], 첫 번째는 흐름 제어 IMP이고 다음 두 가지는 quit 명령이지만 많은 인터프리터는 적절한 종료없이 코드를 실행합니다. 모든 프로그램에서 3자를 저장합니다.


6

팁 2 : 힙을 가능한 적게 사용하십시오

루프를 계산할 때 힙을 많이 사용했지만 실제로는 매우 비효율적이라는 것을 깨달았습니다. 먼저 주소 푸시, 현재 카운트 가져 오기, 가져 오기 / 추가, 주소 다시 푸시 등

이제 스택의 값을 밀어 루프 카운터로 작동 한 다음 [Space][LF][Tab]swap 명령을 사용하여 필요할 때 다시 가져옵니다. 작업 / 주변에 많은 작업이 필요하지만 얻을 때 실제로 문자 수를 줄일 수 있습니다.


5

임의 힙 주소 사용

많은 인터프리터를 사용하면 0 또는 1에서 시작하여 카운트 업하는 대신 임의의 힙 주소를 읽고 쓸 수 있습니다. 기존 스택 값 (3 바이트)을 복제하여 새 값 (최소 4 바이트)을 푸시하는 대신 주소로 사용할 수 있습니다.


+1. 음이 아닌 힙 주소에만 적용됩니다. 따라서 스택의 상단이 음의 정수이면 힙 주소로 사용할 수 없습니다.
케빈 크루이 센

5

빈 시퀀스는 유효한 레이블입니다

[LF][Space][Space][LF](흐름 제어-레이블이 ''인 마크)는 점프 또는 서브 루틴 호출에 유효한 대상인 빈 레이블을 작성합니다. 이렇게하면 레이블을 선언 할 때 바이트와 레이블이 호출 될 때마다 바이트가 저장됩니다.

( 진실을 구현하기위한 공백 답변에서 관찰 됨 )


5

루프에서 인쇄하기 전에 모든 문자를 고정 된 양만큼 낮추고 바로 추가하십시오

Hello World 챌린지에 대한 그의 답변에 비슷한 접근 방식을 사용하는 @LukStorms 에게 감사의 말 을 전합니다 .

( STN각각 스페이스, 탭 및 줄 바꾸기에 사용됩니다.)

문자의 값을 푸시하는 것은 항상 11 바이트입니다 (즉, 문자 'A'의 경우 값 65를 SSSTSSSSSTN누르는 것 ; 문자 'z'의 경우 값 122를 누르는 것임 SSSTTTTSTSN). 많은 양의 텍스트를 출력하려면 비용이 많이들 수 있습니다. 대신, 인쇄하려는 모든 문자의 값을 일정량만큼 낮게 한 다음 루프에서 인쇄하여 고정 된 양을 추가 할 수 있습니다.

이것은 다음 코드로 수행 할 수 있습니다 (이 경우 고정 값이 100이라고 가정하십시오).

  1. 문자의 모든 값 (고정 금액 100을 뺀 값)을 역순으로 밉니다.
  2. NSSN (Label_0 생성, 기본적으로 루프 시작)
    1. SSSTTSSTSSN (고 정량 100을 누릅니다)
    2. TSSS 스택의 상위 2 개 값을 함께 추가하십시오.
    3. TNSS (지금 올바른 값을 문자로 표시하고 인쇄하십시오)
    4. NSNN (Label_0으로 이동; 루프의 다음 반복으로 이동)

이것은 스택에 더 이상 아무것도 하지 않고 Add ( )를 시도하자마자 오류 ( 메타에 따라 허용됨 )로 프로그램을 중지합니다 TSSS. 나는 이것을 사용하여 내 대답을 골프화했습니다 ( 바이트 수를 낮추기 위해했던 것들 5 및 6 참조 ).

고 정량 100이 가장 짧은 방법인지 여부는 인쇄 대상에 따라 다릅니다. 예를 들어 @LukStorm 은 Hello World 답변에 107을 사용했습니다.

in SNS같은 같은 두 개의 인접한 문자에 대한 상위 값 ( )을 복사 하거나 다른 위치에서 값을 복사 하여 더 많은 바이트를 골프에 사용할 수 있습니다.lHello


4

정의되지 않은 레이블로 이동하면 프로그램이 종료됩니다 (일부 통역사에서)

이것은 구현 고유의 행동을 시작하지만 이것이 허용 된다고 생각 합니다 .

존재하지 않는 레이블로 이동하려고하면 TIO (및 다른 인터프리터는 적어도 IDE에서 작동하지 않음)가 실행을 중지합니다. 루프에서 벗어나기 위해 비교를 수행해야하는 경우 나누기 레이블을 선언하지 않고 바이트를 절약 할 수 있습니다. ( 예를 들어 보이지 않는 텍스트 인쇄에 대한 내 의견을 참조하십시오 .)


4

값 0은 이진수가없는 숫자로 선언 될 수 있습니다.

공백 자습서에서는 숫자가 임의의 수의 비트 / 이진수 일 수 있다고 언급합니다. (필요한 부호 비트 이후)없이 비트 수의 값이 0 인 올바른 표현이 수단 [Space][Space][Space][LF][Space][Space][Space][Space][LF]모두 스택에 값 0을 누르면 그러나 전자는 한 바이트 짧다.


0

이전 정수를 복사하면 새 정수를 만드는 것보다 짧을 수 있습니다

( STN각각 스페이스, 탭 및 줄 바꾸기에 사용됩니다.)

STS+ 숫자 인수를 사용 하여 스택 n 번째 항목 (인수가 제공 한)을 스택의 맨 위에 복사 할 수 있습니다 . 경우에 따라 바이트를 저장하는 데 사용될 수 있습니다.

예를 들어, 이 대답 에 대해서는 4 번째 항목에서 설명했습니다 .1 번째 (0 인덱싱 된) 값 ( STSSTN)을 복사하는 것이 12를 눌러 문자 'p'( SSSTTSSN) 를 만드는 것보다 짧은 바이트 수를 줄이려고했습니다. "pop"출력 의 일부 에서. (참고 : 문자 'p'에 112 대신 112 값 12를 사용합니다. 왜냐하면 모든 값을 고정 된 양만큼 낮추는 다른 팁을 적용했기 때문에 루프에서 문자를 인쇄하기 전에 추가했습니다 .)

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