Hintergrund: Zu viele illegale Einwanderer aus Blandia überqueren die Grenze nach Astan. Der Kaiser von Astan hat dich beauftragt, einen Graben auszuheben, um sie fernzuhalten, und Blandia muss für die Kosten aufkommen. Da alle Schreibkräfte bis zum Einrichten des Grabens beschäftigt waren, muss Ihr Code so kurz wie möglich sein. *
Aufgabe: Lassen Sie die Blands anhand einer 2D-Karte der Grenze zwischen Astan und Blandia (mit Land) für einen Grenzgraben bezahlen.
Zum Beispiel: Wenn astanische Zellen markiert sind A
, Blandic-Zellen markiert sind B
und Trench-Zellen markiert sind +
(die Kartenrahmen dienen nur der Klarheit):
┌──────────┐ ┌──────────┐
│AAAAAAAAAA│ │AAAAAAAAAA│
│ABAAAAAABA│ │A+AAAAAA+A│
│ABBBAABABA│ │A+++AA+A+A│
│ABBBAABABA│ │A+B+AA+A+A│
│ABBBBABABA│→│A+B++A+A+A│
│ABBBBABBBB│ │A+BB+A++++│
│ABBBBABBBB│ │A+BB+A+BBB│
│ABBBBBBBBB│ │A+BB+++BBB│
│BBBBBBBBBB│ │++BBBBBBBB│
└──────────┘ └──────────┘
Details: Die Karte enthält mindestens drei Zeilen und drei Spalten. Die obere Reihe wird vollständig astanisch sein und die untere Reihe wird vollständig blandisch sein.
Sie können drei beliebige Werte verwenden, um das astanische Territorium, das blandische Territorium und den Grenzgraben darzustellen, sofern Eingabe und Ausgabe konsistent sind.
Automatenformulierung: Eine blandische Zelle mit mindestens einer astanischen Zelle in ihrer Nachbarschaft Moore wird zu einer Grenzgrabenzelle.
Testfälle
[
"AAAAAAAAAA",
"ABAAAAAABA",
"ABBBAABABA",
"ABBBAABABA",
"ABBBBABABA",
"ABBBBABBBB",
"ABBBBABBBB",
"ABBBBBBBBB",
"BBBBBBBBBB"
]
wird:
[
"AAAAAAAAAA",
"A+AAAAAA+A",
"A+++AA+A+A",
"A+B+AA+A+A",
"A+B++A+A+A",
"A+BB+A++++",
"A+BB+A+BBB",
"A+BB+++BBB",
"++BBBBBBBB"
]
[
"AAA",
"AAA",
"BBB"
]
wird:
[
"AAA",
"AAA",
"+++"
]
[
"AAAAAAAAAA",
"AAAABBBAAA",
"AAAABBBAAA",
"AAAABBBAAA",
"AAAAAAAAAA",
"BBBBBBABBB",
"BBBBBBAABB",
"BBBAAAAABB",
"BBBBBBBBBB"
]
wird:
[
"AAAAAAAAAA",
"AAAA+++AAA",
"AAAA+B+AAA",
"AAAA+++AAA",
"AAAAAAAAAA",
"++++++A+++",
"BB++++AA+B",
"BB+AAAAA+B",
"BB+++++++B"
]
* HAFTUNGSAUSSCHLUSS: JEGLICHE VERHÄLTNIS ZUR TATSÄCHLICHEN GEOPOLITIK IST ENTSPRECHEND!
<sup><sub><sup><sub><sup><sub><sup><sub>
:-Ppass
Die Pläne, einen Grenzgraben zu bauen, führten zu einer Schließung der Regierung, und es passiert nichts.Antworten:
Wolfram Language (Mathematica) , 15 Byte
Probieren Sie es online!
Oder (39 Bytes):
Probieren Sie es online!
Was würden wir sonst noch von Mathematica erwarten? Verwendete Zeichen sind
{Astan -> 0, Blandia -> 1, Trench -> 2}
.quelle
MATL ,
118 BytesInspiriert von @ flawrs Octave-Antwort und @ lirtosiasts Mathematica-Antwort .
Die Eingabe ist eine Matrix, in der Astan durch
0
und Blandia durch dargestellt werden1
. Der Graben wird in der Ausgabe durch dargestellt2
.Probieren Sie es online!
Wie es funktioniert
quelle
JavaScript (ES7),
8482 Byte2 Bytes dank @Shaggy gespart
Übernimmt die Eingabe als Ganzzahlmatrix, wobei für Astan und für Blandia steht. Gibt eine Matrix mit dem zusätzlichen Wert für den Graben zurück.3 0 1
Probieren Sie es online!
Kommentiert
quelle
K (ngn / k) , 23 Bytes
Probieren Sie es online!
verwendet
0 1 2
für"AB+"
{
}
Funktion mit Argumentx
~
logisch nicht2{
}/
zweimal tun0,x,0
Surround mit 0-s (oben und unten in der Matrix)3'
Dreifache von aufeinanderfolgenden Reihen+/'
summiere jeden+
transponierenx&
logisch und vonx
mitx+
hinzufügenx
zuquelle
APL (Dyalog Unicode) , 11 Byte SBCS
Dies basiert auf der 12-Byte-Lösung von @ dzaima im Chat .
∊
Wir danken @ Adám selbst für seine Überlegungen zur Verwendung in der DFN und @ H.PWiz dafür, dass er uns daran erinnert hat, dieselbe Kodierung für Ein- und Ausgabe zu verwendenProbieren Sie es online!
darstellt ,
'AB+'
wie2 0 1
jeweils{
}⌺3 3
Wenden Sie eine Funktion auf jede überlappende 3 × 3-Region der Eingabe an, einschließlich Regionen, die sich um 1 Einheit außerhalb der Matrix erstrecken und mit Nullen aufgefüllt sind2∊⍵
ist eine 2 im argument vorhanden? Rückgabe eines 0/1-Booleschen Werts⊢⌈
pro Element max davon und der ursprünglichen Matrixquelle
display
den ich vergessen habe, zu entfernen. entfernt jetztPowerShell , 220 Byte
Es ist nicht so klein wie die anderen Einreichungen, aber ich dachte, ich würde es als Referenz hinzufügen. [VORDERGRUND!]
Probieren Sie es online!
quelle
0..$h|%{-join$(foreach($j in 0..$w){if ($a[$_][$j]-eq'B'-and($a[(m $_ $h)]|?{$_[(m $j $w)]-match'A'})){'+'}else{$a[$_][$j]}})}
für 207 Bytes werden?Oktave ,
37 3126 BytesDiese Funktion führt eine morphologische Erosion am Astan (
1-b
) - Teil des "Bildes" durch und verwendet dann eine gewisse Arithmetik, um alle drei Bereiche mit unterschiedlichen Symbolen zu versehen. Danke @LuisMendo für -5 Bytes!conv2
imerode
Probieren Sie es online!
quelle
J , 28 Bytes
Probieren Sie es online!
'AB+'
->2 0 1
Inspiriert von der APL-Lösung von ngn. 12 Bytes nur um die Matrix mit Nullen aufzufüllen ...
quelle
⌺
(Stencil) macht es automatisch: "Rechtecke werden auf aufeinanderfolgenden Elementen von Y zentriert und (es sei denn, die Größe des Rechtecks ist 1) mit Füllelementen aufgefüllt."Holzkohle , 20 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Verbinden Sie das Eingabearray mit Zeilenumbrüchen anstelle der üblichen Zeilenumbrüche. Dies ist erforderlich, damit die Zeichen einzeln gedruckt werden können.
Drucken Sie die Eingabezeichenfolge, ohne den Cursor zu bewegen.
Durchlaufen Sie jedes Zeichen der Eingabezeichenfolge.
Wenn das Moore-Viertel ein enthält
A
und das aktuelle Zeichen einB
...... dann überschreibe die
B
mit einem+
...... ansonsten das aktuelle Zeichen drucken (oder in die nächste Zeile springen, wenn das aktuelle Zeichen ein Wagenrücklauf ist).
quelle
JavaScript, 85 Bytes
Warf das letzte Nacht zusammen und vergaß es. Wahrscheinlich gibt es irgendwo noch Raum für Verbesserungen.
Die Ein- und Ausgabe erfolgt als Array von Ziffern-Arrays, wobei
3
Astan,0
Blandia und1
der Graben verwendet werden.Probieren Sie es online aus.
quelle
Javascript,
126118 BytesÜbergeben Sie eines der String-Arrays aus der Frage, und Sie erhalten ein Array von
String-Zeichen-Arrays (danke @Shaggy!) Mit 0 für den Graben. Kann wahrscheinlich mehr golfen werden (ohne auf numerische Arrays umzuschalten), aber mir fällt momentan nichts ein.quelle
Retina 0.8.2 ,
9280 BytesProbieren Sie es online! Lose basierend auf meiner Antwort auf Werde ich es rechtzeitig herausfinden? Erläuterung: Alle
B
s unmittelbar über oder unterA
s werden zua
s. Dies reduziert das Problem auf das Überprüfen vonB
s links oder rechts vonA
s odera
s. Diea
s selbst müssen+
natürlich auch in s umgewandelt werden, aber zum Glück wirkt sich dasi
FlagT
nur auf die Regex-Übereinstimmung aus, nicht auf die tatsächliche Transliteration, sodass dieA
s davon nicht betroffen sind.quelle
05AB1E , 29 Bytes
Matrizen sind nicht wirklich der starke Anzug von 05AB1E (und sie sind auch nicht mein starker Anzug).
Inspiriert von @ngns K (ngn / k) Antwort , verwendet also auch I / O einer 2D Integer Matrix mit
012
fürAB+
.Probieren Sie es online aus . (Die Fußzeile im TIO dient zum hübschen Ausdrucken der Ausgabe. Sie können sie jederzeit entfernen, um die Matrixausgabe anzuzeigen.)
Erläuterung:
quelle
C # (Visual C # Interactive Compiler) , 187 Byte
Statt
Take()
s,Skip()
s undSelect()
s zu verketten , werden stattdessen double for-Schleifen verwendet, um Nachbarn zu finden. GROSSE Byteabnahme von 392 Bytes auf 187. Linq ist nicht immer die kürzeste!Probieren Sie es online!
quelle
Perl 5,
5846 BytesTIO
-12 Bytes dank @Grimy
TIO
-p
mag-n
aber auch drucken-00
Absatzmodus/.\n/
stimmt das letzte Zeichen der ersten Zeile überein@{-}
spezielles Array die Position des Übereinstimmungsbeginns früherer übereinstimmender Gruppen, erzwungen als Zeichenfolge (erstes Element)s/../+/s&&redo
Ersetzen Sie match durch+
while matches/s
flag, damit.
passt das auch zu newline zeichenA(|.{@{-}}.?.?)\KB
StreichhölzerAB
oderA
gefolgt von (width-1) bis (width + 1) Zeichen gefolgt vonB
\K
das linkeB
unverändert zu lassenB(?=(?1)A)
,(?1)
Dirvertieren rekursiv, um auf den vorherigen Ausdruck zu verweisen(|.{$m,$o})
(?=..)
Lookahead, um ohne aufwendige Eingabe zu passenquelle
/. /,@m=@-while s/A(|.{@m}.?.?)\KB|B(?=(?1)A)/+/s
(Literal Newline in der ersten Regex). TIO/. /;s/A(|.{@{-}}.?.?)\KB|B(?=(?1)A)/+/s&&redo
. TIOJava 8,
169145 Bytes-24 Bytes dank @ OlivierGrégoire .
Wird
0
anstelle vonA
und1
anstelle von verwendetB
, wobei die Eingabe eine 2D-Ganzzahlmatrix ist. Ändert die Eingabematrix, anstatt eine neue zurückzugeben, um Bytes zu sparen.Die Zellen werden wie in meiner Antwort für die Herausforderung Alle die einzelnen Acht überprüft .
Probieren Sie es online aus.
Erläuterung:
quelle
m[i+k/3-1][j+k%3-1]
? 145 BytesPowerShell ,
86 bis80 ByteProbieren Sie es online!
Die Map ist eine Zeichenfolge mit Zeilenumbrüchen. Dieses Skript ersetzt
B
to+
durch regexp(?<=A(.?.?.{$MapWidth-1})?)B|B(?=(.?.?.{$MapWidth-1})?A)
.Weniger Golf-Testskript:
Ausgabe:
quelle
Ruby , 102 Bytes
Probieren Sie es online!
Eingabe / Ausgabe als durch Zeilenumbrüche getrennte Zeichenfolge
quelle
Python 2 ,
123119 BytesProbieren Sie es online!
I / O ist eine Liste von Listen
quelle
TSQL, 252 Bytes
Das Aufteilen der Zeichenfolge ist sehr kostspielig, wenn die Zeichenfolge aufgeteilt wurde und die Anzahl der Bytes bereits in einer Tabelle 127 Zeichen beträgt. Script im unteren Bereich enthalten und völlig anders. Entschuldigen Sie, dass Sie so viel Platz in Anspruch nehmen.
Golf gespielt:
Ungolfed:
Versuch es
TSQL, 127 Bytes (Tabellenvariable als Eingabe verwenden)
Führen Sie dieses Skript im Management Studio aus - verwenden Sie "query" - "result to text", um es lesbar zu machen
Probieren Sie es aus - der Warnausgang ist ausgewählt und nicht lesbar. Wäre mit print lesbar, aber das ist mit dieser Methode nicht möglich
quelle