> <> (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 se 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. rinverte la pila e {:}sposta la pila a sinistra (posizionandola ialla fine della pila), copia il valore alla fine della pila, quindi lo sposta a destra. vdice al pesce di iniziare a muoversi verso il basso.
+1xv
+2<v
}
xdice 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 vnuovo e torna indietro. }sposta lo stack a destra, quindi avendo la iposizione 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 vche 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 2a 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 6alla fine dello stack, che sono x, ycoordinate per le .quali li espelle alla fine del impilare, quindi teletrasportare il pesce 10, 6ed 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 yposizione 6 è la linea sotto questa. xla 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-[rvrealtà è 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 iera nella posizione 1 nella pila, allora sapresti che iè ora alla fine della pila.
Il pesce quindi nuota su :}quale copia ie sposta la pila a destra, posizionando isia 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-1valori (lunghezza pila meno 1) sulla nuova pila (quindi lasciando isulla pila vecchia). Quindi il pesce colpisce semplicemente il rvche 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 me il nostro temporaneo i, che chiameremo ti. Immediatamente il pesce nuota 1-}, sottraendo 1 da tie lo sposta all'inizio della pila. Quindi, :}che semplicemente copia me lo sposta all'inizio della pila (mettendo tinella 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 xsuccede, 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 *+oche 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 sposizione 0) non venga copiato, quindi la pila viene spostata due volte a destra (posizionandola tinuovamente sulla parte anteriore), quindi tiviene copiata. ?!vdovrebbe 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 ve vediamo:
v ~}}r]~<
.43<
Niente di speciale qui. Rimuoviamo tidallo 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). vdice 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' whitespaceTrimmeresecuzione.