@0@6000000@5
}0&0&0&0&0
>0@6&3
\\--\/&2
@0/\@4\/&1!!
@4@1..@2@5@3
IIIIIIIIIIII
FF&1FF&2FF&3
@1OO@2OO@3OO
:I
}1..}10001F7
=9&1++..&1&0
&0}0&1&0{1{1
{>\/{0//
:O
}0
+Z
+C
{0
Marbelous 8 bitlik bir dil olduğundan yalnızca 256'nın altındaki değerler için çalışır.
Nasıl çalışır
Marbelous, bazı cihazlar düşmelerini engellemedikçe, her kene üzerinde bir hücre aşağı düşen 8 bit mermerler ile temsil edilen değerlere sahip bir 2D dildir. Bu Marbelous programı 3 kuruldan oluşur; en kolay olanla başlayalım:
:O
}0
+Z
+C
{0
:Okartın adıdır (tam olarak belirtmek gerekirse, O addır ve: bu satırın bir ad olduğunu yorumlamaktadır. Panolara bir ad vererek, diğer kartlar üzerlerinde çağırabilen
}0bir giriş cihazıdır, bu bir İşlevin çağrıldığı
+Zherhangi bir mermere 35 ekler ve düşmesine izin verir. +CAynı şeyi yapar, ancak yalnızca 12 ekler {0bir çıkış hücresidir. , bir mermer bu hücreye ulaştığında, işlev çıkıp bu çıkış cihazındaki değeri döndürür.
Yani hep birlikte, bu tahta bir değer alır ve daha sonra buna 47 ekler. Bizim için bu, herhangi bir tek basamaklı sayıyı -1 basamağının ascii koduna dönüştürdüğü anlamına gelir (bu elbette 10 için de işe yarayacaktır).
:I
}1 .. }1 00 01 F7
=9 &1 ++ .. &1 &0
&0 }0 &1 &0 {1 {1
{> \/ {0 //
Bu tahta biraz daha karmaşık görünüyor. :IKartın adı olarak tanımlayabilmeniz ve bazı giriş ve çıkış aygıtlarını tespit edebilmeniz gerekir . İki farklı giriş cihazımız olduğunu fark edeceksiniz }0ve }1. Bu, bu fonksiyonun 2 giriş aldığı anlamına gelir. Ayrıca }1cihazın iki örneği olduğunu fark edeceksiniz . İşlevi çağırdıktan sonra, bu hücrelerin her ikisi de aynı değeri içerecektir. }0Girdi aygıtı doğrudan üzerinde olan \/bu çöp tenekesi olarak hareket eder ve hemen düşen bir mermer kaldırır cihaz.
}1Girdi cihazları tarafından tahtaya konan mermerler birine ne olduğuna bir göz atalım :
}1
=9 &1
&0
{>
İlk kene düşecek ve =9cihaza çarpacak . Bu, mermerin değerini 9 ile karşılaştırır ve deyim =9değerlendirilirse mermerin düşmesine izin verir . Mermer değilse sağa itilir. &0ve &1senkronizörlerdir. Diğer tüm &nsenkronizatörler de dolana kadar üzerlerine düşen mermerlere tutunurlar . Tahmin edebileceğiniz gibi, bu durum şartlı olarak tahtanın başka bir bölümünde farklı davranışları tetikleyecektir.
}1 00 01 F7
++ .. &1 &0
&1 &0 {1 {1
{0 //
Size bunun ++bir artım aracı olduğunu söylersem, farklı senkronizörlerin ne ile dolduğunu söyleyebilmelisiniz. Solda + 1 &1giriş değeri }1, &0yanında 0 bulunur ( 00onaltılık olarak temsil edilen bir dil değişmezidir). İkinci &11 değerini içerir ve hemen &0bir ile doldurulur F7Marbelous, ekleme modülo 256 olduğu bir değerden 9 çıkarır ki,.
// herhangi bir mermeri düşmesine izin vermek yerine sola iten bir deflektör cihazıdır.
Bunları bir araya getirmek size bunu verir: eğer mermer }19 ise, &0senkronizatörler doldurulur. Bu, 0 değerinin{0 çıktıya ve F7(veya -9) çıktıya{1 . }19 değilse , + 1 {0ile doldurulacak ve }11 {0içerecektir. Bir {>cihaz da var, bu, altındaki bir tahtanın yanında bir mermer çıkaran özel bir çıktıdır. Bu, }19'a eşitse doldurulur .
@0 @6 00 00 00 @5
}0 &0 &0 &0 &0
>0 @6 &3
\\ -- \/ &2
@0 /\ @4 \/ &1 !!
@4 @1 .. @2 @5 @3
II II II II II II
FF &1 FF &2 FF &3
@1 OO @2 OO @3 OO
Tamam, şimdi büyük olan için. Dosyanın ana kartı olduğundan bu kartın açık bir adı yoktur. Örtük adı Mb. Bazı hücreleri tanıyabilmelisiniz. Bir giriş cihazı, bazı dil değişmezleri ( 00ve FF) var. Bazı senkronizörler ve bir saptırıcı var. bu parça parça geçelim.
@0 @6
}0 &0
>0 @6
\\ --
@0 /\ @4
Böylece giriş değeri (bu ana kart olduğu için komut satırı girişi) ikinci hücrede, bulunduğu yerden başlar }0. Düşecek ve >0başka bir karşılaştırma cihazı olan cihaza ulaşacaktır . 0'dan büyük herhangi bir mermer düşer, diğer tüm mermer sağa doğru itilir. (Marbelous değişkenleri imzasız olduğundan, sadece tam olarak 0 sağa doğru itilir). Bu sıfır değerli mermer daha sonra @6cihaza çarpar. Bu bir portaldır ve mermeri, bu durumda hemen üstündeki başka bir ilgili portala taşır. 0 mermer daha sonra &0senkronizöre ulaşacak ve başka yerlerde bazı şeyleri tetikleyecektir.
Mermer 0 değilse, düşer, birer birer azalan ve daha sonra bir klonlayıcıya düşen \\isabetlerle sağa saptırılır . Bu cihaz bir mermer alır ve bir kopyasını sağa ve bir kopyasını sola verir. Soldaki mermer yukarı aynı sıradan geçecek şekilde yukarı doğru alınacaktır . Sol taraf başka bir yere götürülecek. Bu, bize döngü başına komut satırı girdisini bir kez azaltan ve her döngüde 0'a ulaşana kadar bazı davranışları tetikleyen bir döngü verir. Daha sonra başka bir davranışı tetikler.--/\@0
Hadi içine itilen mermer ile neler olduğuna bir bakalım @4Her bir döngüye .
@4 @1 .. @2 @5 @3
II II II II II II
FF &1 FF &2 FF &3
@1 OO @2 OO @3 OO
Burada ( FF) hemen portallara ayrılacak 3 dil değişmezi vardır . Bu portallar onları üç IIcihaza götürecek .II:Idosyada daha sonra tanımladığımız tahtaya atıfta bulunur . Yana :I2 ayrı giriş aygıtlarını vardır, başka gemide 's gösterimi genişliğinde 2 hücreleri olmalıdır. İçinde 6 hücre bulunduğundan II, bu fonksiyonun tahtada 3 örneğine sahip olduğumuzu söyleyebiliriz.
FF(Veya 256 veya -1, olur ise) mermerler giriş hücrelerinde oturup :Ie kadar orada yeterli girdi mermer sto fonksiyonunu başlatmak bekleyen fonksiyonu (bir daha olduğunu) gösterir. @4Portal burada devreye girer. Azalan komut satırı girişinin bir kopyası her döngüde oraya düşer. Bu, en soldaki :Ikartı tetikleyecektir . Başlangıçta 256 (veya -1) değerleri ve komut satırı girdisi -1 ise. Sol mermer içine konacak }0cihazlarının :Ikurulu ve içine doğru biri }1. Bu panonun ne yaptığını hatırlarsanız, bunun ne sonucunu olduğunu anlayabilirsiniz. Sol çıkışta sağ girişin artırılmış bir sürümünü çıkarır (ve 9'u 10 değil 0'a çevirir) ve sağda 1 veya -9'u çıkarır.
Artan değer, bir portal tarafından sağ giriş hücresine geri alınır ve sağdaki değer bir senkronizöre düşer. Bir eşleyici zaten bir mermeri tutuyorsa, iki mermer çarpışacaktır. Çarpışan mermerler modulo 256'ya eklenir. Böylece senkronizatörlerdeki değerler aşağıdakileri yapar: Boşuna başlarlar, sonra 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ve sonra 1 tekrar (247 modulo 256 eklendiğinden).
Ayrıca, giriş değeri 0'a döndüğünde bir mermerin sağa çıktığını da hatırlayabilirsiniz. :ILevhalar hemen yan yana olduğundan , bu levhayı bir kez sağa doğru tetikleyecektir. Bu, üç eşitleyiciyi, komut satırı girdisinin bir kısmi temsili olması gerektiğinden bir yüksek olan değerlerle dolduracaktır.
Ayrıca :Oişlevin bir değeri -1 değerini temsil eden basamağın ascii değerine dönüştürdüğünü de hatırlayabilirsiniz . Bu OOhücrelerin çıktıları daha sonra tahtadan düşer ve karşılık gelen ascii karakterlerini STDOUT'a yazdırır.
00 00 00 @5
&0 &0 &0
&3
\/ &2
\/ &1 !!
@5
Peki komut satırı girişi mermeri 0'a ulaştığında ve &0senkronizatörleri doldurduğunda ne olur ? birkaç değer mermeri düşer ve kısa devre numarasının rakamlarını (+ 1) kartın altında tutan üç senkronizörü tetikler. &3en önemli basamağını içerdiğinden, ilk olarak tetiklenen alır, daha sonra geliyor &2izledi &1. Bu mermer daha sonra tahtaya son veren hücreye @5çarpmadan önce diğer cihaza ışınlanır !!.
19, 20, 21, 22Ondalık dizideki dizinin08, 09, 10, 11shortlex ile eşleştiğine dikkat etmek önemli olabilir . Bu yüzden onu karıştırdım100 -> 89!