INTERCAL에서의 골프 팁


10

INTERCAL 에서의 골프에 대한 일반적인 팁은 무엇입니까 ? 코드 골프 챌린지에 적용될 수 있고 적어도 INTERCAL에 특정한 아이디어를 찾고 있습니다 (예 : "댓글 제거"는 유용한 답변이 아닙니다).

이국적인 언어가 골프 대회에서이기는 데 실제로 도움이 될 수 있다는 것을 알고 있지만 여기에는 많은 INTERCAL 코드가 표시되지 않습니다. INTERCAL을 통해 사람들이 경쟁력있는 코드 크기를 얻는 데 도움이되는 조언이 있습니까? 이 언어가 경쟁력이 될 수 있습니까?

INTERCAL은 활용도가 너무 낮아서 태그가 없습니다. 너무 슬퍼...


언어 별 과제는 일반적으로 권장되지 않으므로 대부분의 언어에는 여기에 고유 한 태그가 없거나 필요하지 않습니다.
Alex A.

9
이것은 Despite the language's intentionally obtuse and wordy syntax,
위키피디아

답변:


2

공백 / "소음"제거는 예상보다 더 진행될 수 있습니다

INTERCAL은 공백에 영향을받지 않는 언어입니다. 그러나 공백에 영향을받지 않는 대부분의 언어와는 달리, 감도는 예상보다 훨씬 더 높아집니다.

예를 들어, DO NOT두 개의 토큰이지만 DONOT파서가 불평하지 않고 작성할 수 있습니다 (거의 널리 사용되는 구현에서). (물론, 글을 쓸 수도 DON'T있지만 터무니없는 것은 아닙니다. 그래도 읽기가 더 쉬울 수도 있습니다. 그래도 PLEASEN'T읽기가 더 어려울 수도 있습니다 PLEASE NOT.) 실제로 공백이 어떤 기능을 수행하는지에 대한 논쟁이 있습니다. 적어도 하나의 INTERCAL 파서는 수치 상수 내부에서도 가능합니다 (골프에는 유용하지 않습니다). 마음에 곰에 한 가지에서가 제거 공백입니다 DO READ OUT제공 으로 인해 내장에 일부 오래된 INTERCAL 파서를 혼동 할 수있는DOREADOUTDO(저자들은 일반적으로이 버그를 버그로 간주하지만, 오늘날에는 일반적으로 유효한 프로그램에서 작동하지만 구문 오류 근처에 이와 같은 코드를 넣는 것은 바람직하지 않습니다.

또한 공간을 절약하기 위해 문자를 오버 펀치 할 수 있습니다. ASCII에서는 '.→ 로만 이것을 풀 수 !있지만, 그 자체로는 매우 유용한 트릭입니다. (배열을 사용하지 않을 때는 모든 그룹화 문자가 동일하더라도 반짝 반짝 모호 할 가능성이 없으므로 골프 참가 항목의 경우 실제로 '배열 아래 첨자가 ". INTERCAL-72에 필요한 3 개가 아닌 ?약어 (C-INTERCAL) 또는 라틴어 -1 ¥(CLC-INTERCAL) 을 사용하여 1 바이트로 표시됩니다 .


2

한 진술에서 가능한 많은 작업을 수행하는 데 집중

INTERCAL의 명령문 식별자는 다소 장황합니다. DO는 모든 문장에 두 개의 노이즈 문자이며, 문장의 이름 자체도 상당히 길다. 그리고 당신은 PLEASE파서를 행복하게하기 위해 매번 던져야한다 . (가장 최선의 방법은 4 DO대 1 의 비율입니다 PLEASE. 즉, 5 개의 명령마다 식별자에 14자를 사용한다는 의미입니다.) 반면에 식 구문은 상당히 간결합니다 (말도 안되지만 간결). 즉, 여러 명령문을 사용하는 것이보다 "자연적인"방법 일 경우에도 프로그램의 일부를 단일 표현식에 적합하게 적용하는 것이 좋습니다.

예를 들어, 할당 할 경우 #1.1#2.2대신 명백한 INTERCAL-72 방법으로 그 일의 :

DO.1<-#1DO.2<-#2

무작위 변수를 오버로드하여 한 번에 두 가지를 모두 할당 할 수 있도록하는 것이 좋습니다.

DO:1<-#1$#2

( :1/!1$.2'프로그램의 어딘가에 던져 져서;이 표기법은 INTERCAL-72보다 상당히 오래 사용 되므로이 기능을 사용하려면 최신 INTERCAL을 사용해야합니다.) 이것은 당신이 계정에 설정을하는 경우에도 약간 이상, 당신이 이제까지 필요하거나 할당 동시에,에 배열 할 수있는 경우 짧아 질 .1.2두 번 이상.

이 트릭이 작동하는 명령 만 계산하는 것이 아닙니다. 변수를 두 번 숨기려면 다음과 같이하지 마십시오.

DOSTASH.1DOSTASH.1

하지만 이렇게 :

DOSTASH.1+.1

( +표기는 개념적으로 이해 될 수있는 대부분의 명령에 적용됩니다.)


2

모든 INTERCAL-72 스타일에 대해 하나의 이력서를 사용하십시오.

"if"문에 해당하는 내용을 작성해야하는 경우 INTERCAL-72 코드를 사용하는 일반적인 방법은 NEXT두 번이고 계산됩니다 RESUME. (현대 코드에서는 계산 COME FROM이 더 나은 경우가 많지만이 팁에서는 코드가 선호한다고 가정합니다 NEXT.) 첫 번째 바이트 NEXT는 "if"의 한 분기에서 다른 분기로 이동할 때 바이트를 지불해야합니다 . NEXT를 볼 때 같은 장소로 이동하는 "if"문장이 많지 않으면 두 번째를 공유하는 것도 사소한 것이 아닙니다 #1. 그러나 RESUME프로그램의 어느 위치 에나있을 수 있습니다 (제어가 즉시 어디서나 떠날 수 있기 때문에).

이를 처리하는 두 가지 방법이 있습니다. "if"문이 많은 경우 RESUME두 번째 NEXT문이 최대한 짧을 수 있도록 한 자리 숫자의 줄 번호 가 필요합니다. 가능하다면 RESUME코드에서 자연스럽게 발생 하는 계산 을 시도 하십시오 NEXT. 그런 다음 유일한 비용은 줄 번호입니다. 이 모든 것에 대해 단일 부울 변수를 사용해야합니다 NEXT. 여기서 일반적인 합의는를 사용하는 것입니다 .5. 주로 표준 라이브러리가 부울 리턴 값에 사용하는 변수이기 때문입니다.

또는 표준 라이브러리의 문서화되지 않은 (기술적으로 저조한 문서를 보았을 때 INTERCAL 설명서에 힌트를 주었으므로) 기능을 사용할 수도 있습니다. 의 중앙 위치 RESUME가 매우 유용 하기 때문에 표준 라이브러리는 내부를 사용합니다. INTERCAL에서 줄 번호는 전역 (규칙의 네임과 함께하지만, 이는 당신이 무슨 일을하는지 알고 있다면 나눌 수 있습니다) 당신이 할 수 있도록, NEXT당신이 바로 표준 라이브러리 내부에 원하는 경우, 특히, 캔 NEXT 중심 RESUME 위치 . 이것은 기존의 INTERCAL 코드에서 충분히 인기가 있으며 표준 라이브러리 대체는 기존 프로그램의 중단을 피하기 위해이를 구현해야합니다.

문제의 행은 (구현에 따라 문자 그대로 또는 효과적으로)입니다.

(1001) DO RESUME .5

이것을 사용하지 않는 주된 이유는 긴 줄 번호입니다. INTERCAL-72 스타일의 if 구조체를 많이 해야하는 경우 더 짧은 숫자를 사용하는 것이 좋습니다.

물론 기술을 결합하여 다음과 같은 것을 작성할 수 있습니다.

(9)DO(1001)NEXT

조금만 더 길다

(9)DORESUME.5

부울이 #2되고 #3(읽기 어렵지만 일반적으로 생성하기가 더 쉽다) 이점이 있습니다. 사실, 그것은 가치도 처리 할 수있는 추가 코드에 넣어 수 있습니다 #0그리고 #1당신은 많은 iffing 할 거라면 (그러나 계산 된 COME FROM요구 사항은 매우 이상한하지 않는 한 아마이 경우에 더 잘 작동합니다).


2

INTERCAL은 우선 순위를 지정하지 않지만 모호한 우선 순위 에서도 오류가 발생 하지 않습니다

같은 표현

#1$#2~#3

모호하고 의미 할 수 있습니다

'#1$#2'~#3

또는

#1$'#2~#3'

INTERCAL 스펙은 의도적으로 불명확하며, 일반적으로 표준이 없습니다 (C-INTERCAL과 CLC-INTERCAL은 더 간단한 경우 서로 일치시키기 위해 노력하지만). 즉, 원본이 잘못 되지 않았습니다 . 모호하고 프로덕션 코드에서는 사용하지 않는 것이 좋지만 프로덕션 코드에서는 INTERCAL 자체를 사용하지 않는 것이 좋지만 대부분의 컴파일러에서 의미가 있습니다.

즉, 그룹화 문자를 제거하고 프로그램이 여전히 작동하기를 바랄 가치가 있습니다. 대부분의 통역사는 주어진 모호한 표현을 일관되게 구문 분석하므로 각 그룹화 문자 쌍에 대해 1 / 2 확률은 불필요합니다. 상당한 비용 절감 효과가 있습니다. (불행하게도, INTERCAL 파서는 충분히 아무도 완전히 확인 규칙이 실제로 무엇 없다는 것을 혼동하는 경향이 있다 , 그러나 그것은 일반적으로 실험에 의해 결정될 수있다. 가장 간단한 경우, 사업자 모두에 경향이 같은 우선 순위와 일관된 연관성을 가지고 있습니다.)


2

C-INTERCAL에서 다음을 사용하여 코드를 줄여보십시오. CREATE

CREATE문장을 사용하면 새로운 구문을 만들 수 있습니다. 이것은 특히 짧은 이름을 줄 수 있기 때문에 골프에 특히 유용합니다. 또한 새로운 연산자를 만들어서 효과적으로 "함수를 정의"하는 데 사용할 수도 있습니다 (표현식 중간에 함수를 호출 할 수 있다는 큰 이점이 있습니다).

여기에서의 설정 비용은 상당히 높지만 많이 사용하는 구문이 있으면 더 짧은 구문을 발명하는 것이 좋습니다.

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