Mô phỏng máy Turing


15

Viết một trình giả lập máy Turing .

Để đơn giản, chúng ta có thể giả sử các trạng thái là số nguyên, ký hiệu là char, ký hiệu trống bằng khoảng trắng

5-tuple ở dạng trạng thái hiện tại, ký hiệu đầu vào, trạng thái tiếp theo, ký hiệu đầu ra, hướng (trái hoặc phải) thứ tự không bắt buộc nhưng chỉ định nếu bạn trao đổi nó

Máy phải dừng khi đạt đến trạng thái không xác định, không cho phép điều kiện dừng khác.

Băng là vô hạn theo cả hai hướng và bạn luôn có thể đọc một ký tự trống.

Đầu vào: băng ban đầu, trạng thái ban đầu và chương trình. bạn có thể đọc dữ liệu từ bất cứ đâu theo định dạng bạn thích

Đầu ra: băng sau khi thực hiện chương trình

Bắt buộc: một chương trình ví dụ chạy trên trình giả lập của bạn

Đây là một colf code nên mã ngắn nhất sẽ giành chiến thắng.

Tôi sẽ đăng một triển khai và một số chương trình ví dụ trong vài giờ tới.


Câu trả lời:


2

GolfScript, 92 ký tự

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

Máy Turing trong GolfScript trở nên dài hơn nhiều so với dự định. Vẫn chơi xung quanh với các đại diện khác nhau của băng.

Dòng đầu tiên của đầu vào là trạng thái ban đầu, dòng thứ hai là băng ban đầu, theo sau là một mảng chuyển tiếp (với trạng thái hiện tại thứ tự, ký hiệu đầu vào, trạng thái tiếp theo, hướng, ký hiệu đầu ra).

Ví dụ (cũng có sẵn trực tuyến )

> 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 

bạn đánh bại việc thực hiện sed của tôi bằng một char, thời gian để xem liệu tôi có thể làm tốt hơn không
Geoff Reedy

7

GNU sed với -r- 133 117 111 93 ký tự

Vâng, sed là hoàn thành. GNU sed và-r (regexps mở rộng) chỉ để lưu một vài ký tự, nó chỉ là một thay đổi nhỏ để hoạt động với POSIX sed.

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

Định dạng đầu vào là

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

Delimiters @, #và nhân vật đứng đầu >không thể được sử dụng như một biểu tượng trên băng. Nhãn nhà nước không thể chứa@ > hoặc #.

Nó sẽ chạy tất cả các chương trình trong đầu vào, mỗi chương trình một dòng

Ví dụ:

Chương trình Marco n a n b n

Đầu vào

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

Đầu ra

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

Xin chào! chương trình

Đầu vào

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

Đầu ra

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

7

Vì vậy, tôi hơi muộn, nhưng chỉ nghĩ rằng tôi sẽ rời khỏi đây ...

Máy Turing Mô phỏng máy Turing: 370 byte?

Ở đây tôi đang sử dụng cấu trúc Turing được sử dụng trong bài báo năm 1936 của mình . Tôi đang sử dụng một ký hiệu = một byte, bao gồm m-config và các hoạt động.

╔═══════════════╦═══════╦═══════════════════╦═══════════════╗
║    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           ║
╚═══════════════╩═══════╩═══════════════════╩═══════════════╝

Đây là một trong những ví dụ của Turing từ bài báo trên cho máy của tôi:

['<', 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]

Hãy thử trực tuyến! (Sử dụng Python 3 làm trình thông dịch) - Chỉnh sửa: Tôi vừa kiểm tra TIO và có vẻ như nó không thực sự hoạt động đúng ... Hãy thử nó trên máy cục bộ của bạn và hy vọng nó sẽ hoạt động. Nó không thuộc về tôi.


Không có hại dự định, chỉ cần sắp xếp các đường viền trên bàn.
Greg Bacon

@GregBacon Không có hành vi phạm tội nào ... có lẽ có một số khác biệt giữa cách các máy tính khác nhau tạo ra các loại tiền mã hóa, nhưng chỉnh sửa của bạn làm cho việc căn chỉnh trở nên tồi tệ hơn nhiều trên màn hình chỉnh sửa của tôi ... không chắc vấn đề là gì
uốn cong

3

APL (110)

(Nó thậm chí không quá ngắn ...)

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⋄,/⊃⌽⍺}⎕

Nó đọc hai dòng từ bàn phím: đầu tiên là chương trình và thứ hai là băng ban đầu.

Định dạng là

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

và tất cả chúng nên nằm trên cùng một dòng. 'Chuyển động' là 0 để di chuyển sang phải và 1 để di chuyển sang trái.

Chương trình ví dụ (ngắt dòng được chèn cho rõ ràng, chúng nên nằm trên một dòng.)

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

Chương trình cộng hai số đơn nguyên với nhau, ví dụ:

in:  1111 111
out: 1111111

Ví dụ 2 (được điều chỉnh từ chương trình gia tăng nhị phân từ mục của 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')

Làm thế nào tôi có thể thử nó? Tôi đang sử dụng linux và đã thử với aplus nhưng nó không hoạt động (mã thông báo không xác định :(). Tôi nên thử trình thông dịch / trình biên dịch nào?
Marco Martinelli

Tôi đang sử dụng Dyalog APL. Tôi không biết sử dụng bất kỳ chức năng cụ thể nào của Dyalog nhưng A + không hoàn toàn giống nhau. Có phiên bản miễn phí của Dyalog nhưng nó chỉ dành cho Windows. (Nó có thể chạy trong Wine nhưng nó sử dụng phương thức nhập riêng của nó để bạn có thể nhập APL.) Nếu bạn chạy Dyalog, chỉ cần nhập / dán mã APL (trên một dòng), sau đó là chương trình máy Turing (trên dòng thứ hai ), sau đó băng ban đầu (trên dòng thứ ba).
bến

ok, tôi sẽ thử nó, cảm ơn bạn
Marco Martinelli

3

Con trăn, 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 và p là các đầu vào, b là băng ban đầu, p mã hóa các quy tắc dưới dạng (biểu diễn chuỗi của) một bộ ba từ (trong trạng thái, trong băng) tuple sang (ngoài trạng thái, di chuyển đầu, ngoài băng) . Nếu di chuyển là 0 thì chương trình kết thúc, 1 là di chuyển sang phải và -1 di chuyển sang trái.

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')}"""

Chương trình mẫu này kiểm tra xem chữ cái cuối cùng của chuỗi (trước băng trống) là 'a', nếu vậy nó ghi 'Y' ở cuối chuỗi (khoảng trống đầu tiên).

Chỉnh sửa 1:

Thay đổi băng được thể hiện dưới dạng chính tả, vì dường như đó là cách ngắn nhất để viết cấu trúc dữ liệu mở rộng. Dòng thứ hai đến cuối cùng chủ yếu là chuyển nó trở lại dạng có thể đọc được cho đầu ra.

Chỉnh sửa 2:

Cảm ơn Strigoides cho rất nhiều cải tiến.

Chỉnh sửa 3:

Tôi đã không cần thiết làm cho nó bằng 0 vì đầu ra sẽ rời khỏi vị trí như nó vốn có. Tôi đã loại bỏ điều này vì chúng ta luôn có thể viết đầu ra giống như đầu vào.


Tôi không nghĩ rằng đây là một giải pháp hợp lệ vì trong quá trình thực hiện của bạn, băng bị hạn chế. Bằng cách này bạn cần biết trước mức tiêu thụ bộ nhớ của chương trình. Và có vấn đề di chuyển trái. Gợi ý: một băng có thể được tạo từ hai ngăn xếp đã được sửa đổi trong đó bạn luôn có thể bật một biểu tượng trống.
Marco Martinelli

À, đúng rồi. Xin lỗi, đã không nghĩ điều này quá xa.
shiona

Uhm .. afaik băng là vô hạn theo cả hai hướng và bạn luôn có thể đọc một ký tự trống. Tôi sẽ chỉ định rằng trong câu trả lời.
Marco Martinelli

Bạn đã đúng (chúng tôi đã có quy tắc nghiêm ngặt hơn trong các bài tập của chúng tôi). Tôi đã sửa ít nhất một số sai sót.
shiona

Bạn có thể xóa khoảng trắng trong dòng đầu tiên, r=0;s=0có thể trở thành r=s=0(và dấu chấm phẩy ở cuối dòng đó là không cần thiết), bạn có thể xóa chức năng w, vì nó không được sử dụng, các dấu ngoặc có thể được loại bỏ (s,m,t)=r[s,c], khối try/ exceptcó thể được rút ngắn sử dụng dict.get; c=a.get(i,' '), vì mlà 0 hoặc 1, bạn có thể sử dụng if m-1:và bạn có thể rút ngắn map()cuộc gọi của mình bằng cách chuyển đổi nó thành một sự hiểu biết danh sách.
Strigoides

3

Bản thảo (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

Điều này có thể là gian lận, nhưng bảng chuyển đổi chứa mã để thực hiện các chuyển đổi. Và do băng được biểu thị bằng ánh xạ từ số nguyên sang số nguyên, tôi đã biểu diễn các trạng thái dưới dạng ánh xạ từ tên sang từ điển để băng và chương trình cùng tồn tại trong cùng một từ điển ẩn danh.

Tiết kiệm thêm bằng cách làm cho tất cả các tên trạng thái có thể thực thi được, để chúng tự động tải .

Ungolfed với chương trình "Hello" nhúng. Thêm 52 ký tự mua một vòng lặp để đọc băng từ stdin.Chạy với 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

Vì vậy, định dạng bảng là

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

nơi in-statelà một cái tên, in-tapeout-tapelà ký tự (ví dụ. các số nguyên, hoặc biểu thức mà năng suất số nguyên), movement-1cho trái hoặc 1cho đúng, và out-statelà một tên thực thi . Nhiều in-tapechuyển tiếp cho cùng một trạng thái phải được kết hợp như trên.


Một vấn đề khác là không có điều khoản nào để khám phá phần nào của băng thú vị. Điều đó sẽ tốn khá nhiều chi phí để làm currentdict{search-for-min-and-max}forall juggle-params-for-for. :(
luser droog

Đã thử của riêng tôi, nhưng đã vượt quá sự cụ thể của bạn. Nhưng tôi đã đề xuất một số cải tiến cho mã của bạn.
Thomas W.

BTW, những gì về các băng ban đầu? Tôi đã xóa dòng nhận xét ra khỏi mã không được đánh gôn bởi vì nó dường như không thực hiện được công việc. ("0 không" trả về -1, do đó không lặp lại vòng lặp)
Thomas W.

Cải tiến tuyệt vời! ... Về mã băng ban đầu, tôi nghĩ rằng tôi đã nhập nhầm từ sổ ghi chép của mình. SB 0 1 0 not{(%stdin)(r)file read not{exit}if def}for. Tôi không chắc tại sao tôi nghĩ rằng tôi có thể thoát khỏi việc bỏ qua điều đó từ phiên bản golf. : P
luser droog

Đợi đã, -1! Vậy thì 0 notnên 16#7fffffff. Lấy làm tiếc. Aha! đó là lý do tại sao nó được bình luận! Nó đi thẳng ra khỏi máy tính xách tay, không được kiểm tra và tôi đã cắt xén tất cả các bình luận mà không cần nhìn khi tôi đánh gôn. Đừng nói với anh chàng Python! : P
luser droog

2

C (chưa chơi gôn)

Tôi cho rằng tôi không thể chiến thắng với điều này, vẫn rất vui khi nó hoạt động. Điều này thậm chí còn đúng hơn khi nó thực sự làm việc. :)

Ngoại trừ nó chỉ vô hạn theo một hướng. Tôi cho rằng nó cũng cần một băng âm. Thở dài....

Tiêu cực không phải là quá tệ. Chúng tôi xen kẽ hai bên là evens và tỷ lệ cược. Biến chứng bây giờ là nó cần hiển thị băng theo thứ tự liên tục , vì bản thân tệp hiện bị xáo trộn. Đây là một sự thay đổi hợp pháp để thực hiện, tôi nghĩ. Turing tự đơn giản hóa theo cách này.

#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;
}

Và đây là bản chạy thử:

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

Chương trình xuất băng theo thứ tự liên tiếp, nhưng tệp đại diện cho các mặt tiêu cực và tích cực xen kẽ.


Có vấn đề với việc thực hiện của bạn. Hãy thử chương trình này hoán đổi a và b 0 'a' 0 'b' R; 0 'b' 0 'a' Rvới đầu vào aaa đầu ra là bab thay vì bbb. Và có vấn đề di chuyển trái.
Marco Martinelli

Cảm ơn vì đã chú ý! Cập nhật sửa cả hai, tôi nghĩ (hy vọng).
luser droog

uhm .. vẫn nhận được bab
Marco Martinelli

Vâng, nhưng lần này là chính xác! 'Aaa' tương ứng với các vị trí [0, -1,1] trên băng. Nhưng đầu ra cần thể hiện rõ điều này cần làm việc.
luser droog

1

Groovy 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()}

Định dạng cho dễ đọc

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 là chức năng đặt băng e là chức năng đánh giá chương trình

Ví dụ 1 - In "Xin chào!" trên băng :)

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)

Ví dụ 2 - Để lại chữ T trên băng nếu chuỗi ban đầu ở dạng a n b n , dừng lại.

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)

Ví dụ 3 - Tăng số nhị phân

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)

trong các ví dụ 1 có nghĩa là di chuyển sang phải và -1 có nghĩa là di chuyển sang trái

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.