Ein Fenster ist ein ASCII-artiges Quadrat mit einer ungeraden Seitenlänge von mindestens 3, einem einzelnen Zeichenrahmen am Rand sowie vertikalen und horizontalen Strichen in der Mitte:
#######
# # #
# # #
#######
# # #
# # #
#######
Ein MS-Fenster ist ein Fenster, in dem der Rahmen nur aus den Zeichen M
und besteht S
. Ihre Aufgabe ist es, ein Programm (oder eine Funktion) zu schreiben, das eine Zeichenfolge verwendet und einen Wahrheitswert ausgibt, wenn die Eingabe ein gültiges MS Window ist, und einen Falsey-Wert, wenn dies nicht der Fall ist.
Spezifikationen
- Sie können die Eingabe als durch Zeilenumbrüche getrennte Zeichenfolge oder als ein Array von Zeichenfolgen für jede Zeile verwenden.
- Der Rand eines MS-Fensters kann eine Mischung aus M- und S-Zeichen enthalten, das Innere besteht jedoch immer aus Leerzeichen.
- Sie können auswählen, ob nur Fenster mit nachgestellten Zeilen oder nur Fenster ohne nachgestellte Zeilen erkannt werden sollen, jedoch nicht beide.
Testfälle
Wahrheit:
MMM
MMM
MMM
SMSMS
M M S
SMSMM
S S M
SMSMS
MMMMMMM
M S M
M S M
MSSSSSM
M S M
M S M
MMMMMMM
Falsey:
Hello, World!
MMMM
MSSM
MS M
MMMM
MMSMM
M S.M
sSSSS
M S M
MMSMM
MMMMMMM
M M M
MMMMMMM
M M M
MMMMMMM
MMMMMMM
M M M M
MMMMMMM
M M M M
MMMMMMM
M M M M
MMMMMMM
MMSSMSSMM
M M M
S S S
S S S
MMSSMSSMM
S S S
S S S
M M M
MMSSMSSMM
code-golf
string
ascii-art
decision-problem
Esolanging Fruit
quelle
quelle
Antworten:
Pyke,
3431 BytesProbieren Sie es hier aus!
quelle
Retina ,
6867 BytesDie Anzahl der Bytes setzt die Kodierung nach ISO 8859-1 voraus.
Probieren Sie es online!
quelle
Schmutz ,
3938 BytesVielen Dank an Zgarb für das Speichern von 1 Byte.
Probieren Sie es online!
Ich bin mir nicht sicher, ob es eine einfachere Möglichkeit gibt, das quadratische Seitenverhältnis der einzelnen Fensterkomponenten zu erzwingen, als ein rekursives Nichtterminal zu verwenden, aber dies scheint recht gut zu funktionieren.
Erläuterung
Lesen Sie das Programm am besten von unten nach oben.
Dies definiert einfach ein Nichtterminal (das Sie sich als eine Unterroutine vorstellen können, die einem Rechteck entspricht),
W
das entweder einemM
oder einem entsprichtS
(]
am Ende der Zeile befindet sich ein Implizit ).Dies definiert ein Nicht-Terminal,
B
das ungefähr einem Viertel der Ausgabe entspricht, dh ein Fensterfeld mit dem linken und oberen Rand. Etwas wie das:Um sicherzustellen, dass dieses Fensterfeld quadratisch ist, definieren wir
B
rekursiv. Es ist entweder ein FensterzeichenW
oder esB/W\ * W/\ /*
fügt eine Ebene rechts und unten hinzu. Um zu sehen, wie das funktioniert, entfernen wir etwas syntaktischen Zucker:Dies ist das Gleiche, da die horizontale Verkettung entweder
AB
oder geschrieben werdenA B
kann, die letztere jedoch eine niedrigere Priorität als die vertikale Verkettung hat,/
während die erstere eine höhere Priorität hat. SoB/W[ ]*
ist aB
mit einem Fensterzeichen und einer Reihe von Leerzeichen darunter. Und dann hängen wir horizontal an,W/[ ]/*
was ein Fensterzeichen mit einer Spalte von Leerzeichen ist.Schließlich montieren wir diese Nichtterminale in die endgültige Fensterform:
Das sind vier Fenster,
B
gefolgt von einer Reihe von Fensterzeichen und einer Spalte von Fensterzeichen. Beachten Sie, dass wir nicht explizit behaupten, dass die vier Fenster die gleiche Größe haben, aber wenn dies nicht der Fall ist, ist es unmöglich, sie zu einem Rechteck zusammenzufügen.Schließlich ist der
e`
Anfang einfach eine Konfiguration, die Grime anweist, zu überprüfen, ob die gesamte Eingabe mit diesem Muster übereinstimmt (und es druckt0
oder1
dementsprechend).quelle
JavaScript (ES6),
115113 ByteNimmt Eingaben als ein Array von Arrays von Zeichen (füge 5 Bytes für ein Array von Zeichenfolgen hinzu) und gibt
1
oder zurück0
. Nachdem überprüft wurde, dass die Höhe ungerade ist, wird jede Zeile überprüft, um sicherzustellen, dass das Array quadratisch ist, und jedes Zeichen wird als eines der Zeichen überprüft, die wir an dieser bestimmten Position erwarten. Bearbeiten: 2 Bytes dank @PatrickRoberts gespeichert.quelle
(...).includes(c)
,~(...).search(c)
um 1 Byte zu speichern(...?/ /:/[MS]/).test(c)
2 statt nur 1 Byte speichern.Perl,
124123119959384Das folgende Perl-Skript liest ein Kandidaten-MS-Fenster aus der Standardeingabe. Es wird dann mit einem Beendigungsstatus von Null beendet, wenn der Kandidat ein MS-Fenster ist, und mit einem Beendigungsstatus ungleich Null, wenn dies nicht der Fall ist.
Dabei werden zwei reguläre Ausdrücke generiert, einer für die obere, mittlere und untere Zeile und einer für jede zweite Zeile, und die Eingabe wird mit diesen verglichen.
Danke, @Dada. Und wieder.
quelle
@a=<>;$s=$"x(($.-3)/2);$m="[MS]";map{$a[$_]!~($_%($./2)?"$m$s$m$s$m":"$m${m}{$.}")&&die}0..--$.
$.
am Ende zweimal zu vermeiden , mit$.-1
(vor allem seit dem ersten Mal war es($.-1)/2
so dass es einige zusätzliche Klammer erforderlich), so dass die$m
in$m${m}{$.}
kein Fehler ist. Außerdem habe ich gerade erst gemerkt, dass Regex-^...$
Zeichen mit (also zusätzliche Zeichen am Ende oder am Anfang scheitern) umgeben sein sollten, oder kürzer:ne
statt verwenden!~
.ne
stattdessen!~
schreiben (ich sollte keine Nachrichten schreiben, wenn ich nur 15 Minuten wach bin!).^...$
Ich fürchte, Sie müssen beide Regex verwenden.Mathematica, 166 Bytes
Unbenannte Funktion, die eine Liste von Zeichenlisten als Eingabe und Rückgabe verwendet
True
oderFalse
. Hier ist eine weniger golfige Version:Die erste Zeile definiert die Funktion
t
, die eine Liste mit Längenangabend
in zwei Teile unterteilt, wobei der erste der erste, der mittlere und der letzte Eintrag der Liste ist und der zweite der Rest. Die zweite Zeile prüft zunächst, ob die Eingabe ein quadratisches Array ist. In der vierten Zeile werdent
zwei Zeichen verwendet , einmal für die Eingabe selbst und einmal für alle Zeichenfolgen in der Eingabe, um die Zeichen, die sein sollen,"M"
oder"S"
die Zeichen, die Leerzeichen sein sollen , zu trennen . dann überprüfen die fünfte und siebte Zeile, ob sie wirklich das sind, was sie sein sollen.quelle
JavaScript (ES6),
108106 BytesEingabe: Array von Strings / Ausgabe:
0
oder1
Testfälle
Code-Snippet anzeigen
quelle
JavaScript (ES6),
140138141140 BytesIch weiß, dass dies keine gewinnende Byteanzahl ist (obwohl Patrick Roberts für -3 zu verdanken war und ich erkannte, dass er 1 anstelle von M / S: +3 falsch positiv war), aber ich habe es auf eine etwas andere Weise getan. ' Ich bin neu in diesem und es hat Spaß gemacht ...
Akzeptiert ein Array von Zeichenfolgen, eine für jede Zeile, und gibt true oder false zurück. Neue Zeile zur Verdeutlichung hinzugefügt (nicht in der Byteanzahl enthalten).
Anstatt die Eingabe mit einem verallgemeinerten Muster zu vergleichen, konstruiere ich ein 'M'-Fenster der gleichen Größe, ersetze S durch M bei der Eingabe und vergleiche die beiden.
Ungolfed
Testfälle
quelle
f=
muss sie für zukünftige Referenzzwecke nicht in die Byteanzahl einbezogen werden. Es handelt sich also tatsächlich um eine 138-Byte-Übermittlung.z=-1+s/2|0
mitz=(s-3)/2
zu speichern 1 Bytee.replace(/S/g,'M')==...
mite.split`S`.join`M`==...
einem anderen Byte speichernz=-1+s/2|0
Gibt eine positive Ganzzahl für s == 1 und sogar s zurück, dh die Funktion gibt false zurück, ohne dass Array () abstürzt. Ansonsten hat die notwendige Logik es länger gemacht. Toller Tipp für Split / Join, dankes=1
Fall nicht in Betracht gezogen , da mein ungültiger regulärer Ausdruck schweigend versagt.JavaScript (ES6),
10910710610599 ByteEdit : Whoa, Arnauld hat mir 6 Bytes gespart, indem er
s.split`\n`.length
zu geändert hats.search`\n`
! Vielen Dank!Dies nimmt eine einzelne mehrzeilige Zeichenfolge und erstellt eine
RegExp
Validierung auf der Grundlage der Länge der Eingabezeichenfolge. Rückgabetrue
oderfalse
. Angenommen, ein gültiges Fensterhatkeinen nachgestellten Zeilenumbruch.Demo
quelle
r=s.search('\n')
anstelle von verwendensplit / length
?s=>!s.split`S`.join`M`.search([...])
können entfernt werden, ohne Syntaxfehler zu verursachen.RegExp