Einführung
Diese Herausforderung ist inspiriert von Grime , meiner 2D-Pattern-Matching-Sprache. Grundsätzlich erhalten Sie eine "Grammatik", die zweidimensionale Gitter von Zeichen beschreibt, und Ihre Aufgabe ist es, ein Gitter gemäß der Grammatik zu generieren. Darüber hinaus sollte das Raster in einem gewissen schwachen Sinne so klein wie möglich sein.
Eingang
Ihre Eingabe ist eine Zeichenfolge, die ASCII-Kleinbuchstaben sowie die Symbole |und enthält -. Der Einfachheit halber enthält die Eingabe keine wiederholten Kleinbuchstaben. Die Zeichenfolge ist eine Spezifikation für eine Klasse von rechteckigen Zeichengittern und wird wie folgt mit einem Stapel von links nach rechts analysiert.
- Wenn Sie ein Zeichen in Kleinbuchstaben haben
c, legen Sie für jedesm×nZeichen ein Raster des Zeichens auf den Stapel .cm, n ≥ 1 - Bei einem Rohr
|, Pop zwei GitterAundBaus dem Stapel (Bwar oben) und schieben das GitterABerhält durch VerkettenBrechts vonA. Dies setzt voraus, dassAundBgleich hoch sind. - Bei einem Bindestrich
-, Pop zwei GitterAundBaus dem Stapel (Bwar oben) und schieben das GitterA/Berhält durch VerkettenBder an die UnterseiteA. Dies setzt voraus, dassAundBgleich breit sind.
Es wird garantiert , dass für einige Entscheidungen von mund nbei der Analyse gemacht (die für jeden Buchstaben verschieden sein können), die Eingangsspezifikation korrekt einig Rechteck beschreibt, die auf dem Stapel am Ende übrig bleibt.
Ausgabe
Ihre Ausgabe ist ein rechteckiges Zeichenraster, das von der Eingabe angegeben wird. Das Raster muss in dem Sinne minimal sein, dass es ungültig wird, wenn Zeilen oder Spalten entfernt werden. Sie können eine durch Zeilenumbrüche getrennte Zeichenfolge (mit oder ohne abschließende Zeilenumbrüche), ein 2D-Array von Zeichen oder ein Array von Zeichenfolgen zurückgeben, je nachdem, welches Format das bequemste ist.
Beachten Sie, dass Sie die Eingabe nicht genau wie oben beschrieben verarbeiten müssen. Wichtig ist nur, dass Ihre Ausgabe korrekt ist.
Beispiel
Beachten Sie die Spezifikation
par-s||e-
Zuerst wählen wir ein 1×2Rechteck aus pund 1×1Rechtecke aus aund r(der Grund dafür wird später klar). Dann knallen wir die aund rRechtecken, und ihre vertikale Verkettung schieben
a
r
Als nächstes verschieben wir ein 1×2Rechteck von s, platzieren es und das obige Rechteck und verschieben ihre horizontale Verkettung
as
rs
Dann platzieren wir das Rechteck und das pRechteck und verschieben ihre Verkettung
pas
prs
Schließlich verschieben wir ein 3×1Rechteck von e, platzieren es und das obige Rechteck und verschieben die vertikale Verkettung
pas
prs
eee
Dies ist die Ausgabe des Programms oder mindestens eine der Möglichkeiten. Beachten Sie das, obwohl
ppas
ppas
pprs
eeee
Wird auch von der Spezifikation generiert, handelt es sich nicht um eine gültige Ausgabe, da viele der Zeilen und Spalten entfernt werden könnten.
Betrachten Sie als subtileres Beispiel
co|m|p|il|e|r|-
Diese Angabe erzeugt das Rechteck
comp
iler
Das ist eine gültige Ausgabe. Es erzeugt jedoch auch
commp
iiler
Dies gilt auch, da keine einzelne Zeile oder Spalte entfernt werden kann, ohne sie ungültig zu machen.
Regeln
Sie können ein vollständiges Programm oder eine Funktion angeben. Die niedrigste Byteanzahl gewinnt, und Standardlücken sind nicht zulässig.
Zusätzliche Testfälle
Mit diesen können Sie Ihr Programm testen.
Input:
a
Output:
a
Input:
co|mp|l|-ex|i|f|-y|
Example output:
cccoy
mplly
exify
Input:
ja-r|g-o|ni-|ze|d-|
Example output:
jronze
arondd
ggoidd
Input:
un|co|p-yr|i|gh-t-ab|-|le-||-
Example output:
unnnnnnn
coyriggl
ppyrihhe
ppyritte
ppyriabe
nund mwerden nicht deterministisch gewählt. Es ist garantiert, dass geeignete Werte für sie existieren, aber es ist Aufgabe Ihres Programms, sie zu finden.
un|co|p-|yr|i|gh--t-ab|-|le-||-ist unmöglich, gültig zu sein. Der letzte -hat eine Arität von 2, während sich nur 1 Element auf dem Stapel befindet.