Im Rahmen eines Stadtplanungsprojekts haben Sie den Auftrag erhalten, ein Programm oder eine Funktion zu erstellen, mit der die Skyline der Stadt angezeigt wird, und zwar unter Einbeziehung der Architekten. Das Projekt befindet sich erst in der Startphase, daher ist eine sehr grobe Skizze ausreichend. Am einfachsten ist es natürlich, die Skyline einfach in ASCII-Kunst zu zeichnen.
Alle Gebäude werden am Fluss liegen, daher sind sie alle ausgerichtet. Die Architekten geben die Höhe jedes Gebäudes als Eingabe an, und Ihr Code sollte die Skyline anzeigen.
Die Eingabe von den Architekten wird entweder eine ganze oder eine halbe ganze Zahl sein. Wenn die Zahl eine Ganzzahl ist, hat das Gebäude ein flaches Dach, während eine halbe Ganzzahl ein geneigtes Dach ergibt. Eine Null ist eben eben. Die Wände eines Gebäudes sind 3 Zeichen voneinander entfernt, während eine Null ein einzelnes Zeichen breit ist. Benachbarte Gebäude teilen sich Wände.
Einzelheiten und Erläuterungen zur Ausgabe finden Sie in den folgenden Beispielen:
N = 3
___
| |
| |
|___|
N = 3.5
_
/ \
| |
| |
|___|
N = 6
___
| |
| |
| |
| |
| |
|___|
n = 0
_
Beispiel Eingabe: 3 3.5 0 2
_
___ / \
| | | ___
| | | | |
|___|___|_|___|
Beispiel Eingabe: 0 0 2.5 3 0 4 1
___
_ ___ | |
/ \| | | |
| | | | |___
__|___|___|_|___|___|
Louisville ,0 2 1 3.5 0 4 2 4 2 4 6 1 6 0 5 1
___ ___
| | | | ___
_ ___ ___ ___| | | | | |
/ \ | | | | | | | | | | |
___ | | | |___| |___| | | | | | |
| |___| | | | | | | | |___| | | |___
_|___|___|___|_|___|___|___|___|___|___|___|___|_|___|___|
Die verwendeten ASCII-Zeichen sind: Zeilenvorschub, Leerzeichen und /\_|
(Codepunkte 10, 32, 47, 92, 95, 124).
Regeln:
- Es ist optional, ein Programm zu erstellen, das nur Ganzzahlen als Eingabe verwendet, indem alle Zahlen mit zwei multipliziert werden. Anstatt also zu nehmen
3 3.5 2
, kann Ihr Programm dauern6 7 4
. Wenn das zweite Eingabeformat ausgewählt ist, sollte eine Eingabe von 6 zu einem dreistöckigen Gebäude führen, 7 sollte ein dreistöckiges Gebäude mit geneigten Dächern usw. sein. - Die Ausgabe sollte genau wie oben beschrieben sein, aber nachgestellte Leerzeichen und Zeilenumbrüche sind in Ordnung.
- Das genaue Format der Eingabe ist optional. Was auch immer am besten in Ihrer Sprache ist.
- Das Ergebnis muss auf dem Bildschirm angezeigt werden, damit die Architekten es sich ansehen können.
- Sie können davon ausgehen, dass mindestens eine Ganzzahl angegeben wird und dass nur gültige Eingaben erfolgen.
Das ist Codegolf, also gewinnt der kürzeste Code in Bytes.
Antworten:
Python 2,
199193188185 BytesDies ist ein vollständiges Programm, das Ganzzahlen als Eingabe akzeptiert. Beispiel Eingabe .
quelle
MATLAB,
219 209203 BytesDies funktioniert bei Octave leider nicht . Nicht ganz sicher, warum, scheint etwas mit dem Disp / Flipud-Bit zu tun zu haben, das bricht.
Außerdem gibt es derzeit keine Definition dessen, wie ein Gebäude mit einer Höhe von 0,5 aussieht, und ich nehme an, dass sie in diesem Code nicht zulässig sind.
Das Folgende ist der Code auf etwas besser lesbare Weise:
Zuerst nehmen wir eine Eingabe als Array und führen eine variable Initialisierung durch.
Da die Gebäude mit der Höhe Null ein Schmerz sind - sie haben im Grunde genommen eine Breite, die davon abhängt, in welcher Umgebung sie sich befinden (obwohl sich die gedruckten Objekte nicht ändern), vereinfachen wir die Dinge, indem wir für alle Gebäude genügend Boden zeichnen. Wir gehen davon aus, dass jedes Gebäude 4 Zeichen breit sein wird (da benachbarte Gebäude zusammengeführt werden) - Null hohe Gebäude sind es nicht, aber der Überschuss wird später gekürzt.
Jetzt zeichnen wir jedes Gebäude der Reihe nach aus.
Zuerst erhalten wir den ganzzahligen Teil der Höhe, da dieser bestimmt, wie viele '|' wir brauchen.
Zeichnen Sie nun die Wand für dieses Gebäude ein. Wenn zwei benachbarte Gebäude vorhanden sind, befindet sich die Wand für dieses neue Gebäude in der gleichen Spalte wie die Wand des letzten Gebäudes.
Überprüfen Sie, ob es sich um ein halbhohes Gebäude handelt. Wenn ja, dann ist das Dach anders. Für die halben Höhen wird das Dach so sein, wie
/ \
es sein wird___
(Matlab wird dies implizit aus einem einzelnen Unterstrich replizieren, also dort ein paar Bytes sparen). Für die halbhohen Gebäude gibt es ein zusätzliches Stück Dach, das ebenfalls hinzugefügt wird.Zeichne das Dach ein
Gehen Sie nun zum Anfang des nächsten Gebäudes und zeichnen Sie die gemeinsame Wand ein (wenn die Wand an dieser Stelle zu kurz ist, wird sie beim Zeichnen des nächsten Gebäudes größer). Beachten Sie, dass Gebäude mit einer Höhe von null eine Breite von 1 und normale Gebäude eine Breite von vier haben. Wir vereinfachen das, was ansonsten ein Wenn-Sonst wäre, indem wir (a> 0) als Dezimalzahl und nicht als Booleschen Wert behandeln.
Als nächstes kommt ein bisschen Hackergeist, um mit null hohen Gebäuden zu arbeiten. Dies besagt im Grunde genommen, dass, wenn dieses Gebäude eine Höhe von null hat und das vorherige Gebäude keine Höhe hat, die Position des nächsten Gebäudes um 1 erhöht werden muss, da ein Gebäude mit einer Höhe von null, das zwischen zwei anderen Gebäuden liegt, doppelt so breit ist berücksichtigt die zusätzliche Wand, die normalerweise mit einem angrenzenden Gebäude geteilt wird. Wir behalten auch diese Gebäudehöhe im Auge, um diese Prüfung beim nächsten Mal durchzuführen.
Wenn Sie fertig sind, drehen Sie die Gebäudematrix um und zeigen Sie sie an. Beachten Sie, dass wir auch hier überschüssigen Boden abschneiden.
Wenn wir dieses Skript ausführen, werden wir nach unserer Eingabe gefragt, zum Beispiel:
Anschließend wird das Gebäude generiert und das Ergebnis angezeigt. Für die obige Eingabe wird Folgendes generiert:
quelle
Kotlin,
447442 BytesUngolfed-Version:
quelle
Python 2,
357306299294287281276 BytesHierbei wird die "doppelte" Codierung verwendet, die als Liste an die Funktion übergeben wird. Bearbeiten: Rasierte Bytes, indem ein Teil der großen Bedingung als Array-Auswahl wiederhergestellt und auf die doppelte Codierung umgeschaltet wurde. Sie haben mehr Bytes gespart, indem Sie die Bedingung noch mehr neu geordnet und mehr Logik in Arithmetik umgewandelt haben.
EDIT: xsot ist besser
Erläuterung:
d
ist 1 mehr als die Länge des Arrays, da wir an jedem Ende der Liste vom zweiten Element bis zu der am Ende hinzugefügten Null Nullen hinzufügen.h
ist die Höhe der Zeichnung. (Wir müssen in dieser Berechnung durch 2 dividieren, weil wir die doppelte Darstellung verwenden, die wir speziell verwenden, um zu vermeiden, dass Schwimmer überall auf Ints geworfen werden müssen. Wir addieren auch 1, bevor wir so ungerade Höhen teilen - spitze Gebäude - Holen Sie sich ein wenig mehr Spielraum als die normale Art.)o
ist die Ausgabe-Zeichenfolge.Ein Standardtrick zum Zusammenfassen einer double for-Schleife zu einer single for-Schleife. Sobald wir machen:
Wir haben jetzt dasselbe erreicht wie:
aber auf eine Weise, die uns zehn Bytes erspart (einschließlich Leerzeichen in den folgenden Zeilen).
Kleben Sie eine Wand an, wenn die Höhe des aktuellen oder des vorherigen Gebäudes höher als die aktuelle Linie ist, sofern sich hier mindestens eine Gebäudegrenze befindet. Dies entspricht der folgenden Bedingung:
Dabei ist b die aktuelle Scanhöhe, a die aktuelle Gebäudehöhe und c die vorherige Gebäudehöhe. Der letztgenannte Teil der Bedingung verhindert, dass Wände zwischen Grundräume gesetzt werden.
Dies ist der Teil, der das richtige Dach zeichnet und die Dachteile durch Vergleichen der Gebäudehöhe mit der aktuellen Scanhöhe auswählt. Wenn hier kein Dach vorhanden ist, werden entsprechend viele Felder gedruckt (3, wenn es sich um ein tatsächliches Gebäude handelt, z. B. a> 0, andernfalls 1). Beachten Sie, dass in Bodennähe niemals versucht wird, ein Dach zu zeichnen, dh Gebäude mit einer Größe von 0,5 erhalten keine spitzen Dächer. Naja.
Wenn wir ebenerdig sind, möchten wir Unterstriche anstelle von Leerzeichen. Wir ersetzen sie hier nur alle auf einmal.
Bevor wir mit der Verarbeitung der nächsten Zeile beginnen, drucken Sie die aktuelle Zeile und löschen Sie die Ausgabezeile. Das letzte Zeichen wird abgeschnitten, da es sich um das "_" handelt, das dem hinzugefügten Grundraum entspricht, indem am Anfang der Funktion eine Null angehängt wird. (Wir haben diese Null angehängt, damit wir keinen Sonderfall hinzufügen müssen, um eine rechte Wand einzufügen, wenn sie existiert. Dies würde viel mehr Code hinzufügen, als wir durch Hinzufügen der 0 und Abschneiden des "_" hinzugefügt haben.)
quelle
Python 3
725 Bytes608 Bytes
Golf Code:
Hier ist der Code ohne Golf. Es gibt einige Kommentare, aber die Grundidee besteht darin, Gebäude mit doppelten Wänden zu erstellen, sodass das Endergebnis so aussieht:
Um dann Indizes dieser doppelten Wände zu erhalten und diese Spalten zu entfernen, erhalten wir:
Code:
Zeit zum Golfen!
quelle
ru(n):return math.ceil(n)
Golfen, aber dennoch ... Bitte nehmen Sie das nicht negativ, ich bin kein Ich selbst bin ein guter Golfer und verdammt noch mal kein guter Programmierer. Ich schlage vor, Sie versuchen, es zu verbessern ... Es macht tatsächlich Spaß, wenn Sie feststellen, dass Sie es schaffen, es zu verkürzen. Ich bin vor ein paar Tagen von vielen auf 120 auf 55 gestiegen. Es ist also möglich, auch wenn Sie neu darin sind.PHP,
307297293 BytesÜbernimmt Argumente * 2 von der Kommandozeile. In Datei speichern, mit ausführen
php <filename> <parameters>
.Nervenzusammenbruch
quelle
C ++, ungolfed
(oder vielleicht ungolfbar)
Angenommen, es gibt weniger als 100 Elemente und jedes Element ist weniger als 100.
s
ist die Anzahl der Gebäude (für die Eingabe erforderlich).quelle