Bu dünyanın sadece 1 zaman boyutuna sahip olması komik bir kaza, ama böyle olmak zorunda değil. 2 veya daha fazla zaman boyutuna sahip dünyaları hayal etmek kolaydır ve bu dünyalarda, tıpkı bu bilgisayardaki gibi, bilgisayarlar oluşturabilir ve üzerinde yazılım çalıştırabilirsiniz.
Sistem
Brainf * ck programlarını iki zaman boyutunda çalıştırmak için bir sistem:
İki zaman boyutu x ve y'dir. Her Brainf * ck programı bir x yarım programdan oluşur ve bir yarım programdan oluşur, örn.
x: +>+
y: [-]
İki yarım programın her birinin kendi program işaretçisi vardır, ancak tek bir bant işaretçisini paylaşırlar (yani, her ikisi de bandın aynı hücresinde çalışır).
Zaman 2 boyutludur, bu yüzden bir anlar ızgarasından oluşur:
X boyutu boyunca hareket eden x half-program bir zaman adımı yürütür. Y boyutu boyunca hareket eden y yarım programı bir seferlik bir adım yürütür.
Yani, örneğin, kasetin [0] 0 0
( []
bant işaretçisini temsil eder) olarak başladığını ve x / y programlarının +
ve olduğunu varsayalım ->-
. Bu programın yürütülmesi şöyle görünecektir:
x y tape x-action y-action
0 0 [ 0] 0 0 + at 0 - at 0
1 0 [ 1] 0 0 (done) - at 0
0 1 [-1] 0 0 + at 0 move >
1 1 [ 0] 0 0 (done) move >
Zaman y yönünde ilerledikçe, x yarım programının aynı şeyi tekrar tekrar yapmaya devam ettiğine dikkat edin, çünkü zamanı ilerlemez.
Her andaki bant, içine beslenen tüm eylemlerin kümülatif etkisini içerir (her eylem bir kez sayılır). Yani, örneğin, zamandaki bant (2, 1) aşağıdakilerin kümülatif etkisini içerir:
- (0, 0) 'dan gelen x-eylemi
- (1, 0) 'dan gelen x-eylemi
- (0, 1) 'den gelen x-eylemi
- (1, 1) 'den gelen x-eylemi
- (0, 0) 'dan y eylemi
- (1, 0) 'dan y eylemi
- (2, 0) 'dan y eylemi
Kümülatif araçlar:
- Bir hücre toplamındaki tüm artışlar ve azalmalar birlikte.
- Bant işaretçisine giden tüm sol (-1) ve sağ (+1) hareketler birlikte toplanır.
Talimat göstergeleri birikmez. Her yarım program, talimat işaretçisini boyutundaki bir önceki andan alır. Yani, x program işaretçileri yalnızca x boyutunda ilerler ve y program işaretçileri yalnızca y boyutunda ilerler. Yani, örneğin, programdan ( []
, +
) itibaren [0] 0 0
,
x y tape x-action y-action x-prog-ptr y-prog-ptr
0 0 0 0 0 + at 0 0 0
1 0 0 0 0 + at 0 2 (from jump) 0
0 1 1 0 0 0 1
1 1 2 0 0 1 (from NO jump) 1
Yukarıdaki ( +
, ->-
) simülasyondan birkaç dakika daha :
x y tape x-action y-action x-prog-ptr y-prog-ptr
0 0 [ 0] 0 0 + at 0 - at 0 0 0
1 0 [ 1] 0 0 - at 0 1 0
2 0 [ 1] 0 0 - at 0 1 0
0 1 [-1] 0 0 + at 0 > 0 1
1 1 [ 0] 0 0 > 1 1
2 1 [-1] 0 0 > 1 1
0 2 -1 [ 0] 0 + at 1 - at 1 0 2
1 2 0 1 [ 0] - at 2 1 2
2 2 [-1] 1 0 - at 0 1 2
İzin verilen Brainf * ck operatörleri şunlardır (standart anlamlarına sahiptirler):
+
,-
: artış, azalma;[
,]
: sıfıra kadar döngü ( standart Brainf * ck'de olduğu gibi a[
veya]
bir zaman adımı işlenir );<
,>
: kaset üzerinde sola / sağa hareket et.
Karmaşık Örnek
Şununla başlayan program ( >
, +
) için [0] 0 0
:
x y tape x-action y-action x-prog-ptr y-prog-ptr
0 0 [ 0] 0 0 > + at 0 0 0
1 0 0 [ 0] 0 + at 1 1 0
0 1 [ 1] 0 0 > 0 1
1 1 1 1 [ 0] 1 1
Şununla başlayan ( +
, -
) için [0] 0 0
:
x y tape x-action y-action x-prog-ptr y-prog-ptr
0 0 [ 0] 0 0 + at 0 - at 0 0 0
1 0 [ 1] 0 0 - at 0 1 0
0 1 [-1] 0 0 + at 0 0 1
1 1 [ 0] 0 0 1 1
Kasetin, [0] 0 0
her biri gibi sona erdiğini +
ve -
0'a toplayarak iki kez gerçekleştiğini unutmayın.
Şununla başlayan program ( >+
, [-]
) için [0] 0 0
:
x y tape x-action y-action x-prog-ptr y-prog-ptr
0 0 [ 0] 0 0 > 0 0
1 0 0 [ 0] 0 + at 1 1 0
2 0 0 [ 1] 0 2 0
0 1 [ 0] 0 0 > 0 3
1 1 0 0 [ 0] + at 2 1 3
2 1 0 1 [ 1] - at 2 2 1
0 2 [ 0] 0 0 > 0 3
1 2 [ 0] 0 0 + at 0 1 3
2 2 [ 1] 1 0 2 2
Diyagram oklarla
Aşağıdaki şemada eylemlerin ve bandın nasıl hesaplanacağı gösterilmektedir:
Bulmaca
Aşağıdaki koşulların her ikisini de karşılayan 3 hücreli bir bant üzerinde çalıştırmak için bir 2D Brainf * ck programı (x yarım program ve ay yarım programlı) yazın:
- Bant şu şekilde başlarsa
[0] 0 0
(5, 5)0
sıfırıncı hücrede bir a vardır. - Bant şu şekilde başlarsa
[1] 0 0
(5, 5)0
sıfırıncı hücrede bir a vardır.
Gereksinimleri karşılayan en kısa program kazanır.
+
, >
) komutunu çalıştırmayı deneyeceğim .
(1,1)
aracılığıyla ya (1,0)
ya (0,1)
, ama bir kez programı başlar >
ve bir kez başladığında +
, o zaman mutlaka onların göreceli düzen meseleleri?
+
ve>
? O If1 1 [0]
(oldukça çılgın ama Spec önermek gibi görünüyor ne), nasıl talimat işaretçiler birleşirler? İki iş parçacığı+
ve ise[]
, o zaman1 2
veri kasetinde olurdu[3]
, ancak ikinci talimat işaretçisi döngü içinde ([]+
yol) veya dışarıda ([+]
yol) veya hatta yasadışı (+[]
) mı?