Befunge에서의 골프 팁


12

Befunge에서의 골프에 대한 일반적인 팁은 무엇입니까? 나는 일반적으로 Befunge에 다소 특정한 코드 골프 문제에 적용될 수있는 아이디어를 찾고 있습니다 (예 : "댓글 제거"는 답이 아닙니다). 답변 당 하나의 팁을 게시하십시오.


이것이 일반적으로 Befunge로 바뀌어야할지 모르겠지만, Befunge 93은 98보다 골프에 적합하지 않습니다.
Justin

6
최근 Befunge 93 주제가 있었지만 대신이 주제를 일반화하는 것이 좋습니다. 괜찮을까요? (그리고 파이썬 팁이 파이썬 2 / 파이썬 3에 해당하는지 여부와 같은 방식으로 어떤 버전이 어떤 버전에 적합한지를 표시 할 수 있습니다)
Sp3000

답변:


9

여러 줄로 된 루프를 사용할 때는 최대한 많이 사용하십시오.

>1234....v
^        <

vs

>1234v
^....<

7

조건부 이후에 값을 삭제해야합니까 (예 : 다른 경로는 값에 의존하지만이 경로는 그렇지 않기 때문에)? >$또는 을 사용 $<하는 _대신 변수의 실제 값을 알고 있다는 사실을 활용 하고 방향과 팝 스택을 변경하는 데 사용하십시오 .

'* : v           >$ .. @          Prints number in binary followed by the original
                                  decimal number.
     > :2%\2/ :!#^_ \.

로 바뀌다

'* : v           _  .. @          Since we know that the topmost value on the stack
                                  will be 0, we combine `>$` into `_`.
     > :2%\2/ :!#^_ \.

6

그것이 0항상 스택에 있다는 것을 잊지 마십시오 . 예를 들어, 빈 스택이 수단은, g동등 00gp동일하다 000p.


5

15보다 큰 숫자를 입력해야하는 경우 '다음 문자의 ASCII 값을 가져옵니다.

'*

42보다는 다음을 누르십시오.

4a*2+

또는 67*작동
Doorknob

4
@Doorknob 어쩌면 나는 내 요점을 더 명확하게 이해하기 위해 소수를 선택했을 수도 있지만 42는 그렇게 큰 숫자입니다.
저스틴

2
이 팁은 Befunge-96 이상에만 적용됩니다. Befunge-93은이 '명령을 지원하지 않았습니다 .
James Holderness

4

을 사용 |하는 대신 다른 줄이 필요합니다 (보통 추가 공간이 많은 경우) j. 예를 들면 다음과 같습니다.

01-`j@more code here

스택 상단의 숫자가 음수이면 중지하고 그렇지 않으면 계속 진행합니다. 여러 문자를해야하는 경우, 사용하는 n*jn으로 전달 된 값이 때 필요한 문자의 수 j이다는 0. 예:

01-`4*j01-*more code

음수를 무효화합니다.


이 팁은 Befunge-96 이상에만 적용됩니다. Befunge-93은이 j명령을 지원하지 않았습니다 .
James Holderness

4

Befunge-93에서 스택에 가장 먼저 밀어 넣는 것이 문자열이면 시작 인용 부호를 생략하여 벗어날 수 있습니다. 예를 들면 다음과 같습니다.

"!iH",,,@

이것으로 단순화 될 수 있습니다 :

!iH",,,@

온라인으로 사용해보십시오!

무슨 일이 일어나고 있는지 해석기는 먼저 인용 부호가없는 문자열의 문자를 실행하려고합니다. !수행 무해한 하지 , 그리고 i하고 H(일부 구현에 당신이 경고를받을 수 있지만) 그들이 무시하고, 그래서 유효 지시하지 않습니다.

이 때 "발생하는, 즉 문자열의 시작으로 간주됩니다,하지만 닫는 따옴표가 없기 때문에이 될 때까지 모든 방법 운동장 감싸는 "두 번째로 발생합니다. 결국 스택에 푸시 된 것은 다음과 같습니다.

,,,@  ···72 spaces···  !iH

그러나 우리는 마지막 몇 문자에만 관심이 있기 때문에 다른 것들은 중요하지 않습니다. 따라서 인용 후에는 마지막으로 ,메시지를 작성하고 @종료되는 명령을 작성 하여 세 가지 명령 을 실행합니다 .

인식 할 수없는 명령으로 인해 통역사가이를 무시하는 대신 반영하게되므로 Befunge-98에서는 일반적으로이 기능이 작동하지 않습니다.


Befunge-98에서는 다음 과 같이 줄 끝에 필요한 문자열을 넣을 수 있습니다 . ",,,@!iH. Pyfunge는 추가 공간을 추가하지만 FBBI는 추가 공간을 추가하지 않습니다.
Jo King

@ JoKing 나는 지적했듯이, 당신이 지적했듯이, 행동은 해석기마다 다르기 때문에 제안하지 않았다. 그리고 그것이 작동하는 것처럼 보일지라도 일관성 없기 때문에 ( 이 경우 FBBI의 여분의 공간을 참고하십시오 ) 어떤 시점에서 수정 될 수있는 버그 일 수 있습니다.
James Holderness

흠 ... 나는 공간이 실제로 사양의 일부라고 생각합니다. 여러 공간을 건너 뛰고 단일 공간으로 계산한다는 어딘가를 읽은 것을 기억합니다. PyFunge과 FBBI의 . FBBI는 각 줄을 가장 긴 줄의 길이로 채우는 것처럼 보이지만 PyFunge은 여분의 공백을 암시 적으로 추가합니다.
Jo King

당신이 옳습니다-스펙은 문자열의 여러 공백이 단일 공백으로 취급되어야한다고 말합니다. 실제로이 규칙은 무한한 운동장에서 줄을 감싸는 문제를 다루기 위해 특별히 제안되었습니다. 그러나 랩핑 알고리즘에 대한 사양의 설명은 해석하기에 다소 개방적이므로 일부 구현이 다르게 작동하는 이유를 이해할 수 있습니다. 그러나 결론은 이것이 상당히 복잡한 문제이며, 이것이 Befunge-97 / 98에 대한 별도의 팁으로 더 잘 다루어 질 것이라고 생각합니다.
James Holderness

4

Befunge-93에서, 루프를 단일 라인으로 편 평화하는 것은 종종 코드의 루프 섹션이 양방향으로 실행되는 것이 유리할 수 있습니다.

예를 들어, 문자를 a8 번 출력하는 아래 코드를 고려하십시오 .

"a"9>1-:#v_@
    ^\,:\<

루프 명령어를 브리지 명령어 ( #) 와 함께 산재하여 단일 라인으로 편 평화 할 수 있습니다 .

"a"9>1#\-#,:#:>#\_@

온라인으로 사용해보십시오!

공백이 아닌 문자 만보고있는 경우 원본보다 길이가 길다는 인상을받을 수 있습니다. 그러나 2 줄 버전에서 필요한 줄 바꿈과 추가 패딩을 고려하면 실제로 4 바이트를 절약하게됩니다.

이 특별한 경우에, 그 시퀀스 :#:는 단순히로 대체 될 수 있음을 주목함으로써 코드가 더욱 압축 된다 :.

"a"9>1#\-#,:>#\_@

온라인으로 사용해보십시오!

실제로 #명령 의 양쪽에서 동일한 명령이 반복 될 때마다 한 명령으로 단순화 할 수 있으므로 루프를 평탄화 할 때 항상주의해야합니다.

이것이 어떻게 작동하는지 이해하려면 루프 시퀀스를 두 번 작성하는 것이 도움이 될 수 있습니다. 한 번은 #제거 된 뒤에 오는 모든 문자 (예 : 왼쪽에서 오른쪽으로 실행될 때 발생하는 일)와 한 번은 #제거 된 앞에있는 문자 (즉, 오른쪽에서 왼쪽으로 실행되는 경우) ).

"a"9>1#\-#,:>#\_@
    >1  -  :>  _      ; executing left to right
    >  \  ,:  \_      ; executing right to left

이것이 코드의 원래 두 줄 버전과 어떻게 일치하는지 분명히 알 수 있습니다.


3

허용되는 출력 양식 인 종료 코드로 출력합니다. 챌린지에서 하나의 숫자를 인쇄하도록 요청하면 q대신 프로그램을 종료하여 바이트를 저장할 수.@


2
이 팁은 Befunge-98 이상에만 적용됩니다. 이전 버전의 Befunge에서는 q명령이 다른 기능 (큐 모드)을 갖거나 지원되지 않았습니다.
James Holderness

3

Befunge-93에서 문자 입력 명령 ( ~)은 종종 EOF에 반환되는 값이므로 -1의 바로 가기로 사용할 수 있습니다.

예를 들어 아래 코드는 -1을 출력합니다.

~.@

온라인으로 사용해보십시오!

대화식 환경에서 실행될 때 프로그램이 일시 중지되고 사용자 입력을 기다릴 수 있으므로 프로덕션 코드에서는 권장되지 않습니다. 그리고 사용자가 무언가를 입력했다면 결과는 더 이상 -1이 아닙니다.

즉, PPCG의 규칙 은 프로그램이 빈 입력 스트림을 가정 할 수 있으며 이것이 TIO 에서 일반적으로 실행되는 방식 입니다.

또한 프로그램이 입력 스트림에서 무언가를 읽어야하기 때문에 반드시이 트릭을 사용할 수있는 것은 아닙니다. 입력을 미리 처리해야합니다. 그 후에 모든 향후 사용은 ~-1을 반환해야합니다.


2

를 처리 할 때 IP의 방향을 사용 _하거나 |보다는위한 여분의 문자를 사용하여 !.

실제 예 ( 이 게시물에서 ) :

#v~
,>:!#@_

로 변경할 수 있습니다

#v~
:<,_@#

2

0k다음 명령을 실행하지 않는 것을 잊지 마십시오 . 이것은 다음을 수행하는 대신에 다음을 의미합니다.

;some boolean test;!jv;code if false;
       ;code if true;<

당신은 수행하여 문자를 저장할 수 있습니다

;some boolean test;kv;code if false;
      ;code if true;<

이 팁은 Befunge-98 이상에만 적용됩니다. 이전 버전의 Befunge는이 k명령을 지원하지 않았습니다 .
James Holderness

1

k운영자를 잊지 마십시오 . 대신 "!dlroW olleH",,,,,,,,,,,,@수행 "!dlroW olleH"bk,@. 참고 k작업을 수행 가에 있음을 셀에 그렇게 9k,하지 9 시간 만 (10)를 인쇄 할 것이다; 로 9 회 k,로 1 회 ,.


1
이 팁은 Befunge-98 이상에만 적용됩니다. 이전 버전의 Befunge는이 k명령을 지원하지 않았습니다 .
James Holderness

1

스택에 작은 숫자를 밀어 넣을 때, 당신은 아마 충분히 쉽게 알아낼 수 있습니다 45*당신을 얻을 것이다 20, 그리고 67*당신을 얻을 것이다 42. 그러나 숫자가 클 때는 가장 효율적인 표현을 계산할 수있는 프로그램이 필요합니다.

가장 쉬운 옵션은 Mike Schwörer의 BefunRep 온라인 인터페이스입니다 . 단순히 숫자를 입력하면 동등한 Befunge 표현이 나옵니다. 항상 가장 최적은 아니지만 충분히 가까우며 손으로 할 수있는 것보다 더 나은 것이 거의 확실합니다.

온라인 시스템은 0에서 16777215 범위의 숫자로 제한되므로 이보다 큰 값이 필요한 경우 독립형 BefunRep 유틸리티 를 다운로드 하여 계산을 직접 실행하십시오.

Befunge-98에서 프로그래밍하는 경우 고려해야 할 또 다른 옵션은 Fungify 입니다. 일반적으로 BefunRep만큼 최적은 아니지만 16 진수와 작은 따옴표 문자가 가장 효과적인 일부 낮은 숫자의 경우 더 나은 결과를 얻을 수 있습니다.


Befunge 98에서 작은 숫자를 입력 할 때는을 사용 '합니다. 예 42:'*
Justin Justin

@Justin 마지막 단락에서 언급했지만이 팁의 요점은 도구를 사용하여 숫자를 생성하는 경우 숫자를 생성하는 데 필요한 많은 트릭을 알 필요가 없다는 것입니다.
James Holderness
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.