Cubix, 238 234 217 151 110 100 Bytes
14 Bytes gespart dank ETHProductions
u'^.:s+.;;;\-?W?rsos\(rrOIO:ur>'=o;^u.;;.>$.vUo^'rsu1;;@!\q?s*su;;IOu*+qU../;(*\(s.;<..r:''uq....qu\
Erweitert:
u ' ^ . :
s + . ; ;
; \ - ? W
? r s o s
\ ( r r O
I O : u r > ' = o ; ^ u . ; ; . > $ . v
U o ^ ' r s u 1 ; ; @ ! \ q ? s * s u ;
; I O u * + q U . . / ; ( * \ ( s . ; <
. . r : ' ' u q . . . . q u \ . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
Probieren Sie es online!
Probieren Sie es hier aus
Erläuterung
Der Code besteht aus 8 Schritten mit zwei Schleifen. Ich werde den Code Teil für Teil durchgehen.
Schritt 1 (A ^ B)
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
I O : u . . . . . . . . . . . . . . . .
U o ^ ' . . . . . . . . . . . . . . . .
; I O u . . . . . . / ; ( * \ . . . . .
? ? r : . . . . . . ? . . . \ ? ? ? ? ?
. . . . ? . . . . . ? . . . . . . . . .
? ? ? ? ?
. . . . .
. . . . .
. . . . .
. . . . .
Dies ist der Würfel, bei dem die Teile, die für den ersten Schritt irrelevant sind, entfernt wurden. Das Fragezeichen zeigt die No-Ops, die die IP besuchen wird, um ihren Weg klarer zu machen.
IO:'^o;IO:r*(; # Explanation
I # Push the first input (A)
O # output that
: # duplicate it
'^ # Push the character "^"
o # output that
; # pop it from the stack
I # Push the second input (B)
O # output that
: # duplicate
r # rotate top 3 elements
* # Push the product of the top two elements
( # decrease it by one
; # pop it from the stack (making the last
# two operations useless, but doing it
# this way saves 10B)
Der Stack sieht nun so aus: A, B, A, B
Schritt 2 (Druckschleife vorbereiten)
Die Druckschleife dauert 3 Argumente (die Top - 3 - Elemente auf dem Stapel) P
, Q
und R
. P
ist die Anzahl der Wiederholungen, Q
ist das Trennzeichen (Zeichencode) und R
ist die zu wiederholende Zahl. Glücklicherweise erfüllt die Schleife auch die Anforderung, dass die resultierende Zeichenfolge auf enden soll R
, nicht Q
.
Wir wollen A*
genau B
mal wiederholen , also ist das Trennzeichen *
. Beachten Sie, dass der Stapel als beginnt A, B, A, B
. Wieder entfernte ich alle irrelevanten Anweisungen. Die IP beginnt im S
Norden.
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . r . . . . . . . . . . . . . . .
. . . . r . . . . . . . . . . . . . . .
. . . . * . . . . . . . . . . . . . . .
. . . . ' . . . . . . . . . . . . . . .
. . . . S . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
'*rr # Explanation
'* # Push * (Stack: A, B, A, B, *)
rr # Rotate top three elements twice
Der Stapel ist jetzt A, B, B, *, A
.
Schritt 3/6/8 (die Druckschleife)
Konzept
E . . . . .
? r s o s u
\ ( r r O <
. . . . . S
Die IP tritt in die Schleife ein S
und zeigt nach Norden. Sie verlässt die Schleife unter E
und zeigt wieder nach Norden. Für diese Erklärung wird der Stack auf gesetzt [..., A, B, C]
. Die folgenden Anweisungen werden ausgeführt. Beachten Sie, dass die IP die Schleife nicht vor dem Fragezeichen verlassen kann, sodass die ersten vier Anweisungen immer ausgeführt werden.
Orr(?rsos # Explanation
O # Output `C`
rr # Rotate top three elements twice (Stack: [..., B, C, A])
( # Decrease A by one (Stack: [..., B, C, A-1])
? # If top of stack (A) > 0:
r # Rotate top of stack (Stack: [..., A-1, B, C])
s # Swap top elements (Stack: [..., A-1, C, B])
o # Output top of stack (B) as character code
s # Swap top elements (Stack: [..., A-1, B, C]
#
# ... and repeat ...
Implementierung
Hier ist wieder der Würfel, wobei die irrelevanten Teile entfernt sind. Die IP beginnt bei S
und zeigt nach Osten.
. . . . .
. . . . .
. . . . .
? r s o s
\ ( r r O
. . . . . S ' = o ; ^ u . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
Wie Sie sehen können, trifft die IP auf vier Anweisungen, bevor sie in die Schleife eintritt. Da der Zeichencode wieder entfernt wird, erreichen wir die Schleife mit genau demselben Stapel, mit dem wir diesen Teil betreten haben.
'=o; # Explanation
'= # Push =
o # Output
; # Pop from stack
Innerhalb der Schleife gilt die obige Erklärung.
Schritt 4 (Unterscheidung der IPs)
Da wir die obige Schleife mehrmals verwenden und sie alle dazu führen, dass die IP an derselben Stelle endet, müssen wir zwischen mehreren Läufen unterscheiden. Erstens können wir zwischen dem Trennzeichen unterscheiden (der erste Lauf hat ein *
, während der zweite und der dritte Lauf ein +
Trennzeichen haben). Wir können zwischen den Läufen 2 und 3 unterscheiden, indem wir den Wert der Zahl überprüfen, die wiederholt wird. Wenn dies der Fall ist, sollte das Programm beendet werden.
Erster Vergleich
So sieht es auf dem Würfel aus. Die IP beginnt bei S und zeigt nach Norden. Der Stapel enthält [..., * or +, A or 1, 0]
. Die Nummer 1 gibt an, wo die IP enden wird, wenn dies die erste Schleife ist (nach Norden zeigend), und die Nummer 2 gibt an, wo die IP enden wird, wenn dies die zweite (oder dritte) Schleife ist (nach Osten zeigend).
u ' . . .
s + . 1 .
; \ - ? 2
S . . . .
. . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
;s'+-? # Explanation
; # Delete top element (0)
s # Swap the top two elements (Stack: 1/A, */+)
'+ # Push the character code of +
- # Subtract the top two elements and push
# that to the stack (Stack: 1/A, */+, +, (*/+)-+)
? # Changes the direction based on the top
# item on the stack. If it's 0 (if (*/+) == +)
# the IP continues going right, otherwise, it
# turns and continues going north.
Wenn die IP jetzt auf ist 1
, ist der Stack [A, *, +, -1]
. Ansonsten ist der Stack [A or 1, +, +, 0]
. Wie Sie sehen, befindet sich im Stapel des zweiten Falls noch ein Unbekannter, sodass wir einen weiteren Vergleich durchführen müssen.
Zweiter Vergleich
Da die IP hat durch Schritt 5, der Stapel sieht wie folgt fort: [A^(B-1) or nothing, A or 1, +, +, 0]
. Wenn das erste Element ist nothing
, ist das zweite Element 1
und das Gegenteil gilt auch. Der Würfel sieht so aus, wobei die IP bei S beginnt und nach Osten zeigt. Wenn dies die zweite Schleife ist, endet die IP bei E
und zeigt nach Westen. Ansonsten schlägt das Programm zu @
und bricht ab.
. . . . .
. . . . ;
. . . S W
. . . . .
. . . . .
. . . . . . . . . . . . . ; . . . . . .
. . . . . . . . . E @ ! \ q . . . . . .
. . . . . . . . . . . . ( * . . . . . .
. . . . . . . . . . . . q u . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
Die ausgeführten Anweisungen, die nichts mit dem Steuerungsfluss zu tun haben, sind unten aufgeführt.
;;q*q(!@
;; # Delete top two elements (Stack [A^(B-1)/null, A/1, +])
q # Send top element to the bottom (Stack [+, A^(B-1)/0, A/1])
* # Push product of top two elements
# (Stack [+, A^(B-1)/0, A/1, A^B/0])
q # Send top element to the bottom
# (Stack [A^B/0, +, A^(B-1)/0, A/1])
( # Decrease the top element by 1
# (Stack [A^B/0, +, A^(B-1)/0, (A-1)/0])
! # If (top element == 0):
@ # Stop program
Der Stack ist jetzt [A^B, +, A^(B-1), A-1]
, sofern das Programm nicht beendet wurde.
Schritt 5 (Vorbereitung für "A +" (Wiederholung von A ^ (B-1))
Leider hat Cubix keinen Netzbetreiber, also brauchen wir eine weitere Schleife. Wir müssen jedoch zuerst den Stapel bereinigen, der jetzt enthält [B, A, *, +, -1]
.
Aufräumen
Hier ist wieder der Würfel. Wie üblich beginnt die IP bei S (nach Norden zeigend) und endet bei E (nach Westen zeigend).
. . . ? .
. . . ; .
. . . S .
. . . . .
. . . . .
. . . . . . . . . . . . . . . . > $ . v
. . . . . . . . . . . . . . . . . . . ;
. . . . . . . . . . . . . . . . . . E <
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
;; # Explanation
;; # Remove top 2 elements (Stack: [B, A, *])
Berechnung von A ^ (B-1)
Eine weitere Schleife, die ungefähr so funktioniert wie die Druckschleife, aber etwas kompakter ist. Die IP beginnt mit S
nach Westen zeigendem Stack [B, A, *]
. Die IP-Adresse E
zeigt nach Norden.
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . . . . . . . . . . . E . . . . .
. . . . . . . . . . . . . . ? s * s u .
. . . . . . . . . . . . . . \ ( s . ; S
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
Der Schleifenkörper ist der folgende.
;s(?s*s # Explanation
; # Pop top element.
s # Shift top elements.
( # Decrease top element by one
? # If not 0:
s # Shift top elements again
* # Multiply
s # Shift back
#
# ... and repeat ...
Der resultierende Stapel ist [A, A^(B-1), 0]
.
Stapel (wieder) aufräumen
Jetzt müssen wir wieder zur Druckschleife gelangen, wobei die Oberseite des Stapels enthält [..., A^(B-1), +, A]
. Dazu führen wir Folgendes aus. Hier ist wieder der Würfel,
. . ^ ? :
. . . . .
. . . . .
. . . . .
E . . . .
. . . . . s . . . . . . . . ; . . $ . .
. . . . . + q U . . . . . . S . . s . .
. . . . . ' u q . . . . . . . . . ? . .
. . . . . . . ? . . . . . . . . . ? . .
. . . . . . . ? . . . . . . . . . ? . .
. . ? . .
. . ? . .
. . ? . .
. . ? . .
. . ? . .
;:$sqq'+s # Explanation
; # Delete top element (Stack: [A, A^(B-1)])
: # Copy top element
$s # No-op
qq # Send top two elements to the bottom
# (Stack: [A^(B-1), A^(B-1), A])
'+ # Push +
# (Stack: [A^(B-1), A^(B-1), A, +])
s # Swap top two elements
# (Stack: [A^(B-1), A^(B-1), +, A])
Schritt 7 (Vorbereitung für die letzte Schleife)
Der Stack ist jetzt [A^B, +, A^(B-1), A-1]
, die IP beginnt bei S
, geht nach Westen und endet bei E
, geht nach rechts.
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . . E . . . . . . . . . . . . . .
. . . . . . u 1 ; ; S . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
Die ausgeführten Anweisungen:
;;1 # Explanation
;; # Delete top two elements
1 # Push 1
Der Stapel sieht nun so aus [A^B, +, 1]
und die IP wird in die Druckerschleife eingegeben, also sind wir fertig.