Bei einer positiven ungeraden Ganzzahl als Eingabe wird ein konvergierender Zickzack als Liste von Zeichenfolgen, Liste von Zeichenlisten oder durch Zeilenumbrüche getrennte Zeichenfolge in der folgenden Form zurückgegeben:
#
#
#
#
#
#
#
#
#
#
#
Sie können durch ein #
beliebiges konsistentes Zeichen ohne Leerzeichen ersetzen . Leerzeichen in jeder Zeile dürfen nachgestellt werden, und ein Zeilenumbruch ist zulässig.
Der Zick-Zack beginnt bei der Spalte 1
und bewegt sich für jede Zeile um eine Spalte nach rechts, bis die Spalte erreicht ist n
(wo n
ist die Eingabe). Dann bewegt es sich nach links 2
, dann nach rechts n-1
und dann nach links 3
, wobei die beiden Begrenzungen zusammenlaufen, bis der Zickzack in der mittleren Spalte endet ( (n+1)/2
).
Testfälle
Das obige Beispiel ist der Testfall für 5
.
Es folgen einzelne Testfälle:
3
#
#
#
#
7
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
1
#
Antworten:
C (gcc) , 89 Bytes
Probieren Sie es online!
Analysiert die Folge der Anzahl der Leerzeichen wie folgt (für n = 7):
Und für n = 3:
Wir können sehen, dass die mittlere Zahl (
a
im Code) von [n-1, n / 2] läuft. Dann ist der Unterschied zwischen der ersten und der mittleren Zahl:Wenn wir also
b
[- (2a-n), 2a-n] durchlaufen habena-abs(b)
, erhalten wir die gewünschte Sequenz. Dies ist im Wesentlichen das, was der Code tut.quelle
Kohle ,
108 BytesProbieren Sie es online! Link ist eine ausführliche Version des Codes. Edit: 2 Bytes gespart dank @dzaima für den Hinweis, dass ich kein
#
s verwenden muss.quelle
Python 2 , 78 Bytes
Probieren Sie es online!
quelle
Jelly , 14 Bytes
Probieren Sie es online!
Volles Programm.
Verwendet
1
.-1 Danke an Jonathan Allan .
-1 Danke an Jonathan Allan .
quelle
’R
->Ṗ
für ein Byte.”X
->1
zum anderen.Haskell , 72 Bytes
Probieren Sie es online!
Wir definieren eine unendliche Liste
r
als die Diagonale von#
s beginnend in der oberen linken Ecke.Wir definieren dann eine Funktion,
g
die den Hauptteil der Arbeit erledigt.g
Nimmt eine Liste und kehrt sie wiederholt um und entfernt ihr erstes Element, bis die Liste leer ist. Verketten Sie dann das Ergebnis jeder Aktion.Unsere Hauptfunktion ist hier eine punktfreie Funktion. Diese Funktion beginnt mit der Übernahme von
n
Elementen aus der unendlichen Lister
, schneidet dann das erste Element und wird angewendetg
. Als letztes müssen wir#
dem Anfang ein Zurück hinzufügen , weil die Spezifikationen für die Frage etwas seltsam sind. Ich bin mir nicht sicher, warum die erste Diagonale immer länger ist, als sie sein sollte, aber so ist es, also müssen wir aa hinzufügen#
.quelle
("#":).g.init.(
,r)
aber danke!SOGL V0.12 , 19 Bytes
Probieren Sie es hier aus!
quelle
05AB1E , 22 Bytes
Probieren Sie es online!
Verwendet
8
.quelle
05AB1E , 6 Bytes
Probieren Sie es online!
quelle
S
. Die Ausgabe wird also doppelt so lang. Ich wusste noch nichts über + und ×. Sie ergeben wirklich interessante Muster, wenn Sie sie mit Zahlen kombinierenS
, habe aber nicht genug auf die Ausgabe geachtet ..>.> Und das+
und×
sind im Grunde für[0,4,4,0,2,6,6,2]
und gebaut[1,5,5,1,3,7,7,3]
. Und8
wird auf den Ursprung zurückgesetzt, von dem Sie ausgegangen sind. Hier ein bisschen mehr Information.CJam , 29 Bytes
Probieren Sie es online!
Verwendet
8
.quelle
Pyth, 23 Bytes
Probieren Sie es hier aus.
quelle
JavaScript, 127 Bytes
Berechnet das zu erreichende Ziel (
g
). Wenn dieses Ziel erreicht ist, drehe dich zum nächsten Ziel um. Verwendet auch einen Trick, um die Verwendung zu vermeiden,Math.round()
indem0.5
zu jeder ungeraden Zahl hinzugefügt wird.quelle
Haskell, 74 Bytes
Probieren Sie es online!
Wie es funktioniert:
Bei jedem rekursiven Aufruf
f
wird die nächste Diagonale angehängt.quelle
Schale , 19 Bytes
Probieren Sie es online!
Erläuterung
Das fühlt sich etwas klobig an.
quelle
Python 3 , 82 Bytes
Probieren Sie es online!
quelle
Retina , 71 Bytes
Probieren Sie es online! Erläuterung: In den ersten drei Schritten wird die Eingabe in die Form konvertiert, in der
:> :
die Anzahl der Zeichen zwischen den Zeichen:
die Eingabenummer ist. Die letzten beiden Stufen hüpfen dann mit dem>
(oder<
, wenn Sie sich nach links bewegen) zwischen den:
s. In der vierten Stufe wird der Sprung wiederholt, wobei jedes Mal die erforderlichen Teile der Zeichenfolge gedruckt werden. Das;
hält die Zeichenfolge nach der Schleife gedruckt wird.quelle
05AB1E , 16 Bytes
Probieren Sie es online!
Erläuterung
quelle
K (Kona), 27 Bytes
Erzeugt die zugrunde liegende numerische Sequenz, indem der Kopf eines Vektors wiederholt umgedreht und abgelegt wird, bis er leer ist.
quelle
PHP, 65 Bytes
Laufen Sie als Pipe mit
-nF
oder testen Sie es online .Erläuterung:
erste Iteration:
$n
istNULL
,--$n
hat also keine Auswirkung und wertetNULL
-> setze
$n
und$d
dekrementiere Argument1. inkrementiere
$x
für gerade$d
, dekrementiere für ungerade$d
2.
X
drucke, eine neue Zeile und$x
Leerzeichenweitere Iterationen: Dekrementierung
$n
; Wenn es trifft0
, setzen Sie zurück$n
(und$d
) auf das vordekrementierte Argument zurückFinale: Drucke noch einen
X
.quelle
Japt , 31 Bytes
Rekursive Lösung, die ein Array von Zeilen zurückgibt.
Probieren Sie es online! Verwenden Sie das
-R
Flag, um die Ausgabe mit Zeilenumbrüchen zu verbinden.quelle
Python 2,
159145141136 BytesEs gab bereits nette Python-Versionen zu diesem Problem, aber ich dachte, ich würde immer noch meinen schrecklichen Einzeiler posten. (Ohne Semikolon!)
Bearbeiten: 14 Bytes nach unten, wobei die Summe anstelle des doppelten Listenverständnisses verwendet wird
Bearbeiten: Gerade in Python 2 bemerkt, können Sie Eingabe anstelle von raw_input verwenden. Ich habe immer nur Letzteres verwendet.
quelle
Mathematica,
142102 Bytes (unabhängig)Diese Lösung hat einen mathematischen Geschmack:
UnitVector[#,1-Sum[(-1)^Floor[#+1/2-Sqrt[9/4+#*#-#-2x]],{x,k}]]~Table~{k,0,#(#-1)/2}/.{0->" ",1->"X"}&
Dies berechnet im Grunde genommen, in welchem Segment wir uns befinden (durch Invertieren der Dreieckszahlfunktion) und bewegt sich dann nach links oder rechts, indem eine Potenz von -1 addiert wird.
Sie können es in der Wolfram Code Sandbox testen, indem Sie Code wie einfügen
UnitVector[#,1-Sum[(-1)^Floor[#+1/2-Sqrt[9/4+#*#-#-2x]],{x,k}]]~Table~{k,0,#(#-1)/2}/.{0->" ",1->"X"}&@6//MatrixForm
und Umschalt + Eingabetaste oder Ziffernblock-Eingabetaste drücken oder auf Zahnrad -> "Zelle auswerten" klicken.Dies ist zufällig die gleiche Länge wie mein ursprünglicher falscher Port von Eriks Python 2-Lösung (Dieser Port gibt die Ausgabe für eine Eingabe um eins höher):
(Print[X];l=Range@#;Do[Do[Print[StringRepeat[" ",l[[j]]]<>"X"],{j,Length@l}];l=l[[-2;;1;;-1]],{i,#}])&
quelle