이것은 @ ais523의 답변을 한 단계 더 발전 시켜 두 세트의 대괄호로 줄였으며 골롬 통치자 이론을 기반으로 한 더 작은 셀 배치를 사용했습니다. ais523이있다 이 건설을위한 컴파일러를 만들 뿐만 아니라, 이 TIO 세션 TWM 카운터의 추적을 디버그 실행 샘플 결과 BF 프로그램을 보여주는.
원본과 마찬가지로 이것은 Waterfall 모델 의 프로그램으로 시작하며 일반성을 잃지 않는 몇 가지 제한 사항이 있습니다.
- 모든 카운터는 동일한 자체 재설정 값 R 갖습니다 . 즉, TWM 트리거 맵 f 는 모든 x에 대해 f(x,x)=R 속성을 갖습니다 .x
- 정지 카운터 h 가 하나 있습니다 .
- 카운터 의 수 c 는 소수 p에 대해 (p−1)/2 입니다 .p
골롬 통치자
Erdős–Turán 구조 를 Welch–Costas 배열 의 순열 함수와 결합하여 필요한 속성을 가진 Golomb 눈금자를 얻습니다.
(이 결합 된 구성은 새로운 아이디어가 될 수 없지만 Wikipedia 에서이 두 조각을 발견하고 함께 맞았습니다.)
r 을 p=2c+1 의 기본 근 이라고하자 . 기능 정의
지( k ) = 4 c k − ( ( r케이- 1 ) 개조 ( 2 C + 1 ) ) , K = 0 , ... , 2 (C) - 1.
- 지2 c g ( i ) − g ( j ) i , j ∈ { 0 , … , 2 c - 1 } 는 차수 의 골롬 통치자 입니다 . 즉, 차이 는 고유 한 숫자 모든 쌍에 대해 고유합니다 .2cg(i)−g(j)i,j∈{0,…,2c−1}
- g(k)mod(2c) 는 모든 값 정확히 한 번만 취합니다 .0,…,2c−1
테이프 구조
각 TWM 카운터 에 대해 폴백 셀 와 값 셀 두 BF 테이프 셀 위치를 지정합니다 .x∈{0,…,c−1}u ( x ) v ( x ) u(x) v(x)
u(x)=g(k1)<v(x)=g(k2) with u(x)≡v(x)≡x(modc)
의 두 번째 속성 에는 정확히 두 개의 고유 한 값이 있습니다.gk1,k2
폴백 셀의 내용은 카운터가 방금 방문한 경우, 있을 때 카운터 자체 재설정 값의 두 배인 경우를 제외하고 대부분 으로 유지됩니다 . 값 셀은 해당 TWM 카운터 값의 두 배로 유지됩니다.02R
BF 프로그램 실행 (유한 수)으로 도달 할 수있는 다른 모든 셀은 홀수 값으로 유지되므로 항상 0이 아닌 것으로 테스트됩니다. 초기화 후에는 모든 셀 조정이 일정한 양이므로 자동입니다.
원하는 경우, 초기 BF 테이프 위치의 왼쪽으로 이동하는 것을 피하기 위해 모든 셀 위치를 일정하게 오른쪽으로 이동할 수 있습니다.
BF 프로그램 구조
하자 정지 단계 카운터 값과 대체 셀 사이의 거리 및하자 숫자 충분히 큰 것이 모든 카운터에 대한 . 기본 BF 프로그램 구조는H=v(h)−u(h)NcN+1≥v((x+1)modc)−u(x)x
초기화 조정[
>
×(H+cN+1) [
<
×c × H]
<
×H ]
초기화
초기화 단계 마지막에 카운터는 방문되었고 저스트 현재 셀의 대체 세포 인 경우 모든 셀이 상태에서, 초기 값으로 설정 프로그램에 의해 도달 :u(c−1)
- 값 셀은 카운터 이 미리 감소 된 것을 제외하고 해당 TWM 카운터의 초기 내용의 두 배로 초기화됩니다 .0
- 대체 세포로 설정 세포 제외 로 설정되어, .0u(c−1)2R
- 프로그램이 도달 할 수있는 다른 모든 셀 (유한 숫자)은 로 설정됩니다 .1
그런 다음 프로그램의 첫 번째에 도달하기 전에 테이프 포인터가 (항상 0이 아닌 셀) 위치로 이동합니다 .u(c−1)−H[
외부 루프의 시작
외부 루프의 반복이 시작될 때 테이프 포인터는 카운터 대해 또는 에 있습니다.u(x)−Hv(x)−Hx
하자 방문 할 다음 카운터 수.y=((x+1)modc)
움직임 는 테이프 포인터를 왼쪽이 아닌 위치에 놓습니다 .>
×(H+cN+1)≡y(modc)v(y)
내부 루프 씩 좌측으로 현재 검색어 제로 셀. 카운터 가 0이면 (0) 값 셀 . 그렇지 않으면 대체 셀 찾을 수 있습니다.[
<
×c c y v ( y ) u ( y )]
cyv(y)u(y)
발견 된 셀이 새 활성 셀이됩니다.
조정
조정 단계는 현재 셀에 대한 상대적인 위치에 기초하여 상기 테이프에 다양한 세포를 조절한다. 이 섹션에는 +-><
명령 만 포함되어 있으므로 이러한 조정은 무조건 수행됩니다. 그러나 모든 카운터 관련 셀이 Golomb 눈금자 패턴이기 때문에 현재 활성 셀에 적합하지 않은 조정은 모든 중요한 셀을 놓치고 대신 부적합한 셀을 조정합니다 (홀수 유지).
따라서 조정은 상대적 위치만을 기반으로하기 때문에 활성 셀의 자체 조정을 제외하고 가능한 모든 활성 및 조정 셀 쌍에 대해 별도의 코드가 프로그램에 포함 되어야합니다.
필요한 조정은 다음과 같습니다.
- 이전 카운터의 폴백 셀 를 조정하십시오 .u(x)−2R
- 현재 카운터의 대체 세포 조절 에 의해 , 제외 현재 액티브 셀인지 우리는 중단되도록한다.u(y)2RV ( H )v(h)
- 다음 카운터의 값 셀 를 (카운터 감소).v((y+1)modc)−2
- 활성 셀이 값 셀 (카운터 가 0에 도달 한 경우) TWM 트리거 맵에서 모든 값 셀 를 만큼 조정하십시오 . 자체는 의해 조정됩니다 .v(y)yv(z)2f(y,z)v(y)2R
위의 첫 번째 및 두 번째 조정은 모든 활성 셀 이 동일한 값, 즉 값 셀의 경우 폴백 셀의 경우 자체 조정해야한다는 사실에 의해 필요합니다 . 이를 위해서는 대체 셀을 준비하고 정리 하여 값 및 대체 브랜치에서 모두 으로 돌아 오도록해야합니다 .2R0
외부 루프의 끝
움직임 는 조정 단계의 끝에서 테이프 포인터가 활성 셀의 왼쪽 으로 위치 이동 한다는 것을 나타낸다.<
×HH
모든 활성 셀들에 대한 다른 정지 단계 카운터 값 전지보다 ,이 관련성이없는 셀 등 홀수 및 비 - 제로이고, 상기 외부 루프가 다른 반복에 대해 계속된다.v(h)
들어 , 포인터 대신에 이에 대응하는 대체 셀에 배치되는 우리가 제로로 유지하는 상기 예외를 만든되는, 프로그램이 종료되므로 최종 관통 하고 정지하고.v(h)u(h)]