Inspiriert von Fibonacci-Domino-Kacheln geht es bei diesem Problem darum, ASCII-Kunst zu generieren, die eine andere berühmte kombinatorische Sequenz darstellt.
Ein n-stufiges Gebirgsdiagramm ist eine Zeichnung einer Bergkette, in der genau n '/' und n '\' Zeichen verwendet werden, sodass die Zeichen eine durchgehende Kurve zeichnen, die niemals unter ihre ursprüngliche "Höhe" abfällt. Beispielsweise,
/\/\
/\/ \
und
/\
/\/ \/\
sind beide 4-Stufen-Bergdiagramme, aber
/\ /\/\
\/
ist nicht.
Eingang
Das Programm sollte eine Ganzzahl n von stdin oder als Parameter für eine Funktion akzeptieren .
Ausgabe
Drucken Sie alle n- stufigen Bergdiagramme nach Standard aus. Die Diagramme können in beliebiger Reihenfolge angezeigt werden, müssen jedoch durch Leerzeichen voneinander getrennt sein. Sie können entscheiden, ob verschiedene Diagramme horizontal, vertikal usw. ausgegeben werden sollen.
Wie beim Domino-Kachelproblem können Sie beliebige Leerzeichen verwenden. Dies schließt zusätzliche Zeilenumbrüche vor oder nach der Druckausgabe ein.
Beispiel
Einige Beispiele für gültige Ausgaben für n = 3:
Gültige Ausgabe A:
/\
/\ /\ / \ /\/\
/\/\/\ / \/\ /\/ \ / \ / \
Gültige Ausgabe B:
/\
/\/ \
/\/\
/ \
/\/\/\
/\
/ \
/ \
/\
/ \/\
Gültige Ausgabe C:
/\
/ \ /\
/ \ /\/ \
/\/\
/\ / \
/ \/\ /\/\/\
Das ist Code Golf; kürzestes Programm (in Bytes) gewinnt.
quelle
Antworten:
Python 2: 151 Zeichen
Wow, das ist ein Durcheinander.
Die erste Idee besteht darin, die Zahlen
0 to 2**N-1
zu verwenden, um alle Sequenzen vonN
Aufwärts- und Abwärtsbewegungen in ihren Bits zu codieren . Wir lesen diese Bits einzeln ab, indem wir sie wiederholt%2
und/2
in einerexec
Schleife durchlaufen.Wir speichern das laufende Gebirge seitwärts in einer transponierten Liste von Zeichenketten
L
. Jedes Mal, wenn wir eine neue Zeile mit Leerzeichen erzeugen, wird ein Leerzeichen in der neuen Zeile durch ersetzt/
oder\
abhängig davon ersetzt, ob eine Aufwärts- oder eine Abwärtsbewegung stattgefunden hat.Der Index dieses Raums sind
c
Leerzeichen vom Ende, wobeic
die Laufhöhe ist. Wenn man es von vorne macht, werden die Berge auf den Kopf gestellt. Wir verschieben es weiter, indem wirb
Aufwärts- und Abwärtsbewegungen ausrichten und erhalten[b-c]
. Wenn Siec
bei 1 anstatt bei 0 beginnen, wird ein Fehler behoben, der nur einmal auftritt.Um Fälle zu eliminieren, in denen
c
Einbrüche unter dem Startwert liegen1
, setzen wir in diesem Falli
auf0
, wodurch alle weiteren Bewegungen nach unten verlaufen undc
negativer werden. Dann, wenn wir prüfen, ob umc
geendet hat1
, prüfen wir auch, obc
jemals darunter gefallen ist. Wir haben nurprint
die Bergkette wennc
ist1
.Drucken machen wir
zip(*L)
transponieren den Bereich von vertikal nach horizontal und drucken jede verbundene Zeichenfolge. Viele Probleme bei dieser Antwort sind darauf zurückzuführen, dass Python Zeichenfolgen als unveränderlich behandelt. Daher haben wir sie als Listen von Zeichen bearbeitet und sie nur zum Drucken zu Zeichenfolgen zusammengefügt.Vielen Dank an @flornquake für Hilfe und Verbesserungen.
quelle
' '
statt verwenden," "
wenn Sie eine Schleife verwenden möchtenexec
. :) Übrigens, du musst dem Backslash nicht entkommen.' '
versucht, die Zeichenfolge durch Anführungszeichen durch eine Variable zu ersetzen. Dies ergab immer noch einen Index außerhalb desfor _ in[0]*N:exec("b=i%2;c+=2*b-1;L+=[[" "]*N];L[-1][b-c]='\\/'[b];i=i//2*(c>0);")
exec("b=i%2;c+=2*b-1;L+=[[' ']*N];L[-1][b-c]='\\/'[b];i=i//2*(c>0);")
, dh die inneren Anführungszeichen müssen sich von den äußeren unterscheiden.APL (88)
Ausgabe für
n=3
:Erläuterung:
(N/2)⊤⍳2*N←2×⍵
: Erhalte ein Bitfeld für jede Zahl von0
bis2^⍵
.Z←↓⍉¯1+2×
: multiplizieren Sie mit 2 und subtrahieren Sie 1, wobei Sie1
für auf und-1
ab geben. Speichern Sie einen Vektor von Vektoren, wobei jeder Vektor die Darstellung für eine Zahl enthält, inZ
.{
...}¨Z
: für jedes Element vonZ
:∧/0≤+\⍵
: Überprüfen Sie, ob die laufende Summe niemals unterschritten wird0
(nicht unter den Boden geht),(0=+/⍵)
: und dass die Gesamtsumme ist0
(endet wieder auf Bodenniveau).{
...}¨Z/⍨
: Wählen Sie die Elemente aus,Z
für die dies zutrifft. Für jeden von ihnen:K←(⍵≠1)++\⍵
: Finde die Höhe für jedes Zeichen und speichere inK
. Heben Sie jeweils\
eine an, damit sie/
richtig mit der s übereinstimmen. Das macht die Bodenhöhe1
.¯1+2×K=⊂⌽⍳⌈/K
: Erstellen Sie für jede Spalte eine Liste[1..max(K)]
und markieren Sie die Position des Zeichens in dieser Spalte mit1
und den Rest mit-1
. (Replizieren mit -1 füllt diese Position mit einem Leerzeichen.)'\/'[1+⍵=1]/⍨¨
: Finden Sie das richtige Zeichen für jede Spalte und replizieren Sie es anhand der Liste für diese Spalte.⍉↑
: Verwandle das Ergebnis in eine Matrix und lege es mit der rechten Seite nach obenquelle
Python,
261241236 ZeichenEs beginnt eine Weile zu dauern
n=5
und bis ...quelle
JavaScript (ES6) 159
163Genau wie meine Antwort für Fibonacci Domino Tiling untersuche ich alle Sequenzen von n + n Bits, wobei 1 ein '/' und 0 ein '\' markiert (nur für die Ausgabe wird später '2' hinzugefügt, um eine neue Zeile zu markieren). . Während ich das ASCII-Muster aufbaue, überprüfe ich den Kontostand - gleiche Zahlen von 0 und 1 und nie unter die Startgrundlinie - und gebe aus, was den Regeln entspricht.
Die Ausgabe erfolgt mit 'alert', was für JS-Codegolf Standard ist, aber ziemlich nervig und möglicherweise gegen die Regeln verstößt. Mit console.log wird die Zeichenanzahl auf 165 gesetzt.
Weniger golfen
Test in der FireFox / FireBug-Konsole.
Ausgabe
quelle
-b-b
und-n-n
stattdessen-2*b
?2*b+1
->b-~b
)CJam, 84 Bytes
Beachten Sie, dass dieses Programm die Berge in einer Endlosschleife ausgibt, sodass der Online-Interpreter Ihnen nicht weiterhilft. Rufen Sie in der Befehlszeile mit
oder um es online zu versuchen
und drücke einfach ein paar Mal hintereinander auf die Schaltfläche "Ausführen" und stelle dir vor, die Ausgabe sei verkettet.
Die Grundidee ist, dass wir wissen, dass ein Gebirgszug der Größe Q Q von jedem Aufwärts- und Abwärtsübergang hat.
Wenn es gültig ist, drucken wir es, wenn nicht, entfernen wir es aus dem Stapel, damit es nicht überläuft.
Die Druckroutine erstellt im Grunde genommen jede Spalte als Q-Höhen-Leerzeichen, dann das Symbol, dann genügend Leerzeichen, um Q + 1 Gesamtzeichen zu erreichen, und dann transponieren und drucken wir die Zeilen mit Zeilenumbrüchen dazwischen.
quelle
C 179
ohne unnötige Leerzeichen.
Eine ähnliche Strategie wie bei edc65. Ich durchlaufe alle
n*2
-Bit-Binärwerte unter Berücksichtigung von/
= 1 und\
= 0.Ich formatiere eine einzelne Zeichenfolge, die
n
Zeilenumbrüche für allen*3
Zeichen enthält. Wie geschrieben, enthält die Zeichenfolge 1000 Zeichen, daher wird normalerweise viel Leerzeichen nach dem Berg gedruckt. (Dies kann durch Hinzufügens[n*n*3]=0
vor dem behoben werdenputs
.) Auf jeden Fall ermöglicht dies mir, den gesamten Berg mit einem einzigen auszugebenputs
nachdem überprüft habe, ob er den Regeln entspricht.Ich werde versuchen, es in eine Funktion umzuwandeln und
for
später auf eine einzelne Schleife zu reduzieren .Ausgabe (beachte die enorme Menge an Leerzeichen rechts)
quelle
Haskell, 140 Bytes
Nachdem einige Versuche nicht sehr erfolgreich waren, kam ich zu dieser Haskell-Implementierung. Ich bin froh, nur einen Faktor 2 von der APL-Lösung entfernt zu sein!
Golf Lösung:
Ungolfed und kommentiert:
Das Programm erstellt die Menge der n- stufigen Bergdiagramme rekursiv. Jedes Diagramm wird durch eine Liste unendlich langer Zeichenfolgen dargestellt, die die seitwärts gezogenen Berge gefolgt von Räumen bis ins Unendliche darstellen. Dies stellt sicher, dass alle Diagramme dieselbe Höhe haben, was die Rekursion erleichtert. Der Bergdrucker akzeptiert einen Parameter, der die Höhe auf einen endlichen Wert begrenzt.
Beispielnutzung:
quelle
GolfScript 103 ( Demo )
Das Programm verwendet einen Integer-Parameter, um alle binären Darstellungen der Zahlen von 0 bis 2 ^ (n-1) als Berge darzustellen. Es werden keine ungültigen Kombinationen ausgegeben (z. B. diejenigen, die unter Stufe 0 liegen).
quelle