Befunge에서의 골프에 대한 일반적인 팁은 무엇입니까? 나는 일반적으로 Befunge에 다소 특정한 코드 골프 문제에 적용될 수있는 아이디어를 찾고 있습니다 (예 : "댓글 제거"는 답이 아닙니다). 답변 당 하나의 팁을 게시하십시오.
Befunge에서의 골프에 대한 일반적인 팁은 무엇입니까? 나는 일반적으로 Befunge에 다소 특정한 코드 골프 문제에 적용될 수있는 아이디어를 찾고 있습니다 (예 : "댓글 제거"는 답이 아닙니다). 답변 당 하나의 팁을 게시하십시오.
답변:
조건부 이후에 값을 삭제해야합니까 (예 : 다른 경로는 값에 의존하지만이 경로는 그렇지 않기 때문에)? >$
또는 을 사용 $<
하는 _
대신 변수의 실제 값을 알고 있다는 사실을 활용 하고 방향과 팝 스택을 변경하는 데 사용하십시오 .
'* : 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/ :!#^_ \.
15보다 큰 숫자를 입력해야하는 경우 '
다음 문자의 ASCII 값을 가져옵니다.
'*
42보다는 다음을 누르십시오.
4a*2+
67*
작동
'
명령을 지원하지 않았습니다 .
을 사용 |
하는 대신 다른 줄이 필요합니다 (보통 추가 공간이 많은 경우) j
. 예를 들면 다음과 같습니다.
01-`j@more code here
스택 상단의 숫자가 음수이면 중지하고 그렇지 않으면 계속 진행합니다. 여러 문자를해야하는 경우, 사용하는 n*j
곳 n
으로 전달 된 값이 때 필요한 문자의 수 j
이다는 0
. 예:
01-`4*j01-*more code
음수를 무효화합니다.
j
명령을 지원하지 않았습니다 .
Befunge-93에서 스택에 가장 먼저 밀어 넣는 것이 문자열이면 시작 인용 부호를 생략하여 벗어날 수 있습니다. 예를 들면 다음과 같습니다.
"!iH",,,@
이것으로 단순화 될 수 있습니다 :
!iH",,,@
무슨 일이 일어나고 있는지 해석기는 먼저 인용 부호가없는 문자열의 문자를 실행하려고합니다. !
수행 무해한 하지 , 그리고 i
하고 H
(일부 구현에 당신이 경고를받을 수 있지만) 그들이 무시하고, 그래서 유효 지시하지 않습니다.
이 때 "
발생하는, 즉 문자열의 시작으로 간주됩니다,하지만 닫는 따옴표가 없기 때문에이 될 때까지 모든 방법 운동장 감싸는 "
두 번째로 발생합니다. 결국 스택에 푸시 된 것은 다음과 같습니다.
,,,@ ···72 spaces··· !iH
그러나 우리는 마지막 몇 문자에만 관심이 있기 때문에 다른 것들은 중요하지 않습니다. 따라서 인용 후에는 마지막으로 ,
메시지를 작성하고 @
종료되는 명령을 작성 하여 세 가지 명령 을 실행합니다 .
인식 할 수없는 명령으로 인해 통역사가이를 무시하는 대신 반영하게되므로 Befunge-98에서는 일반적으로이 기능이 작동하지 않습니다.
",,,@!iH
. Pyfunge는 추가 공간을 추가하지만 FBBI는 추가 공간을 추가하지 않습니다.
Befunge-93에서, 루프를 단일 라인으로 편 평화하는 것은 종종 코드의 루프 섹션이 양방향으로 실행되는 것이 유리할 수 있습니다.
예를 들어, 문자를 a
8 번 출력하는 아래 코드를 고려하십시오 .
"a"9>1-:#v_@
^\,:\<
루프 명령어를 브리지 명령어 ( #
) 와 함께 산재하여 단일 라인으로 편 평화 할 수 있습니다 .
"a"9>1#\-#,:#:>#\_@
공백이 아닌 문자 만보고있는 경우 원본보다 길이가 길다는 인상을받을 수 있습니다. 그러나 2 줄 버전에서 필요한 줄 바꿈과 추가 패딩을 고려하면 실제로 4 바이트를 절약하게됩니다.
이 특별한 경우에, 그 시퀀스 :#:
는 단순히로 대체 될 수 있음을 주목함으로써 코드가 더욱 압축 된다 :
.
"a"9>1#\-#,:>#\_@
실제로 #
명령 의 양쪽에서 동일한 명령이 반복 될 때마다 한 명령으로 단순화 할 수 있으므로 루프를 평탄화 할 때 항상주의해야합니다.
이것이 어떻게 작동하는지 이해하려면 루프 시퀀스를 두 번 작성하는 것이 도움이 될 수 있습니다. 한 번은 #
제거 된 뒤에 오는 모든 문자 (예 : 왼쪽에서 오른쪽으로 실행될 때 발생하는 일)와 한 번은 #
제거 된 앞에있는 문자 (즉, 오른쪽에서 왼쪽으로 실행되는 경우) ).
"a"9>1#\-#,:>#\_@
>1 - :> _ ; executing left to right
> \ ,: \_ ; executing right to left
이것이 코드의 원래 두 줄 버전과 어떻게 일치하는지 분명히 알 수 있습니다.
허용되는 출력 양식 인 종료 코드로 출력합니다. 챌린지에서 하나의 숫자를 인쇄하도록 요청하면 q
대신 프로그램을 종료하여 바이트를 저장할 수.@
q
명령이 다른 기능 (큐 모드)을 갖거나 지원되지 않았습니다.
Befunge-93에서 문자 입력 명령 ( ~
)은 종종 EOF에 반환되는 값이므로 -1의 바로 가기로 사용할 수 있습니다.
예를 들어 아래 코드는 -1을 출력합니다.
~.@
대화식 환경에서 실행될 때 프로그램이 일시 중지되고 사용자 입력을 기다릴 수 있으므로 프로덕션 코드에서는 권장되지 않습니다. 그리고 사용자가 무언가를 입력했다면 결과는 더 이상 -1이 아닙니다.
즉, PPCG의 규칙 은 프로그램이 빈 입력 스트림을 가정 할 수 있으며 이것이 TIO 에서 일반적으로 실행되는 방식 입니다.
또한 프로그램이 입력 스트림에서 무언가를 읽어야하기 때문에 반드시이 트릭을 사용할 수있는 것은 아닙니다. 입력을 미리 처리해야합니다. 그 후에 모든 향후 사용은 ~
-1을 반환해야합니다.
0k
다음 명령을 실행하지 않는 것을 잊지 마십시오 . 이것은 다음을 수행하는 대신에 다음을 의미합니다.
;some boolean test;!jv;code if false;
;code if true;<
당신은 수행하여 문자를 저장할 수 있습니다
;some boolean test;kv;code if false;
;code if true;<
k
명령을 지원하지 않았습니다 .
k
운영자를 잊지 마십시오 . 대신 "!dlroW olleH",,,,,,,,,,,,@
수행 "!dlroW olleH"bk,@
. 참고 k
작업을 수행 가에 있음을 셀에 그렇게 9k,
하지 9 시간 만 (10)를 인쇄 할 것이다; 로 9 회 k
,로 1 회 ,
.
k
명령을 지원하지 않았습니다 .
스택에 작은 숫자를 밀어 넣을 때, 당신은 아마 충분히 쉽게 알아낼 수 있습니다 45*
당신을 얻을 것이다 20
, 그리고 67*
당신을 얻을 것이다 42
. 그러나 숫자가 클 때는 가장 효율적인 표현을 계산할 수있는 프로그램이 필요합니다.
가장 쉬운 옵션은 Mike Schwörer의 BefunRep 온라인 인터페이스입니다 . 단순히 숫자를 입력하면 동등한 Befunge 표현이 나옵니다. 항상 가장 최적은 아니지만 충분히 가까우며 손으로 할 수있는 것보다 더 나은 것이 거의 확실합니다.
온라인 시스템은 0에서 16777215 범위의 숫자로 제한되므로 이보다 큰 값이 필요한 경우 독립형 BefunRep 유틸리티 를 다운로드 하여 계산을 직접 실행하십시오.
Befunge-98에서 프로그래밍하는 경우 고려해야 할 또 다른 옵션은 Fungify 입니다. 일반적으로 BefunRep만큼 최적은 아니지만 16 진수와 작은 따옴표 문자가 가장 효과적인 일부 낮은 숫자의 경우 더 나은 결과를 얻을 수 있습니다.
'
합니다. 예 42
:'*