언더로드에서의 골프 팁


11

언더로드ais523 에 의해 생성 된 스택 기반 반 기능 타르 입니다. 나는 놀랍게도 우아한 언어이므로 최근에 골프를 시도했습니다.

언더로드에서 골프를하기위한 팁이 있습니까? (답변 당 하나의 팁)


나는 제어 흐름의 유일한 형태는 eval명령이라는 것을 좋아합니다.
ETHproductions

답변:


3

*출력에 사용

때문에 당신은 스택에 문자열을 떠나하여 출력 할 수 있습니다 , 사용하여 문자열을 축적하는 것이 유용 할 수 있습니다 *보다는 함께 출력 S. "문자열을 가져 와서 공백을 추가"하는 것이 어려울 경우 출력으로 수행하는 방법은 다음과 같습니다.

S( )S

반면에을 사용하는 방법 *은 1 바이트 짧습니다.

( )*

문제는 출력에 누적이 많으면 스택의 출력 요소를 처리하는 데 바이트가 필요할 수 있다는 것입니다.


2

반복적으로 재사용되는 함수 사전을 사용하십시오.

코드 조각을 많이 사용해야하는 경우 해당 코드를 스택에 저장하고 매번 복제 및 평가하는 것이 좋습니다. 지금까지는 일반적인 Underload 프로그래밍입니다. 불행히도, 스택에서 오랫동안 값을 유지하는 것은 어렵고 코드가 장황하게되는 경향이 있으며, 값이 데이터가 아닌 함수 일지라도 마찬가지입니다. 반복해서 재사용해야하는 여러 기능이있는 경우 훨씬 더 나빠집니다.

재사용되는 여러 기능을 활용할 수있는 더 큰 규모의 프로그램에서 대신 사용할 수있는 솔루션은 호출 방식에 따라 목적에 맞는 하나의 큰 기능을 만드는 것입니다. 이상 사용보다는 다만 시퀀스를 호출을 통해 ^, 신중하게 작성 기능을 구별 할 수 ^^에서 ^:^에서 ^*^에서 ^~^) 뚜렷한 상당히 짧은 시퀀스 당신에게 제공합니다. 이 "사전"에 여러 번 사용하는 문자열과 같은 다른 유용한 것들을 저장할 수도 있습니다. 사전을 과도하게 사용하는 경우 사전을 일종의 퀴니로 만들어서 사본을 스택에 다시 밀어 넣을 수 있으므로 수동으로 복사 할 필요가 없습니다.: 나중에 사용할 수있는 능력을 잃지 않고 사용할 수 있습니다.


Underload에서 충분히 큰 프로그램을 갖기 전에이 문제가 될 정도로 오래 전에 화를 냈습니다. P
Esolanging Fruit

필자는 선호하는 스타일 조회를 사용하여 사전을 수행하는 방법 에 대한 예를 esolangs 페이지^!!!!^ 에 작성했습니다.
Ørjan Johansen

2

문제가 필요한 작업에 특화된 데이터 형식을 선택하십시오

간단한 예로, 가장 일반적으로 보이는 부울 구현은 !()false (예 : 정수 0)이고 null 문자열은 true (예 : 정수 1)이지만 논리 XOR을 기반으로하는 문제가있는 경우 더 많이 만들 수 있습니다. null 문자열을 false 및 ~true 로 사용하는 것이 좋습니다. 이 데이터 형식은을 사용하여 다른 부울 형식으로 변환 할 수 있으며 XOR에 대한 (false)~(true)~^!매우 간결한 구현 *을 허용합니다 .

이 일반적인 원칙을 더욱 발전시키고 나중에 데이터 값의 일부로 프로그램이 필요로하는 기능을 사용할 수 있습니다. 스택에 함수와 데이터를 별도로 저장하지 않아도됩니다. 이것은 제어 흐름을 좀 더 혼란스럽게 만들 수 있지만, 골프를 칠 때 유지 관리 능력은 종종 뒷좌석을 가져와야하며, Underload가 사용 가능한 것은 아닙니다.


나는 부울 을 사용 (!)하고 사용 (~!)했지만 길은 더 좋아 보입니다.
Esolanging 과일

2

"더러운"감소

기능적으로 순수한 교회 숫자를 줄이는 방법은 람다 미적분학 선행 함수를 사용하는 것입니다.

\n.n(\p.\z.z($(pT))(pT))(\z.z0[whatever you define the predecessor of 0 to be])

여기서 0 = \ x. \ yy, T = \ x. \ yx 및 $는 후속 작업입니다.

언더로드로 다시 작성하면 28 바이트입니다.

(!())~(!())~(!:(:)~*(*)*~)~^!

이것은 괜찮아,하지만 우리는, 즉 그, 저 부하의 유용한 특성의 일부를 이용할 수 :!하고 ()*있습니다 어떤 작전을하지 않는다. 숫자, 이것은 수단 n, :ⁿ!!()()*ⁿ( cⁿ한다 c반복 n시간) N-1을 산출한다. 예를 들어 교회 번호 3에 대해 이것을 수행하면 다음과 같이 나타납니다.

:::!!()()***

No-op 쌍을 제거하면 다음과 같은 이점이 있습니다.

:*

2입니다.

따라서 이것은 새롭고 짧은 선행 작업입니다.

:(:)~^(!!()())*~(*)~^*

이것은 7 바이트 더 짧습니다.


그래도 n = 0입니다. 작동 해야하는 경우 (()~(:))~:(^!!())*~(*)~^** 여전히 3 바이트 짧습니다.
Ørjan Johansen

@ ØrjanJohansen 일반적으로 Underload의 숫자가 0을 줄이면 0이 의미가 없기 때문에 n = 0에 특별한 경우가 있습니다.
Esolanging 과일

1

불필요한 스택 값을 프로그램 공간에 추가

언더로드에는 실제로 두 개의 스택, 즉 문자열 스택과 소스 코드를 구성하는 명령 스택이 있습니다. 언더로드의 ^명령으로 문자열을 이전 스택에서 후자로 이동할 수 있습니다. 이렇게하면 불필요한 스택 조작을 많이 줄일 수 있습니다.

예를 들어, 우리가 말하는 (a)(b)(c)주요 스택에 우리는 무시하고, 하단의 두 요소를 연결하는 싶습니다 (c)얻으려면 (ab)(c). 이 작업을 수행하는 순진한 방법은 스택을 돌려서 (c)(a)(b)수렴하고 다시 바꾸는 것입니다.

a~a~*~a*^*~

이것은 나쁘다. a~a~*~a*^이와 같이 스택을 회전시키는 데 사용 하는 것은 비용이 많이 들며 가능하면 피해야합니다. (c)대신 프로그램 공간에 넣으면 4 바이트 더 짧아 질 수 있습니다.

a(*)~*^

아이디어는 실행하려는 지시를 취한 (c)다음 끝에 지시를 추가 한 다음 결과를 평가하는 것입니다. 즉, (c)완료 한 후 되돌릴 때까지 걱정할 필요가 없습니다 .


1
로 쓸 수도 (*)~a*^있는데, 조금 더 작곡이 가능하다고 생각합니다. 기본적 ~a*^으로 dipJoy 의 명령입니다.
Ørjan Johansen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.