바쁜 뇌 비버


13

가능한 많은 단계를 수행하지만 무한 반복하지 않는 256 자 이하의 brainfuck 프로그램을 작성하십시오. 프로그램이 입력을받지 못할 수 있습니다.

더 구체적으로:

  • 오른쪽에 무한한 수의 셀이 있다고 가정하십시오.
  • A는 <가장 왼쪽 세포에서 아무것도하지 않을 때.
  • -때 셀 값은 제로 세트 셀이다 255.
  • 명령은 +-<>.모두 실행될 때 한 단계로 계산됩니다.
  • [이상이 ]발생, 그것은 하나의 단계로 계산합니다. 그러나 조건이 참이고 제어 흐름이 점프하면 해당 ]또는 다시 단계로 계산 [되지 않습니다 .
  • 가장 많은 조치를 취하는 솔루션이 승리합니다.
  • 솔루션에 어떤 종류의 패턴이있는 경우 비슷한 길이의 프로그램이 몇 단계를 거치는 지에 대한 기능을 제공하는 n것이 중요하지만 필수는 아닙니다.
  • 명령어 수를 세려면 이 수정 된 인터프리터를 사용할 수 있습니다 .

예:

++[-]

발생한 지침은 ++[-]-]이며 프로그램은 7 단계 동안 실행되었습니다.


6
승자가 통역사 수를 넘치지 않고 종료하면 놀랍습니다. 6-state TM busy 비버는 최소 10 ** 36534 단계를 거치게됩니다.
피터 테일러

나는 동의한다. 수년간 실행할 수있는 <50 char BF 프로그램을 작성할 수있을 것 같습니다. 시작하겠습니다.
captncraig 2013

서명했다. drb.insel.de/~heiner/BB 의 Busy Beaver 리서치 페이지 는 매우 흥미 롭습니다. 특히 레코드 프로그램이 매우 오래 실행 되고 여전히 정확한 결과를 가지고 있다는 사실입니다 ( drb.insel.de/~heiner/BB/bb 참조) . -xlist.txt )-시뮬레이션은 상태를 기억하고 시뮬레이션 단계 등을 저장하기 위해 "매크로"를 구축합니다.
schnaader

4
@AntonGolov : 불행히도,이 우주에서, RAM과 HD는 256 ^보다 큰 큰 숫자 를 바이트 단위로 바이트 에 저장하려고 할 때 무한 저장 장치로 변환되지 않습니다 ...
반 시계 회전을 중단

1
@boothby 현재 컴퓨터에서 초월자와 관련된 정확한 계산을 완벽하게 수행 할 수 있습니다. 값의 구성 요소는 일반적인 일상 컴퓨팅에 사용되는 일반 float또는 double기본 요소 보다 더 추상적 인 표현으로 저장해야합니다 . (이 시점에서 컴퓨터는 주로 방정식을 나타내는 문자열을 조작하는 것입니다)
AJMansfield

답변:


15

다음은 결국 중단되는 41 문자 프로그램입니다. 10 ↑ (10 ↑ 28) 이상의 연속 셀이 1로 설정되어 있습니다 (따라서 실행되는 명령의 수가 그보다 훨씬 큽니다).

>+>+>+>+[->[>]+[->[>]+[->[>]+[<]+<]+<]+<]

내가 실수하지 않은 경우, 각 메모리 셀에 단일 비트를 사용하는 BF 변형 언어로 다음 프로그램을 올바르게 번역 한 것입니다 (즉, 0..255 대신 셀 내용 0..1이므로 '+' 단순히 비트 값을 뒤집는 역할을합니다) :

>+>+>+>+[+>[>]+[+>[>]+[+>[>]+[<]+<]+<]+<]

후자의 프로그램에 의해 생성 된 정확한 값 (인접한 1 비트 수)은

3 * (2 ↑ 118842243771396506390315925503 - 1) + 1.


위의 프로그램은 2 ↑↑ x ( Knuth 위쪽 화살표 표기법 ) 처럼 자라는 함수를 초기화하고 계산합니다 . 2 ↑ 23 x 처럼 커지는 함수를 초기화하고 계산하는 변형 BF 프로그램의 유사한 변환은 다음 256 문자 프로그램을 제공합니다.

>+>+>+>+>+>+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+

이것은 결국 정지하고 2 ↑ 23 6 개 이상의 인접한 셀을 1로 설정합니다 (따라서 단계 수는 그보다 훨씬 큽니다).

NB-1 : 2 ↑ 23 6은 "생각할 수 없을 정도로 큰"숫자입니다. 예를 들어, 2 ↑ 4 6 = 2 ↑↑↑↑ 6 조차 Graham의 수 를 계산하는 데 사용 된 순서에서 첫 번째 항 (3 ↑↑↑↑ 3)을 이미 능가합니다 .

NB-2 : BF 프로그램 이 Graham의 수보다 훨씬 큰 출력을 가진 함수를 초기화하고 계산하기에 256자가 충분하다고 생각합니다 .

NB-3 : 위의 프로그램의 출처에 관심이있는 사용자를 위해 Python으로 작성된 다양한 프로그램과 함께 "Brainf * ck F"에 대한 프로그래밍 리소스가 있습니다. ( "Brainf * ck F"또는 "F"는 내가 Smallf * ck esolanguage 의 Turing-complete 변형이라고 불렀 습니다.) 이제 몇 년 동안 오프라인 상태였던이 파일을 업로드했습니다. 링크 된 웹 페이지는 "파일 캐비닛"일뿐입니다. 위의 프로그램과 관련된 자세한 내용은 Busy_Beavers.txt 파일을 참조하십시오.


(현재 다른 사람들을 과소 평가하지 않는 한) 이것은 현재 확실한 승자입니다. 더 많은 제안을 환영하지만 지금은이를 승인 된 것으로 표시하겠습니다. 누군가 동의하지 않으면 의견을 말하십시오.
Anton Golov 2019

이 수준에 도달하면 무한한 메모리를 가진 통역사가 있다고 가정하는 것은 비현실적입니다. 유한 래핑 메모리를 사용하면 이것이 더 나은 과제라고 생각하기 시작하여 실제로 답변을 실행할 수 있습니다.
captncraig

9

다음은 멋진 39 자입니다.

-[>-[>-[-[>+<-]<[>+<-]<[>+<-]>>>]<-]<-]

기본적으로 3 칸 넓이를 '썰매'로 만들어 오른쪽으로 이동하고 하나씩 줄입니다. 31,919,535,558 개의 명령으로 완료되었으며 가장 안쪽의 루프는 256 ^ 3 번 실행됩니다. 나는 여전히 14 자의 속도로 런타임까지 다른 크기로 확장 할 수있는 충분한 공간을 가지고 있습니다.

무제한 메모리 또는 랩핑 메모리가있는 모든 인터프리터에서 작동합니다.

개선 된 2 루프 버전이 언제 끝날지 결정하기 위해 독자에게 연습을 남깁니다.

-[>-[>-[>-[>-[-[>+<-]<[>+<-]<[>+<-]<[>+<-]<[>+<-]>>>>>]<-]<-]<-]<-]

이제 밤새 실행되었으며 3,000,000,000 단계 이상입니다. 여전히 외부 루프의 단일 반복을 거치지 않았습니다. 간신히 두 번째 루프의 15 %를 통과했습니다.


2

이 프로그램은 무한한 수의 셀에서 작동합니다. 처음에는 ascii 값 255로 두 개의 값이 초기화됩니다. 주 루프의 첫 번째 회전시 첫 번째 값은 255 셀로 분할되고, 주 루프의 두 번째 회전시 255 개의 셀에서 각 값은 다시 분할됩니다. 메인 루프의 255 회전에 대해 동일한 방식으로 최대 255 * 255 셀까지 초기화 된 총 셀은 255 ^ 255입니다. 두 번째 값은 메인 루프가 반복되는 횟수를 결정합니다.

>->>-[<<[<]>[[[>]>>>[>]-[<]<<<[<]>-]>]>[>>[>]>+<<[<]<-]>>[>]>-]

2

이 프로그램은 내 이전 프로그램과 거의 동일합니다. 차이점은 외부 루프를 결정하는 값이 특정 셀에 고정 된 상태로 유지되므로 초기화 된 셀 수와 프로그램 끝의 총 단계가 모두 증가 할 수 있다는 것입니다

->>-<<[>>[>]<[[>>[>]-[<]<-]>>[[<+>-]>]<<[<]<]>>[[<+>-]>]<<[<]<-]

프로그램 끝에서 초기화 된 셀 255 ^ 255

-[>-[>->>[-]-<<[>>[>]<[[>>[>]-[<]<-]>>[[<+>-]>]<<[<]<]>>[[<+>-]>]<<[<]<-]<-]<-]

프로그램 끝에서 초기화 된 셀 255 ^ 255 ^ 3

더 많은 단계를 실행하도록 추가로 수정했습니다.

->>>->>-<<<<<[>>>[>]<[[>>[>]<[[>>[>]-[<]<-]>>[[<+>-]>]<<[<]<]>>[[<+>-]>]<<[<]<-]<[>>>[[<+>-]>]<<[<]]<]>>>>[[<<+>>-]>]<-<<[<]<<-]

메인 루프의 두 번째 회전 동안 메인 255 ^ (255 ^ 255 * 255) 셀의 첫 번째 회전 중에 255 ^ 255 셀을 초기화 함 메인 루프의 세 번째 회전 중 255 ^ {255 ^ (255 ^ 255 * 255) * 255} 셀 이 방법으로 루프는 255 번 반복됩니다.


좋아 보인다! 아직 답변을받지 못해서 죄송합니다. 이것들을보고 성장 순서를 알아내는 데 시간이 좀 걸립니다. "255 ^ 255 * 255"라고 말하면 "255 ^ (255 * 255)"를 의미합니까? (그렇지 않으면 "255 ^ 256"이 필요합니다.)
Anton Golov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.