Turing Makinesi Simülatörü


15

Bir Turing makine simülatörü yazın .

Basitlik için durumları tamsayı, semboller char, boş semboller boşluklara eşit

Mevcut durum, giriş sembolü, sonraki durum, çıkış sembolü, yön (sol veya sağ) şeklinde 5-demet sipariş zorunlu değildir, ancak değiştirip değiştirmediğinizi belirtin

Bilinmeyen bir duruma ulaşıldığında makine durmalıdır, başka durma durumuna izin verilmez.

Kaset her iki yönde de sonsuzdur ve her zaman boş bir karakter okuyabilirsiniz.

Giriş: başlangıç ​​bandı, bir başlangıç ​​durumu ve bir program. verileri istediğiniz biçimde herhangi bir yerden okuyabilirsiniz

Çıktı: programın yürütülmesinden sonra bant

Gerekli: simülatörünüzün üzerinde çalışan örnek bir program

Bu bir kod-colf yani en kısa kod kazanır.

Önümüzdeki birkaç saat içinde bir uygulama ve bazı örnek programlar yayınlayacağım.


Yanıtlar:


2

GolfScript, 92 karakter

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

GolfScript'teki Turing makinesi beklenenden çok daha uzun oldu. Hala kasetin farklı gösterimleri ile oynuyor.

Girişin ilk satırı orijinal durum, ikinci satırı ilk bant ve ardından bir dizi geçiş (sipariş geçerli durumu, giriş sembolü, bir sonraki durum, yön, çıkış sembolü).

Örnek ( çevrimiçi olarak da mevcut )

> 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 

benim sed uygulama bir char tarafından dövmek, daha iyi yapabilirim görmek için zaman
Geoff Reedy

7

GNU ile sed -r- 133 117 111 93 chars

Evet, sed tamamlanıyor. GNU sed ve -r(genişletilmiş normal ifade) yalnızca birkaç karakter kaydetmek içindir, POSIX sed ile çalışmak için sadece küçük bir değişikliktir.

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

Girdi biçimi:

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

Sınırlayıcı @, #ve baş karakter >kasete bir sembol olarak kullanılamaz. Durum etiketleri @ >veya içeremez #.

Her satırda bir tane olmak üzere girişteki tüm programları çalıştıracaktır

Örnekler:

Marco a n b n programı

Giriş

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

Çıktı

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

Marco Merhaba! program

Giriş

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

Çıktı

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

7

Bu yüzden biraz geç kaldım, ama bunu burada bırakacağımı düşündüm ...

Turing Makinesi Turing Makinesi Simülasyonu: 370 bayt?

Burada Turing'in 1936 gazetesinde kullandığı yapıyı kullanıyorum . M-config ve işlemleri içeren bir sembol = bir bayt kullanıyorum.

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

Makinem için yukarıdaki makaleden Turing'in örneklerinden biri:

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

Çevrimiçi deneyin! (Python 3'ü tercüman olarak kullanır.) Benimkinde.


Hasar yok, sadece masadaki sınırları hizalamak.
Greg Bacon

@GregBacon Hiçbir suç alınmadı ... belki de farklı bilgisayarların kod bloklarını nasıl oluşturduğu arasında bir fark vardır, ancak düzenlemeniz düzenleme ekranımda hizalamayı daha da kötüleştirdi ... Eminim düzenlemeyi önerdiğinizde iyi görünüyordu; sorunun ne olduğundan emin değilim
bendl

3

APL (110)

(O kadar da kısa değil ...)

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

Klavyeden iki satır okur: birincisi program ve ikincisi ilk kasettir.

Biçim

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

ve hepsi aynı hatta olmalı. 'Hareket' sağa hareket etmek için 0 ve sola hareket etmek için 1'dir.

Örnek program (netlik için eklenen satır sonları, hepsi bir satırda olmalıdır.)

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

Program birlikte iki tekli sayı ekler, örneğin:

in:  1111 111
out: 1111111

Örnek 2 (Marco Martinelli'nin girişinden ikili artış programından uyarlanmıştır):

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

Nasıl deneyebilirim? Linux kullanıyorum ve aplus ile denedim ama işe yaramıyor (tanımsız jeton :(). Hangi tercüman / derleyiciyi denemeliyim?
Marco Martinelli

Dyalog APL kullanıyorum. Dyalog'a özgü herhangi bir işlev kullanmanın farkında değilim ama A + tamamen aynı şey değil. Dyalog'un ücretsiz bir sürümü var, ancak sadece Windows için. (Wine altında çalışabilir, ancak APL yazabilmek için kendi giriş yöntemini kullanır.) Dyalog'u çalıştırırsanız, APL kodunu (bir satırda), ardından Turing makine programını (ikinci bir satıra) girin / yapıştırın ), ardından ilk bandı (üçüncü satırda).
marinus

tamam, bunu deneyeceğim, teşekkür ederim
Marco Martinelli

3

Python, 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 ve p girişlerdir, b ilk teyptir, p kuralları (durum, bant içi) demetinden (durum dışı, kafa hareketi, bant dışı) grubuna (dize gösterimi) bir kural olarak kodlar . Hareket 0 ise program biter, 1 sağa ve -1 sola gider.

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

Bu örnek program, dizenin son harfinin (boş banttan önce) 'a' olup olmadığını sınar, öyleyse dizenin sonuna 'Y' yazar (ilk boş alan).

Düzenleme 1:

Genişletilebilir bir veri yapısı yazmanın en kısa yolu gibi göründüğü için, bandı bir diksiyon olarak gösterilecek şekilde değiştirdi. İkinci satırdan son satıra çoğunlukla çıktı için tekrar okunabilir forma dönüştürülüyor.

Düzenleme 2:

Strigoides'e büyük gelişmeler için teşekkürler.

Düzenleme 3:

Çıktı olduğu gibi olduğu gibi gereksiz yere 0 yapmıştı. Çıkışı her zaman girişle aynı şekilde yazabildiğimiz için bunu kaldırdım.


Bunun geçerli bir çözüm olduğunu düşünmüyorum çünkü uygulamanızda bant sınırlı. Bu şekilde, programınızın bellek tüketimini önceden bilmeniz gerekir. Ve sola hareket ederken problemler var. İpucu: her zaman boş bir sembol açabileceğiniz iki değiştirilmiş desteden bir bant yapılabilir.
Marco Martinelli

Ah, doğru. Üzgünüm, bunu fazla düşünmedim.
shiona

Ahh .. afaik kaset her iki yönde de sonsuzdur ve her zaman boş bir karakter okuyabilirsiniz. Bunu cevapta belirteceğim.
Marco Martinelli

Haklıydınız (egzersizlerimizde daha katı kurallarımız vardı). En azından bazı kusurları düzelttim.
shiona

İlk satırdaki boşluğu kaldırabilir, r=0;s=0olabilir r=s=0(ve bu satırın sonundaki noktalı virgül gereksizdir), wkullanılmadığı için işlevi kaldırabilirsiniz , parantezler çıkarılabilir (s,m,t)=r[s,c], try/ exceptblok kısaltılabilir dict.get kullanarak; c=a.get(i,' '), m0 veya 1 olduğundan, kullanabilirsiniz if m-1:ve map()aramanızı liste kavrayışına dönüştürerek kısaltabilirsiniz .
Strigoides

3

dipnot (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

Bu muhtemelen hile yapıyor, ancak geçiş tablosu geçişleri gerçekleştirmek için kod içeriyor. Kaset, tamsayılardan tamsayılara bir eşleme ile temsil edildiğinden, durumları adlardan sözlüklere eşleme olarak temsil ettim, böylece bant ve program aynı anonim sözlükte bir arada var olur.

Tüm eyalet adlarını yürütülebilir hale getirerek ekstra tasarruf sağlar, böylece otomatik olarak yüklenirler.

Gömülü "Merhaba" programı ile başa çıkıldı. Fazladan 52 karakter, stdin'den bandı okumak için bir döngü satın alır.İle çalıştırın 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

Yani tablo formatı

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

burada in-statebir isim, in-tapeve out-tapekarakter (yani. tamsayı ya da tamsayılar verim ifadeler) vardır movementolan -1sol ya da 1sağ için ve out-statebir bir yürütülebilir ad. in-tapeAynı durum için çoklu geçiş yukarıdaki gibi birleştirilmelidir.


Başka bir sorun, bandın hangi kısmının ilginç olduğunu keşfetmek için herhangi bir hüküm bulunmamasıdır. Bunu yapmak biraz pahalıya mal olacak currentdict{search-for-min-and-max}forall juggle-params-for-for. :(
luser droog

Kendimi denedim, ama özleminin çok ötesindeydi. Ancak kodunuzda bazı iyileştirmeler önerdim.
Thomas

BTW, ilk kasete ne dersiniz? Bu işi yapmak değildi çünkü yorum satırı un-golfed kod kaldırıldı. ("0 değil" -1 değerini döndürür, bu nedenle döngünün yinelemesi olmaz)
Thomas W.

Mükemmel gelişmeler! ... ilk kaset kodu hakkında, sanırım dizüstü bilgisayarımdan yanlış yazdım. SB 0 1 0 not{(%stdin)(r)file read not{exit}if def}for. Golfçü versiyondan atlayarak neden kaçabileceğimi düşündüğümden emin değilim. : P
luser droog

Oh, bekle, -1! O zaman 0 notolmalı 16#7fffffff. Afedersiniz. Aha! bu yüzden yorumlandı! Doğrudan dizüstü bilgisayardan çıktı, test edilmedi ve golf yaparken ne zaman bakmadan tüm yorumları kesmiştim. Python adama söyleme! : P
luser droog

2

C (henüz golf oynamadı)

Sanırım bununla kazanamam, yine de işe yaraması eğlenceliydi. Bu gerçekten işe yaradığı için daha da doğru . :)

Dışında sadece bir yönde sonsuzdur. Sanırım negatif bir kasete de ihtiyacı var. İç çekmek....

Olumsuz o kadar da kötü değildi. İki tarafı da eşitler ve oranlar olarak ayırıyoruz. Artık , dosyanın kendisi karıştırıldığı için teybi sıralı olarak görüntülemesi gerekiyor . Bence bu meşru bir değişiklik. Kendini çevirmek bu şekilde basitleşti.

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

Ve işte test sürüşü:

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

Program bandı sırayla çıkarır, ancak dosya serpiştirilmiş negatif ve pozitif tarafları temsil eder.


Uygulamanızla ilgili sorunlar var. A ve b'yi 0 'a' 0 'b' R; 0 'b' 0 'a' Raaa girişi ile değiştiren bu programı deneyin bbb yerine çıktı bab olur. Ve sola hareket ederken problemler var.
Marco Martinelli

İlginiz için teşekkürler! Güncelleme her ikisini de giderir, sanırım (umut).
luser droog

uhm .. hala bab oluyor
Marco Martinelli

evet, ama bu sefer doğru! 'aaa' kasetteki [0, -1,1] konumlarına karşılık gelir. Ancak bunu göstermesi gereken çıktı açıkça işe ihtiyaç duyar.
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()}

Okunabilirlik için biçimlendirilmiş

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 bandı ayarlayan işlevdir e programı değerlendiren işlevdir

Örnek 1 - "Merhaba!" kasette :)

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)

Örnek 2 - İlk dize n b n biçimindeyse banda T bırakın , aksi takdirde durun.

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)

Örnek 3 - İkili sayının artışı

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)

örneklerde 1 sağa ve -1 sola hareket anlamına gelir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.