@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
Il ne fonctionne que pour les valeurs inférieures à 256 car Marbelous est un langage 8 bits.
Comment ça fonctionne
Marbelous est un langage 2D avec des valeurs représentées par des billes 8 bits qui tombent d'une cellule à chaque tick à moins qu'un appareil ne les empêche de tomber. Ce programme Marbelous se compose de 3 planches; Commençons par le plus simple:
:O
}0
+Z
+C
{0
:O
est le nom de la carte (pour être précis, O est le nom et: indique à l'interprété que cette ligne est un nom. En donnant un nom aux cartes, d'autres cartes peuvent les appeler
}0
est un périphérique d'entrée, cela peut être vu comme un argument de cette fonction. Cette cellule sera remplacée par une bille d'entrée (valeur) lorsque la fonction sera appelée.
+Z
ajoute 35 à toute bille qui la traverse et la laisse passer. +C
fait de même mais n'ajoute que 12. {0
est une cellule de sortie , lorsqu'un marbre atteint cette cellule, la fonction se termine et renvoie la valeur dans ce périphérique de sortie.
Donc, tous ensemble, ce tableau prend une valeur, puis en ajoute 47. Pour nous, cela signifie qu'il transforme n'importe quel nombre à un seul chiffre en code ascii du chiffre -1 (cela fonctionnera bien sûr également pour 10).
:I
}1 .. }1 00 01 F7
=9 &1 ++ .. &1 &0
&0 }0 &1 &0 {1 {1
{> \/ {0 //
Cette carte semble un peu plus compliquée. Vous devriez pouvoir identifier:I
le nom de la carte et avoir repéré certains périphériques d'entrée et de sortie. Vous remarquerez que nous avons deux périphériques d'entrée différents, }0
et }1
. Cela signifie que cette fonction prend 2 entrées. Vous remarquerez également qu'il existe deux instances de l' }1
appareil. Lors de l'appel de la fonction, ces deux cellules contiendront la même valeur. Le }0
périphérique d'entrée est directement au-dessus d'un \/
périphérique, cela agit comme une poubelle et élimine immédiatement toute bille qui tombe dessus.
Jetons un œil à ce qui arrive à l'une des billes mises dans le tableau par les }1
périphériques d'entrée:
}1
=9 &1
&0
{>
Il tombera sur le premier tick et frappera l' =9
appareil. Cela compare la valeur de la bille à 9 et laisse la bille tomber si l'instruction est =9
évaluée à travers. Le marbre est poussé vers la droite sinon. &0
et&1
sont des synchroniseurs. Ils s'accrochent aux billes qui tombent sur eux jusqu'à ce que tous les autres &n
synchroniseurs soient également remplis. Comme vous pouvez vous y attendre, cela déclenchera conditionnellement un comportement différent sur une autre partie de la carte.
}1 00 01 F7
++ .. &1 &0
&1 &0 {1 {1
{0 //
Si je vous dis qu'il ++
s'agit d'un incrémenteur, vous devriez déjà être en mesure de dire de quoi les différents synchroniseurs seront remplis. La gauche &1
contiendra la valeur d'entrée }1
+ 1, la &0
suivante contiendra 0 ( 00
est un littéral de langue, représenté en hexadécimal). La deuxième&1
contiendra la valeur 1 et la droite sera &0
remplie d'un F7
, ce qui soustrait 9 d'une valeur puisque l'addition dans Marbelous est le modulo 256.
//
est un dispositif déflecteur qui pousse n'importe quelle bille vers la gauche au lieu de la laisser tomber.
Mettre tout cela ensemble vous donne ceci: si le marbre }1
est à 9, les &0
synchroniseurs se remplissent. Cela entraînera la valeur 0 à tomber dans la {0
sortie et F7
(ou -9) dans la {1
sortie. Si ce }1
n'est pas 9, {0
sera rempli de }1
+ 1 et {0
contiendra 1. Il y a aussi un {>
appareil, c'est une sortie spéciale qui sort une bille à côté d'une planche au lieu d'en dessous. Cela sera rempli de}1
s'il est égal à 9.
@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
D'accord, maintenant pour le grand. Cette carte n'a pas de nom explicite, car il s'agit de la carte principale du fichier. Son nom implicite est Mb
. Vous devriez pouvoir reconnaître certaines cellules. Il existe un périphérique d'entrée, certains littéraux de langue ( 00
et FF
). Il y a des synchroniseurs et un déflecteur. permet de parcourir ce morceau par morceau.
@0 @6
}0 &0
>0 @6
\\ --
@0 /\ @4
Ainsi, la valeur d'entrée (l'entrée de ligne de commande car il s'agit de la carte principale) commence à la deuxième cellule du haut où }0
se trouve. Il tombera et atteindra l' >0
appareil, qui est un autre appareil de comparaison. tout marbre supérieur à 0 tombe à travers, tout autre marbre est poussé vers la droite. (puisque les variables Marbelous ne sont pas signées, seulement exactement 0 sera poussé vers la droite). Ce marbre de valeur nulle frappera alors le@6
appareil. Il s'agit d'un portail et transporte le marbre vers un autre portail correspondant, dans ce cas juste au-dessus. La bille 0 atteindra alors le &0
synchroniseur et déclenchera certaines choses ailleurs.
Si la bille n'est pas 0, elle tombe, est déviée vers la droite par des \\
coups --
qui la décrémentent d'un, puis tombe sur /\
un cloneur. Cet appareil prend une bille et en sort une copie à droite et une à gauche. Celui de gauche sera amené vers le haut de l'autre@0
où le marbre passera à nouveau par la même séquence. Celui de gauche sera pris ailleurs. Cela nous donne une boucle, qui décrémente l'entrée de ligne de commande une fois par boucle et déclenche un comportement sur chaque boucle jusqu'à ce qu'il atteigne 0. Il déclenche ensuite un autre comportement.
Voyons ce qui se passe avec le marbre poussé dans @4
chaque boucle.
@4 @1 .. @2 @5 @3
II II II II II II
FF &1 FF &2 FF &3
@1 OO @2 OO @3 OO
Il y a 3 littéraux de langue ici ( FF
), qui tomberont immédiatement dans les portails. Ces portails les amèneront à trois des II
appareils. II
fait référence au tableau que :I
nous avons défini plus loin dans le fichier. Puisqu'il :I
a 2 périphériques d'entrée distincts, sa représentation sur une autre carte doit avoir 2 cellules de large. Puisque nous avons 6 cellules contenantII
, nous pouvons dire que nous avons 3 instances de cette fonction sur la carte.
Les FF
billes (ou 256 ou -1 si vous voulez) resteront dans les cellules d'entrée de la :I
fonction en attendant jusqu'à ce qu'il y ait suffisamment de billes d' entrée pour démarrer la fonction (une de plus). C'est là que le @4
portail entre en jeu. Une copie de l'entrée de ligne de commande décrémentée passe par là sur chaque boucle. Cela déclenchera la :I
carte la plus à gauche . Initialement avec les valeurs 256 (ou -1) et quelle que soit l'entrée de ligne de commande était -1. Le marbre gauche sera placé dans les }0
appareils de la :I
planche et celui de droite dans le }1
. Si vous vous souvenez de ce que cette carte a fait, vous pourrez dire quel résultat cela a. Il produira une version incrémentée de l'entrée droite sur la sortie gauche (et il transforme un 9 en 0, pas 10) et sort soit 1 ou -9 sur la droite.
La valeur incrémentée sera reprise directement dans la cellule d'entrée de droite par un portail, et la valeur de droite tombe dans un synchroniseur. Si un synchroniseur contient déjà une bille, les deux billes entreront en collision. Les billes en collision sont ajoutées ensemble modulo 256. Les valeurs dans les synchroniseurs feront donc le suivi: elles commencent vide, puis passent à 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, puis à 1 à nouveau (puisque 247 s'ajoute modulo 256).
Vous vous souvenez peut-être également qu'une bille est sortie vers la droite lorsque la valeur d'entrée revient à 0. Comme les :I
cartes sont côte à côte, thsi déclenchera la carte vers la droite une fois. Cela remplira les trois synchroniseurs avec des valeurs plus élevées qu'elles ne devraient l'être pour être une représentation en shortlex de l'entrée de ligne de commande, au moment où celle-ci est bouclée à 0.
Vous vous souvenez peut-être également que la :O
fonction transforme une valeur en valeur ascii du chiffre qui représente la valeur -1. La sortie de ces OO
cellules tombera alors de la carte, qui imprime leurs caractères ascii correspondants sur STDOUT.
00 00 00 @5
&0 &0 &0
&3
\/ &2
\/ &1 !!
@5
Alors, que se passe-t-il lorsque la bille d'entrée de ligne de commande atteint 0 et remplit les &0
synchroniseurs? eh bien, quelques billes de valeur 0 tombent et déclenchent les trois synchroniseurs qui contiennent les chiffres (+ 1) du numéro de shortlex au bas de la planche. &3
est déclenché en premier, car il contient le chiffre le plus significatif, puis vient &2
ensuite &1
. Cette bille est ensuite téléportée vers l'autre @5
appareil avant de finalement toucher la !!
cellule, ce qui met fin à la planche.
19, 20, 21, 22
en décimales correspond à08, 09, 10, 11
en shortlex. C'est pourquoi j'ai utilisé ça confus100 -> 89
!