> <> (Poisson), 107 106 103 octets
<v}:{r&" "
1xv+
2<v+
v}<
<~v!?=&:&:
6.>ol2-?!;a
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o-+
^3<v ~}}r]~<
.40<
Essayez-le en ligne!
Ce n'est pas super aléatoire, mais c'est aléatoire. Placez simplement la chaîne et l'entier sur la pile (exemple: "Bonjour tout le monde!", 5).
Input: "Hello world!", 5
Output: H^\^]^eceeedldcdeclgfffhowhhfggojkkkkrdccedl]]\]\d
Explication complète
Il s'agit d'une version légèrement plus ancienne du code, jusqu'à ce que je mette à jour l'explication. C'est à peu près la même chose, peut-être un peu plus facile à lire:
< v}:{r&" "
+1xv
+2<v
}
:&:<~ v!?=&
?!;a6.>ol2-
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o+*
^3<v ~}}r]~<
.43<
Nous prétendons que le paramètre de chaîne est s
et le paramètre entier est i
.
< v}:{r&" "
Le <
dit au poisson de se déplacer immédiatement vers la gauche, qui s'enroule vers " "
, ce qui ajoute un espace à la pile. Ensuite, le poisson se déplace &
, ce qui ajoute de l'espace au registre. r
inverse la pile et {:}
décale la pile vers la gauche (en mettant i
la fin de la pile), copie la valeur à la fin de la pile, puis la décale vers la droite. v
dit au poisson de commencer à descendre.
+1xv
+2<v
}
x
indique au poisson de se déplacer dans une direction aléatoire, entraînant finalement le poisson à droite et continue vers le bas, ou passe au-dessus 1+
ou 2+
avant. Ceux-ci ajoutent respectivement 1 ou 2 au nombre à la fin de la pile. Si le poisson v
remonte , il frappe à nouveau et redescend. }
décale la pile vers la droite, puis ayant i
à la position 1 sur la pile et cette nouvelle variable à la position 0 (nous l'appellerons m
).
:&:<~ v!?=&
Cette section est une fonction, appelons-la whitespaceTrimmer . Cela commence là où <
est. Il supprime simplement les espaces qui se trouvent à la fin de la pile (donc au début de la chaîne) jusqu'à ce qu'il rencontre un caractère non-espace.
Donc, immédiatement, le poisson nage dans un <
et doit se déplacer vers la gauche. Il s'exécute ensuite dans :&:&
lequel copie la valeur à la fin de la pile, place l'espace du registre à la fin de la pile, le copie, puis le replace sur le registre.
Ensuite, le poisson frappe =?!v ~
, ou plus précisément, =
qui sort les deux dernières valeurs (les deux que nous venons de créer) de la pile, les compare, place un 1 à la fin de la pile si elles sont égales et un 0 sur la fin de la pile si elles sont différentes. Le fait ?
apparaître la nouvelle valeur à la fin de la pile, s'il est égal à 0, il n'exécute pas l'instruction suivante, qui dans ce cas !
, il exécute à la placev
, ce qui ordonne au poisson de se déplacer vers le bas (en quittant la fonction).
Si c'est 1 cependant, alors il a trouvé un espace, donc il exécute le !
qui est un trampoline, et cela fait que le poisson saute l'instruction suivante, qui est un v
, donc le poisson continue. Devant le poisson, il voit ~
qui lui dit de sortir la dernière valeur de la pile (confirmée comme étant un espace), puis le poisson continue et exécute à nouveau la fonction.
?!;a6.>ol2-
Le poisson est immédiatement averti de nager à droite de a >
, puis de sortir le dernier caractère de la pile o
(qui, la première fois qu'il est exécuté, est le premier caractère de s
). Il obtient la longueur de la pile l
, place un 2
à la fin de la pile, puis -
en soustrait 2 l
. Il frappe ?!;
ce qui, se souvenant de ce qui ?
fait, fait sauter le poisson !
si la pile est vide et atterrir ;
, ce qui met fin au programme.
Après s'il y a encore des caractères sur la pile, nous exécutons !
ce qui fait rebondir le poisson sur ;
et exécute a6.
, qui stocke a
(AKA 10
), et 6
à la fin de la pile, qui sont les x, y
coordonnées de .
, ce qui les fait disparaître à la fin de la empiler, puis téléporter le poisson 10, 6
et exécuter l'instruction à droite de cette position (car le poisson nage à droite).
C'est moins compliqué qu'il n'y paraît lorsque vous réalisez que la y
position 6 est la ligne en dessous de celle-ci. x
la position 10 est alors v
, et à droite de celle-ci
, qui est un no-op. Cela amène le poisson à continuer de nager à droite et à commencer l'exécution en fait au début de la ligne ...
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o+*
^3<v ~}}r]~<
.43<
C'est donc la fonction qui ajoute le texte aléatoire entre les caractères. C'est un peu bouchée, mais c'est juste parce que j'ai essayé de le rendre un peu plus aléatoire. Appelons cela genRandomChars .
Le :{{:}l1-[rv
est en fait la configuration de la fonction, et moins une partie de la fonction elle-même. Le poisson nage d'abord sur :{{
lequel copie la valeur à la fin de la pile, puis la déplace deux fois vers la gauche. Si vous vous souvenez que i
c'était à la position 1 sur la pile, alors vous sauriezi
c'est maintenant à la fin de la pile.
Le poisson nage ensuite sur les :}
copies i
et déplace la pile vers la droite, en la plaçant i
au début et à la fin de la pile. l1-[
demande au poisson de placer la longueur à la fin de la pile, soustrayez-en 1, puis [
créez une nouvelle pile, en déplaçant l-1
(longueur de la pile moins 1) les valeurs vers la nouvelle pile (donc en laissant simplement i
sur l'ancienne pile). Ensuite, le poisson frappe simplement, rv
ce qui inverse à nouveau la pile (je pense que la création d'une nouvelle pile l'inverse pour une raison quelconque) et ordonne au poisson de nager à nouveau vers le bas, en commençant vraiment la fonction <
ci - dessous.
Donc, actuellement, la fin de la pile a m
et notre temporaire i
, que nous appellerons ti
. Immédiatement, le poisson nage 1-}
, ce qui soustrait 1 ti
et le déplace au début de la pile. Ensuite, :}
qui copie simplement m
et le déplace au début de la pile (en mettantti
à la position de pile 1).
C'est là que nous avons touché cette petite chose:
v2<
<1x|!
^3<
C'est vraiment simple. Le !
fait sauter |
et exécuter le poisson x
. En se souvenant de ce qui se x
passe, nous nous souvenons que cela fait bouger le poisson dans 4 directions. |
est simplement un miroir, et fait revenir le poissonx
. Donc, fondamentalement, le poisson placera 1, 2 ou 3 à la fin de la pile et continuera à se déplacer vers la gauche, en s'enroulant.
Le poisson s'exécute ensuite, *+o
ce qui provoque le saut des deux dernières valeurs de la pile, leur multiplication et le retour du résultat, puis la même chose avec addition, puis la valeur finale est sautée de la pile et sortie avec o
. Notre pile est maintenant contenant encore relativement normale juste [ m
, ti
, s
].
:}}:
entraîne la s
copie de la valeur à la fin de la pile (essentiellement la position 0), puis la pile est déplacée deux fois vers la droite (en la replaçant ti
sur le devant), puis ti
est copiée. ?!v
devrait être assez facile à comprendre maintenant. Fondamentalement, si ti
est 0, nous quittons la fonction avec v
, sinon nous exécutons !
et sautonsv
(en faisant une autre boucle).
Si ti
est 0 et que nous avons fini de produire des caractères légèrement aléatoires, alors nous exécutons v
et voyons:
v ~}}r]~<
.43<
Rien d'extraordinaire ici. Nous retirons ti
de la pile via ~
. Puis ]
c'est nouveau, il sort toutes nos valeurs de la pile et les place sur l'ancienne pile! En raison de la question de l' inversion on inverse avec r
, puis déplacer la pile à droite deux fois avec }}~
, shufting la pile à droite, nous donnant [ m
, i
, s
], l' ~
est de supprimer le supplément en double s[0]
plus tôt dans la fonction que nous aurions besoin si nous faisions une boucle (mais nous ne le sommes pas, nous sortons). v
dit au poisson de nager vers le bas et vers l' >34.
intérieur (inversé pour montrer l'ordre d'exécution), ce qui dit au poisson de simplement nager vers la gauche et vers l'intérieur 3, 4
(parce que le.
c'est un saut!). 3, 4
est en fait juste à droite du débutwhitespaceTrimmer
, ce qui est parfait car nous partons à gauche.
En suivant toute cette logique, nous pouvons suivre le poisson jusqu'à ce que la pile soit finalement vide et que le programme se termine juste après whitespaceTrimmer
son exécution.