D,g,@@#,BF1_B
D,k,@@#,bR$d@$!Q@BFB
D,f,@,BDdVÑ_€?1€_0b]$+€?dbLRBcB*BZB]GbL1+b]+qG€gd€bLÑ_0b]$+BcB]£k€¦+Ñ=1$ª=
Probieren Sie es online!
Wie es funktioniert
Wir definieren unsere 3 Funktionen, f, G und k. f ist die Hauptfunktion, die die Eingabe in die richtige Ausgabe umwandelt.
f( x )
Zuerst konvertieren wir die Eingabe Xin eine Liste von Ziffern, dann nehmen Sie die Vorwärtsschritte. Als nächstes nehmen wir das Vorzeichen jedes Inkrements. Dies ergibt bei zunehmenden Teilfolgen eine Teilfolge von1für gleiche Teilfolgen, wie z [ 4 , 4 , 4 ], Dies ergibt 0s und für abnehmende Abschnitte, - 1ist zurück gekommen. Wir nehmen dann das Komplement von jedem dieser Zeichen, um uns umzudrehen1in einen falschen Wert und alles andere in einen wahren Wert. Nächster,0wird diesem Array vorangestellt, und wir nehmen das Vorzeichen jedes Elements erneut. Dies ergibt ein Array,EIN, von 0 und 1, wobei das erste Element immer ist 0.
Wir geben dann den Bereich [ 1 , 2 , . . . l e n gt h ( A ) ] und entfernen Sie die entsprechenden Elemente 0 im EIN. Dies lässt uns mit einem zweiten Array,EIN′. Wir tippen dann die Anzahl der Ziffern in die Eingabe, addieren eine und hängen diese Zahl anEIN′. Wir deduplizieren dannEIN′, um ein neues Array zu ergeben, EIN''.
Als nächstes verwenden wir die GHilfsfunktion. WieGist dyadisch (benötigt 2 Argumente) und verhält sich in Verbindung mit jedem Operator etwas anders €
. Dyadische Funktionen holen einen Wert aus dem Stapel und binden diesen Wert als ihr rechtes Argument, um eine partielle monadische Funktion zu erzeugen. Diese Teilfunktion wird dann auf jedes Element im Argument abgebildet. Das gebundene rechte Argument sind hier die Ziffern der Eingabe, und die Teilfunktion wird abgebildetEIN''.
G( x , y)
Schauen wir uns nur eine Iteration von an G( x , y) wo x : = [ 1 , 2 , 0 , 1 , 2 ] und y= 3. Beachten Sie, dass3 ist der erste Index in EIN'' Woher die Schilder? EIN entsprach mit 1, eher, als 0. In der Tat, fürx = 12012, wir können das sehen EIN''= [ 3 , 6 ]. 3 ist der einzige Index ungleich Null in EIN, und 6 ist die Länge von X Plus eins.
So für G( [ 1 , 2 , 0 , 1 , 2 ] , 3 )Folgendes passiert: Zuerst tauschen wir die beiden Argumente aus, sodass der Stapel die Ziffern unter dem Index enthält. Wir reduzieren dann das Array und den Index. Bisher sieht der Stapel so aus [1 2 0 1 2 2]
. Wir führen dann den Kopf Befehl. Wir ziehen den Index vom oberen Ende des Stapels und nehmen so viele Zeichen vom unteren Ende des Stapels. Dies ergibt[ 1 , 2 ], die dann von zurückgegeben wird G.
Damit, G( x , y) wird über jedes Element abgebildet y∈ A'', der eine Reihe von Präfixen der Eingabe mit unterschiedlicher Länge zurückgibt. Dieser Teil könnte etwas verwirrend werden, daher werden wir ihn anhand der Beispieleingabe von bearbeitenx : = 12012. Nach der Kartierung vonGsieht der Stack momentan so aus
[[[1 2] [1 2 0 1 2]]]
Wir verschieben dann ein Array, das die Länge jedes Arrays enthält, in das oberste Element oder in diesem Fall in das Array [ 2 , 5 ]. Dies ist das gleiche wieEIN''- 1, wenn die -Operatorzuordnungen, aber es werden mehr Bytes benötigt, um diese Beziehung zu verwenden. Als nächstes werden die Vorwärtsdifferenzen der Längen genommen und0 wird vorangestellt und ergibt in diesem Beispiel [ 0 , 3 ]. Dieses neue Array wird dann mit den Ergebnissen von komprimiertG erschaffen Bund der Starmap- Operator wird über jedes Paar gefahren.
k ( x , n )
Der Starmap- Operator verwendet die Funktionkals Argument und arbeitet mit einer dyadischen Funktion und einem verschachtelten Array. Das Array muss aus Paaren bestehen, z[ [ 1 , 2 ] , [ 3 , 4 ] , [ 5 , 6 ] ]und die dyadische Funktion wird über jedes Paar abgebildet, wobei jedes Element der Paare das linke bzw. rechte Argument ist.
Hier ist unser Beispiel für ein verschachteltes Array [ [ [ 1 , 2 ] , 0 ] , [ [ 1 , 2 , 0 , 1 , 2 ] , 3 ] ] und unsere Funktion ist k. Wir werden uns einfach darauf konzentrierenk ( [ 1 , 2 , 0 , 1 , 2 ] , 3 ) zur Zeit.
k ( x , n ) beginnt, ähnlich wie Gdurch Vertauschen der beiden Argumente, sodass das Array die oberste Position im Stapel einnimmt. Wir kehren dann das Array um und tauschen die Argumente zurück. Jetzt,n = 0Wenn Sie das Array unverändert lassen möchten, duplizieren Sie die Ganzzahl und drehen Sie die oberen drei Argumente, sodass der Stapel das Format hat [ n , x , n ]. Als nächstes geben wir das Array if zurückn = 0. Andernfalls wird das Element top verworfen und der Stapel wird so angeordnet, wie er war, dh mit dem umgekehrten Array unten und der Ganzzahl oben, oder in unserem Beispiel:[ [ 2 , 1 , 0 , 1 , 2 ] , 3 ]. Dann machen wir den Stapel flach und nehmen den erstenn Elemente von X. Diese Elemente werden dann zurückgegeben und ersetztX im B.
Für unsere Eingabe wird dies zurückgegeben [ 0 , 1 , 2 ]. (Genau genommen kehrt es zurück[ 2 , 1 , 0 ], aber die Reihenfolge spielt für den Rest des Programms keine Rolle).
Nach k ( x , n ) wird über jedes Paar abgebildet ( x , n ) ∈ BWir nehmen die Summe jedes Paares und überprüfen dann, ob jedes Element gleich ist, indem wir behaupten, dass jedes benachbarte Paar gleich ist, und dann behaupten, dass jeder dieser Gleichheitstests ergibt 1(ein wahrer Wert). Schließlich wird dieses Ergebnis zurückgegeben.