> <> (Fisch), 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<
Probieren Sie es online!
Es ist nicht super zufällig, aber es ist zufällig. Legen Sie einfach den String und die ganze Zahl auf den Stapel (Beispiel: "Hallo Welt!", 5).
Input: "Hello world!", 5
Output: H^\^]^eceeedldcdeclgfffhowhhfggojkkkkrdccedl]]\]\d
Vollständige Erklärung
Dies ist eine etwas ältere Version des Codes, bis ich die Erklärung aktualisiere. Es ist meistens dasselbe, nur vielleicht ein bisschen einfacher zu lesen:
< v}:{r&" "
+1xv
+2<v
}
:&:<~ v!?=&
?!;a6.>ol2-
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o+*
^3<v ~}}r]~<
.43<
Wir werden so tun, als wäre der String-Parameter s
und der Integer-Parameter i
.
< v}:{r&" "
Der <
Befehl weist den Fisch an, sich sofort nach links zu bewegen, woraufhin " "
der Stapel um ein Feld erweitert wird. Dann reist der Fisch vorbei &
, was dem Register den Platz hinzufügt. r
Kehrt den Stapel um und {:}
verschiebt den Stapel nach links (setzt i
das Ende des Stapels auf), kopiert den Wert am Ende des Stapels und verschiebt ihn dann nach rechts. v
sagt dem Fisch, er solle sich nach unten bewegen.
+1xv
+2<v
}
x
weist den Fisch an, sich in eine zufällige Richtung zu bewegen, was letztendlich dazu führt, dass der Fisch nach rechts und weiter nach unten geht oder über 1+
oder vorüber geht 2+
. Diese addieren jeweils 1 oder 2 zur Zahl am Ende des Stapels. Wenn der Fisch aufwärts reist, trifft er v
erneut und reist wieder abwärts. }
verschiebt den Stapel nach rechts und hat dann die i
Position 1 auf dem Stapel und diese neue Variable die Position 0 (wir nennen es m
).
:&:<~ v!?=&
Dieser Abschnitt ist eine Funktion, nennen wir sie WhitespaceTrimmer . Es beginnt dort, wo es <
ist. Leerzeichen am Ende des Stapels (also am Anfang der Zeichenfolge) werden entfernt, bis ein Nicht-Leerzeichen angezeigt wird.
Also schwimmt der Fisch sofort in ein <
und muss nach links fahren. Anschließend wird ausgeführt, in :&:&
welche der Wert am Ende des Stapels kopiert wird, der Speicherplatz aus dem Register auf das Ende des Stapels platziert wird, kopiert und dann wieder auf das Register zurückgesetzt wird.
Dann trifft der Fisch =?!v ~
, oder genauer gesagt, =
der die letzten beiden Werte (die beiden, die wir gerade erstellt haben) aus dem Stapel entfernt, vergleicht sie, setzt eine 1 am Ende des Stapels, wenn sie gleich sind, und eine 0 an das Ende des Stapels, wenn sie unterschiedlich sind. Das ?
löscht den neuen Wert vom Ende des Stapels. Wenn er 0 ist, führt es nicht den nächsten Befehl aus. In diesem Fall !
führt es stattdessen den folgenden Befehl aus v
, der den Fisch auffordert , sich nach unten zu bewegen (die Funktion zu verlassen).
Wenn es jedoch 1 ist, dann hat es ein Leerzeichen gefunden, so dass es das ausführt, !
was ein Trampolin ist, und das den Fisch veranlasst, die nächste Anweisung zu überspringen, die a ist v
, so dass der Fisch fortfährt. Vor dem Fisch sieht er, ~
welcher ihn auffordert, den letzten Wert vom Stapel zu nehmen (bestätigt als Leerzeichen), dann fährt der Fisch fort und führt die Funktion erneut aus.
?!;a6.>ol2-
Der Fisch wird sofort angewiesen, direkt von a zu schwimmen >
, und gibt dann das letzte Zeichen auf dem Stapel von aus o
(das erste Mal, wenn dies ausgeführt wird, ist das erste Zeichen von s
). Er erhält die Länge des Stapels von l
, platziert a 2
am Ende des Stapels und -
bewirkt dann, dass 2 von subtrahiert wird l
. Es trifft auf ?!;
das, was ?
den Fisch veranlasst, !
den Stapel zu überspringen, wenn er leer ist, und landet auf dem Stapel ;
, wodurch das Programm beendet wird.
Wenn sich noch Zeichen auf dem Stapel befinden, wird ausgeführt !
, wodurch der Fisch über den AKA- Speicher springt ;
und ausgeführt a6.
wird , und am Ende des Stapels werden die Koordinaten für den a
AKA- Speicher angezeigt , der sie vom Ende des AKA- Speichers abwirft stapeln, dann teleportieren Sie den Fisch zu und führen Sie die Anweisung rechts von dieser Position aus (da der Fisch richtig schwimmt).10
6
x, y
.
10, 6
Dies ist weniger kompliziert als es sich anhört, wenn Sie erkennen, dass y
Position 6 die Linie unter dieser Position ist. x
Position 10 ist dann v
, und rechts davon ist
, was ein No-Op ist. Dies führt dazu, dass der Fisch richtig weiter schwimmt und die Ausführung tatsächlich am Anfang der Linie beginnt ...
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o+*
^3<v ~}}r]~<
.43<
Dies ist also die Funktion, die den zufälligen Text zwischen den Zeichen hinzufügt. Es ist ein bisschen mundvoll, aber das ist nur, weil ich versucht habe, es ein bisschen extra zufällig zu machen. Nennen wir das genRandomChars .
Das :{{:}l1-[rv
ist eigentlich das Setup für die Funktion, und weniger so einen Teil der eigentlichen Funktion selbst. Der Fisch schwimmt zuerst :{{
, kopiert den Wert am Ende des Stapels und verschiebt ihn dann zweimal nach links. Wenn Sie sich erinnern, dass i
sich das auf Position 1 des Stapels befand, wissen Sie, dass i
es sich jetzt am Ende des Stapels befindet.
Der Fisch schwimmt dann über :}
die Kopien i
und verschiebt den Stapel nach rechts, wobei er i
sowohl am Anfang als auch am Ende des Stapels platziert. l1-[
Lässt der Fisch die Länge am Ende des [
Stapels platzieren, zieht 1 davon ab und erstellt dann einen neuen Stapel, wobei die l-1
Werte (Stapellänge minus 1) zum neuen Stapel verschoben werden (so dass nur i
der alte Stapel übrig bleibt). Dann schlägt der Fisch einfach zu, rv
was den Stapel wieder umkehrt (ich denke, das Erzeugen eines neuen Stapels kehrt ihn aus irgendeinem Grund um), und befiehlt dem Fisch, noch einmal nach unten zu schwimmen, wobei die Funktion wirklich unten beginnt <
.
Also hat derzeit das Ende des Stacks m
und unsere temporäre i
, die wir nennen werden ti
. Sofort schwimmt der Fisch vorbei 1-}
, der 1 abzieht ti
und an den Anfang des Stapels verschiebt. Dann wird es :}
einfach kopiert m
und an den Anfang des Stapels verschoben ( ti
Position 1 des Stapels ).
Dies ist, wenn wir dieses kleine Ding treffen:
v2<
<1x|!
^3<
Das ist eigentlich ganz einfach. Das !
bewirkt, dass der Fisch überspringt |
und ausgeführt wird x
. Wenn x
wir uns erinnern, was passiert, bewegen sich die Fische in 4 Richtungen. |
ist einfach ein Spiegel und bewirkt, dass der Fisch zurückschwimmt x
. Im Grunde genommen wird der Fisch 1, 2 oder 3 auf das Ende des Stapels legen und sich weiter nach links bewegen und herumwickeln.
Der Fisch wird dann ausgeführt *+o
, wodurch die letzten beiden Werte auf dem Stapel abgehoben, multipliziert und das Ergebnis zurückgeschoben werden. Dann wird das Gleiche mit Addition ausgeführt. Dann wird der Endwert vom Stapel genommen und mit ausgegeben o
. Unser Stapel ist jetzt relativ normal wieder enthält nur [ m
, ti
, s
].
:}}:
bewirkt, dass der Wert am Ende des Stapels (im Grunde s
Position 0) nicht kopiert wird, dann wird der Stapel zweimal nach rechts verschoben ( ti
wieder vorne platziert) und dann ti
kopiert. ?!v
sollte mittlerweile ziemlich einfach zu verstehen sein. Im Grunde genommen verlassen ti
wir die Funktion mit v
, wenn sie 0 ist , andernfalls führen wir eine andere Schleife aus !
und überspringen v
sie.
Wenn ti
0 ist und wir keine leicht zufälligen Zeichen mehr ausgeben, führen wir Folgendes aus v
und sehen:
v ~}}r]~<
.43<
Nichts Besonderes hier. Wir entfernen ti
vom Stapel über ~
. Dann ]
ist es neu, es wirft alle unsere Werte vom Stapel und legt sie auf den alten Stapel! Aufgrund der Umkehrung Problems , das wir mit umkehren r
, dann den Stapel nach rechts verschieben zweimal mit }}~
, shufting den Stapel nach rechts, was uns [ m
, i
, s
], das ~
ist die zusätzliche dupliziert entfernen s[0]
von früher in der Funktion , wie wir es brauchen würden , wenn Wir machten eine Schleife (aber wir sind nicht, wir verlassen). v
sagt den Fischen, dass sie hinunter und hinein schwimmen sollen >34.
(invertiert, um die Ausführungsreihenfolge anzuzeigen), was den Fischen sagt, dass sie einfach nach links und hinein schwimmen sollen 3, 4
(weil das .
ein Sprung ist!). 3, 4
ist eigentlich nur rechts vom anfangwhitespaceTrimmer
, was perfekt ist, weil wir links unterwegs sind.
Nach all dieser Logik können wir den Fischen folgen, bis der Stapel endgültig leer ist und das Programm unmittelbar nach der whitespaceTrimmer
Ausführung beendet wird.