Grabe einen Grenzgraben

59

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 Bund 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!

Adam
quelle
23
Politische Satire in Form von Code Golf, ich liebe es: o)
Sok
4
-1 dafür <sup><sub><sup><sub><sup><sub><sup><sub>:-P
Luis Mendo
25
Python, 4 Bytes : passDie Pläne, einen Grenzgraben zu bauen, führten zu einer Schließung der Regierung, und es passiert nichts.
TheEspinosa
3
@TheEspinosa Nein, nein, die Abschaltung erfolgt, bis der Graben angeordnet ist .
Adám
1
Ich habe nur wegen der Hintergrundgeschichte upvoted. Lesen Sie noch nicht einmal weiter.
Pipe

Antworten:

9

MATL , 11 8 Bytes

Inspiriert von @ flawrs Octave-Antwort und @ lirtosiasts Mathematica-Antwort .

EG9&3ZI-

Die Eingabe ist eine Matrix, in der Astan durch 0und Blandia durch dargestellt werden 1. Der Graben wird in der Ausgabe durch dargestellt 2.

Probieren Sie es online!

Wie es funktioniert

E       % Implicit input. Multiply by 2, element-wise
G       % Push input again
9       % Push 9
&3ZI    % Erode with neighbourhood of 9 elements (that is, 3×3) 
-       % Subtract, element-wise. Implicit display
Luis Mendo
quelle
8

JavaScript (ES7),  84  82 Byte

2 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.301

a=>(g=x=>a.map(t=(r,Y)=>r.map((v,X)=>1/x?t|=(x-X)**2+(y-Y)**2<v:v||g(X,y=Y)|t)))()

Probieren Sie es online!

Kommentiert

a => (                      // a[] = input matrix
  g = x =>                  // g = function taking x (initially undefined)
    a.map(t =               //   initialize t to a non-numeric value
      (r, Y) =>             //   for each row r[] at position Y in a[]:
      r.map((v, X) =>       //     for each value v at position X in r[]:
        1 / x ?             //       if x is defined (this is a recursive call):
          t |=              //         set the flag t if:
            (x - X) ** 2 +  //           the squared Euclidean distance
            (y - Y) ** 2    //           between (x, y) and (X, Y)
            < v             //           is less than v (3 = Astan, 0 = Blandia)
        :                   //       else (this is the initial call to g):
          v ||              //         yield v unchanged if it's equal to 3 (Astan)
          g(X, y = Y)       //         otherwise, do a recursive call with (X, Y) = (x, y)
          | t               //         and yield the flag t (0 = no change, 1 = trench)
      )                     //     end of inner map()
    )                       //   end of outer map()
)()                         // initial call to g
Arnauld
quelle
82 Bytes?
Shaggy
4
@ Shaggy Nicht genug Fragen in letzter Zeit. Ich kann nicht mehr Golf spielen. : D Danke!
Arnauld
Ich habe das erst früher gedacht!
Shaggy
7

K (ngn / k) , 23 Bytes

{x+x&2{++/'3'0,x,0}/~x}

Probieren Sie es online!

verwendet 0 1 2für"AB+"

{ } Funktion mit Argument x

~ logisch nicht

2{ }/ zweimal tun

  • 0,x,0 Surround mit 0-s (oben und unten in der Matrix)

  • 3' Dreifache von aufeinanderfolgenden Reihen

  • +/' summiere jeden

  • + transponieren

x&logisch und von xmit

x+hinzufügen xzu

ngn
quelle
5

APL (Dyalog Unicode) , 11 Byte SBCS

⊢⌈{2∊⍵}⌺3 3

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 verwenden

Probieren Sie es online!

darstellt , 'AB+'wie 2 0 1jeweils

{ }⌺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 sind

2∊⍵ist eine 2 im argument vorhanden? Rückgabe eines 0/1-Booleschen Werts

⊢⌈ pro Element max davon und der ursprünglichen Matrix

ngn
quelle
Wenn Sie zu Stencil wechseln, sparen Sie natürlich mehr als die Hälfte Ihrer Bytes.
Adám
@Adam das wäre eine Antwort in einer anderen Sprache, also nicht vergleichbar oder im Wettbewerb mit dieser Antwort. und ich finde das
golfspielen in spezialsprachen
@Adám ein Alias, für displayden ich vergessen habe, zu entfernen. entfernt jetzt
ngn
5

PowerShell , 220 Byte

Es ist nicht so klein wie die anderen Einreichungen, aber ich dachte, ich würde es als Referenz hinzufügen. [VORDERGRUND!]

function m($i,$m){($i-1)..($i+1)|?{$_-in0..$m}}
$h=$a.count-1;$w=$a[0].length-1
foreach($i in 0..$h){-join$(foreach($j in 0..$w){if ($a[$i][$j]-eq'B'-and($a[(m $i $h)]|?{$_[(m $j $w)]-match'A'})){'+'}else{$a[$i][$j]}})} 

Probieren Sie es online!

Keith S Garner
quelle
1
Willkommen bei PPCG. Schöne erste Antwort, sogar mit TIO Link! Mach dir keine Sorgen über die Codelänge; Jede Sprache tritt gegen sich selbst an. Übrigens können Sie ein Byte sparen, indem Sie den ersten Zeilenumbruch ohne negative Auswirkungen entfernen.
Adám
Kann die letzte Zeile 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?
Gabriel Mills
4

Oktave , 37 31 26 Bytes

Diese 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

@(b)2*b-imerode(b,ones(3))

Probieren Sie es online!

fehlerhaft
quelle
2
-1 für keine Faltung :-P
Luis Mendo
@ LuisMendo Eine frühere Version enthielt eine Faltung :)
Fehler
Danke, aktualisiert!
Fehler
3

J , 28 Bytes

>.3 3(2 e.,);._3(0|:@,|.)^:4

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 ...

Galen Ivanov
quelle
Warum kann die APL-Lösung ohne Auffüllen durchkommen?
Jonah
@Jonah: APL's (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."
Galen Ivanov
das scheint so viel nützlicher zu sein als Js Version ...
Jonah
@Jonah Ja, das ist es!
Galen Ivanov
2

Holzkohle , 20 Bytes

≔⪫θ⸿θPθFθ⎇∧№KMA⁼Bι+ι

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.

Pθ

Drucken Sie die Eingabezeichenfolge, ohne den Cursor zu bewegen.

Fθ

Durchlaufen Sie jedes Zeichen der Eingabezeichenfolge.

⎇∧№KMA⁼Bι

Wenn das Moore-Viertel ein enthält Aund das aktuelle Zeichen ein B...

+

... dann überschreibe die Bmit einem +...

ι

... ansonsten das aktuelle Zeichen drucken (oder in die nächste Zeile springen, wenn das aktuelle Zeichen ein Wagenrücklauf ist).

Neil
quelle
2

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 3Astan, 0Blandia und 1der Graben verwendet werden.

a=>a.map((x,i)=>x.map((y,j)=>o.map(v=>o.map(h=>y|=1&(a[i+v]||x)[j+h]))|y),o=[-1,0,1])

Probieren Sie es online aus.

Zottelig
quelle
2

Javascript, 126 118 Bytes

_=>_.map(x=>x.replace(/(?<=A)B|B(?=A)/g,0)).map((x,i,a)=>[...x].map((v,j)=>v>'A'&&(a[i-1][j]<v|(a[i+1]||x)[j]<v)?0:v))

Ü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.

M Dirr
quelle
Ich denke, das funktioniert für 120 Bytes.
Shaggy
Oder 116 Bytes, die ein Array von Zeichenarrays zurückgeben.
Shaggy
1
@Shaggy Dein Golf funktioniert leider nicht - es fängt keine Stellen ein, an denen A und B diagonal zueinander sind. Auf der anderen Seite zeigt es einige wirklich einfache Golfplätze, die ich verpasst habe ...
M Dirr
1

Retina 0.8.2 , 92 80 Bytes

(?<=¶(.)*)B(?=.*¶(?<-1>.)*(?(1)_)A|(?<=¶(?(1)_)(?<-1>.)*A.*¶.*))
a
iT`Ba`+`.?a.?

Probieren Sie es online! Lose basierend auf meiner Antwort auf Werde ich es rechtzeitig herausfinden? Erläuterung: Alle Bs unmittelbar über oder unter As werden zu as. Dies reduziert das Problem auf das Überprüfen von Bs links oder rechts von As oder as. Die as selbst müssen +natürlich auch in s umgewandelt werden, aber zum Glück wirkt sich das iFlag Tnur auf die Regex-Übereinstimmung aus, nicht auf die tatsächliche Transliteration, sodass die As davon nicht betroffen sind.

Neil
quelle
1

05AB1E , 29 Bytes

_2FIн¸.øVgN+FYN._3£})εøO}ø}*Ā+

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 012für AB+.

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:

_                # Inverse the values of the (implicit) input-matrix (0→1 and 1→0)
                 #  i.e. [[0,0,0,0],[0,1,0,0],[0,1,1,1],[1,1,1,1]]
                 #   → [[1,1,1,1],[1,0,1,1],[1,0,0,0],[0,0,0,0]]
 2F              # Loop `n` 2 times in the range [0, 2):
   Iн            #  Take the input-matrix, and only leave the first inner list of 0s
                 #   i.e. [[0,0,0,0],[0,1,0,0],[0,1,1,1],[1,1,1,1]] → [0,0,0,0]
     ¸           #  Wrap it into a list
                 #   i.e. [0,0,0,0] → [[0,0,0,0]]
               #  Surround the inverted input with the list of 0s
                 #   i.e. [[1,1,1,1],[1,0,1,1],[1,0,0,0],[0,0,0,0]] and [0,0,0,0]
                 #    → [[0,0,0,0],[1,1,1,1],[1,0,1,1],[1,0,0,0],[0,0,0,0],[0,0,0,0]]
        V        #  Pop and store it in variable `Y`
   g             #  Take the length of the (implicit) input-matrix
                 #   i.e. [[0,0,0,0],[0,1,0,0],[0,1,1,1],[1,1,1,1]] → 4
    N+           #  Add `n` to it
                 #   i.e. 4 and n=0 → 4
                 #   i.e. 4 and n=1 → 5
      F          #  Inner loop `N` in the range [0, length+`n`):
       Y         #   Push matrix `Y`
        N._      #   Rotate it `N` times towards the left
                 #    i.e. [[0,0,0,0],[1,1,1,1],[1,0,1,1],[1,0,0,0],[0,0,0,0],[0,0,0,0]] and N=2
                 #     → [[1,0,1,1],[1,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[1,1,1,1]]
            3£   #   And only leave the first three inner lists
                 #    i.e. [[1,0,1,1],[1,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[1,1,1,1]]
                 #     → [[1,0,1,1],[1,0,0,0],[0,0,0,0]]
              }  #  After the inner loop:
    )            #  Wrap everything on the stack into a list
                 #   → [[[0,0,0,0],[1,1,1,1],[1,0,1,1]],[[1,1,1,1],[1,0,1,1],[1,0,0,0]],[[1,0,1,1],[1,0,0,0],[0,0,0,0]],[[1,0,0,0],[0,0,0,0],[0,0,0,0]]]
     €ø          #  Zip/transpose (swapping rows/columns) each matrix in the list
                 #   → [[[0,1,1],[0,1,0],[0,1,1],[0,1,1]],[[1,1,1],[1,0,0],[1,1,0],[1,1,0]],[[1,1,0],[0,0,0],[1,0,0],[1,0,0]],[[1,0,0],[0,0,0],[0,0,0],[0,0,0]]]
       O         #  And take the sum of each inner list
                 #   → [[2,1,2,2],[3,1,2,2],[2,0,1,1],[1,0,0,0]]
        ø        #  Zip/transpose; swapping rows/columns the entire matrix again
                 #   i.e. [[2,1,2,2],[3,1,2,2],[2,0,1,1],[1,0,0,0]]
                 #    → [[2,3,2,1],[1,1,0,0],[2,2,1,0],[2,2,1,0]]
               } # After the outer loop:
                 #   i.e. [[3,5,5,4,2],[4,6,5,4,2],[2,3,2,2,1],[1,1,0,0,0]]
  *              # Multiple each value with the input-matrix at the same positions,
                 # which implicitly removes the trailing values
                 #  i.e. [[3,5,5,4,2],[4,6,5,4,2],[2,3,2,2,1],[1,1,0,0,0]]
                 #   and [[0,0,0,0],[0,1,0,0],[0,1,1,1],[1,1,1,1]]
                 #    → [[0,0,0,0],[0,1,0,0],[0,2,1,0],[2,2,1,0]]
   Ā             # Truthify each value (0 remains 0; everything else becomes 1)
                 #  i.e. [[0,0,0,0],[0,1,0,0],[0,2,1,0],[2,2,1,0]]
                 #   → [[0,0,0,0],[0,1,0,0],[0,1,1,1],[1,1,0,0]]
    +            # Then add each value with the input-matrix at the same positions
                 #  i.e. [[0,0,0,0],[0,1,0,0],[0,1,1,1],[1,1,0,0]]
                 #   and [[0,0,0,0],[0,1,0,0],[0,1,1,1],[1,1,1,1]]
                 #    → [[0,0,0,0],[0,2,0,0],[0,2,2,2],[2,2,1,1]]
                 # (and output the result implicitly)
Kevin Cruijssen
quelle
1

C # (Visual C # Interactive Compiler) , 187 Byte

a=>a.Select((b,i)=>b.Select((c,j)=>{int k=0;for(int x=Math.Max(0,i-1);x<Math.Min(i+2,a.Count);x++)for(int y=Math.Max(0,j-1);y<Math.Min(j+2,a[0].Count);)k+=a[x][y++];return k>1&c<1?9:c;}))

Statt Take()s, Skip()s und Select()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!

Verkörperung der Ignoranz
quelle
1

Perl 5, 58 46 Bytes

$m=($n=/$/m+"@+")-2;s/A(|.{$m,$n})\KB|B(?=(?1)A)/+/s&&redo

TIO

-12 Bytes dank @Grimy

/.
/;s/A(|.{@{-}}.?.?)\KB|B(?=(?1)A)/+/s&&redo

TIO

  • -pmag -naber auch drucken
  • -00 Absatzmodus
  • um die width-1 zu erhalten, /.\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&&redoErsetzen Sie match durch +while matches
    • /sflag, damit .passt das auch zu newline zeichen
  • A(|.{@{-}}.?.?)\KB Streichhölzer
    • ABoder Agefolgt von (width-1) bis (width + 1) Zeichen gefolgt vonB
    • \Kdas linke Bunverändert zu lassen
  • B(?=(?1)A),
    • (?1) Dirvertieren rekursiv, um auf den vorherigen Ausdruck zu verweisen (|.{$m,$o})
    • (?=..) Lookahead, um ohne aufwendige Eingabe zu passen
Nahuel Fouilleul
quelle
-9 Bytes mit /. /,@m=@-while s/A(|.{@m}.?.?)\KB|B(?=(?1)A)/+/s(Literal Newline in der ersten Regex). TIO
Grimmy
1
Down to 46: /. /;s/A(|.{@{-}}.?.?)\KB|B(?=(?1)A)/+/s&&redo. TIO
Grimmy
danke, ich hatte auch die idee, aber verworfen, weil ich an katastrophales backtracking dachte, aber für code golf performance ist das nicht wichtig
nahuel fouilleul
1

Java 8, 169 145 Bytes

m->{for(int i=m.length,j,k;i-->0;)for(j=m[i].length;j-->0;)for(k=9;m[i][j]==1&k-->0;)try{m[i][j]=m[i+k/3-1][j+k%3-1]<1?2:1;}catch(Exception e){}}

-24 Bytes dank @ OlivierGrégoire .

Wird 0anstelle von Aund 1anstelle von verwendet B, 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:

m->{                            // Method with integer-matrix parameter and no return-type
  for(int i=m.length,j,k;i-->0;)//  Loop over the rows
    for(j=m[i].length;j-->0;)   //   Inner loop over the columns
      for(k=9;m[i][j]==1&       //    If the current cell contains a 1:
          k-->0;)               //     Inner loop `k` in the range (9, 0]:
        try{m[i][j]=            //      Set the current cell to:
             m[i+k/3-1]         //       If `k` is 0, 1, or 2: Look at the previous row
                                //       Else-if `k` is 6, 7, or 8: Look at the next row
                                //       Else (`k` is 3, 4, or 5): Look at the current row
              [j+k%3-1]         //       If `k` is 0, 3, or 6: Look at the previous column
                                //       Else-if `k` is 2, 5, or 8: Look at the next column
                                //       Else (`k` is 1, 4, or 7): Look at the current column
               <1?              //       And if this cell contains a 0:
                  2             //        Change the current cell from a 1 to a 2
                 :              //       Else:
                  1;            //        Leave it a 1
        }catch(Exception e){}}  //      Catch and ignore ArrayIndexOutOfBoundsExceptions
                                //      (try-catch saves bytes in comparison to if-checks)
Kevin Cruijssen
quelle
1
Ich habe nicht viel nachgesehen, aber stimmt etwas nicht m[i+k/3-1][j+k%3-1]? 145 Bytes
Olivier Grégoire
@ OlivierGrégoire Dang, das ist so viel einfacher .. Danke!
Kevin Cruijssen
Ich denke, es gilt auch für Ihre Antworten auf frühere Herausforderungen, da sie anscheinend dieselbe Struktur haben
Olivier Grégoire,
@ OlivierGrégoire Ja, ich wollte diese auch mit Ihrem Vorschlag Golf spielen, aber dazwischen kam ein weiterer Kommentar (und eine Frage bei der Arbeit). Werde das gleich tun
Kevin Cruijssen
1

PowerShell , 86 bis 80 Byte

$p="(.?.?.{$(($args|% i*f '
')-1)})?"
$args-replace"(?s)(?<=A$p)B|B(?=$p`A)",'+'

Probieren Sie es online!

Die Map ist eine Zeichenfolge mit Zeilenumbrüchen. Dieses Skript ersetzt Bto +durch regexp (?<=A(.?.?.{$MapWidth-1})?)B|B(?=(.?.?.{$MapWidth-1})?A).

Weniger Golf-Testskript:

$f = {
$l=($args|% indexOf "`n")-1
$p="(.?.?.{$l})?"
$args-replace"(?s)(?<=A$p)B|B(?=$p`A)",'+'
}

@(
,(@"
AAAAAAAAAA
ABAAAAAABA
ABBBAABABA
ABBBAABABA
ABBBBABABA
ABBBBABBBB
ABBBBABBBB
ABBBBBBBBB
BBBBBBBBBB
"@,@"
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
"@,@"
AAA
AAA
+++
"@)
,(@"
AAAAAAAAAA
AAAABBBAAA
AAAABBBAAA
AAAABBBAAA
AAAAAAAAAA
BBBBBBABBB
BBBBBBAABB
BBBAAAAABB
BBBBBBBBBB
"@,@"
AAAAAAAAAA
AAAA+++AAA
AAAA+B+AAA
AAAA+++AAA
AAAAAAAAAA
++++++A+++
BB++++AA+B
BB+AAAAA+B
BB+++++++B
"@)
) | % {
    $map,$expected = $_
    $result = &$f $map
    $result-eq$expected
    #$result # uncomment this line to display results
}

Ausgabe:

True
True
True
mazzy
quelle
0

Ruby , 102 Bytes

->a{a+=?.*s=a.size
(s*9).times{|i|a[j=i/9]>?A&&a[j-1+i%3+~a.index($/)*(i/3%3-1)]==?A&&a[j]=?+}
a[0,s]}

Probieren Sie es online!

Eingabe / Ausgabe als durch Zeilenumbrüche getrennte Zeichenfolge

Level River St
quelle
0

Python 2 , 123 119 Bytes

lambda m:[[[c,'+'][c=='B'and'A'in`[x[j-(j>0):j+2]for x in m[i-(i>0):i+2]]`]for j,c in e(l)]for i,l in e(m)];e=enumerate

Probieren Sie es online!

I / O ist eine Liste von Listen

TFeld
quelle
0

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:

WITH C as(SELECT x,x/z r,x%z c,substring(@,x+1,1)v
FROM spt_values CROSS APPLY(SELECT number x,charindex(char(10),@)z)z
WHERE'P'=type)SELECT @=stuff(@,x+1,1,'+')FROM c WHERE
exists(SELECT*FROM c d WHERE abs(r-c.r)<2and
abs(c-c.c)<2and'AB'=v+c.v)PRINT @

Ungolfed:

DECLARE @ varchar(max)=
'AAAAAAAAAA
ABAAAAAABA
ABBBAABABA
ABBBAABABA
ABBBBABABA
ABBBBABBBB
ABBBBABBBB
ABBBBBBBBB
BBBBBBBBBB';

WITH C as
(
  SELECT x,x/z r,x%z c,substring(@,x+1,1)v
  FROM spt_values
  CROSS APPLY(SELECT number x,charindex(char(10),@)z)z
  WHERE'P'=type
)
SELECT
  @=stuff(@,x+1,1,'+')
FROM c
WHERE exists(SELECT*FROM c d 
         WHERE abs(r-c.r)<2 
           and abs(c-c.c)<2 and'AB'=v+c.v)
PRINT @

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

--populate table variable
USE master
DECLARE @v varchar(max)=
'AAAAAAAAAA
ABAAAAAABA
ABBBAABABA
ABBBAABABA
ABBBBABABA
ABBBBABBBB
ABBBBABBBB
ABBBBBBBBB
BBBBBBBBBB'

DECLARE @ table(x int, r int, c int, v char)

INSERT @
SELECT x+1,x/z,x%z,substring(@v,x+1,1)
FROM spt_values
CROSS APPLY(SELECT number x,charindex(char(10),@v)z)z
WHERE'P'=type and len(@v)>number

-- query(127 characters)

SELECT string_agg(v,'')FROM(SELECT
iif(exists(SELECT*FROM @
WHERE abs(r-c.r)<2and abs(c-c.c)<2and'AB'=v+c.v),'+',v)v
FROM @ c)z

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

t-clausen.dk
quelle
Warum denkst du, dass du keinen Tisch als Argument nehmen kannst?
Adám
@ Adám keine schlechte Idee, den Code mit einer Tabelle als Argument zu erstellen - ich werde gleich darauf kommen
t-clausen.dk
@Adám Ich glaube, ich habe mich geirrt, um das Skript für 120 Zeichen arbeiten zu lassen, würde ich sowohl die Tabelle als auch den Varchar als Eingabe benötigen, ich habe es umgeschrieben. Es dauerte 151 Zeichen
t-clausen.dk