Oldukça ayrıntılı bir Turing tarpit için fena değil ...
N
Count i while _%128-9 {
Count x while _/128%2 {
Write 40
_+128
}
Write _%128
_+128-_%128+N
}
Count j while _/256-j {
Write 41
}
(Evet, bütün bu boşluklar zorunludur.)
Not: çünkü giriş sınırlamaları Acc !! , bazı sınırlayıcılar olmadan rastgele bir karakter dizisi okumak mümkün değildir. Bu nedenle, bu program girişi (stdin'de) bir sekme karakteri izleyen bir dizge olarak bekler.
Acc !! ?
Oluşturduğum bir dil sadece kullanılamaz görünüyor . Sadece veri tipi tamsayılar, tek kontrol akışı yapısı Count x while y
döngüdür ve veri depolamanın tek yolu tek bir akümülatördür _
. Giriş ve çıkış, özel değer N
ve Write
deyim kullanılarak bir defada bir karakter yapılır . Bu sınırlamalara rağmen, eminim ki Acc !! Turing tamamlandı.
açıklama
Acc temel strateji ! programlama, akümülatörü kavramsal olarak bölümlere ayırmak için mod %
ve tamsayı bölmesini kullanmak ve /
aynı anda birden fazla değeri saklamasını sağlamaktır. Bu programda, bu tür üç bölüm kullanıyoruz: en düşük dereceli yedi bit ( _%128
) girdiden bir ASCII kodu depolar; sonraki bit ( _/128%2
) bir bayrak değeri saklar; ve kalan bitler ( _/256
) ihtiyaç duyacağımız yakın-ebeveynlerin sayısını.
Acc Giriş !! N
tek bir karakter okuyan ve ASCII kodunu değerlendiren özel değerden gelir . Yalnızca bir ifadeden oluşan herhangi bir ifade, bu ifadenin sonucunu akümülatöre atar. Böylece ilk karakterin kodunu aküde saklayarak başlıyoruz.
_%128
En son okunan karakteri saklar. Bu yüzden ilk döngü _%128-9
sıfır değilken , yani geçerli karakter bir sekme olana kadar çalışır .
İlk döngüde (
olmadıkça döngü içinde yazdırmak istiyoruz . Acc beri ! if deyimi yok, koşullamalar için döngüler kullanmalıyız. Akünün 128 bitini _/128%2
bayrak değeri olarak kullanırız. İlk geçişte, akümülatördeki tek şey bir ASCII değeri <128'dir, bu nedenle bayrak 0'dır ve döngü atlanır. Sonraki her pasta, bayrağın 1 olduğundan emin olacağız.
İçinde Count x
döngü (bayrak olduğunda 1), açık bir parantez (ASCII yazma 40
) ve böylece 0'a bayrağını ayarlama ve döngüsünden çıkar, akümülatör için 128 ekleyin. Bu aynı zamanda _/256
, çıkacak olan yakın-parilerimiz olarak kullanacağımızın değerini de arttırır.
Bayrağın değeri ne olursa olsun, basitçe en son girdi karakterini yazıyoruz _%128
.
Bir sonraki atama ( _+128-_%128+N
) iki şey yapar. İlk olarak, 128 ekleyerek, bayrağını bir sonraki kez döngüden geçirir. İkincisi, _%128
yuvayı sıfırlar , başka bir karakter okur ve orada saklar. Ardından döngü.
Ne zaman Count i
döngüden çıkılır, biz sadece bir sekme karakteri okudum ve akümülatör değeri böyle yıkar:
_%128
: 9
(sekme karakteri)
_/128%2
: 1
(bayrak)
_/256
: okunan karakter sayısı, eksi 1
(Eksi 1, ana döngüden ilk geçişte aküye sadece bir kez 128 eklediğimiz için.) Şimdi tek ihtiyacımız olan yakın parenler. her seferinde bir yakın-paren (ASCII ) yazan zamanlar, Count j while _/256-j
döngüler . İşte bu kadar!_/256
41