Befunge 프로그램 콤팩트


17

Befunge 는 2 차원 비전 프로그래밍 언어입니다. 기본 아이디어는 (1 문자) 명령이 2 차원 그리드에 배치된다는 것입니다. 제어 흐름은 그리드를 가로 질러지나 가면서 명령을 실행하고 화살표 ( >^<v)에 도달하면 방향을 변경 합니다. 명령은 스택 기반입니다. 이 목록을 참조하십시오 . http://esolangs.org/wiki/Befunge 도 참조하십시오 .

Befunge-98의 사양을 사용할 수 있습니다.

문제

Befunge 프로그램을보다 간결한 표현으로 변환하는 프로그램을 작성하십시오. 예를 들어, 다음 프로그램이 인쇄됩니다 0.

>   0   v

>   @   .

^       <

이 경우 공백 행을 제거하여 프로그램의 동작을 변경하지 않고도 압축 할 수 있습니다.

>0v
>@.
^ <

보다 복잡한 변환은 명령 시퀀스를 회전 또는 미러링하고 프로그램을 압축하기 위해 불필요한 제어 흐름 명령을 제거 할 수 있습니다. 예를 들어,이 프로그램으로 :

>12345v
      6
v....7<
.
.
.
@

프로그램 끝을 구멍에 넣을 수 있습니다.

>12345v
>...@ 6
^....7<

첫 번째 예에서 가능한 가장 간단한 프로그램은

>0.@

출력 프로그램이 동일한 결과를 제공하는 한 모든 변환을 사용할 수 있습니다.

입력 프로그램

입력 프로그램은 유효한 Befunge-98 프로그램입니다.

입력 프로그램이 결정적이라고 가정 할 수 있습니다. 즉, 외부 상태를 읽는 명령, 즉 사용자 입력 명령 &~임의 화기 ?및 자체 수정 코드 명령 p및을 사용하지 않습니다 g.

입력 프로그램이 종료되었다고 가정 할 수 있습니다.

채점

이것은 코드 골프가 아니라 코드 골프를 수행하는 프로그램을 작성하는 데 문제가 있습니다.

입력은 일련의 테스트 사례입니다 (위의 입력 제한을 만족하는 Befunge 프로그램). 총점은 테스트 사례에 대한 점수의 합계입니다.

각 테스트 사례에 대한 점수

점수는 출력 프로그램에서 비어 있지 않은 셀의 볼록 껍질 영역입니다. 여기서 각 셀은 직교 평면에서 격자 점이 4 개의 모서리 인 정사각형으로 처리됩니다. 예를 들어,

>   v
 @  <

9.5 점을 얻습니다.

프로그램이 특정 입력에서 적당한 시간과 메모리에서 종료되지 않으면 점수는 입력 프로그램의 점수입니다. 프로그램이 제 시간에 종료되지 않으면 입력 프로그램을 변경하지 않고 출력하는 시간 제한 래퍼를 간단하게 추가 할 수 있기 때문입니다.

프로그램으로 처리 한 후 테스트 케이스 프로그램의 결과가 다르거 나 종료되지 않으면 점수는 입력 프로그램의 점수에 100 점의 벌점을 더한 것입니다.


8
프로그램을 완료하여 실행하고 동일한 출력을 인쇄하는 Befunge 프로그램을 작성하지 못하게하려면 어떻게해야합니까?
Keith Randall

5
"get"과 "put"이 허용됩니까? "put"(자체 수정 코드)을 허용하면 어떤 작업도 수행하기 어렵습니다.
Keith Randall

2
처형은 어디서 시작됩니까? 왼쪽 상단? 그렇다면 두 번째 예의 출력을 설명 할 수 있습니까? .는 출력 정수를 의미하지만 왼쪽 상단에서 시작하면 스택에 출력 할 정수가 없습니다.
elssar

1
@elssar yes, .정수를 출력합니다. 그러나 스택에 매개 변수가 충분하지 않으면 대신 충분한 양의 0이 있다고 가정합니다. 따라서 두 번째 예제는 출력 000합니다.
daniero

@KeithRandall : 동일한 출력으로 새 프로그램을 작성하면 출력이 짧은 프로그램에만 작동합니다. gp허용되지 않습니다 (죄송합니다, 그 잊었다; 편집).
기계 달팽이

답변:


12

나는 이것을 코딩하는 데 긴 비행기를 탔다. 필자는 befunge 프로그램을 실행하고 기본 블록을 추출하여 간단한 표현으로 배치하는 의사 befunge 컴파일러를 작성했습니다.

프로그램에 연결하십시오 .

이 99 병 프로그램에서 실행될 때 :

92+9*                           :. v  <
>v"bottles of beer on the wall"+910<
,:
^_ $                             :.v
            >v"bottles of beer"+910<
            ,:
            ^_ $                     v
>v"Take one down, pass it around"+910<
,:
^_ $                           1-v
                                 :
        >v"bottles of beer"+910.:_          v
        ,:
        ^_ $                          ^
                    >v" no more beer..."+910<
                    ,:
                    ^_ $$ @

다음과 같은 출력을 생성합니다.

92+9*:.019+"llaw eht no "v
v  _v# :"bottles of beer"<
>    ,:    v
^  _v#     <
    >$:.019+"reeb f"v
 v _  v#:"bottles o"<
 >     ,:  v
 ^ _  v#   <
      >$019+"dnuo"v
     v"pass it ar"<
     >" ,nwod eno"v
 v _    v#:"Take "<
 >       ,:v
 ^ _    v# <
        >$1-:v
 v _      v# <
 >         :.019+"reeb "v
  v_  v#   :"bottles of"<
  >        ,v
  ^_  v#   :<
      >    $019+"llaw"v
           v" on the "<
           >"reeb fo "v
^  _^#      :"bottles"<
          >019+"...r"v
v  _v#:" no more bee"<
>    ,:    v
^  _v#     <
    >$$@    

실제로 소스보다 훨씬 콤팩트하지는 않지만 더 크거나 더 작은 프로그램에서는 더 나을 것입니다.

프로그램은 왼쪽의 라우팅 영역과 오른쪽의 기본 블록 내용으로 구성됩니다. 기본 블록은 일반적으로 짝수 행에 배치되므로 입구와 출구가 라우팅 영역에 인접 해 있습니다. 각 기본 블록의 끝에서 가젯#^_v 에서 오른쪽에서 왼쪽으로 배치 된 및 변형은 조건부 분기를 수행하고 흐름을 열로 라우팅합니다. 각 기본 블록이 시작될 때 이러한 열은 대상 기본 블록의 행으로 라우팅됩니다.

또한 출력이 짧은 경우 다음과 같이 명시 적으로 출력을 생성합니다.

"output">:#,_@

기본 블록 자체를 최적화하기 위해 아무것도하지 않았으며 레이아웃 만 수행했습니다. 할 것.

테스트는 어디에 있습니까?


1
소스 코드 링크는 현재 500 인 것 같습니다. 서버 구성이 잘못 되었습니까?
John Dvorak

1
@ JanDvorak : 참으로. 결정된.
Keith Randall

1

Sed, 5 자

따라서 이것이 코드 골프가 아닌 경우에도 코드 길이 대 점수 비율은 다소 좋지만 반드시 좋은 점수는 아닌 솔루션이 있습니다.

/^$/d

단순히 빈 줄을 제거합니다.


10
코드가 올바르지 않습니다! 빈 줄을 간단히 제거 할 수는 없습니다. 의견에 2d 코드를 작성할 수 없습니다. 그러나 방향이 아래쪽을 향하고 상수 문자열이 시작되는 경우를 고려하십시오 ( "). 도중에있는 모든 빈 줄은 공백 문자로 처리해야합니다. 해당 문자열을 인쇄하면 생성 한 코드에 해당 공백이 출력되지 않습니다!
saeedn

3
ideone.com/BdcRcf 의 코드를 확인하십시오b a . 인쇄해야합니다 . 그러나 단축 후에는 인쇄 ba됩니다.
saeedn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.