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 ydöngüdür ve veri depolamanın tek yolu tek bir akümülatördür _. Giriş ve çıkış, özel değer Nve Writedeyim 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ş !! Ntek 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.
_%128En son okunan karakteri saklar. Bu yüzden ilk döngü _%128-9sı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%2bayrak 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 xdö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, _%128yuvayı sıfırlar , başka bir karakter okur ve orada saklar. Ardından döngü.
Ne zaman Count idö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-jdöngüler . İşte bu kadar!_/25641