Gali parit perbatasan

59

Latar belakang: Terlalu banyak imigran gelap dari Blandia menyeberangi perbatasan ke Astan. Kaisar Astan telah menugaskan Anda dengan menggali parit untuk mengusir mereka, dan Blandia harus membayar biayanya. Karena semua juru ketik telah diketik hingga parit diatur, kode Anda harus sesingkat mungkin. *

Tugas: Diberikan peta 2D perbatasan antara Astan dan Blandia, membuat Blands membayar (dengan tanah) untuk parit perbatasan.

Sebagai contoh: Dengan sel-sel Astanian ditandai A, sel-sel Blandic ditandai Bdan sel-sel parit ditandai +(bingkai peta hanya untuk kejelasan):

┌──────────┐ ┌──────────┐
│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│
└──────────┘ └──────────┘

Detail: Peta akan memiliki setidaknya tiga baris dan tiga kolom. Baris atas sepenuhnya menjadi Astania dan baris bawah sepenuhnya Blandic.
 Anda dapat menggunakan tiga nilai untuk mewakili wilayah Astania, wilayah Blandic, dan parit perbatasan, selama input dan output konsisten.

Formulasi otomat: Sel Blandic dengan setidaknya satu sel Astanian di lingkungan Moore menjadi sel parit perbatasan.

Uji kasus

[
  "AAAAAAAAAA",
  "ABAAAAAABA",
  "ABBBAABABA",
  "ABBBAABABA",
  "ABBBBABABA",
  "ABBBBABBBB",
  "ABBBBABBBB",
  "ABBBBBBBBB",
  "BBBBBBBBBB"
]

menjadi:

[
  "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"
]

menjadi:

[
  "AAA",
  "AAA",
  "+++"
]

[
  "AAAAAAAAAA",
  "AAAABBBAAA",
  "AAAABBBAAA",
  "AAAABBBAAA",
  "AAAAAAAAAA",
  "BBBBBBABBB",
  "BBBBBBAABB",
  "BBBAAAAABB",
  "BBBBBBBBBB"
]

menjadi:

[
  "AAAAAAAAAA",
  "AAAA+++AAA",
  "AAAA+B+AAA",
  "AAAA+++AAA",
  "AAAAAAAAAA",
  "++++++A+++",
  "BB++++AA+B",
  "BB+AAAAA+B",
  "BB+++++++B"
]

* PERNYATAAN: TANGGAPAN APAPUN TERHADAP GEOPOLITIK AKTUAL ADALAH COINCIDENTAL PURELY!

Adm
sumber
23
Sindiran politik dalam bentuk kode golf, aku suka itu: o)
Sok
4
-1 untuk itu <sup><sub><sup><sub><sup><sub><sup><sub>:-P
Luis Mendo
25
python, 4 byte : passRencana untuk membangun parit perbatasan menyebabkan shutdown pemerintah dan tidak ada yang terjadi.
TheEspinosa
3
@ TheEspinosa Tidak, shutdown sampai parit diatur .
Adám
1
Saya memilih hanya karena latar belakang cerita. Bahkan tidak melanjutkan membaca.
pipa

Jawaban:

9

MATL , 11 8 byte

Terinspirasi oleh @ flawr ini Octave jawaban dan @ lirtosiast ini Mathematica jawaban .

EG9&3ZI-

Input adalah matriks dengan Astan diwakili oleh 0dan Blandia oleh 1. Parit diwakili dalam output oleh 2.

Cobalah online!

Bagaimana itu bekerja

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
sumber
8

JavaScript (ES7),  84  82 byte

Disimpan 2 byte berkat @Shaggy

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)))()

Cobalah online!

Berkomentar

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
sumber
82 byte?
Shaggy
4
@ Shaggy Tidak cukup pertanyaan akhir-akhir ini. Saya tidak tahu cara bermain golf lagi. : D Terima kasih!
Arnauld
Saya hanya memikirkan hal yang sama sebelumnya!
Shaggy
7

K (ngn / k) , 23 byte

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

Cobalah online!

gunakan 0 1 2untuk"AB+"

{ } berfungsi dengan argumen x

~ logis tidak

2{ }/ dua kali

  • 0,x,0 surround dengan 0-s (atas dan bawah matriks)

  • 3' tiga kali lipat dari baris berturut-turut

  • +/' jumlah masing-masing

  • + mengubah urutan

x&logis dan xdengan

x+tambahkan xke

ngn
sumber
5

APL (Dyalog Unicode) , 11 byte SBCS

⊢⌈{2∊⍵}⌺3 3

ini didasarkan pada solusi 12-byte @ dzaima dalam obrolan . kredit ke @ Adám sendiri karena berpikir untuk menggunakan di dfn, dan ke @ H.Wiz untuk mengingatkan kita untuk menggunakan pengkodean yang sama untuk input dan output

Cobalah online!

mewakili masing 'AB+'- 2 0 1masing

{ }⌺3 3 menerapkan fungsi pada setiap wilayah input 3 × 3 yang tumpang tindih, termasuk wilayah yang memanjang 1 unit di luar matriks, diisi dengan 0s

2∊⍵Apakah 2 hadir dalam argumen? kembalikan 0/1 boolean

⊢⌈ maks per-elemen itu dan matriks asli

ngn
sumber
Tentu saja, beralih ke Stensil akan menghemat lebih dari setengah byte Anda.
Adám
@ Adám yang akan menjadi jawaban dalam bahasa yang berbeda, jadi tidak sebanding atau bersaing dengan jawaban ini. dan saya tidak menemukan golf dalam bahasa tujuan khusus sangat menarik, maaf
ngn
@ Adm alias alias displayyang saya lupa hapus. dihapus sekarang
ngn
5

PowerShell , 220 byte

Ini tidak sekecil kiriman lainnya, tapi saya pikir saya akan menambahkannya untuk referensi. [DEPAN!]

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]}})} 

Cobalah online!

Keith S Garner
sumber
1
Selamat datang di PPCG. Jawaban pertama yang bagus, bahkan dengan tautan TIO! Jangan khawatir tentang panjang kode; setiap bahasa bersaing melawan dirinya sendiri. Btw, Anda dapat menyimpan satu byte dengan menghapus jeda baris pertama tanpa efek buruk.
Adám
Bisakah garis akhir menjadi 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]}})}207 byte?
Gabriel Mills
4

Oktaf , 37 31 26 byte

Fungsi ini melakukan erosi morfologis pada bagian Astan ( 1-b) dari "gambar" menggunakan , dan kemudian menggunakan beberapa aritmatika untuk membuat ketiga area simbol yang berbeda. Terima kasih @LuisMendo untuk -5 byte!conv2 imerode

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

Cobalah online!

cacat
sumber
2
-1 tanpa konvolusi :-P
Luis Mendo
@LuisMendo Versi sebelumnya memang menyertakan konvolusi :)
flawr
Terima kasih, diperbarui!
flawr
3

J , 28 byte

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

Cobalah online!

'AB+' -> 2 0 1

Terinspirasi oleh solusi APL ngn. 12 byte hanya untuk mengisi matriks dengan nol ...

Galen Ivanov
sumber
mengapa solusi APL bisa lolos tanpa melakukan zero padding?
Jonah
@Jonah: APL (Stensil) melakukannya secara otomatis: "Persegi panjang dipusatkan pada elemen Y yang berurutan dan (kecuali ukuran persegi panjangnya 1), diisi dengan elemen isian."
Galen Ivanov
yang tampaknya jauh lebih berguna daripada versi J ...
Jonah
@ Jonah Ya, benar!
Galen Ivanov
2

Arang , 20 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

≔⪫θ⸿θ

Bergabunglah dengan array input dengan carriage return daripada newlines biasa. Ini diperlukan agar karakter dapat dicetak secara individual.

Pθ

Cetak string input tanpa menggerakkan kursor.

Fθ

Ulangi setiap karakter dari string input.

⎇∧№KMA⁼Bι

Jika lingkungan Moore berisi A, dan karakter saat ini adalah B...

+

... lalu timpa Bdengan +...

ι

... jika tidak, cetak karakter saat ini (atau pindah ke baris berikutnya jika karakter saat ini adalah carriage return).

Neil
sumber
2

JavaScript, 85 byte

Lemparkan ini bersama tadi malam dan lupakan itu. Mungkin masih ada ruang untuk perbaikan di suatu tempat.

Input dan output adalah sebagai array dari digit array, digunakan 3untuk Astan, 0untuk Blandia & 1untuk parit.

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])

Cobalah secara online (Untuk kenyamanan, peta dari & kembali ke format I / O yang digunakan dalam tantangan)

Shaggy
sumber
2

Javascript, 126 118 byte

_=>_.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))

Lewati salah satu array string dari pertanyaan, dan Anda akan mendapatkan array array karakter string (terima kasih @Shaggy!) Dengan menggunakan 0 untuk parit. Dapat mungkin akan golfed lebih (tanpa beralih ke array numerik), tapi aku tidak bisa memikirkan apa pun saat ini.

M Dirr
sumber
Saya pikir ini berfungsi untuk 120 byte.
Shaggy
Atau 116 byte mengembalikan array array karakter.
Shaggy
1
@Shaggy Golf Anda tidak berfungsi, sayangnya - itu tidak menangkap tempat-tempat di mana A dan B diagonal satu sama lain. Di sisi lain, ini menunjukkan beberapa golf sangat sederhana yang saya lewatkan ...
M Dirr
1

Retina 0.8.2 , 92 80 byte

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

Cobalah online! Secara longgar didasarkan pada jawaban saya untuk Akankah saya keluar tepat waktu? Penjelasan: Apa pun Byang tepat di atas atau di bawah Adiubah menjadi as. Ini kemudian mengurangi masalah untuk memeriksa Bs ke kiri atau kanan As atau as. Itu asendiri juga perlu diubah menjadi +tentu saja, tetapi untungnya ibendera Thanya mempengaruhi pertandingan regex, bukan transliterasi yang sebenarnya, sehingga Atetap tidak terpengaruh.

Neil
sumber
1

05AB1E , 29 byte

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

Matriks tidak benar-benar setelan kuat 05AB1E (juga bukan setelan kuat saya) .. Tapi pasti bisa bermain golf lagi.
Terinspirasi oleh @ ngn's K (ngn / k) jawaban , jadi juga menggunakan I / O dari matriks integer 2D dengan masing 012- AB+masing.

Cobalah online . (Catatan kaki di TIO adalah mencetak hasil cetak dengan cantik. Jangan ragu untuk menghapusnya untuk melihat keluaran matriks.)

Penjelasan:

_                # 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
sumber
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;}))

Alih-alih chaining Take()s, Skip()s, dan Select()s, alih-alih ini menggunakan double untuk loop untuk menemukan tetangga. Penurunan byte BESAR, dari 392 byte menjadi 187. Linq tidak selalu yang terpendek!

Cobalah online!

Perwujudan Ketidaktahuan
sumber
1

Perl 5, 58 46 byte

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

TIO

-12 byte terima kasih kepada @Grimy

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

TIO

  • -psuka -ntapi cetak juga
  • -00 mode paragraf
  • untuk mendapatkan lebar-1 /.\n/cocok dengan karakter terakhir dari baris pertama
  • @{-} susunan khusus posisi awal pertandingan dari kelompok yang cocok sebelumnya, dipaksa sebagai string (elemen pertama)
  • s/../+/s&&redoganti pertandingan dengan +pertandingan saat
    • /spanji, sehingga .cocok dengan karakter baris baru
  • A(|.{@{-}}.?.?)\KB cocok
    • ABatau Adiikuti oleh (lebar-1) hingga (lebar + 1) karakter diikuti olehB
    • \Kuntuk menjaga kiri Btidak berubah
  • B(?=(?1)A),
    • (?1) dirverting recursive, untuk referensi ekspresi sebelumnya (|.{$m,$o})
    • (?=..) lookahead, untuk mencocokkan tanpa mengkonsumsi input
Nahuel Fouilleul
sumber
-9 byte dengan /. /,@m=@-while s/A(|.{@m}.?.?)\KB|B(?=(?1)A)/+/s(baris baru literal di regex pertama). TIO
Grimmy
1
Ke 46: /. /;s/A(|.{@{-}}.?.?)\KB|B(?=(?1)A)/+/s&&redo. TIO
Grimmy
terima kasih, saya juga punya ide, tetapi dibuang karena berpikir untuk mengulangi bencana namun untuk kinerja kode golf tidak penting
Nahuel Fouilleul
1

Java 8, 169 145 byte

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 byte terima kasih kepada @ OlivierGrégoire .

Menggunakan 0bukannya Adan 1bukannya B, dengan input berupa matriks integer 2D. Memodifikasi input-matriks alih-alih mengembalikan yang baru untuk menghemat byte.

Sel-sel diperiksa sama seperti dalam jawaban saya untuk tantangan All the single eights .

Cobalah online.

Penjelasan:

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
sumber
1
Saya belum banyak memeriksa, tetapi apakah ada yang salah dengan itu m[i+k/3-1][j+k%3-1]? 145 byte
Olivier Grégoire
@ OlivierGrégoire Dang, itu jauh lebih mudah .. Terima kasih!
Kevin Cruijssen
Saya pikir itu juga berlaku untuk jawaban Anda atas tantangan sebelumnya mengingat bahwa mereka tampaknya memiliki struktur yang sama
Olivier Grégoire
@ OlivierGrégoire Ya, saya akan bermain golf juga dengan saran Anda, tapi kemudian komentar lain (dan pertanyaan di tempat kerja) muncul di antaranya. Akan melakukannya sebentar lagi.
Kevin Cruijssen
1

PowerShell , 86 80 byte

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

Cobalah online!

Peta adalah string dengan baris baru. Script ini menggantikan Buntuk +dengan regexp(?<=A(.?.?.{$MapWidth-1})?)B|B(?=(.?.?.{$MapWidth-1})?A) .

Skrip Tes yang kurang golf:

$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
}

Keluaran:

True
True
True
mazzy
sumber
0

Ruby , 102 byte

->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]}

Cobalah online!

input / output sebagai string yang dipisahkan baris baru

Level River St
sumber
0

Python 2 , 123 119 byte

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

Cobalah online!

I / O adalah daftar daftar

TFeld
sumber
0

TSQL, 252 byte

Memisahkan string sangat mahal, jika string dipecah dan sudah dalam tabel jumlah byte akan menjadi 127 karakter. Script termasuk di bagian bawah dan sangat berbeda. Maaf telah mengambil ruang sebanyak ini.

Golf:

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 @

Tidak Disatukan:

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 @

Cobalah

TSQL, 127 byte (Menggunakan variabel tabel sebagai input)

Jalankan skrip ini di studio manajemen - gunakan "kueri" - "hasil ke teks" agar dapat dibaca

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

Cobalah - output peringatan dipilih dan tidak dapat dibaca. Dapat dibaca dengan cetak, tetapi itu tidak mungkin menggunakan metode ini

t-clausen.dk
sumber
Apa yang membuat Anda berpikir bahwa Anda tidak dapat menganggap tabel sebagai argumen?
Adám
@ Adám bukan ide buruk untuk membuat kode menggunakan tabel sebagai argumen juga - Saya akan langsung melakukannya
t-clausen.dk
@ Adm Saya kira saya salah, untuk membuat skrip berfungsi untuk 120 karakter, saya akan membutuhkan tabel dan varchar sebagai input, saya menulis ulang. Butuh 151 karakter
t-clausen.dk