튜링 머신 시뮬레이터


15

튜링 머신 시뮬레이터를 작성하십시오 .

간단히하기 위해 상태를 정수로, 기호를 문자로, 공백 기호를 공백으로 가정 할 수 있습니다.

현재 상태, 입력 기호, 다음 상태, 출력 기호, 방향 (왼쪽 또는 오른쪽)의 형태로 5 튜플 순서는 필수는 아니지만 교체 여부를 지정하십시오.

알 수없는 상태에 도달하면 정지 조건이 없어야합니다.

테이프는 양방향으로 무한하며 항상 빈 문자를 읽을 수 있습니다.

입력 : 초기 테이프, 초기 상태 및 프로그램. 원하는 형식으로 어디서나 데이터를 자유롭게 읽을 수 있습니다

출력 : 프로그램 실행 후 테이프

필수 : 시뮬레이터 위에서 실행되는 예제 프로그램

이것은 코드 콜프이므로 가장 짧은 코드가 승리합니다.

다음 몇 시간 내에 구현 및 일부 예제 프로그램을 게시하겠습니다.


답변:


2

GolfScript, 92 자

~:m;n\+{:^.n?)>1<]m{2<1$=},.{~2>~^n/~1>[@\+]n*1$%n/~\1$1<+[\1>.!{;" "}*]n*\%@}{;;^0}if}do n-

GolfScript의 튜링 머신이 의도 한 것보다 훨씬 길어졌습니다. 테이프의 다른 표현으로 여전히 놀고 있습니다.

입력의 첫 번째 줄은 원래 상태이고, 두 번째 줄은 초기 테이프이며, 전환 배열 (순서 현재 상태, 입력 기호, 다음 상태, 방향, 출력 기호)이 이어집니다.

예 ( 온라인 에서도 사용 가능 )

> 0
> '101'
> [[0 '0' 0 1 '0']
>  [0 '1' 0 1 '1']
>  [0 ' ' 1 -1 ' ']
>  [1 '0' 2 1 '1']
>  [1 '1' 3 -1 '0']
>  [3 '0' 2 1 '1']
>  [3 ' ' 2 1 '1']
>  [3 '1' 3 -1 '0']] 

110 

당신은 내가 더 잘 할 수 있는지 확인하기 위해 하나 개의 문자, 시간 내 나오지 구현을 이길
제프 리디

7

GNU 함께 나오지 -r- 133 개 117 111 93 문자

예, sed는 튜링이 완료되었습니다. GNU sed 및 -r(확장 정규식)은 몇 개의 문자 만 저장하기위한 것이며 POSIX sed에서 작업하기위한 작은 변경 일뿐입니다.

:s
s/^(.*@)(.*)>(.)(.*#\1\3([^@]*@)(..))/\5\2\6>\4/
T
s/(..)l>|r>/>\1/
s/>@/@> /
s/>#/> #/
bs

입력 형식은

[initial state]@[non-empty tape with > marking head position]#[state]@[input symbol][next state]@[output symbol][direction l or r]#...

구분자 @, #머리 문자는 >테이프의 상징으로 사용할 수 없습니다. 상태 레이블은 @ >또는을 포함 할 수 없습니다 #.

입력 당 모든 프로그램을 한 줄에 하나씩 실행합니다.

예 :

마르코의 a n b n 프로그램

입력

0@>aaabbb#0@a1@ r#0@ 4@ r#1@a1@ar#1@b1@br#1@ 2@ l#2@b3@ l#2@a5@al#3@b3@bl#3@a3@al#3@ 0@ r#4@ 5@Tr

산출

5@    T>  #0@a1@ r#0@ 4@ r#1@a1@ar#1@b1@br#1@ 2@ l#2@b3@ l#2@a5@al#3@b3@bl#3@a3@al#3@ 0@ r#4@ 5@Tr

마르코의 안녕! 프로그램

입력

0@> #0@ 1@Hr#1@ 2@er#2@ 3@lr#3@ 4@lr#4@ 5@or#5@ 6@!r

산출

6@Hello!> #0@ 1@Hr#1@ 2@er#2@ 3@lr#3@ 4@lr#4@ 5@or#5@ 6@!r

7

그래서 나는 조금 늦었지만 여기에 남겨 두겠다고 생각했습니다 ...

튜링 머신 튜링 머신 시뮬레이션 : 370 바이트?

여기 1936 년 논문 에서 사용 된 Turing 구조를 사용하고 있습니다. m-config 및 연산을 포함하여 하나의 기호 = 1 바이트를 사용하고 있습니다.

╔═══════════════╦═══════╦═══════════════════╦═══════════════╗
║    m-config    ║ Symbol ║     Operations      ║ Final m-config ║
╠═══════════════╬═══════╬═══════════════════╬═══════════════╣
║ currentCommand ║ Any    ║ L                   ║ currentCommand ║
║                ║ *      ║ MR                  ║ readCommand    ║
╠----------------╬--------╬---------------------╬----------------╣
║ nextCommand    ║ Any    ║ L                   ║ nextCommand    ║
║                ║ *      ║ E  R  R  R  P* R    ║ readCommand    ║
╠----------------╬--------╬---------------------╬----------------╣
║ readCommand    ║ P      ║ R                   ║ readCommandP   ║
║                ║ M      ║ R                   ║ readCommandM   ║
║                ║ G      ║ R                   ║ readCommandG   ║
║                ║ E      ║ R                   ║ MHPNone        ║
╠----------------╬--------╬---------------------╬----------------╣
║ readCommandP   ║ 0      ║                     ║ MHP0           ║
║                ║ 1      ║                     ║ MHP1           ║
║                ║ e      ║                     ║ MHPe           ║
║                ║ x      ║                     ║ MHPx           ║
║                ║ None   ║                     ║ MHPNone        ║
╠----------------╬--------╬---------------------╬----------------╣
║ readCommandM   ║ R      ║                     ║ MHMR           ║
║                ║ L      ║                     ║ MHML           ║
╠----------------╬--------╬---------------------╬----------------╣
║ readCommandG   ║ 1      ║                     ║ G2<1           ║
║                ║ 2      ║                     ║ G2<2           ║
║                ║ 3      ║                     ║ G2<3           ║
║                ║ 4      ║                     ║ G2<4           ║
║                ║ 5      ║                     ║ G2<5           ║
╠----------------╬--------╬---------------------╬----------------╣
║ G2<1           ║ int(1) ║ L  P@ R  R  R  P* R ║ GTS            ║
║                ║ <      ║                     ║ G21            ║
║                ║ *      ║ E  L                ║ G2<1           ║
║                ║ @      ║ E  L                ║ G2<1           ║
║                ║ Any    ║ L                   ║ G2<1           ║
╠----------------╬--------╬---------------------╬----------------╣
║ G2<2           ║ int(2) ║ L  P@ R  R  R  P* R ║ GTS            ║
║                ║ <      ║                     ║ G22            ║
║                ║ *      ║ E  L                ║ G2<2           ║
║                ║ @      ║ E  L                ║ G2<2           ║
║                ║ Any    ║ L                   ║ G2<2           ║
╠----------------╬--------╬---------------------╬----------------╣
║ G2<3           ║ int(3) ║ L  P@ R  R  R  P* R ║ GTS            ║
║                ║ <      ║                     ║ G23            ║
║                ║ *      ║ E  L                ║ G2<3           ║
║                ║ @      ║ E  L                ║ G2<3           ║
║                ║ Any    ║ L                   ║ G2<3           ║
╠----------------╬--------╬---------------------╬----------------╣
║ G2<4           ║ int(4) ║ L  P@ R  R  R  P* R ║ GTS            ║
║                ║ <      ║                     ║ G24            ║
║                ║ *      ║ E  L                ║ G2<4           ║
║                ║ @      ║ E  L                ║ G2<4           ║
║                ║ Any    ║ L                   ║ G2<4           ║
╠----------------╬--------╬---------------------╬----------------╣
║ G2<5           ║ int(5) ║ L  P@ R  R  R  P* R ║ GTS            ║
║                ║ <      ║                     ║ G25            ║
║                ║ *      ║ E  L                ║ G2<5           ║
║                ║ @      ║ E  L                ║ G2<5           ║
║                ║ Any    ║ L                   ║ G2<5           ║
╠----------------╬--------╬---------------------╬----------------╣
║ G21            ║ int(1) ║ L  P@ R             ║ GTS            ║
║                ║ Any    ║ R                   ║ G21            ║
╠----------------╬--------╬---------------------╬----------------╣
║ G22            ║ int(2) ║ L  P@ R             ║ GTS            ║
║                ║ Any    ║ R                   ║ G22            ║
╠----------------╬--------╬---------------------╬----------------╣
║ G23            ║ int(3) ║ L  P@ R             ║ GTS            ║
║                ║ Any    ║ R                   ║ G23            ║
╠----------------╬--------╬---------------------╬----------------╣
║ G24            ║ int(4) ║ L  P@ R             ║ GTS            ║
║                ║ Any    ║ R                   ║ G24            ║
╠----------------╬--------╬---------------------╬----------------╣
║ G25            ║ int(5) ║ L  P@ R             ║ GTS            ║
║                ║ Any    ║ R                   ║ G25            ║
╠----------------╬--------╬---------------------╬----------------╣
║ GTS            ║ ^      ║ R                   ║ TS             ║
║                ║ Any    ║ R                   ║ GTS            ║
╠----------------╬--------╬---------------------╬----------------╣
║ TS             ║ 0      ║                     ║ RL0            ║
║                ║ 1      ║                     ║ RL1            ║
║                ║ e      ║                     ║ RLe            ║
║                ║ x      ║                     ║ RLx            ║
║                ║ None   ║                     ║ RLNone         ║
╠----------------╬--------╬---------------------╬----------------╣
║ RL0            ║ @      ║ R  R                ║ GTS0           ║
║                ║ Any    ║ L                   ║ RL0            ║
╠----------------╬--------╬---------------------╬----------------╣
║ RL1            ║ @      ║ R  R                ║ GTS1           ║
║                ║ Any    ║ L                   ║ RL1            ║
╠----------------╬--------╬---------------------╬----------------╣
║ RLe            ║ @      ║ R  R                ║ GTSe           ║
║                ║ Any    ║ L                   ║ RLe            ║
╠----------------╬--------╬---------------------╬----------------╣
║ RLx            ║ @      ║ R  R                ║ GTSx           ║
║                ║ Any    ║ L                   ║ RLx            ║
╠----------------╬--------╬---------------------╬----------------╣
║ RLNone         ║ @      ║ R  R                ║ GTSNone        ║
║                ║ Any    ║ L                   ║ RLNone         ║
╠----------------╬--------╬---------------------╬----------------╣
║ GTS0           ║ 0      ║ R  P*  R            ║ readCommand    ║
║                ║ Any    ║ R                   ║ GTS0           ║
╠----------------╬--------╬---------------------╬----------------╣
║ GTS1           ║ 1      ║ R  P*  R            ║ readCommand    ║
║                ║ Any    ║ R                   ║ GTS1           ║
╠----------------╬--------╬---------------------╬----------------╣
║ GTSe           ║ e      ║ R  P*  R            ║ readCommand    ║
║                ║ Any    ║ R                   ║ GTSe           ║
╠----------------╬--------╬---------------------╬----------------╣
║ GTSx           ║ x      ║ R  P*  R            ║ readCommand    ║
║                ║ Any    ║ R                   ║ GTSx           ║
╠----------------╬--------╬---------------------╬----------------╣
║ GTSNone        ║ _      ║ R  P*  R            ║ readCommand    ║
║                ║ Any    ║ R                   ║ GTSNone        ║
╠----------------╬--------╬---------------------╬----------------╣
║ MHP0           ║ ^      ║ R                   ║ Print0         ║
║                ║ Any    ║ R                   ║ MHP0           ║
╠----------------╬--------╬---------------------╬----------------╣
║ MHP1           ║ ^      ║ R                   ║ Print1         ║
║                ║ Any    ║ R                   ║ MHP1           ║
╠----------------╬--------╬---------------------╬----------------╣
║ MHPe           ║ ^      ║ R                   ║ Printe         ║
║                ║ Any    ║ R                   ║ MHPe           ║
╠----------------╬--------╬---------------------╬----------------╣
║ MHPx           ║ ^      ║ R                   ║ Printx         ║
║                ║ Any    ║ R                   ║ MHPx           ║
╠----------------╬--------╬---------------------╬----------------╣
║ MHPNone        ║ ^      ║ R                   ║ PrintNone      ║
║                ║ Any    ║ R                   ║ MHPNone        ║
╠----------------╬--------╬---------------------╬----------------╣
║ MHMR           ║ ^      ║ R  R                ║ MHR            ║
║                ║ Any    ║ R                   ║ MHMR           ║
╠----------------╬--------╬---------------------╬----------------╣
║ MHML           ║ ^      ║ L                   ║ MHL            ║
║                ║ Any    ║ R                   ║ MHML           ║
╠----------------╬--------╬---------------------╬----------------╣
║ Print0         ║ ^      ║ R                   ║ Print0         ║
║                ║ None   ║ P0                  ║ nextCommand    ║
║                ║ Any    ║ E                   ║ Print0         ║
╠----------------╬--------╬---------------------╬----------------╣
║ Print1         ║ ^      ║ R                   ║ Print1         ║
║                ║ None   ║ P1                  ║ nextCommand    ║
║                ║ Any    ║ E                   ║ Print1         ║
╠----------------╬--------╬---------------------╬----------------╣
║ Printx         ║ ^      ║ R                   ║ Printx         ║
║                ║ None   ║ Px                  ║ nextCommand    ║
║                ║ Any    ║ E                   ║ Printx         ║
╠----------------╬--------╬---------------------╬----------------╣
║ Printe         ║ ^      ║ R                   ║ Printe         ║
║                ║ None   ║ Pe                  ║ nextCommand    ║
║                ║ Any    ║ E                   ║ Printe         ║
╠----------------╬--------╬---------------------╬----------------╣
║ PrintNone      ║ ^      ║ R                   ║ PrintNone      ║
║                ║ None   ║                     ║ nextCommand    ║
║                ║ Any    ║ E                   ║ PrintNone      ║
╠----------------╬--------╬---------------------╬----------------╣
║ MHL            ║ ^      ║ R  R                ║ MHL            ║
║                ║ [      ║                     ║ SBL            ║
║                ║ Any    ║ L  P^ R  R  E       ║ nextCommand    ║
╠----------------╬--------╬---------------------╬----------------╣
║ MHR            ║ ^      ║ R  R                ║ MHR            ║
║                ║ ]      ║                     ║ SBR            ║
║                ║ None   ║ P^ L  L  E          ║ nextCommand    ║
╠----------------╬--------╬---------------------╬----------------╣
║ SBR            ║ ]      ║ E  R  R  P]         ║ currentCommand ║
╠----------------╬--------╬---------------------╬----------------╣
║ SBL            ║ ]      ║ R                   ║ SBLE           ║
║                ║ Any    ║ R                   ║ SBL            ║
╠----------------╬--------╬---------------------╬----------------╣
║ SBLE           ║ [      ║                     ║ currentCommand ║
║                ║ None   ║ L                   ║ SBLE           ║
║                ║ Any    ║ E  R  R  P] L       ║ SBLE           ║
╚═══════════════╩═══════╩═══════════════════╩═══════════════╝

내 컴퓨터에 대한 위의 논문에서 튜링의 예 중 하나는 다음과 같습니다.

['<', None, 1, '0', None, 'P', 'e', None, 'M', 'R', None, 'P', 'e', None, 'M', 'R', None, 'P', '0', None, 'M', 'R', None, 'M', 'R', None, 'P', '0', None, 'M', 'L', None, 'M', 'L', None, 'G', '2',
                      '1', None, 'P', 'e', None, 'M', 'R', None, 'P', 'e', None, 'M', 'R', None, 'P', '0', None, 'M', 'R', None, 'M', 'R', None, 'P', '0', None, 'M', 'L', None, 'M', 'L', None, 'G', '2',
                      'e', None, 'P', 'e', None, 'M', 'R', None, 'P', 'e', None, 'M', 'R', None, 'P', '0', None, 'M', 'R', None, 'M', 'R', None, 'P', '0', None, 'M', 'L', None, 'M', 'L', None, 'G', '2',
                      'x', None, 'P', 'e', None, 'M', 'R', None, 'P', 'e', None, 'M', 'R', None, 'P', '0', None, 'M', 'R', None, 'M', 'R', None, 'P', '0', None, 'M', 'L', None, 'M', 'L', None, 'G', '2',
                      '_', None, 'P', 'e', None, 'M', 'R', None, 'P', 'e', None, 'M', 'R', None, 'P', '0', None, 'M', 'R', None, 'M', 'R', None, 'P', '0', None, 'M', 'L', None, 'M', 'L', None, 'G', '2',

             None, 2, '1', None, 'M', 'R', None, 'P', 'x', None, 'M', 'L', None, 'M', 'L', None, 'M', 'L', None, 'G', '2',
                      '0', None, 'G', '3',

             None, 3, '0', None, 'M', 'R', None, 'M', 'R', None, 'G', '3',
                      '1', None, 'M', 'R', None, 'M', 'R', None, 'G', '3',
                      '_', None, 'P', '1', None, 'M', 'L', None, 'G', '4',

             None, 4, 'x', None, 'E', 'E', None, 'M', 'R', None, 'G', '3',
                      'e', None, 'M', 'R', None, 'G', '5',
                      '_', None, 'M', 'L', None, 'M', 'L', None, 'G', '4',

             None, 5, '0', None, 'M', 'R', None, 'M', 'R', None, 'G', '5',
                      '1', None, 'M', 'R', None, 'M', 'R', None, 'G', '5',
                      'e', None, 'M', 'R', None, 'M', 'R', None, 'G', '5',
                      'x', None, 'M', 'R', None, 'M', 'R', None, 'G', '5',
                      '_', None, 'P', '0', None, 'M', 'L', None, 'M', 'L', None, 'G', '2',
        None, '[', '^', None, ']', None]

온라인으로 사용해보십시오! (Python 3을 인터프리터로 사용)-편집 : 방금 TIO를 확인했는데 실제로 제대로 작동하지 않는 것 같습니다 ... 로컬 컴퓨터에서 시도해보십시오. 그것은 내 것입니다.


의도는 없으며 테이블의 테두리를 정렬하기 만하면됩니다.
Greg Bacon

@GregBacon 위반 없음 ... 아마도 다른 컴퓨터가 코드 블록을 렌더링하는 방법에 약간의 차이가있을 수 있지만 편집으로 인해 편집 화면에서 정렬이 훨씬 더 나빠질 수 있습니다. 문제가 무엇인지 확실하지 않음
bendl

3

APL (110)

(그만큼 짧지는 않습니다 ...)

0(''⍞){×⍴X←0~⍨⍺∘{x y S T s m t←⍺,⍵⋄S T≡x,⊃⊃⌽y:s,⊂(⊃y){m:(¯1↓⍺)(⍵,⍨¯1↑⍺)⋄(⍺,⊃⍵)(1↓⍵)}t,1↓⊃⌽y⋄0}¨⍵:⍵∇⍨⊃X⋄,/⊃⌽⍺}⎕

키보드에서 두 줄을 읽습니다. 첫 번째는 프로그램이고 두 번째는 초기 테이프입니다.

형식은

(in-state in-tape out-state movement out-tape) 

그리고 모두 같은 줄에 있어야합니다. '움직임'은 오른쪽으로 이동하려면 0이고 왼쪽으로 이동하려면 1입니다.

예제 프로그램 (명확성을 위해 삽입 된 줄 바꿈, 모두 한 줄에 있어야합니다.)

(0 ' ' 1 0 '1')
(0 '1' 0 0 '1')
(1 '1' 1 0 '1')
(1 ' ' 2 1 ' ')
(2 '1' 3 1 ' ')

프로그램은 두 개의 단항 숫자를 함께 더합니다. 예를 들면 다음과 같습니다.

in:  1111 111
out: 1111111

예제 2 (Marco Martinelli의 항목에서 이진 증분 프로그램에서 수정) :

(0 '0' 0 0 '0')
(0 '1' 0 0 '1')
(0 ' ' 1 1 ' ')
(1 '0' 2 0 '1')
(1 '1' 3 1 '0')
(3 '0' 2 0 '1')
(3 ' ' 2 0 '1')
(3 '1' 3 1 '0')

어떻게하면 되나요? 나는 리눅스를 사용하고 aplus로 시도했지만 작동하지 않습니다 (정의되지 않은 토큰 :(). 어떤 인터프리터 / 컴파일러를 사용해야합니까?
Marco Martinelli

Dyalog APL을 사용하고 있습니다. Dyalog 관련 기능을 사용하는 것을 알고 있지 않지만 A +는 완전히 같은 것은 아닙니다. Dyalog의 무료 버전이 있지만 Windows 전용입니다. (와인에서 실행될 수 있지만 자체 입력 방법을 사용하여 APL을 입력 할 수 있습니다.) Dyalog를 실행하는 경우 APL 코드 (한 줄)를 입력 / 붙여 넣기 한 다음 Turing 머신 프로그램 (두 번째 줄)을 입력 / 붙여 넣기 만하면됩니다. ), 첫 번째 테이프 (세 번째 줄)
marinus

알겠습니다. 감사합니다
Marco Martinelli

3

파이썬 101 189 152 142

a=dict(zip(range(len(b)),b))
r=eval(p)
i=s=0
while 1:
 c=a.get(i,' ')
 s,m,a[i]=r[s,c]
 if 0==m:exit([x[1]for x in sorted(a.items())])
 i=i+m

b와 p는 입력이고, b는 초기 테이프이며, p는 규칙을 (상태에서, 테이프 내) 튜플에서 (상태에서, 헤드 이동, 테이프 외) 튜플로의 (문자열 표현)으로 인코딩합니다. . 이동이 0이면 프로그램이 완료되고 1이 오른쪽으로 이동하고 -1이 왼쪽으로 이동합니다.

b="aaba"

p="""{(0, 'a'): (1, 1, 'a'),
      (0, 'b'): (0, 1, 'b'),
      (1, 'a'): (1, 1, 'a'),
      (1, 'b'): (0, 1, 'b'),
      (1, ' '): (1, 0, 'Y'),
      (0, ' '): (0, 0, 'N')}"""

이 샘플 프로그램은 문자열의 마지막 문자 (빈 테이프 이전)가 'a'인지 테스트하여 문자열의 끝에 'Y'를 기록합니다 (첫 번째 빈 공간).

편집 1 :

테이프가 확장 가능한 데이터 구조를 작성하는 가장 짧은 방법 인 것처럼 보이기 때문에 dict로 표시되도록 변경했습니다. 두 번째 줄부터 마지막 ​​줄은 주로 출력을 위해 읽을 수있는 형태로 다시 변환하는 것입니다.

편집 2 :

많은 개선을위한 Strigoides에 감사드립니다.

편집 3 :

출력이 그대로 자리를 떠나기 때문에 불필요하게 0으로 만들었습니다. 항상 출력을 입력과 동일하게 쓸 수 있으므로 이것을 제거했습니다.


귀하의 구현에서 테이프가 제한되어 있기 때문에 이것이 유효한 솔루션이라고 생각하지 않습니다. 이런 식으로 프로그램의 메모리 소비를 미리 알아야합니다. 그리고 왼쪽으로 이동하는 데 문제가 있습니다. 힌트 : 두 개의 수정 된 스택으로 테이프를 만들 수 있으며 항상 빈 기호를 표시 할 수 있습니다.
Marco Martinelli

아 맞아 미안, 너무 멀리 생각하지 않았다.
shiona

음 .. afaik 테이프는 양방향으로 무한하며 항상 빈 문자를 읽을 수 있습니다. 나는 대답에서 그것을 지정할 것입니다.
Marco Martinelli

당신은 정확했습니다 (우리는 연습에서 더 엄격한 규칙을 가졌습니다). 나는 결함의 적어도 일부를 수정했습니다.
shiona

당신은 첫 번째 줄에 공간을 제거 할 수 있습니다 r=0;s=0될 수 있습니다 r=s=0, 당신이 기능을 제거 할 수 있습니다 (그 줄의 끝에 세미콜론이 필요하지 않습니다) w가 사용되지 않는 한, 괄호를 제거 할 수 있습니다, (s,m,t)=r[s,c]1, try/의 except블록이 단축 될 수 있습니다 dict.get 사용; c=a.get(i,' '), m는 0 또는 1 if m-1:이므로을 사용할 수 map()있으며 목록 이해로 변환 하여 통화를 줄일 수 있습니다 .
Strigoides

3

추신 (205) (156) (150) (135)

<<
>>begin
/${stopped}def([){add dup{load}${exit}if}def
0 A{1 index{load}${pop( )}if
get{exec}${exit}if}loop
3{-1[pop}loop{1[print}loop

이것은 부정 행위 일 수 있지만 전환 테이블에는 전환을 수행하는 코드가 포함되어 있습니다. 그리고 테이프는 정수에서 정수로의 매핑으로 표시되므로 상태를 이름에서 사전으로의 매핑으로 나타내므로 테이프와 프로그램이 동일한 익명 사전에 공존합니다.

모든 상태 이름을 실행 가능하게하여 추가 비용을 절약하므로 자동로드 됩니다.

임베디드 "Hello"프로그램이 포함되어 있습니다. 추가 52 문자는 stdin에서 테이프를 읽기 위해 루프를 구입합니다.로 실행하십시오 gsnd -q tm.ps.

%!
<<
    /A<<( ){dup(H)def 1 add B}>>
    /B<<( ){dup(e)def 1 add C}>>
    /C<<( ){dup(l)def 1 add D}>>
    /D<<( ){dup(l)def 1 add E}>>
    /E<<( ){dup(o)def 1 add F}>>
>>begin %ds: int-keys=tape name-keys=prog
0 A %pos state
{ %loop
    1 index{load}stopped{pop( )}if  %pos state tape(pos)
    get    {exec}stopped{exit  }if  %new-pos new-state
} loop
% Loop from tape position 0 to left until left tape end is found
0{                                  %pos
  -1 add                            %new-pos
  dup{load}stopped{exit}if          %new-pos tape(new-pos)
  pop                               %new-pos tape(new-pos)
}loop
% Move to the right and print all chars until right end is hit
{                                   %pos
  1 add                             %new-pos
  dup{load}stopped{exit}if          %new-pos tape(new-pos)
  print                             %new-pos tape(new-pos)
}loop

그래서 테이블 형식은

/in-state<<in-tape{dup out-tape def movement add out-state}
           in-tape2{dup out-tape2 def movement2 add out-state2}>>

여기서 in-state이름입니다, in-tape그리고 out-tape문자 (예. 정수 또는 정수를 산출하는 표현)입니다 movement입니다 -1왼쪽 또는 1권리를 위해, 그리고 out-state입니다 실행 파일 이름을 입력합니다. in-tape동일한 상태에 대한 다중 전이는 위와 같이 결합되어야합니다.


또 다른 문제는 테이프의 어떤 부분이 흥미로운 지 발견 할 준비가 없다는 것입니다. 그것은 꽤 많은 비용이 듭니다 currentdict{search-for-min-and-max}forall juggle-params-for-for. :(
luser droog

내 자신을 시험해 보았지만 간결함을 초월했습니다. 그러나 코드 개선 사항을 제안했습니다.
Thomas W.

BTW, 초기 테이프는 어떻습니까? 작업을 수행하지 않는 것처럼 보이기 때문에 코드가없는 코드에서 주석 처리 된 행을 제거했습니다. ( "0 not"은 -1을 반환하므로 루프가 반복되지 않습니다.)
Thomas W.

뛰어난 개선! ... 초기 테이프 코드에 대해서는 노트북에서 잘못 입력 한 것 같습니다. SB 0 1 0 not{(%stdin)(r)file read not{exit}if def}for. 왜 내가 골프 버전에서 그것을 생략하여 벗어날 수 있다고 생각했는지 모르겠습니다. : P
luser droog

잠깐만, -1! 그렇다면 0 not이어야합니다 16#7fffffff. 죄송합니다. 아하! 그것이 주석 처리 된 이유입니다! 노트북에서 바로 나오고 테스트를 거치지 않았으며 골프를 치지 않을 때 모든 주석을 다듬 었습니다. 파이썬 사람에게 말하지 마십시오! : P
luser droog

2

C (아직 골프하지 않음)

나는 이것으로 이길 수 없다고 생각하지만 여전히 작동하는 것은 재미있었습니다. 이것은 정말 지금보다 더 사실이다 않는 작품. :)

한 방향으로 만 무한하다는 것을 제외하고. 네거티브 테이프도 필요하다고 생각합니다. 한숨....

부정적인 것은 그리 나쁘지 않았습니다. 우리는 짝수와 확률로 양면을 인터리브합니다. 이제는 파일 자체가 뒤죽박죽 으로 테이프를 순차적으로 표시해야합니다 . 이것은 합법적 인 변경이라고 생각합니다. 튜링 자신은 이런 식으로 단순화되었습니다.

#include<stdio.h>
int main(int c, char**v){
    int min=0,max=0;
    int pos=0,qi;sscanf(v[1],"%d",&qi);
    FILE*tab=fopen(v[2],"r");
    FILE*tape=fopen(v[3],"r+");
    setbuf(tape,NULL);
    do {
        min = pos<min? pos: min;
        max = pos>max? pos: max;
        fseek(tape,(long)(abs(pos)*2)-(pos<0),SEEK_SET);
        int c = fgetc(tape), qt=qi-1,qr;
        fseek(tape,(long)(abs(pos)*2)-(pos<0),SEEK_SET);
        char x = c==EOF?' ':c, xt=x-1,xr,d[2];
        if (x == '\n') x = ' ';
printf("%d '%c' %d (%d)\n", qi, x, pos, (int)ftell(tape));
        while((qt!=qi)||(xt!=x)){
            fscanf(tab, "%d '%c' %d '%c' %1[LRN]", &qt, &xt, &qr, &xr, d);
            if (feof(tab)){
                goto HALT;
            }
printf("%d '%c' %d '%c' %s\n", qt, xt, qr, xr, d);
        }
        qi=qr;
        rewind(tab);
        fputc(xr,tape);
        pos+=*d=='L'?-1:*d=='R'?1:0;
    } while(1);
HALT:
printf("[%d .. %d]:\n", min, max);
    for (pos = min; pos <= max; pos++){
        fseek(tape,(long)(abs(pos)*2)-(pos<0),SEEK_SET);
        //printf("%d ",pos);
        putchar(fgetc(tape));
        //puts("");
    }
    return qi;
}

그리고 테스트 실행은 다음과 같습니다.

522(1)04:33 AM:~ 0> cat bab.tm
0 'a' 0 'b' R
0 'b' 0 'a' R
523(1)04:33 AM:~ 0> echo aaaaa > blank; make tm ; tm 0 bab.tm blank; echo; cat blank
make: `tm' is up to date.
0 'a' 0 (0)
0 'a' 0 'b' R
0 'a' 1 (2)
0 'a' 0 'b' R
0 'a' 2 (4)
0 'a' 0 'b' R
0 ' ' 3 (6)
0 'a' 0 'b' R
0 'b' 0 'a' R
[0 .. 3]:
bbbÿ
babab

프로그램은 테이프를 순차적으로 출력하지만 파일은 삽입 된 음과 양을 나타냅니다.


구현에 문제가 있습니다. a와 b 0 'a' 0 'b' R; 0 'b' 0 'a' R를 입력 aaa로 바꾸는이 프로그램을 사용해보십시오 . 출력은 bbb 대신 bab입니다. 그리고 왼쪽으로 이동하는 데 문제가 있습니다.
Marco Martinelli

관심을 가져 주셔서 감사합니다! 두 가지 업데이트 모두 수정되었습니다.
luser droog

흠 .. 아직 밥을 먹다
Marco Martinelli

네,하지만 이번에는 맞습니다! 'aaa'는 테이프의 위치 [0, -1,1]에 해당합니다. 그러나 이것을 보여야하는 결과물에는 분명히 작업이 필요합니다.
luser droog

1

당연 234 228 154 153 149 139 124

n=[:];i=0;t={it.each{n[i++]=it};i=0};e={p,s->a=p[s,n[i]?:' '];if(a){n[i]=a[1];i+=a[2];e(p,a[0])}else n.sort()*.value.join()}

가독성을위한 형식

n=[:];
i=0;
t={it.each{n[i++]=it};i=0};
e={p,s->
    a=p[s,n[i]?:' '];
    if(a){
        n[i]=a[1];
        i+=a[2];
        e(p,a[0])
    }else n.sort()*.value.join()
}

t는 테이프를 설정하는 기능입니다. e는 프로그램을 평가하는 기능입니다.

예 1- "Hello!"인쇄 테이프에 :)

t('')
e([[0,' ']:[1,'H',1],
   [1,' ']:[2,'e',1],
   [2,' ']:[3,'l',1],
   [3,' ']:[4,'l',1],
   [4,' ']:[5,'o',1],
   [5,' ']:[6,'!',1]],0)

예 2-초기 문자열이 n b n 형식 인 경우 테이프에 T를 두십시오 . 그렇지 않으면 중지하십시오.

t('aaabbb')
e([[0,'a']:[1,' ',1],
   [0,' ']:[4,' ',1],
   [1,'a']:[1,'a',1],
   [1,'b']:[1,'b',1],
   [1,' ']:[2,' ',-1],
   [2,'b']:[3,' ',-1],
   [2,'a']:[5,'a',-1],
   [3,'b']:[3,'b',-1],
   [3,'a']:[3,'a',-1],
   [3,' ']:[0,' ',1],
   [4,' ']:[5,'T',1]],0)

예 3-이진수의 증가

t('101')
e([[0,'0']:[0,'0',1],
   [0,'1']:[0,'1',1],
   [0,' ']:[1,' ',-1],
   [1,'0']:[2,'1',1],
   [1,'1']:[3,'0',-1],
   [3,'0']:[2,'1',1],
   [3,' ']:[2,'1',1],
   [3,'1']:[3,'0',-1]],0)

예제에서 1은 오른쪽으로 이동하고 -1은 왼쪽으로 이동하는 것을 의미합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.