@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
:O
kartı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
}0
bir giriş cihazıdır, bu bir İşlevin çağrıldığı
+Z
herhangi bir mermere 35 ekler ve düşmesine izin verir. +C
Aynı şeyi yapar, ancak yalnızca 12 ekler {0
bir çı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. :I
Kartı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 }0
ve }1
. Bu, bu fonksiyonun 2 giriş aldığı anlamına gelir. Ayrıca }1
cihazın iki örneği olduğunu fark edeceksiniz . İşlevi çağırdıktan sonra, bu hücrelerin her ikisi de aynı değeri içerecektir. }0
Girdi aygıtı doğrudan üzerinde olan \/
bu çöp tenekesi olarak hareket eder ve hemen düşen bir mermer kaldırır cihaz.
}1
Girdi cihazları tarafından tahtaya konan mermerler birine ne olduğuna bir göz atalım :
}1
=9 &1
&0
{>
İlk kene düşecek ve =9
cihaza çarpacak . Bu, mermerin değerini 9 ile karşılaştırır ve deyim =9
değerlendirilirse mermerin düşmesine izin verir . Mermer değilse sağa itilir. &0
ve &1
senkronizörlerdir. Diğer tüm &n
senkronizatö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 &1
giriş değeri }1
, &0
yanında 0 bulunur ( 00
onaltılık olarak temsil edilen bir dil değişmezidir). İkinci &1
1 değerini içerir ve hemen &0
bir ile doldurulur F7
Marbelous, 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 }1
9 ise, &0
senkronizatörler doldurulur. Bu, 0 değerinin{0
çıktıya ve F7
(veya -9) çıktıya{1
. }1
9 değilse , + 1 {0
ile doldurulacak ve }1
1 {0
içerecektir. Bir {>
cihaz da var, bu, altındaki bir tahtanın yanında bir mermer çıkaran özel bir çıktıdır. Bu, }1
9'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 ( 00
ve 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 >0
baş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 @6
cihaza çarpar. Bu bir portaldır ve mermeri, bu durumda hemen üstündeki başka bir ilgili portala taşır. 0 mermer daha sonra &0
senkronizö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 @4
Her 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ı üç II
cihaza götürecek .II
:I
dosyada daha sonra tanımladığımız tahtaya atıfta bulunur . Yana :I
2 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 :I
e kadar orada yeterli girdi mermer sto fonksiyonunu başlatmak bekleyen fonksiyonu (bir daha olduğunu) gösterir. @4
Portal burada devreye girer. Azalan komut satırı girişinin bir kopyası her döngüde oraya düşer. Bu, en soldaki :I
kartı tetikleyecektir . Başlangıçta 256 (veya -1) değerleri ve komut satırı girdisi -1 ise. Sol mermer içine konacak }0
cihazlarının :I
kurulu 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. :I
Levhalar 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 :O
işlevin bir değeri -1 değerini temsil eden basamağın ascii değerine dönüştürdüğünü de hatırlayabilirsiniz . Bu OO
hü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 &0
senkronizatö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. &3
en önemli basamağını içerdiğinden, ilk olarak tetiklenen alır, daha sonra geliyor &2
izledi &1
. Bu mermer daha sonra tahtaya son veren hücreye @5
çarpmadan önce diğer cihaza ışınlanır !!
.
19, 20, 21, 22
Ondalık dizideki dizinin08, 09, 10, 11
shortlex ile eşleştiğine dikkat etmek önemli olabilir . Bu yüzden onu karıştırdım100 -> 89
!