Bu zorluğun amacı (sonunda) her olası durdurma programını seçtiğiniz bir dilde vermektir. İlk başta bu imkansız gelebilir, ancak bunu çok dikkatli bir şekilde yürütme emri seçimiyle yapabilirsiniz.
Aşağıda bunu göstermek için bir ASCII diyagramı bulunmaktadır. Sütunların mümkün olan her programın bir numarasını temsil etmesine izin verin (her program sonlu bir alfabedeki sınırlı sayıda semboldür). Her satır bu programın yürütülmesinde tekil bir adımı temsil edelim. Bir X
temsilci, o zaman adımında bu program tarafından gerçekleştirilen yürütmeyi temsil eder.
step# p1 p2 p3 p4 p5 p6
1 X X X X X X
2 X X X X X
3 X X X X
4 X X X X
5 X X X
6 X X
7 X X
8 X X
9 X X
∞ X X
Anlatabileceğiniz gibi, programlar 2 ve 4 durmuyor. Bunları birer birer uygulayacak olsaydınız, kontrol cihazınız program 2 olan sonsuz döngüye takılır ve hiçbir zaman program 3 ve öteye çıkmaz.
Bunun yerine, bir kırlangıç yaklaşımı kullanın . Harfler ilk 26 adım için olası bir yürütme sırasını temsil ediyor. *
Ler o program durdurdu ve çıktısı alınır yerlerdir. .
Ler henüz infaz edilmemiş adımlardır.
step# p1 p2 p3 p4 p5 p6
1 A C F J N R V
2 B E I M Q * Z
3 D H * P U
4 G L T Y
5 K O X
6 * S .
7 W .
8 . .
9 . .
∞ . .
Hedef dil için gerekenler
Hedef dil (paralel olarak tercüme edilen) Turing-tamamlanmış olmalıdır. Bunun dışında , çok daha büyük dillerin tam Turing altkümeleri de dahil olmak üzere, Turing tamamlandı herhangi bir dil olabilir . Ayrıca döngüsel etiket sistemi kuralları gibi şeyleri yorumlamakta özgürsünüz. Bunun neden Turing-tamamlandı olduğunu gösterebildiğiniz sürece, test etmek için bir dil yaratmanıza izin verilir.
Örnek olarak, eğer beyin hasarı test etmeyi seçerseniz []-+<>
, giriş desteklenmediği ve çıkış sadece atıldığı için sadece altkümeyi test etmek en iyisidir (aşağıya bakınız).
“Golf” kontrol programına gelince (ki golf oynuyorsunuz), özel bir gereklilik yoktur. Normal dil kısıtlamaları geçerlidir.
Sonsuz bir program listesi nasıl oluşturulur
Programlama dillerinin çoğu sonlu bir alfabeden gelen bir dizi sembol olarak gösterilebilir. Bu durumda, artan uzunluk sırasına göre her olası programın bir listesini numaralandırmak nispeten kolaydır. Kullandığınız alfabe , hedef dilin gereksinimlerini temsil etmelidir . Çoğu durumda, bu yazdırılabilir ASCII'dir. Diliniz Unicode'u ek bir özellik olarak destekliyorsa, mümkün olan her Unicode karakter kombinasyonunu test etmemelisiniz, sadece ASCII. Diliniz yalnızca kullanıyorsa []-+<>
, "comment" ASCII karakterlerinin çeşitli kombinasyonlarını test etmeyin. APL gibi dillerin kendi özel harfleri olur.
Diliniz en iyi şekilde Fractran veya Turing Machines gibi alfabetik olmayan bir şekilde tanımlanıyorsa, olası tüm geçerli programların bir listesini oluşturmanın eşit derecede geçerli başka yöntemleri de vardır.
Sürekli büyüyen programların listesini yorumlama
Bu zorluğun kilit kısmı, büyüyen programların listesi için paralel bir tercüman yazmaktır. Bunun için bazı temel adımlar var:
- Listeye sınırlı sayıda program ekleyin
- Listedeki her programı belirli bir süre için ayrı ayrı yorumlayınız. Bu, her biri için bir talimat adımı gerçekleştirilerek gerçekleştirilebilir. Bütün ülkeleri kurtar.
- Tüm sonlandırma / hata atma programlarını listeden kaldır
- Temiz bir şekilde durmuş * programların çıktısını alın
- Listeye daha fazla program ekleyin
- Her programı sırayla benzetin, kaldığı yerden daha eski programların çalıştırılmasını sağlayın
- Tüm sonlandırma / hata atma programlarını listeden kaldır
- Temiz bir şekilde durmuş * programların çıktısını alın
- tekrar et
* Yalnızca temiz bir şekilde durduran programları çıkarmalısınız. Bu, yürütme sırasında atılan sözdizimi hataları veya yakalanmayan istisnalar olmadığı anlamına gelir. Girdi isteyen programlar da çıktı alınmadan sonlandırılmalıdır. Bir program çıktı üretirse, onu sonlandırmamalısınız, sadece çıktıları atmalısınız.
Daha fazla kural
- Test edilen programları içerecek şekilde yeni başlıklar oluşturmamalısınız, çünkü bu paralel işletim sistemini ana işletim sistemi işletim sistemine / diğer yazılıma yükler.
- Düzenleme: Gelecekteki potansiyel boşlukları kapatmak için
eval
, test edilen programın kodunun bir kısmına (veya ilgili bir fonksiyona) izin verilmez . Sen caneval
tercüman kodundan bir kod bloğu. (BF-in-Python cevabı bu kurallar uyarınca hala geçerlidir.) - Bu kod golfü
- İçinde Gönderiminizi yazma dili gelmez sen çıkışının / test ediyoruz dil olarak aynı olması gerekir.
- Kullanılabilir hafızanızın sınırsız olduğunu varsaymalısınız.
- Turing'in eksiksiz olduğunu kanıtlarken, girişin programa kodlanmış olduğunu ve çıkışın programın iç durumundan okunabileceğini varsayabilirsiniz.
- Programın kendisi çıktı, muhtemelen yanlış veya çokgrup.
"If your program outputs itself, it is probably wrong or a polyglot."