Die Herausforderung
Ihr Programm oder Ihre Funktion akzeptiert eine einzelne Zeichenfolge, die von STDIN eingegeben wurde, oder einen Funktionsparameter. Sie können davon ausgehen, dass die Eingabe nur alphabetische Zeichen (a-zA-Z), Leerzeichen und Punkte enthält. Bei der Eingabe wird die Groß- und Kleinschreibung nicht berücksichtigt, daher sollten Sie "a" genauso behandeln wie "A".
Für jedes Zeichen in der Zeichenfolge geben Sie eine Darstellung eines Gebäudes gemäß der folgenden Spezifikation aus.
Jedes Gebäude muss ein Dach haben, das in der obersten Zeile durch einen Unterstrich und in der zweiten Zeile durch einen Schrägstrich, ein Leerzeichen und einen umgekehrten Schrägstrich gekennzeichnet ist.
_
/ \
Sie haben dann mehrere Stockwerke, die mit der Buchstabenanzahl (a = 1, b = 2, c = 3 usw.) übereinstimmen und durch eine Wand (|) auf jeder Seite und ein Leerzeichen in der Mitte dargestellt werden. Das Untergeschoss (und nur das Untergeschoss) sollte ein Fundament haben, das einen Unterstrich zwischen den Wänden darstellt. So was...
|_|
So würde zum Beispiel 'b' so aussehen
_
/ \
| |
|_|
Jetzt wissen wir, dass sehr hohe, schmale Gebäude nicht stehen können und an der Basis breiter werden müssen, sodass kein Gebäude ohne zusätzliche Unterstützung mehr als drei Stockwerke hoch stehen kann. Also sollten Sie alle drei Ebenen (nicht weniger) eine "Verbreiterungsebene" hinzufügen. Die sich erweiternde Schicht besteht aus einem Schrägstrich und einem umgekehrten Schrägstrich direkt über den Wänden des Abschnitts darunter, und der Abschnitt darunter sollte zwei Stellen breiter sein als der Abschnitt darüber. Die zusätzliche Schicht zählt nicht zur Höhe des Gebäudes.
Gebäude sollten sich nicht überlappen, aber keine unnötigen Abstände haben, und der Boden sollte immer flach sein, sodass alle Gebäude ihre Basis auf derselben Ebene haben sollten.
Beispielsweise sieht 'abcdefga' so aus.
_
/ \
_ | |
_ / \ | |
_ / \ | | | |
/ \ | | | | / \
_ | | | | | | | |
_ / \ | | | | / \ | |
_ / \| | | | / \| | | | _
/ \| || |/ \| || |/ \/ \
|_||_||_||___||___||___||_____||_|
Leerzeichen in der Zeichenfolgeneingabe sollten durch ein doppeltes Leerzeichen dargestellt werden.
Punkte in der Zeichenfolgeneingabe sollten durch Trümmer wie dieses dargestellt werden.
/\/\
Weitere Beispiele
Eingabe = Hello world.
Ausgabe =
_
/ \
| |
| |
| |
/ \
| |
| | _
| | / \
/ \ | |
| | | |
_ | | _ | |
/ \ | | / \ / \
| | / \ | | | |
| | | | | | | |
_ _ | | | | | | | | _
/ \ / \ / \ | | / \ / \ / \
| | | | | | / \ | | | | | |
| | | | | | | | | | | | | |
| | | | | | | | | | | | | |
_ / \ / \ / \ | | / \ / \ / \
/ \ | | | | | | / \ | | | | | |
| | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | |
| | _ / \ / \ / \ | | / \ / \ / \
/ \ / \ | | | | | | / \ | | | | | | _
| | | | | | | | | | | | | | | | | | / \
| | | | | | | | | | | | | | | | | | | |
| | | | / \/ \/ \ | | / \/ \/ \ | |
/ \/ \| || || | / \| || || | | |
| || || || || | | || || || |/ \
|_____||___||_______||_______||_________| |_______________||_________||___________||_______||___|/\/\
Eingabe = lorem ipsum
_
/ \
_ | |
/ \ | |
_ | | | |
/ \ | | / \
| | _ | | | |
| | / \ / \ | |
_ | | | | | | | |
/ \ / \ | | | | / \
| | | | _ | | | | | | _
| | | | / \ / \ / \ | | / \
_ | | | | | | | | | | | | | |
/ \ / \ / \ | | | | | | / \ | |
| | | | | | | | | | | | | | | |
| | | | | | / \ / \ / \ | | / \
| | | | | | | | _ | | | | | | | |
/ \ / \ / \ | | / \ | | | | / \ | |
| | | | | | | | | | | | | | | | | |
| | | | | | / \ | | / \ / \ | | / \
| | | | | | | | | | | | | | | | | |
/ \ / \ / \ _ | | / \ | | | | / \ | |
| | | | | | / \ | | | | | | | | | | | |
| | | | | | | | / \ | | / \ / \ | | / \
| | | | | | | | | | | | | | | | | | | |
/ \/ \/ \ | | | | / \ | | | | / \ | |
| || || |/ \ | | | | | | | | | | | |
| || || || |/ \ | |/ \/ \| |/ \
|_______||_________||___________||___||_________| |_____||___________||_____________||_____________||_________|
Eingabe = a.a.a.x.x.x.a.a.a
_ _ _
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
_ _ _ | | | | | | _ _ _
/ \ / \ / \ | | | | | | / \ / \ / \
|_|/\/\|_|/\/\|_|/\/\|_______________|/\/\|_______________|/\/\|_______________|/\/\|_|/\/\|_|/\/\|_|
Regeln
- Natürlich ist dies Codegolf, die niedrigste Punktzahl in Bytes gewinnt
- Es gelten Standard-Regelungslücken
- Es sind beliebig viele zusätzliche Leerzeilen vor oder nach der Ausgabe zulässig
- Sie können das gesamte Ergebnis in einer Zeichenfolge ausgeben oder die Ausgabe als Array anbieten, wobei jedes Element eine Ausgabezeile darstellt, oder an STDOUT senden
Hinweis
Dies ist mein erster Beitrag bei PPCG. Es ist durch den Sandkasten gegangen. Alle negativen Punkte oder mögliche Verbesserungen bitte als Kommentar posten und ich werde tun, was ich kann
[a,z]
und[A,Z]
nach[1,26]
scheint eine sinnlose Anforderung zu sein. Es wäre viel besser, nur eine Liste mit ganzen Zahlen als Eingabe zu verwenden (wobei0
dies die Eingabe für Trümmer ist). Das Posten Ihrer Herausforderung nach nur 21 Stunden in der Sandbox , ohne darauf zu warten, dass Stimmen oder Feedback von mehr als einem Benutzer eingehen, gilt nicht als "durch die Sandbox gegangen". Es wird empfohlen, die Herausforderungen mindestens 48-72 Stunden in der Sandbox zu belassen, damit die Benutzer genügend Zeit haben, sie zu überprüfen.[a,z]
,[1.26]
Teile das Mego zu ändern , das erwähnt wird. Es optional zu haben ist oft das Beste (es sei denn, es ist ein wichtiger Teil der Herausforderung (es ist nicht hier).Antworten:
JavaScript (ES6),
330326...315309 BytesErstellt die ASCII-Grafik rekursiv, beginnend mit der untersten Ebene und Anwenden mehrerer regulärer Ausdrücke zwischen den einzelnen Phasen:
Wie es funktioniert
1) Untergeschoss
Wir beginnen mit der Übersetzung der Eingabezeichenfolge in ein unteres Stockwerk wie:
wo:
y
ist ein kürzerer Alias für den Backslash (der ein Escape erfordert)0
,1
oder2
) kurz vor einer Folge von_
der linken Wand des Gebäudes. Es gibt die Anzahl der Wände an, die vor der nächsten „Ausbreitungsschicht“ darüber platziert werden müssen._
steht für die rechte Wand des Gebäudes und ist immer auf gesetzt0
.2) Reguläre Ausdrücke, die zwischen den einzelnen Phasen angewendet werden
Der rekursive Prozess besteht aus dem Anwenden von 9 Ersetzungen in der vorherigen Etage unter Verwendung der folgenden regulären Ausdrücke:
/\/y/g
=>" "
(Schutt entfernen)/_/g
=>"x"
(ersetzen Sie das Fundament oder die Oberseite des Gebäudes durch einen festen Block)/\/xy/g
=>" _ "
(Ersetze die letzte Verbreiterungsschicht mit der Oberseite des Gebäudes)/1/g
=>"3"
(vorübergehend ersetzen1
durch3
- siehe letzten Schritt)/2/g
=>"1"
(ersetzen2
durch1
)/\/xx(x+)y/g
=>" 2$10 "
(Ersetzen Sie eine verbreiternde Ebene durch eine neue, schmalere Wand)/0(x+)0/g
=>"/$1y"
(ersetzen Sie die Oberseite der Wand mit einer verbreiternden Schicht)/3/g
=>"0"
(ersetzen3
durch0
)Zum Beispiel sind hier die aufeinanderfolgenden Transformationen von
2___0
(unteres Stockwerk erzeugt durch a'f'
):NB : Die Oberseite des Gebäudes wird dann durch a ersetzt
x
. Dies ist im obigen Diagramm nicht dargestellt.3) Reguläre Ausdrücke, die auf das Endergebnis angewendet werden
Die Rekursion hört auf, wenn nichts mehr zu ersetzen ist, was bedeutet, dass wir uns jenseits der Spitze des höchsten Gebäudes befinden.
Wir müssen jetzt alles mit noch ein paar regulären Ausdrücken aufräumen:
/\d/g
=>"|"
(Ziffern durch Pfeifen ersetzen)/x/g
=>" "
(feste Blöcke durch Leerzeichen ersetzen)/y/g
=>"\"
(durchy
Backslashes ersetzen )Zum Beispiel:
Demo
Mitwirkende:
4 Bytes gespart dank Hedi
8 Bytes gespart dank Not that Charles
quelle
.charCodeAt()
.new
innew RegExp(e,'g')
y
, ohne dass Sie einen Schrägstrich machen müssen. 2. wenn Sie verwenden_
für das Erdgeschoss, können Sie immer noch die Spitze mit dem regulären Ausdruck unterscheiden:/_ /
.PHP,
386376367364362358356 Byteserste Ansatz; kann noch golf sein.
PHP,
366362361360357 Bytesähnlicher Ansatz mit einer Unterfunktion:
Aufschlüsselung für den zweiten Ansatz
+16 Byte, wenn führende Zeilen nicht zulässig sind:
Ersetzen
echo"$o[$y]\n;
durchif($s=rtrim($o[$y]))echo"$s\n";
.-3 Bytes für einen der
;<=>?[\]^_{|}~
Trümmer: Ersetzen Sie 1)($n=31&ord($c))
mit$n
, 2)$n=28,$w='.'!=$c
mit($n=31&ord($c))<27
und 3)4
mit($n=28)/7
.Ein weiterer für -8
>
,^
oder ,~
wie Bauschutt: Undo 3)quelle
if(!$n){$o[$y++].=str_pad(_,$w," ",2);}
-2 Bytes für die Klammernfor($y=36;$y--;)echo"$o[$y]\n";
; aber ich habe einen neuen Ansatz, der andere 2 Bytes spart.use
funktioniert nur für anonyme Funktionen. es würde 2 Bytes sparen; Aber ich müsste diese Funktion in einer Variablen speichern,$a=
anstatt ihr einen Namen (+3 Bytes) zu geben, und$
jedem der vier Aufrufe ein hinzufügen .Pyth,
9379 BytesProbieren Sie es online aus. Testsuite.
Erläuterung
Ich habe dies standardmäßig ausgeblendet, da es viel zu lang ist.
Code-Snippet anzeigen
quelle
Perl,
147146 BytesBeinhaltet +1 für
-p
Mit Eingabe auf STDIN ausführen, z
citysky.pl
:Funktioniert wie abgebildet, aber ersetzen Sie die
\xhh
Escape-Zeichen durch ihren Literalwert, um die beanspruchte Punktzahl zu erhalten. Sie können das mit dieser Kommandozeile machen:Ich habe noch keine anderen Ansätze untersucht, daher ist dies möglicherweise sehr schlagbar ...
quelle
Haskell, 289 Bytes
quelle
Ruby, 245
Sie erlauben so viele zusätzliche Zeilenumbrüche, wie Sie möchten, also nehme ich mir die Freiheit. Abgesehen davon ist der Prozess wie folgt:
a
.a[0]
/\/\
zua[0]
c.upcase.ord + (c.upcase.ord-1)/3
)a
:a[t]+=w*(a[0].size-a[t].size)
h
, zentriere a_
| |
oder/ \
der richtigen Breite (1+2*((h-t)/4
) sind, je nachdem, obh-t%4==0
"|___|"
die richtigen Breite zua[0]
a.reverse
Ich wette, ich kann es kleiner machen, wenn ich die Mathematik ausarbeite, um das zu vermeiden
reverse
quelle
PHP, 297 Bytes
Eine lesbarere Version:
quelle