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×n
Zeichen ein Raster des Zeichens auf den Stapel .c
m, n ≥ 1
- Bei einem Rohr
|
, Pop zwei GitterA
undB
aus dem Stapel (B
war oben) und schieben das GitterAB
erhält durch VerkettenB
rechts vonA
. Dies setzt voraus, dassA
undB
gleich hoch sind. - Bei einem Bindestrich
-
, Pop zwei GitterA
undB
aus dem Stapel (B
war oben) und schieben das GitterA/B
erhält durch VerkettenB
der an die UnterseiteA
. Dies setzt voraus, dassA
undB
gleich breit sind.
Es wird garantiert , dass für einige Entscheidungen von m
und n
bei 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×2
Rechteck aus p
und 1×1
Rechtecke aus a
und r
(der Grund dafür wird später klar). Dann knallen wir die a
und r
Rechtecken, und ihre vertikale Verkettung schieben
a
r
Als nächstes verschieben wir ein 1×2
Rechteck von s
, platzieren es und das obige Rechteck und verschieben ihre horizontale Verkettung
as
rs
Dann platzieren wir das Rechteck und das p
Rechteck und verschieben ihre Verkettung
pas
prs
Schließlich verschieben wir ein 3×1
Rechteck 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
n
und m
werden 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.