İki zaman boyutunda programlama


17

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:

3x3 kez ızgara, x ve y eylemleriyle bağlantı

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:

Hangi eylemler aşağıda listelendiği gibi bir bant anlık görüntüsüne beslenir

  • (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 0her 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:

Programın bölümlerinin nasıl hesaplandığını gösteren oklarla diyagram

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) 0sıfırıncı hücrede bir a vardır.
  • Bant şu şekilde başlarsa [1] 0 0(5, 5) 0sıfırıncı hücrede bir a vardır.

Gereksinimleri karşılayan en kısa program kazanır.


Sadece doğrulamak için: Koşmanın sonucu nedir +ve >? O If 1 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 zaman 1 2veri kasetinde olurdu [3], ancak ikinci talimat işaretçisi döngü içinde ( []+yol) veya dışarıda ( [+]yol) veya hatta yasadışı ( +[]) mı?
John Dvorak

@JanDvorak Ah, sanırım ne istediğini görüyorum. Her programın talimat işaretçisini boyutundaki bitişik andan aldığını eklemeyi unuttum. Bunu düzenleyeceğim ve sizinle aynı sonucu alıp almadığımı görmek için ( +, >) komutunu çalıştırmayı deneyeceğim .
Owen

Bu güzel bir mücadeledir, ancak cevapları sıralayabilmek için nesnel bir kazanma ölçütüne ihtiyaç vardır.
Martin Ender

3
Zorluk hala benim için net değil. Zaman çizelgede tam olarak nasıl ilerler. Sizin grafiğe göre, ben varmak gibi görünüyor (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?
Martin Ender

Yanıtlar:


8

Toplam 4 bayt: ( [-],> )

Ben bir kaba kuvvetlere, yazdığı en küçük tür programı bulmak için.

İşte bu programın eylem diyagramları. Bu ızgaralar, (0,0) sol alt köşesi, x ekseni boyunca x zamanı ve y ekseni boyunca y zamanı ile spesifikasyondaki ızgaraya benzer şekilde düzenlenir. Sağ üst köşede sonuç bulunur.

İlk olarak, bir bant ile 0 0 0:

|  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|( 0)  0   0 |( 0)  0   0 |( 0)  0   0 |( 0)  0   0 |( 0)  0   0 |( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|(>)         |(>)         |(>)         |(>)         |(>)         |(>)         
+------------+------------+------------+------------+------------+------------

Şimdi bir bant ile 1 0 0:

|  1 ( 0)  0 |  1   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|  1 ( 0)  0 |  1   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|  1 ( 0)  0 |  1   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|  1 ( 0)  0 |  1   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|  1 ( 0)  0 |  1   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|( 1)  0   0 |( 1)  0   0 |( 0)  0   0 |( 0)  0   0 |( 0)  0   0 |( 0)  0   0 
|([)-]       |[(-)]       |[-(])       |[-]         |[-]         |[-]         
|(>)         |(>)         |(>)         |(>)         |(>)         |(>)         
+------------+------------+------------+------------+------------+------------

Spesifikasyonda net olarak açıklanmayan birkaç şey vardı, örneğin 3 hücreli bandın etrafını sarar.


Bonus olarak, işte ( >+, [-]) örneğinin görselleştirilmesi :

|( 0)  0   0 |( 0)  0   0 |( 1)  1   0 
|(>)+        |>(+)        |>+          
|[-]         |[-]         |[-(])       
+------------+------------+------------
|( 0)  0   0 |  0   0 ( 0)|  0   1 ( 1)
|(>)+        |>(+)        |>+          
|[-]         |[-]         |[(-)]       
+------------+------------+------------
|( 0)  0   0 |  0 ( 0)  0 |  0 ( 1)  0 
|(>)+        |>(+)        |>+          
|([)-]       |([)-]       |([)-]       
+------------+------------+------------

Ve ( >+, +>) örnekten biri:

|( 1)  0   0 |  1   1 ( 0)|  1   3 ( 1)
|(>)+        |>(+)        |>+          
|+(>)        |+(>)        |+(>)        
+------------+------------+------------
|( 0)  0   0 |  0 ( 0)  0 |  0 ( 1)  0 
|(>)+        |>(+)        |>+          
|(+)>        |(+)>        |(+)>        
+------------+------------+------------

Sağ üst köşenin listelediklerinizden farklı olduğunu unutmayın, kodumda denediğim diğer tüm örneklerle eşleştiğinden, bu örnekte bir hata olduğunu düşünüyorum.


Bu harika! Hata konusunda haklı olabilirsiniz. Tekrar kontrol edeceğim.
Owen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.