Klein est un langage 2D que j'ai conçu et qui peut être intégré à 12 surfaces topologiques différentes. Un programme de Klein peut être exécuté sur différentes surfaces en modifiant les arguments de la ligne de commande.
La topologie détermine l'emplacement du pointeur d'instruction lorsqu'il quitte le programme. Lorsque vous vous éloignez du bord, l'ip saute sur un bord avec la couleur correspondante et conserve sa position par rapport à la flèche, c'est-à-dire que le pointeur conservera sa distance par rapport à la tête de la flèche.
Par exemple 000
, la topologie , la topologie utilisée par la plupart des langages 2D, fait en sorte que le pointeur d'instruction se retourne de l'autre côté lorsqu'il se déplace hors d'un bord.
Tâche
La tâche est assez simple: écrivez un programme Klein qui, une fois exécuté, affichera la topologie dans laquelle il est exécuté. Les nombres individuels peuvent être séparés par des espaces. (par exemple, 000
et 0 0 0
sont les deux sortie autorisée). Vous pouvez choisir d'utiliser ou d'ignorer l' -A
indicateur de ligne de commande. Il ne vous coûtera pas d'octets si vous l'utilisez.
C'est du code-golf donc la réponse la plus courte sera gagnante.
Voici un pilote de test en ligne qui peut être utilisé pour tester toutes les topologies à la fois. Pour exécuter en mode entier, supprimez le fichier -A
.
Réponses:
5248 octetsEssayez-le en ligne!
Pilote d'essai
Explication
À Klein, l’IP commence dans le coin supérieur gauche et va à droite. La première étape que je souhaitais que mon programme fasse est d’envoyer l’adresse IP depuis le début du programme pour déterminer le premier et le troisième bits. L’IP rentrerait dans le programme comme suit en fonction de la topologie:
J'ai décidé que mon programme enregistrerait le troisième bit de la topologie avant le second bit mais les échangerait (avec
$
) avant la fin. À cette fin, j'ai ajouté du code pour pousser les premier et troisième bits de chaque topologie aux points d'entrée de l'IP décrits ci-dessus.Ensuite, je me suis concentré sur les topologies avec
1
ou2
comme premier élément. J'ai décidé de les recombiner et de les envoyer du côté non connecté au nord afin de pouvoir déterminer leur deuxième bit.Cela a commodément regroupé les topologies par leur deuxième bit afin que je puisse le transférer vers la pile.
Après cela, je devais simplement échanger les deuxième et troisième bits et faire terminer le programme.
Maintenant que les topologies avec
1
ou2
dans leur premier bit ont fonctionné, je pouvais me concentrer sur la création de topologies avec0
la sortie correcte. La première étape consistait à les recombiner afin de pouvoir les séparer en deux groupes en fonction de leur deuxième bit.Je me suis d'abord concentré sur ces topologies avec
1
comme second élément. Celles-ci constituaient un défi, car pour elles, l’IP était sur une ligne déjà utilisée par les topologies avec2
comme premier bit. Puisqu'il serait difficile d'adapter plus d'une instruction sur cette ligne (une instruction unique peut être sautée à l'aide de l'!
instruction) et que je manquais beaucoup d' espace, j'ai décidé de rediriger l'IP de cette ligne et de réutiliser une1
instruction existante. pousser le second bit.Maintenant, tout ce qui restait à faire pour les topologies avec
1
leur deuxième bit consistait à fixer l'ordre des deuxième et troisième bits et à se terminer.Restaient enfin les topologies avec
0
comme second bit. Il ne restait pas beaucoup d'espace dans le programme, le plus grand espace inutilisé se trouvant sur la première ligne. C'est donc là que j'ai redirigé l'adresse IP pour les topologies0
comme deuxième bit.Je devais encore pousser
0
pour le deuxième bit et fixer l'ordre des deuxième et troisième bits ainsi que terminer le programme. Heureusement, j'ai pu réutiliser une$
instruction existante afin que les instructions0
et@
puissent être placées dans les espaces restants.Enfin, les nops peuvent être supprimés des extrémités des lignes pour obtenir le programme final.
la source
1168886776961605958545350 octetsEssayez-le en ligne!
la source
-d
drapeau, c'est exactement ce que vous ferez. Malheureusement, cela ne fonctionne pas dans TIO.44 41 40 3837 octetsEssayez-le en ligne!
Pilote d'essai.
Utilise un carré de 6 par 6. Le plus court que je puisse obtenir avec un carré de 8 sur 8 est de 38 octets si quelqu'un veut essayer de l'améliorer.
Explication:
Le premier passage du code code les deux premiers chiffres des préfixes
0
et1
. Car2
, il code le troisième nombre puis le premier.Ensuite, nous passons les adresses IP à travers le troisième bord pour décider du nombre final. Nous combinons les IP avec le même préfixe.
Pour les préfixes
0
et1
, ils sortent tous les deux du bord supérieur pour décider du troisième nombre.Pour le
2
préfixe, les adresses IP sortent des coins du bord inférieur.Les deux bords échangent le premier et le troisième numéro, poussez le deuxième nombre et échangez-le avec le troisième pour obtenir le bon ordre.
la source