Ini kecelakaan yang lucu bahwa dunia ini kebetulan hanya memiliki 1 dimensi waktu, tetapi tidak harus seperti itu. Sangat mudah untuk membayangkan dunia dengan dimensi waktu 2 atau lebih, dan di dunia itu Anda dapat membangun komputer dan menjalankan perangkat lunak pada mereka, seperti di dunia ini.
Sistem
Berikut adalah sistem untuk menjalankan program Brainf * ck dalam dua dimensi waktu:
Dua dimensi waktu adalah x dan y. Setiap program Brainf * ck terdiri dari x setengah program, dan setengah program, misalnya, sebuah program bisa
x: +>+
y: [-]
Kedua program setengah masing-masing memiliki pointer program mereka sendiri, tetapi mereka berbagi satu tape pointer (yaitu, keduanya beroperasi pada sel yang sama dari rekaman itu).
Waktu adalah 2 dimensi, jadi terdiri dari kisi momen:
Bergerak sepanjang dimensi x, program setengah x mengeksekusi satu langkah waktu. Bergerak sepanjang dimensi y, program setengah y mengeksekusi satu langkah waktu.
Jadi, misalnya, katakanlah rekaman itu dimulai sebagai [0] 0 0
( []
mewakili penunjuk kaset) dan program x / y adalah +
dan ->-
. Eksekusi program ini akan terlihat seperti ini:
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 >
Perhatikan bahwa, seiring berjalannya waktu ke arah y, program setengah x terus melakukan hal yang sama berulang kali, karena waktunya tidak berkembang.
Rekaman pada setiap saat termasuk efek kumulatif dari semua tindakan yang dimasukkan ke dalamnya (setiap tindakan dihitung sekali). Jadi, misalnya, rekaman pada waktu (2, 1) berisi efek kumulatif dari:
- x-action from (0, 0)
- x-action from (1, 0)
- x-action from (0, 1)
- x-action from (1, 1)
- aksi-y dari (0, 0)
- aksi-y dari (1, 0)
- aksi-y dari (2, 0)
Kumulatif berarti:
- Semua kenaikan dan penurunan jumlah sel bersama-sama.
- Semua gerakan kiri (-1) dan kanan (+1) ke jumlah penunjuk kaset bersama-sama.
Petunjuk petunjuk tidak terakumulasi. Setiap setengah program mendapatkan penunjuk instruksinya dari momen sebelumnya dalam dimensinya. Yaitu, progres program x hanya berkembang dalam dimensi x, dan progres program x hanya berjalan dalam dimensi y. Jadi, misalnya, dalam program ( []
, +
) mulai dari [0] 0 0
, eksekusi akan dilakukan
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
Beberapa momen lagi dari simulasi di atas ( +
, ->-
) adalah:
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
Operator Brainf * ck diizinkan adalah sebagai berikut (mereka memiliki arti standar):
+
,-
: increment, decrement;[
,]
: loop sampai nol (memproses a[
atau]
mengambil satu langkah waktu, seperti pada Brainf * ck standar);<
,>
: bergerak ke kiri / kanan pada kaset.
Contoh Kompleks
Untuk program ( >
, +
) dimulai dengan [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
Untuk ( +
, -
) dimulai dengan [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
Perhatikan bahwa rekaman itu berakhir [0] 0 0
karena masing +
- masing dan -
terjadi dua kali, jumlah ke 0.
Untuk program ( >+
, [-]
) dimulai dengan [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
Diagram dengan Panah
Diagram di bawah ini menunjukkan cara menghitung tindakan dan rekaman:
Teka-teki
Tulis program 2D Brainf * ck (dengan program setengah x dan setengah program) untuk dijalankan pada pita 3-sel, yang memenuhi kedua kondisi berikut:
- Jika pita dimulai sebagai
[0] 0 0
, pada waktu (5, 5) ia memiliki0
dalam sel nol. - Jika pita dimulai sebagai
[1] 0 0
, pada waktu (5, 5) ia memiliki0
dalam sel nol.
Program terpendek yang memenuhi persyaratan menang.
+
, >
) untuk melihat apakah saya mendapatkan hasil yang sama seperti Anda.
(1,1)
salah satu (1,0)
atau (0,1)
, tetapi satu program dimulai >
dan satu dimulai +
, maka tentu urutan relatif mereka penting?
+
dan>
? Jika itu1 1 [0]
(cukup gila tapi sepertinya apa yang disarankan oleh spec), Bagaimana cara menggabungkan instruksi? Jika dua utas adalah+
dan[]
, maka pada1 2
rekaman data akan[3]
, tetapi apakah penunjuk instruksi kedua di dalam loop ([]+
path), atau di luar ([+]
path) atau bahkan ilegal (+[]
)?