> <> (Fish), 107 106 103 bytes
<v}:{r&" "
1xv+
2<v+
v}<
<~v!?=&:&:
6.>ol2-?!;a
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o-+
^3<v ~}}r]~<
.40<
Pruébalo en línea!
No es súper aleatorio, pero es aleatorio. Simplemente coloque la cadena y el entero en la pila (Ejemplo: "¡Hola, mundo!", 5).
Input: "Hello world!", 5
Output: H^\^]^eceeedldcdeclgfffhowhhfggojkkkkrdccedl]]\]\d
Explicación completa
Esta es una versión un poco más antigua del código, hasta que actualizo la explicación. Es casi lo mismo, solo que quizás sea un poco más fácil de leer:
< v}:{r&" "
+1xv
+2<v
}
:&:<~ v!?=&
?!;a6.>ol2-
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o+*
^3<v ~}}r]~<
.43<
Fingiremos que el parámetro de cadena es s
y el parámetro entero es i
.
< v}:{r&" "
El <
le dice al pez que se mueva inmediatamente hacia la izquierda, lo que se envuelve " "
, lo que agrega un espacio caracterizado a la pila. Luego, el pez viaja &
, lo que agrega el espacio al registro. r
invierte la pila y la {:}
desplaza hacia la izquierda (colocando i
el extremo de la pila), copia el valor al final de la pila y luego la desplaza hacia la derecha. v
le dice al pez que comience a moverse hacia abajo.
+1xv
+2<v
}
x
le dice al pez que se mueva en una dirección aleatoria, lo que finalmente hace que el pez vaya a la derecha y continúe hacia abajo, o pase por encima 1+
o de 2+
antemano. Estos suman 1 o 2 respectivamente al número al final de la pila. Si el pez viaja hacia arriba, golpea de v
nuevo y viaja hacia abajo. }
desplaza la pila a la derecha, luego tiene la i
posición 1 en la pila y esta nueva variable en la posición 0 (la llamaremos m
).
:&:<~ v!?=&
Esta sección es una función, llamémosla whitespaceTrimmer . Comienza donde el<
está el. Simplemente elimina los espacios que están en el extremo de la pila (por lo tanto, el comienzo de la cadena) hasta que se encuentra con un carácter que no es espacio.
Entonces, inmediatamente el pez nada hacia a <
y debe viajar hacia la izquierda. Luego se topa con:&:&
y copia el valor en el extremo de la pila, coloca el espacio desde el registro al final de la pila, lo copia y luego lo vuelve a colocar en el registro.
Luego, el pez golpea =?!v ~
, o más específicamente, =
que saca los dos últimos valores (los dos que acabamos de crear) de la pila, los compara, coloca un 1 en el extremo de la pila si son iguales y un 0 en Al final de la pila si son diferentes. La ?
hace estallar el nuevo valor fuera de la final de la pila, si es 0 no se ejecuta la siguiente instrucción, que en este caso es !
, en su lugar se ejecuta v
, que las órdenes de los peces a moverse hacia abajo (salida de la función).
Sin embargo, si es 1, entonces ha encontrado un espacio, por lo que ejecuta el !
que es un trampolín, y eso hace que el pez omita la siguiente instrucción, que es a v
, por lo que el pez continúa. Frente al pez, ve ~
qué le dice que saque el último valor de la pila (confirmado como un espacio), luego el pez continúa y ejecuta la función nuevamente.
?!;a6.>ol2-
Inmediatamente se le dice al pez que nade a la derecha por a >
, luego muestra el último carácter en la pila o
(que, la primera vez que se ejecuta, es el primer carácter de s
). Obtiene la longitud de la pila l
, coloca un 2
al final de la pila y luego -
hace que se reste 2 l
. Golpea lo ?!;
que, al recordar lo que ?
hace, hace que el pez se salte !
si la pila está vacía y aterriza ;
, lo que finaliza el programa.
A continuación, si todavía hay caracteres en la pila, ejecutamos lo !
que hace que el pez rebote sobre ;
y ejecute a6.
, que almacena a
(AKA 10
), y 6
al final de la pila, que son x, y
coordenadas para .
, que los saca del final de la pila. apilar, luego teletransporta al pez 10, 6
y ejecuta la instrucción a la derecha de esa posición (ya que el pez nada a la derecha).
Esto es menos complicado de lo que parece cuando te das cuenta de que la y
posición 6 es la línea debajo de esta. x
la posición 10 es entonces v
, y a la derecha de eso es
, que es un no-op. Esto hace que el pez continúe nadando bien y realmente comience la ejecución al comienzo de la línea ...
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o+*
^3<v ~}}r]~<
.43<
Entonces esta es la función que agrega el texto aleatorio entre los caracteres. Es un poco bocado, pero eso es solo porque intenté hacerlo un poco más al azar. Llamemos a esto genRandomChars .
En :{{:}l1-[rv
realidad, es la configuración de la función, y menos parte de la función en sí. El pez nada primero, lo :{{
que copia el valor al final de la pila, luego lo desplaza hacia la izquierda dos veces. Si recuerdas que i
estaba en la posición 1 de la pila, sabrías que i
ahora está al final de la pila.
Luego, el pez nada sobre :}
las copias i
y desplaza la pila hacia la derecha, colocando i
ambas al principio y al final de la pila. l1-[
hace que el pez coloque la longitud en el extremo de la pila, reste 1 de ella, luego [
cree una nueva pila, moviendo los l-1
valores (longitud de la pila menos 1) a la nueva pila (por lo tanto, simplemente abandonando i
la pila anterior). Luego, el pez simplemente golpea, lo rv
que invierte la pila nuevamente (creo que crear una nueva pila la invierte por alguna razón), y ordena que el pez nade hacia abajo una vez más, comenzando verdaderamente la función en el<
inferior.
Entonces, actualmente el final de la pila tiene m
y nuestro temporal i
, que llamaremos ti
. Inmediatamente el pez nada 1-}
, lo que resta 1 ti
y lo mueve al comienzo de la pila. Luego, :}
que simplemente lo copia m
y lo mueve al comienzo de la pila (poniendoti
en la posición 1 de la pila).
Esto es cuando golpeamos esta pequeña cosa:
v2<
<1x|!
^3<
Esto es realmente muy simple. Esto !
hace que el pez salte |
y se ejecute x
. Recordando lo que x
hace, recordamos que esto hace que los peces se muevan en 4 direcciones. |
es simplemente un espejo y hace que el pez nade de regreso ax
. Básicamente, el pez colocará 1, 2 o 3 en el extremo de la pila, y continuará moviéndose hacia la izquierda, envolviendo.
Luego, el pez se ejecuta, lo *+o
que hace que los dos últimos valores de la pila se eliminen, se multipliquen juntos, y el resultado se vuelva a presionar, luego lo mismo con la suma, luego el valor final se extrae de la pila y se genera o
. Nuestra pila es ahora relativamente normal de nuevo que contiene solo [ m
, ti
,s
].
:}}:
hace que el valor en el extremo de la pila (básicamente la s
posición 0) no se copie, luego la pila se desplaza hacia la derecha dos veces (colocándose ti
en el frente nuevamente), luego ti
se copia. ?!v
debería ser bastante fácil de entender por ahora. Básicamente, si ti
es 0, salimos de la función con v
, de lo contrario, ejecutamos !
y omitimosv
(haciendo otro ciclo).
Si ti
es 0 y hemos terminado de generar caracteres ligeramente aleatorios, ejecutamos v
y vemos:
v ~}}r]~<
.43<
Nada muy lujoso aquí. Eliminamos ti
de la pila a través de ~
. ¡Entonces ]
es nuevo, saca todos nuestros valores de la pila y los coloca en la pila anterior! Debido al problema de reversión invertimos con r
, a continuación, cambiar la pila de la derecha dos veces con }}~
, shufting la pila a la derecha, que nos da [ m
, i
, s
], el ~
es eliminar el extra duplicado s[0]
desde principios de la función a medida que lo necesitaría si estábamos haciendo un bucle (pero no estamos, estamos saliendo). v
le dice al pez que nade hacia abajo y hacia adentro >34.
(invertido para mostrar el orden de ejecución), que le dice al pez que simplemente nade hacia la izquierda y hacia adentro 3, 4
(¡porque .
es un salto!). 3, 4
en realidad está justo a la derecha del principiowhitespaceTrimmer
, lo cual es perfecto porque estamos viajando a la izquierda.
Siguiendo toda esta lógica, podemos seguir al pez hasta que la pila esté finalmente vacía y el programa salga justo después de whitespaceTrimmer
ejecutarse.