Stellen wir uns einen normalen Mauerziegel als vor [__]
(und ignorieren Sie die Tatsache, dass die Oberseite offen ist). Wenn diese Steine gestapelt werden, wird jede zweite Schicht um einen halben Stein versetzt, wie es im Ziegelbau üblich ist:
[__][__][__][__]
[__][__][__][__]
[__][__][__][__]
[__][__][__][__]
Somit hat jeder Ziegel höchstens sechs Nachbarn und es ist unmöglich, dass zwei Ziegel direkt vertikal ausgerichtet werden.
Der entscheidende Punkt ist, dass die Anordnungen dieser Steine nicht gemörtelt werden , sondern lediglich durch die Schwerkraft zusammengehalten werden. Daher ist es wichtig, dass jeder Stein in der Struktur stabil ist, da sonst die gesamte Struktur instabil ist.
Es gibt drei Möglichkeiten, wie ein einzelner Ziegelstein stabil sein kann:
- Jeder Ziegel auf dem Boden (die unterste Ziegelreihe) ist stabil.
Jeder Stein, der zwei Steine direkt darunter hat, ist stabil:
[__] <- this brick is stable [__][__] <- because these bricks hold it up
Jeder Stein, auf dessen Seite sich oben und unten ein Stein befindet, ist stabil:
[__] [__] [__] [__] <- these middle bricks are stable [__] [__] because the upper and lower bricks clamp them in [__] [__] [__] [__] <- these middle bricks are NOT stable [__] [__]
Aus diesen Regeln können wir zum Beispiel die Anordnung ersehen
[__][__][__][__]
[__][__][__][__]
[__][__][__][__]
[__][__][__][__]
ist instabil, weil der obere rechte Ziegel instabil ist, was alles ist, was es braucht.
Eine Ziegelkonstruktion ist nur dann stabil, wenn alle Ziegel stabil sind.
Herausforderung
Ihre Aufgabe ist es, eine Funktion zu schreiben, die eine Brick-Strukturzeichenfolge aufnimmt und einen Wahrheitswert zurückgibt, wenn die Struktur stabil ist, und einen falschen Wert, wenn sie instabil ist. ( wahrheitsgemäße / falsche Definition )
Die Eingabezeichenfolge kann beliebig groß sein, es handelt sich jedoch immer um ein rechteckiges Zeichenraster mit Leerzeichen, die Bereiche ohne Ziegel füllen. Die Zeichenrasterbreite ist durch 4 teilbar, die Höhe kann jedoch ungerade oder gerade sein.
Das Ziegelgitter erstreckt sich immer über und rechts von der unteren linken Ziegelposition:
.
.
.
BRK?BRK?BRK?BRK?
BRK?BRK?BRK?BRK?BRK?
BRK?BRK?BRK?BRK?
BRK?BRK?BRK?BRK?BRK? . . .
BRK?BRK?BRK?BRK?
BRK?BRK?BRK?BRK?BRK?
Je nach Struktur steht jeder BRK?
für einen Stein ( [__]
) oder einen leeren Raum (4 Räume).
Beachten Sie, dass die Hohlräume aus halben Ziegeln mit Leerzeichen gefüllt sind, um sicherzustellen, dass das Zeichenraster rechteckig ist.
Wertung
Der kürzeste Code in Bytes gewinnt.
Anmerkungen
- Falls gewünscht, können Sie
.
anstelle des Leerzeichens ein Leerzeichen verwenden. - Die leere Zeichenfolge wird als stabil betrachtet.
- Wenn Ihre Sprache keine Funktionen hat, können Sie eine benannte Zeichenfolgenvariable als Eingabe verwenden und das Ergebnis einer anderen Variablen zuweisen.
- Wenn Ihre Sprache keine Zeichenketten enthält, können Sie alles tun, was für die Eingabe angemessen erscheint.
Testfälle
Verschiedene Testfälle, durch Leerzeilen getrennt. Aus Gründen der Übersichtlichkeit .
wird anstelle von Leerzeichen Leerzeichen verwendet.
Stabil:
[__]
..[__]..
[__][__]
........[__]........
......[__][__]......
........[__]........
..[__][__]..
[__][__][__]
..[__][__]..
[__]....[__]
............[__]..
..[__][__][__][__]
[__][__][__][__]..
..[__][__][__][__]
[__][__][__][__]..
..[__]........[__]..
[__][__][__][__][__]
..[__][__][__][__]..
....[__][__][__]....
......[__][__]......
........[__]........
Instabil:
..[__]..
........
..[__]..
[__]....
..[__]..
....[__]
..[__][__]..
[__]....[__]
..[__][__]..
[__]....[__]
..[__][__][__][__]
[__][__][__][__]..
..[__][__][__][__]
[__][__][__][__]..
[__][__][__][__][__]
..[__][__][__][__]..
....[__][__][__]....
......[__][__]......
........[__]........
........[__]....
......[__][__]..
....[__][__]....
..[__][__]......
[__][__]........
..[__]..........
(Sie müssen diese Linien in Gedanken übereinander stapeln. Der Punkt ist, dass Ihre Regeln Strukturen zulassen, deren Schwerpunkt weit von ihrem Kontaktpunkt mit dem Boden entfernt ist. Es sollte möglich sein, sie festzuziehen, um dies zu vermeiden , ohne eine Physik-Engine, wenn Sie Lust dazu hatten.)Antworten:
80386 Maschinencode, 98
Der Code:
Der Code scannt die ASCII-Grafik vom Ende bis zum Anfang, wobei jeweils 2 Zeichen übersprungen werden. Dies führt zweimal die erforderlichen Überprüfungen durch (es würde ausreichen, um 4 Zeichen zu springen), vereinfacht jedoch die Logik.
Die Prüfung beginnt mit der vorletzten Zeichenreihe (es ist nicht erforderlich, die letzte Zeile zu prüfen). In jeder Zeile beginnen 3 Zeichen von rechts (es ist nicht erforderlich, zu weit rechts zu prüfen). Für jedes Zeichen werden 4 umgebende Zeichen überprüft:
Es gibt eine Reihe von logischen Bedingungen zu prüfen:
Es ist ein glücklicher Zufall, dass alle Brick-Charaktere
[_]
ihr LSB-Set haben. Alle anderen Zeichen.\n
haben es klar. Darüber hinaus hat der 80386 - Befehlssatz die praktischen „high“ und „low“ Register (ah
,al
usw.), die dazu beitragen , die Kontrollen etwas parallelisieren. Alle Überprüfungen laufen also auf etwas dunkles Geigen hinaus.Ich habe mit dem folgenden C-Code begonnen:
Ich habe den Code in die Assembler-Sprache übersetzt (meistens eins zu eins), einschließlich einer Implementierung von
strchr
undstrlen
. Der folgende Quellcode wird von MS Visual Studio in den Computercode oben in meinem Beitrag übersetzt.quelle
MATLAB - 119 Bytes
Minimiert:
Erweitert:
Beispielnutzung:
Einzelheiten
Die Routine fügt eine Zeile von
.
an den Anfang der Eingabematrix an und konvertiert dann in eine numerische Matrix, indem 3 zu den ASCII-Zeichencodes hinzugefügt wird. Bei dieser Konvertierung entsteht eine 2D-Faltung mit dem Kernelergibt eine Matrix mit
0
an Stellen, an denen sich das Zeichenmuster befindetvorhanden ist, mit der
*
Darstellung "beliebiger Zeichen". Aufgrund der Konstruktion des Kernels ist dies das einzige gültige Zeichenmuster, das a ergibt0
.Eine identische Faltung wird mit der von links nach rechts gekippten Version des Kernels durchgeführt, um dies zu erkennen
Eine Eingabe ist stabil, wenn entweder i ) sie leer ist oder ii ) in keiner Faltung Nullen auftreten.
Zwei Frustrationen sind
Die Standardfaltung von MATLAB läuft an den Kanten der Operandenmatrix vorbei und erzeugt fehlerhafte
0
s in gegenüberliegenden Ecken für beide Faltungen, zu denen,'valid'
(8 Bytes) hinzugefügt werden müssenconv2
Aufruf müssen , um die Ausgabe auf den Bereich zu beschränken, in dem die Faltung gültig ist.Die Behandlung des leeren String-Falls fügt 12 Bytes hinzu.
quelle
JavaScript (E6) 131
261Test in der FireFox / FireBug-Konsole
Ausgabe
Ungolfed
quelle
[...a]
tun, wenn es Ihnen nichts ausmacht, wenn ich Sie frage? Ich weiß, dass ES6...arg
als letztes Argument einer Funktion die Erfassung von Variadics ermöglicht, aber ich habe noch nie gesehen, dass es so verwendet wird.{:}
in MATLAB. Das wird sehr nützlich sein. Vielen Dank. :)Python 279
Ich denke, ich bin ziemlich schlecht in Code-Golf-Herausforderungen, und vielleicht verwende ich dafür die falschen Sprachen: D Aber ich liebe Code, der sich leicht lesen lässt :) Übrigens, ich würde gerne einen Python-Code sehen, der weniger Bytes verwendet!
Mögliche Beispiele:
quelle
_
[
<>
verwenden!=
.!=
ist der bevorzugte WegJavaScript 2 (ES6) - 148
151BytesGibt eine Zeichenfolge aus Zeilen mit Zeilenumbrüchen als Trennzeichen aus (Anmerkung: Wenn wir ein anderes Trennzeichen wie "|" zum Trennen von Zeilen verwenden könnten, könnte dies um 1 Byte kürzer gemacht werden).
Testen Sie in der Firefox-Konsole mit:
quelle
Python, 209
Tests:
Ausgabe:
quelle