Симулятор машини Тьюрінга


15

Напишіть тренажер машини Тьюрінга .

Для простоти ми можемо вважати статуси цілими, символи як char, порожній символ дорівнює пробілу

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 

ви перемогли мою реалізацію sed на один чар, час побачити, чи можу я зробити краще
Джефф Реді

7

GNU sed з -r- 133 117 111 93 символів

Так, сед закінчується. 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]#...

Роздільники @, #і голова персонажа >не можуть бути використані в якості символу на стрічці. Державні мітки не можуть містити @ >або #.

Він запустить усі програми на вході, по одній на рядок

Приклади:

Марко - це програма « 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 року. Я використовую один символ = один байт, включаючи m-config та операції.

╔═══════════════╦═══════╦═══════════════════╦═══════════════╗
║    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, і він, здається, насправді не працює правильно ... Спробуйте це на своїй локальній машині, і він повинен (сподіваємось) спрацювати. Це робиться на моїх.


Ніякої шкоди не передбачається, просто вирівнюючи межі столу.
Грег Бекон

@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 (адаптований з програми бінарного приросту від запису Марко Мартінеллі):

(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')

Як я можу спробувати? Я використовую linux і пробую з aplus, але він не працює (невизначений маркер :(). Якого перекладача / компілятора слід спробувати?
Marco Martinelli

Я використовую Dyalog APL. Я не знаю про використання будь-яких функцій, пов'язаних з Dyalog, але A + - це не те саме. Існує безкоштовна версія Dyalog, але це лише для Windows. (Він може працювати під Wine, але він використовує власний метод введення, щоб ви могли набрати APL.) Якщо у вас запущений Dyalog, просто введіть / вставте код APL (в одному рядку), а потім машинну програму Turing (у другому рядку ), потім початкова стрічка (на третьому рядку).
marinus

ок, я спробую це, дякую
Марко Мартінеллі

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:

Змінили стрічку, яка була представлена ​​як диктант, оскільки це здавалося найкоротшим способом написання розширюваної структури даних. Другий останній рядок здебільшого перетворює його назад у читану форму для виведення.

Редагувати 2:

Завдяки Strigoides за велику кількість вдосконалень.

Редагувати 3:

Я без зайвих зусиль зробив це так, щоб 0 як результат залишив місце, як є. Я видалив це, оскільки ми завжди можемо записати вихід таким же, як і вхід.


Я не думаю, що це правильне рішення, оскільки у вашій реалізації стрічка обмежена. Таким чином потрібно заздалегідь знати споживання пам'яті вашої програми. І виникають проблеми з переміщенням ліворуч. Підказка: стрічку можна зробити з двох модифікованих стеків, в які завжди можна вставити порожній символ.
Марко Мартінеллі

Ах, правда. Вибачте, не думав це занадто далеко.
shiona

Ага .. afaik стрічка нескінченна в обидва боки, і ви завжди можете прочитати порожній символ. Я зазначу це у відповіді.
Марко Мартінеллі

Ви були правильні (у нас були більш суворі правила в наших вправах). Я виправив хоча б деякі недоліки.
shiona

Ви можете видалити пробіл у першому рядку, r=0;s=0можете стати r=s=0(а крапка з комою в кінці цього рядка непотрібна), ви можете видалити функцію w, оскільки вона не використовується, кронштейни можуть бути видалені (s,m,t)=r[s,c], а 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

Це, мабуть, обман, але таблиця переходу містить код для виконання переходів. А оскільки стрічка представлена ​​зіставленням з цілих чисел на цілі числа, я представляв стани як відображення від імен до словників, тому стрічка та програма співіснують в одному анонімному словнику.

Додаткові заощадження, роблячи всі імена штатів виконуваними, тому вони автоматично завантажуються.

Ungolfed із вбудованою програмою "Привіт". Додаткові 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

Я спробував своє, але був набагато вищим за вашу стислість. Але я запропонував деякі вдосконалення вашого коду.
Томас В.

До речі, як щодо початкової стрічки? Я вилучив коментований рядок із коду, який не перебуває у гольфі, оскільки він, схоже, не спрацював із цією справою. ("0 не" повертає -1, тому немає повторення циклу)
Thomas W.

Відмінні покращення! ... Щодо початкового коду стрічки, я думаю, що я помилково вписав його у свій блокнот. СБ 0 1 0 not{(%stdin)(r)file read not{exit}if def}for. Я не впевнений, чому я подумав, що можу втекти, якщо пропустити це з версії для гольфу. : P
luser droog

Ой, чекай, -1! Тоді 0 notмає бути 16#7fffffff. Вибачте. Ага! ось чому це прокоментували! Він вийшов прямо із зошита, не пройшов тестування, і я обрізав усі коментарі, не дивлячись, коли я його заграв. Не кажи хлопця Python! : 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, вихід - bab замість bbb. І виникають проблеми з переміщенням ліворуч.
Марко Мартінеллі

Дякую за увагу! Оновлення виправляє обидва, я думаю (сподіваюся).
luser droog

гмм .. все-таки отримую баб
Марко Мартінеллі

так, але цього разу це правильно! 'aaa' відповідає положенням [0, -1,1] на стрічці. Але висновок, який повинен це показати, потребує роботи.
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()}

Відформатовано для читабельності

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 - Роздрукуйте "Привіт!" на стрічку :)

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 - Залиште T на стрічці, якщо початковий рядок має форму n b n , зупиніть інше.

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 означає переміщення вліво

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.