> <> (Pesce), 107 106 103 byte
<v}:{r&" "
1xv+
2<v+
v}<
<~v!?=&:&:
6.>ol2-?!;a
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o-+
^3<v ~}}r]~<
.40<
Provalo online!
Non è super casuale, ma è casuale. Posiziona semplicemente la stringa e il numero intero sullo stack (Esempio: "Hello world!", 5).
Input: "Hello world!", 5
Output: H^\^]^eceeedldcdeclgfffhowhhfggojkkkkrdccedl]]\]\d
Spiegazione completa
Questa è una versione leggermente più vecchia del codice, fino a quando non aggiorno la spiegazione. È per lo più lo stesso, forse solo un po 'più facile da leggere:
< v}:{r&" "
+1xv
+2<v
}
:&:<~ v!?=&
?!;a6.>ol2-
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o+*
^3<v ~}}r]~<
.43<
Faremo finta che il parametro string sia s
e il parametro integer sia i
.
< v}:{r&" "
Questo <
dice al pesce di spostarsi immediatamente a sinistra, che si avvolge intorno " "
, il che aggiunge uno spazio disegnato alla pila. Quindi il pesce viaggia &
, il che aggiunge lo spazio al registro. r
inverte la pila e {:}
sposta la pila a sinistra (posizionandola i
alla fine della pila), copia il valore alla fine della pila, quindi lo sposta a destra. v
dice al pesce di iniziare a muoversi verso il basso.
+1xv
+2<v
}
x
dice al pesce di muoversi in una direzione casuale, portando alla fine il pesce che va a destra e continua verso il basso, oppure passa sopra 1+
o 2+
prima. Questi aggiungono rispettivamente 1 o 2 al numero alla fine della pila. Se il pesce viaggia verso l'alto, colpisce di v
nuovo e torna indietro. }
sposta lo stack a destra, quindi avendo la i
posizione 1 nello stack e questa nuova variabile nella posizione 0 (lo chiameremo m
).
:&:<~ v!?=&
Questa sezione è una funzione, chiamiamola whitespaceTrimmer . Inizia dove si <
trova. Elimina semplicemente gli spazi che si trovano alla fine della pila (quindi l'inizio della stringa) fino a quando non si imbatte in un carattere non spaziale.
Quindi immediatamente il pesce nuota in un <
e deve viaggiare a sinistra. Quindi si imbatte:&:&
cui copia il valore all'estremità della pila, posiziona lo spazio dal registro alla fine della pila, lo copia, quindi lo posiziona nuovamente nel registro.
Quindi il pesce colpisce =?!v ~
, o più specificamente, =
che estrae gli ultimi due valori (i due che abbiamo appena creato) dallo stack, li confronta, posiziona un 1 alla fine dello stack se sono uguali e uno 0 su la fine della pila se sono diverse. La ?
schiocca il nuovo valore l'estremità della pila, se è 0 non esegue l'istruzione successiva, che in questo caso è !
, invece esegue v
che ordini il pesce a scendere (uscita dalla funzione).
Se è 1, tuttavia, ha trovato uno spazio, quindi esegue quello !
che è un trampolino, e questo fa sì che il pesce salti l'istruzione successiva, che è a v
, quindi il pesce continua. Di fronte al pesce, vede ~
quale gli dice di estrarre l'ultimo valore dallo stack (confermato come spazio), quindi il pesce continua ed esegue nuovamente la funzione.
?!;a6.>ol2-
Al pesce viene immediatamente detto di nuotare a destra da un >
, quindi emette l'ultimo personaggio in pila di o
(che, la prima volta che viene eseguito, è il primo personaggio di s
). Prende la lunghezza della pila l
, posiziona 2
a alla fine della pila, quindi -
fa sottrarre 2 l
. Colpisce il ?!;
che, ricordando cosa ?
fa, fa saltare il pesce !
se la pila è vuota e atterra;
, che termina il programma.
In seguito, se ci sono ancora caratteri nello stack, eseguiamo ciò !
che fa rimbalzare il pesce sopra ;
e lo esegue a6.
, che memorizza a
(AKA 10
), e 6
alla fine dello stack, che sono x, y
coordinate per le .
quali li espelle alla fine del impilare, quindi teletrasportare il pesce 10, 6
ed eseguire le istruzioni a destra di quella posizione (mentre il pesce sta nuotando a destra).
Questo è meno complicato di quanto sembri quando ti rendi conto che la y
posizione 6 è la linea sotto questa. x
la posizione 10 è quindi v
, e alla sua destra
, che è una no-op. Questo fa sì che il pesce continui a nuotare bene e inizi effettivamente l'esecuzione all'inizio della linea ...
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o+*
^3<v ~}}r]~<
.43<
Quindi questa è la funzione che aggiunge il testo casuale tra i caratteri. È un po 'un boccone, ma è solo perché ho cercato di renderlo un po' più casuale. Chiamiamo questo genRandomChars .
In :{{:}l1-[rv
realtà è l'impostazione per la funzione, e meno parte della funzione stessa. Il pesce prima nuota sopra il :{{
quale copia il valore all'estremità della pila, quindi lo sposta due volte a sinistra. Se ricordi che i
era nella posizione 1 nella pila, allora sapresti che i
è ora alla fine della pila.
Il pesce quindi nuota su :}
quale copia i
e sposta la pila a destra, posizionando i
sia all'inizio che alla fine della pila. l1-[
fa posizionare il pesce alla fine della pila, sottrae 1 da essa, quindi [
crea una nuova pila, spostando i l-1
valori (lunghezza pila meno 1) sulla nuova pila (quindi lasciando i
sulla pila vecchia). Quindi il pesce colpisce semplicemente il rv
che inverte di nuovo lo stack (penso che la creazione di un nuovo stack lo inverta per qualche motivo), e ordina al pesce di nuotare ancora una volta verso il basso, iniziando davvero la funzione dal <
basso.
Quindi attualmente la fine dello stack ha m
e il nostro temporaneo i
, che chiameremo ti
. Immediatamente il pesce nuota 1-}
, sottraendo 1 da ti
e lo sposta all'inizio della pila. Quindi, :}
che semplicemente copia m
e lo sposta all'inizio della pila (mettendo ti
nella posizione 1 della pila).
Questo è quando colpiamo questa piccola cosa:
v2<
<1x|!
^3<
Questo è in realtà semplice morto. Ciò !
fa saltare |
ed eseguire il pesce x
. Ricordando cosa x
succede, ricordiamo che questo fa muovere il pesce in 4 direzioni. |
è semplicemente uno specchio e fa ritornare il pesce x
. Quindi, fondamentalmente, il pesce posizionerà 1, 2 o 3 sull'estremità dello stack e continuerà a spostarsi a sinistra, avvolgendosi.
Il pesce quindi esegue il *+o
che fa schioccare, moltiplicare insieme gli ultimi due valori nello stack e il risultato si spinge indietro, quindi la stessa cosa con l'aggiunta, quindi il valore finale viene saltato fuori dallo stack e emesso con o
. Il nostro stack è ora relativamente nuovo normale contenente solo [ m
, ti
,s
].
:}}:
fa sì che il valore all'estremità della pila (sostanzialmente la s
posizione 0) non venga copiato, quindi la pila viene spostata due volte a destra (posizionandola ti
nuovamente sulla parte anteriore), quindi ti
viene copiata. ?!v
dovrebbe essere abbastanza facile da capire ormai. Fondamentalmente se ti
è 0 allora usciamo dalla funzione v
, altrimenti eseguiamo !
e saltiamov
(facendo un altro ciclo).
Se ti
è 0 e abbiamo finito di emettere caratteri leggermente casuali, quindi eseguiamo v
e vediamo:
v ~}}r]~<
.43<
Niente di speciale qui. Rimuoviamo ti
dallo stack tramite ~
. Quindi ]
è nuovo, estrae tutti i nostri valori dallo stack e li posiziona nello stack precedente! A causa del problema di inversione invertiamo con r
, quindi spostare la pila destra due volte con }}~
, shufting lo stack a destra, dandoci [ m
, i
, s
], il ~
è quello di rimuovere l'extra duplicato s[0]
dalla prima in funzione di come avremmo bisogno se stavamo facendo un ciclo (ma non lo siamo, stiamo uscendo). v
dice al pesce di nuotare verso il basso e dentro >34.
(invertito per mostrare l'ordine di esecuzione), che dice al pesce di nuotare semplicemente a sinistra e dentro 3, 4
(perché il.
è un salto!). 3, 4
è in realtà proprio alla destra dell'iniziowhitespaceTrimmer
, che è perfetto perché stiamo viaggiando a sinistra.
Seguendo tutta questa logica possiamo seguire il pesce fino a quando lo stack non è alla fine vuoto e il programma esce subito dopo l' whitespaceTrimmer
esecuzione.