C'est un drôle d'accident que ce monde ne possède qu'une seule dimension temporelle, mais il ne doit pas nécessairement en être ainsi. Il est facile d'imaginer des mondes avec 2 dimensions temporelles ou plus, et dans ces mondes, vous pourriez construire des ordinateurs et exécuter des logiciels dessus, comme dans celui-ci.
Le système
Voici un système pour exécuter les programmes Brainf * ck en deux dimensions temporelles:
Les deux dimensions temporelles sont x et y. Chaque programme Brainf * ck comprend un demi-programme x et un demi-programme ay, par exemple, un programme
x: +>+
y: [-]
Les deux demi-programmes ont chacun leur propre pointeur de programme, mais ils partagent un seul pointeur de bande (c'est-à-dire qu'ils fonctionnent tous les deux sur la même cellule de la bande).
Le temps est bidimensionnel, il est donc constitué d'une grille de moments:
En se déplaçant le long de la dimension x, le demi-programme x exécute un pas de temps. En se déplaçant le long de la dimension y, le demi-programme y exécute un pas de temps.
Ainsi, par exemple, supposons que la bande commence comme [0] 0 0
( []
représente le pointeur de bande) et que les programmes x / y sont +
et ->-
. L'exécution de ce programme ressemblerait à ceci:
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 >
Notez que, lorsque le temps se déplace dans la direction y, le demi-programme x continue de faire la même chose encore et encore, car son temps ne progresse pas.
La bande à chaque instant inclut l'effet cumulatif de toutes les actions qui y alimentent (chaque action compte une fois). Ainsi, par exemple, la bande au moment (2, 1) contient l'effet cumulatif de:
- l'action x de (0, 0)
- l'action x de (1, 0)
- l'action x de (0, 1)
- l'action x de (1, 1)
- l'action y de (0, 0)
- l'action y de (1, 0)
- l'action y de (2, 0)
Cumul signifie:
- Tous les incréments et décréments d'une somme de cellules ensemble.
- Tous les mouvements vers la gauche (-1) et la droite (+1) vers le pointeur de bande totalisent ensemble.
Les pointeurs d'instructions ne s'accumulent pas. Chaque demi-programme obtient son pointeur d'instruction à partir du moment précédent dans sa dimension. Autrement dit, les pointeurs de programme x progressent uniquement dans la dimension x et les pointeurs de programme y progressent uniquement dans la dimension y. Ainsi, par exemple, dans le programme ( []
, +
) à partir de [0] 0 0
, l'exécution serait
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
Quelques autres moments de la simulation ci-dessus ( +
, ->-
) sont:
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
Les opérateurs Brainf * ck autorisés sont les suivants (ils ont leur signification standard):
+
,-
: incrémenter, décrémenter;[
,]
: boucle jusqu'à zéro (le traitement d'un[
ou]
prend un pas de temps, comme dans Brainf * ck standard);<
,>
: déplacez-vous vers la gauche / droite sur la bande.
Exemple complexe
Pour le programme ( >
, +
) commençant par [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
Pour ( +
, -
) commençant par [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
Notez que la bande se termine comme [0] 0 0
chacun +
et -
se produit deux fois, en additionnant à 0.
Pour le programme ( >+
, [-]
) commençant par [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
Diagramme avec des flèches
Le diagramme ci-dessous montre comment calculer les actions et la bande:
Le puzzle
Écrivez un programme 2D Brainf * ck (avec un demi-programme x et un demi-programme ay) à exécuter sur une bande à 3 cellules, qui remplit les deux conditions suivantes:
- Si la bande commence comme
[0] 0 0
, au moment (5, 5), elle a un0
dans la cellule zéro. - Si la bande commence comme
[1] 0 0
, au moment (5, 5), elle a un0
dans la cellule zéro.
Le programme le plus court répondant aux exigences l'emporte.
+
, >
) pour voir si j'obtiens le même résultat que vous.
(1,1)
travers l'un (1,0)
ou l' autre (0,1)
, mais si un programme commence par >
et l'autre commence par +
, alors leur ordre relatif est-il important?
+
et>
? Si c'est1 1 [0]
(assez fou mais c'est ce que la spécification semble suggérer), comment les pointeurs d'instructions se combinent-ils? Si les deux threads sont+
et[]
, alors1 2
la bande de données serait[3]
, mais le deuxième pointeur d'instruction est-il à l'intérieur de la boucle ([]+
chemin), ou à l'extérieur ([+]
chemin) ou même illégal (+[]
)?