골프 언어로 저장하기위한 팁


16

나는 골프 언어를 쓰고 있습니다.

코드 골프 언어로 저장하기 위해 변수, 스택, 테이프, 레지스터 등을 제안합니까? 암시 적 입력은 어떻습니까?

대략적인 정의 :

  • 변수는 단순히 값에 할당되고, 나중에 그 이름으로 검색 할 수있는 이름 (골프 언어 긴 일반적으로 하나 개의 문자)입니다.
  • 레지스터는 변수처럼,하지만 자신의 (일반적으로 단일 바이트)가 / 설정 값을 가져 오기위한 명령.
  • 스택은 가장 최근에 추가 된 값 (값 "위에")가 변형되는 것들이다 값의 가변 길이 배열 /리스트이다.
  • 의 "의 값을 제외하고 스택처럼 바닥 "변형되는 것들이다.
  • 테이프 각 값 인덱스가 값 정적 배열 /리스트이다. 스택과 테이프의 주요 차이점은 테이프의 값이 제자리에서 수정된다는 것입니다.

각기 다른 시나리오와 전체에 대한 각 옵션의 장단점을 알고 싶습니다. 추론과 함께 의견과 백업 진술을 피하십시오.


1
나는 당신이 당신의 질문에이 용어들의 정의를 포함시켜야한다고 생각합니다
Kritixi Lithos

2
@Fatalize 기술적으로 저장 방법은 어떤 종류의 골프 언어에 의존하지 않고, 골프 언어의 종류는 저장 방법에 달려 있습니다 ...
ETHproductions

1
@ETHproductions 그들은 완전히 상호 의존적입니다.
치명적

1
다양한 저장 용어에 대한 대략적인 정의를 추가했습니다. 마음에 들지 않으면 자유롭게 편집하거나 롤백하십시오.
ETHproductions

2
저장 방법과 언어 유형 사이에는 매우 밀접한 관계가 있지만 두 가지를 모두 봐야한다고 생각합니다. 예를 들어, 명령을 왼쪽에서 오른쪽으로 엄격하게 수행하는 "제국"언어는 스택 기반 (CJam, 05AB1E), 테이프 기반 (BrainF ***) 또는 다른 언어 (V, 몇 개의 레지스터와 함께 "버퍼"라는 하나의 큰 2D 문자열). 또한 접두사 기반 언어 (Pyth), 접두사 기반 언어 (Japt, Pip 및 기본적으로 모든 주류 언어), 링크 기반 언어 (Jelly) 등이 있으며 언급 된 방법을 거의 사용하지 않습니다.
ETHproductions

답변:


4

모든 스토리지 유형에는 한 시점에 무언가를 저장하고 나중에 검색하는 것이 포함됩니다. 한 작업에서만이 작업을 수행하려면 자동으로 저장하거나 검색하고 다른 작업에서 저장된 값의 위치를 ​​지정해야합니다.

즉, 명시적인 저장을 위해이 연산 전에 n 번째 계산 된 값을 검색하거나 n 연산 후에 현재 값을 되 돌리는 연산자를 만들 수 있습니다. 또는 프로그램 시작에서 절대 위치를 사용하거나 일부 작업 후 (예 : 스택에서) 일부 요소를 자동으로 제거하는 등 더 많은 작업을 수행 할 수 있습니다. 이러한 자동 작업 유무에 관계없이 여러 스토리지 사본에서 검색하여 여러 운영자를 만들 수도 있습니다. 또한 작업에 지정하는 데 필요한 최대 수를 합리적으로 작게 만들어 각 번호에 대해 하나의 연산자를 할당 할 수 있습니다.

그러나 대부분의 경우 연산자가 필요하지 않으며 언어가이를 암시 적으로 수행합니다. 이때 스택 또는 대기열과 같은보다 표준화 된 모델을 고려해야합니다. 지금까지 가장 성공한 것은 암묵적인 프로그래밍으로 보였으며 스토리지를 직접 언급하지도 않았습니다.

새로운 모델을 설계하려는 경우 평가를 dag로 확장하고 다른 항목이 지정되지 않은 경우 기본 dag를 고려할 수 있습니다. 대부분의 경우 기본 설정은 트리 일 뿐이며 여러 잎이 동일한 입력에 연결될 수 있습니다. 예를 들어 균형 잡힌 나무의 대기열을 사용하거나 잎이 대부분 일정한 깊은 나무의 스택을 사용하거나 잎이 대부분 입력의 사본 인 깊은 나무의 경우 젤리와 같은 것을 사용할 수 있습니다.

그러나 이진 트리의 모양을 연산자 당 2 비트로 인코딩 할 수 있습니다. 따라서 언어에 64 개 미만의 연산자가있는 경우 실제로 기존 모델을 무시하고 스페어 비트로 전체 트리를 인코딩 할 수 있습니다 (combin_parent 및 below_leaf 플래그라고 함). 더 많은 연산자가 있어도 꽤 좋은 기본값 (예 : Jelly 모델)과 3 개의 수정자를 만들어 변경할 수 있습니다.

편의상 암시 적 스토리지와 명시 적 스토리지에 동일한 모델을 사용할 수 있지만 반드시 그럴 필요는 없습니다. 예를 들어, 암시 적 저장소에 스택을 사용할 수 있지만 명시 적 저장소 (또는 암시 적 저장소 외에 다른 명시 적 저장소)에서 요소를 팝하지는 않습니다. 최종 문서에서 스택이라고하지는 않지만 아이디어를 얻습니다.

참고로, 이진 트리의 완벽한 인코딩의 크기는 카탈로니아 어 숫자 의 로그입니다 . 그리고 "이진 (binary)"dag의 완벽한 인코딩의 크기는 A082161 의 로그 이지만 분명히 비현실적입니다. 이것은 다른 인수 순서를 가진 연산자가 두 개의 다른 연산자를 가정하고 그렇지 않은 경우 다른 비트를 추가한다고 가정합니다.

때때로 루프에 변수를 원할 수도 있습니다. 다른 방법으로 루프를 다시 작성할 수 있습니다. 그러나 실제로 필요한 경우 이름 외에 1 바이트 구문을 사용하여 변수를 정의하지 마십시오. 사전 초기화 된 값만 사용하지 않는 한 일반적으로 1 비트 플래그를 사용하여이 변수를 읽거나 쓰는지 여부를 지정하는 것이 더 효율적입니다.


7

나는 그들 모두를 제안합니다!

더 진지하게, 그들은 모두 시간의 일부를 편리하게 제공하며, 더 좋을수록 좋습니다! 암시 적 입력은 결코 나쁘지 않습니다. 끄는 플래그 만 있으면됩니다. 변수는 도움이되므로 스택이나 테이프에서 찾을 필요가 없습니다. 레지스터와 동일합니다. 스택은 데이터를 저장하는 데 도움이되며 테이프도 마찬가지입니다. 스택 레지스터 또는 GolfScript와 같은 스택 및 변수와 같은 여러 가지를 구현하는 것이 좋습니다 . 각 함수를 1 바이트로 만들 수 있다면 각 언어의 장점을 사용할 수 있으므로 언어가 골프에 효과적 일 것입니다.

예를 들면 :

  • 두 숫자를 입력으로 사용하고 문자열 길이를 추가하고 싶다고 가정 해보십시오.
  • 변수가 더 좋을 수도 있습니다 (스택이 아닐 수도 있습니다)
  • GolfScript의 예제 코드 (암시 적 입력) :

    ~,\,+
    ~ # Eval input (e.g. "1 2" > 1, 2)
    , # Take Length
    \ # Reverse items on the stack
    , # Take Length
    + # Add
      # Implicit output
    

    그러나 변수를 사용하면 더 길다는 것을 알고 있습니다. 스택에서 장소를 바꾸지 않아도됩니다.

    ~,:a;,:b;ab+
    ~ # Eval input
    , # Get length
    :a# Store in "a"
    ; # Discard value left on stack
    , # Length
    :b# Store in "b"
    ; # Discard
    a # Recall a
    b # Recall b
    + # Add
      # Implicit output
    

과부하

도움이 될 수있는 또 다른 것은 과부하입니다. 예를 들어, 가변 저장 기능이있는 경우 스택 또는 테이프에 추가하기 위해 모나드 (one-input function; J / K / APL의 용어가 확실하지 않음)로 사용될 수 있습니다.

예:

c12 # Stores "1" into register 2
c1] # Pushes "1" onto the stack ("]" is used to denote the end of the monad)

어쩌면 잘못된 유형으로 인수를 호출하면 대기열에 추가되어 스택이 비어 있으면 값을 채우는 데 사용됩니까?
Esolanging 과일

5

프로그램이 관련이없는 작업을 수행하는 동안 방해가되지 않도록 빠르게 사용할 수있는 스토리지 (주어진 테이프, 대기열, 스택) 및 영구 스토리지 (변수, 레지스터)를 사용하는 것이 좋습니다. 나는 더 많은 것이 거의 아무것도주지 않고 더 많은 1 바이트 명령어를 위해 더 많은 문자를 남겨 두겠다고 말하고 싶습니다.

주어진 정의에서 내가 가장 잘 작동한다고 생각하는 것은 스택 및 레지스터입니다.
스택은 테이프에 새로운 것을 저장하기 위해 함수를 사용해야하기 때문에 스택에는 간단한 푸시 및 팝 기능이 있어야합니다 (일반적으로 명령에 내장되어 있음). 레지스터는 일반적으로 변수에 비해 적은 바이트를 사용하기 때문에 2-4 개가 넘는 다른 것을 저장해야하는 경우 뭔가 잘못한 것입니다.

이름이나 정의가 여물통을 제안하는 것으로 만 기능을 제한하지 마십시오 put the 1st thing of the stack on top of the stack.


5

기본적으로 다르게 처리해야하는 두 가지 종류의 저장소가 있습니다. 최근에 생성 된 값 및 / 또는 입력에 액세스; 장기 보관.

장기 저장의 경우 변수가 가장 잘 작동하는 것 같습니다. 제한된 수의 옵션이있는 것은 확장 할 수 없습니다 (젤리와 같은이 속성을 가진 언어는 그럼에도 불구하고 중간 규모의 작업에서도 상당히 잘 수행 할 수 있습니다). 그러나 대부분 변수를 저장할 때 변수 이름 을 제공 할 필요는 없습니다 . 변수에 값을 저장하는 명령이 있고 예측 가능한 패턴에 따라 이름을 자동 생성하여 값을 저장하고 검색하는 것이 간단한 경우에 각각 하나의 명령이 될 수 있습니다. 예를 들어, 가장 최근에 할당 된 변수, 두 번째로 가장 최근에, 세 번째로 가장 최근에 등을 작은 고정 숫자와 인수를 사용한 일반 명령으로 복원하는 명령이있을 수 있습니다.

단기 저장의 경우 가능한 한 암시 적이어야합니다. 내가 본 거의 모든 골프 언어는 기본적으로 한 명령의 출력을 다음 명령의 입력에 연결합니다. 이것이 수행되는 정확한 방법은 언어마다 다르지만 일반적으로 같은 것입니다. 그러나 2 입력 명령의 두 번째 입력이 더 흥미 롭습니다. 스택에서 가져 오면 값이 한 번만 사용되지만 값을 재사용 할 때 잘 확장되지 않는 경우에 효과적입니다. (스택 조작 프리미티브를 피하려고 노력하십시오.이를 사용해야하는 경우 많은 바이트를 낭비하고 있습니다.) 또는 암시 적 두 번째 인수로 사용자 입력 또는 최근에 할당 된 변수를 사용하면 몇 바이트를 절약 할 수 있습니다 간단한 프로그램이지만

현재 진행중인 골프 언어에서 매우 저렴한 메커니즘 (단일 비트 ) 의 조합을 사용 하여 구문 분석 트리의 모양을 지정하고 기본적으로 사용자 입력에서 누락 된 인수를 자동으로 채우고 검사 점 누락 된 인수에 대한 기본값을 다른 것으로 (더 많은 특별한 경우) 설정할 수있는 접근 방식. 어느 시점에서 나는 프로그램을 따라 더 먼 거리에서 정보를 전달하기 위해 변수를 추가 할 것입니다.


0

테이프와 레지스터를 제안합니다.

테이프는 요소가 적기 때문에 테이프를 조작하기가 쉽기 때문에 스택보다 테이프를 선호합니다. 또한 테이프의 요소를 레지스터에 배치 할 수 있으며 그 반대의 경우에도 쉽고 짧은 코드를 만들 수 있습니다.

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