> <> , 51 + 3 = 54 47 Bytes
:&v
?!\1-:&:&*}}r:
~\
!~>1+::n&:&%:a84*@@?$~o?
Probieren Sie es online!
Die Eingabe wird beim Programmstart über das -v
Flag auf dem Stack erwartet . Die Ausgabe besteht aus nicht ausgerichteten Zahlen, die durch einzelne Leerzeichen voneinander getrennt sind. Jede Zeile wird durch eine neue Zeile voneinander getrennt. Beispielausgabe für N=5
:
1 2 3 4 5
11 12 13 14 15
21 22 23 24 25
16 17 18 19 20
6 7 8 9 10
... gefolgt von einer einzelnen Zeile. Das Programm wird mit einem Fehler ( something smells fishy...
) beendet, aber das steht auf STDERR und nicht auf STDOUT.
Erklärung:
In der ersten Zeile wird einfach eine Kopie von N
im Register gespeichert.
In der zweiten Zeile wird der Versatz für jede Ausgabezeile durch Subtrahieren von 1 N
, Multiplizieren mit N
, Drehen auf den Boden des Stapels und anschließendes Umkehren des gesamten Stapels gebildet. Wenn die Zahl oben auf dem Stapel 0 erreicht, sollte der Stapel folgendermaßen aussehen (Beispiel verwendet N=5
):
5 15 20 10 0 0
In der dritten Zeile wird das Duplikat 0
oben im Stapel verworfen.
Die vierte Zeile erhöht den oberen Bereich des Stapels und gibt eine Kopie davon aus. Dies wird dann mod genommen N
, und dies wird verwendet, um zu entscheiden, ob ein Leerzeichen oder eine neue Zeile gedruckt werden soll und ob die Oberseite des Stapels verworfen werden soll - wenn die letzte gedruckte Zahl ist x
, x mod N == 0
zeigt dies an, dass das Ende dieser Ausgabezeile erreicht wurde . Die Ausführung endet, wenn 1+
sie auf einem leeren Stapel ausgeführt wird, wodurch der Beendigungsfehler ausgelöst wird.
Vorherige Version
Dies prüfte explizit, ob ein leerer Stapel vorhanden war, um die Ausführung zu beenden, und ich bezog auch 3 Bytes für die -v
Flag-Verwendung ein.
:&v
?!\1-:&:&*}}r:
~\
!;>1+::n&:&%:a84*@@?$~o?!~l?
Probieren Sie es online!