Sorot Bounding Box, Bagian II: Grid Hexagonal

24

Anda diberi kisi heksagonal karakter .dan #, seperti ini:

 . . . . . . . .
. . . . # . . . 
 . # . . . # . .
. . . # . . . . 
 . . . . . # . .
. . . . . . . . 

Tugas Anda adalah untuk mengisi seluruh kotak pembatas yang selaras sumbu #dengan yang lebih lanjut #:

 . . . . . . . .
. . # # # # . . 
 . # # # # # . .
. . # # # # # . 
 . . # # # # . .
. . . . . . . . 

Kotak bounded aligned sumbu adalah bentuk heksagonal cembung terkecil yang berisi semua #. Perhatikan bahwa dalam kasus kisi heksagonal, ada tiga sumbu yang perlu dipertimbangkan (W / E, SW / NE, NW / SE):

masukkan deskripsi gambar di sini

Berikut adalah contoh lain untuk menunjukkan bahwa dalam beberapa kasus, satu atau lebih sisi hanya akan berisi satu #:

. . . . . . . .         . . . . . . . . 
 . # . . . . . .         . # # # # . . .
. . . . . # . .         . . # # # # . . 
 . . # . . . . .         . . # # # . . .
. . . . . . . .         . . . . . . . . 

Anda bisa melihat ini sebagai segi enam dengan sisi yang merosot, atau Anda dapat menggambar kotak pembatas di sekitar mereka, seperti yang telah saya lakukan di atas, dalam hal ini mereka masih berbentuk segi enam:

masukkan deskripsi gambar di sini

Terlalu keras? Coba Bagian I!

Aturan

Anda dapat menggunakan dua yang berbeda non-ruang dicetak karakter ASCII (0x21 untuk 0x7E, inklusif), di tempat #dan .. Saya akan terus merujuk mereka sebagai #dan .untuk sisa spesifikasi.

Input dan output dapat berupa string yang dipisahkan dengan linefeed tunggal atau daftar string (satu untuk setiap baris), tetapi formatnya harus konsisten.

Anda dapat mengasumsikan bahwa input berisi setidaknya satu #dan semua baris memiliki panjang yang sama. Perhatikan bahwa ada dua "jenis" garis yang berbeda (dimulai dengan spasi atau non spasi) - Anda mungkin tidak berasumsi bahwa input selalu dimulai dengan tipe yang sama. Anda dapat mengasumsikan bahwa kotak pembatas selalu cocok di dalam kotak yang Anda berikan.

Anda dapat menulis sebuah program atau fungsi dan menggunakan salah satu metode standar kami untuk menerima input dan memberikan output.

Anda dapat menggunakan bahasa pemrograman apa pun , tetapi perhatikan bahwa celah ini dilarang secara default.

Ini adalah , jadi jawaban tersingkat yang valid - diukur dalam byte - menang.

Uji Kasus

Setiap test case memiliki input dan output yang bersebelahan.

#    #

 . .      . . 
# . #    # # #
 . .      . . 

 . #      . # 
. . .    . # .
 # .      # . 

 # .      # . 
. . .    . # .
 . #      . # 

 # .      # . 
# . .    # # .
 . #      # # 

 . #      # # 
# . .    # # #
 . #      # # 

. . #    . # #
 . .      # # 
# . .    # # .

# . .    # # .
 . .      # # 
. . #    . # #

. . . . . . . .         . . . . . . . . 
 . . # . # . . .         . . # # # . . .
. . . . . . . .         . . . # # . . . 
 . . . # . . . .         . . . # . . . .

. . . . . . . .         . . . . . . . . 
 . . # . . . # .         . . # # # # # .
. . . . . . . .         . . . # # # # . 
 . . . # . . . .         . . . # # # . .

. . . . . . . .         . . . . . . . . 
 . # . . . . . .         . # # # # . . .
. . . . . # . .         . . # # # # . . 
 . . . . . . . .         . . . . . . . .

. . . . . . . .         . . . . . . . . 
 . # . . . . . .         . # # # # . . .
. . . . . # . .         . . # # # # . . 
 . . # . . . . .         . . # # # . . .

. . . . # . . .         . . # # # # . . 
 . # . . . # . .         . # # # # # . .
. . . # . . . .         . . # # # # # . 
 . . . . . # . .         . . # # # # . .
Martin Ender
sumber
1
Kepalaku berputar mencoba menemukan pola yang jelas. Anda mengatakan 'heksagonal' tetapi hanya ada dua input yang membentuk heksagon dalam kasus uji. Saya tersesat.
Anastasiya-Romanova 秀
1
@ Anastasiya-Romanova 秀 Jika Anda membayangkan bentuknya melalui pusat-pusat karakter luar, maka ya beberapa segi enam akan memiliki sisi yang merosot (seperti di kotak persegi panjang, di mana Anda bisa mendapatkan kotak di mana persegi panjang berkurang menjadi garis). Namun, jika Anda menggambar persegi panjang di sekitar karakter (seperti yang saya lakukan dalam diagram), semua contoh adalah segi enam (beberapa di antaranya memiliki sisi yang sangat pendek).
Martin Ender
1
@ Anastasiya-Romanova 秀 Apakah diagram baru membantu?
Martin Ender
3
SAYA! Sepertinya saya II jika kacamata saya salah ..
Neil
1
@Neil Atau, Anda tahu, terlalu banyak alkohol;)
ThreeFx

Jawaban:

7

Pyth , 82 71 byte

L, hbebMqH @ S + GH1KhMyJs.e, Lkfq \ # @ bTUb.zA, ySm-FdJySsMJj.es.eXW && gKkgG-kYgH + kYZ \. \ # Bz
MqH @ S [hGHeG) 1j.es.eXW && ghMJs.e, Lkfq \ # @ bTUb.zkgSm-FdJ-kYgSsMJ + kYZ \. \ # Bz

Cobalah online!

Penjelasan

  • Misalkan A adalah titik dengan koordinat y terendah dan B titik dengan koordinat y tertinggi.

  • Misalkan C adalah titik dengan nilai terendah (nilai x minus nilai y) dan titik D dengan nilai tertinggi.

  • Biarkan E menjadi titik dengan nilai terendah (nilai x plus nilai y) dan F titik dengan nilai tertinggi.

Maka itu sama dengan menemukan koordinat yang koordinat y adalah antara A dan B, nilai x minus nilai y adalah antara C dan D, dan nilai x plus nilai y adalah antara E dan F.

Biarawati Bocor
sumber
pertama kali ketika saya bisa memposting solusi sebelumnya, jika hanya aplikasi android SE yang dapat menangani karakter tab dengan benar (untuk beberapa alasan mereka menghilang ketika disisipkan): /
Sarge Borsch
@SargeBorsch Saya minta maaf :(
Leaky Nun
haha kenapa, itu aplikasi Android SE yang membuat saya gagal: D
Sarge Borsch
6

Haskell, 256 254 243 byte

import Data.List
f=z(\l->(,).(,))[0..]l)[0..]
q l=m(m(\e->min(snd e).(".#"!!).fromEnum.and.z($)(m(\x y->y>=minimum x&&y<=maximum x).transpose.m b.filter((==)'#'.snd).concat$l)$b e))l
b=(m uncurry[const,(-),(+)]<*>).pure.fst
z=zipWith
m=map
q.f

Terima kasih @ Damian untuk bermain golf f!

Input diambil sebagai daftar daftar karakter, output disediakan dengan cara yang sama.

Soo ini binatang buas yang harus ditulis. Ini didasarkan pada ide LeakyNun menggunakan penyaringan berdasarkan maksimum dan minimum pada koordinat item.

Saya benar-benar terkejut oleh fakta bahwa m=mapsebenarnya menghemat byte karena tampaknya sangat mahal.


Penjelasan:

Berikut ini versi yang sedikit kurang disembelih (penekanan sedikit ):

import Data.List
f=zipWith(\y l->zipWith(\x e->((y,x),e))[0..]l)[0..]
p=map(\x y->y>=minimum x&&y<=maximum x).transpose.map b.filter((==)'#'.snd).concat
q l=map(map(\e->min(snd e).(".#"!!).fromEnum.and.zipWith($)(p$l)$b e))l
b=(map uncurry[const,(-),(+)]<*>).pure.fst
  • fadalah fungsi yang memberikan masing-masing karakter indeks (y-index, x-index)sambil mempertahankan struktur asli daftar.

  • b: Diberikan item dari daftar yang diindeks, bmenghitung [y-index, y - x, y + x].

  • p: Diberikan bidang yang diindeks, mengembalikan 3 fungsi Int -> Bool, yang pertama adalah pemeriksaan indeks-y, yang kedua dari perbedaan dan yang ketiga dari jumlah. min(snd e)merawat ruang (ruang lebih kecil dari keduanya). Fungsi ini diuraikan dalam kode golf.

  • qmengingat diindeks lapangan, mengubah semua yang diperlukan .untuk #dengan memeriksa jika itu bidang tertentu kembali Trueke setiap fungsi tes.

Solusi terakhir adalah komposisi qdan f.

ThreeFx
sumber
1
f=z(\y->z((,).(,)y)[0..])[0..]
Damien
atauh x=z x[0..] f=h$h.curry(,)
Damien
5

Python 3, 380 378 348 346 byte

Perhatikan bahwa lekukan adalah dengan tab, bukan spasi.

Versi golf:

def s(i):
    L=i.splitlines();E=enumerate;A=lambda x,y:(y,x+y,x-y);N=(2**64,)*3;X=(-2**64,)*3
    for y,l in E(L):
        for x,c in E(l):
            if c=='#':p=A(x,y);X=tuple(map(max,X,p));N=tuple(map(min,N,p))
    R=''
    for y,l in E(L):
        for x,c in E(l):
            if c!='.':R+=c
            else:p=A(x,y);f=all(N[j]<=p[j]<=X[j]for j in range(0,3));R+='.#'[f]
        R+='\n'
    return R

Uji di Ideone

Penjelasan (untuk versi yang tidak dipisahkan di bawah):

Semua pemrosesan dilakukan tanpa konversi apa pun, karakter spasi hanya dilewati.
Fungsi axes_posmenghitung 3-tupel dari koordinat "3D" imajiner, mereka diakumulasikan ke dalam (elemen bijaksana) minimum dan maksimum 3-tupel ( bmin, bmax) untuk semua #karakter.

Koordinat dihitung dalam def axes_pos(x, y): return y, x + y, lc - y + x;
di mana X dihitung dari 0 ke kanan, dan Y dihitung dari 0 ke bawah (dari baris pertama ke terakhir).
Koordinat imajiner pertama pada dasarnya Y, karena jelas mengapa. Kapaknya ortogonal ke batas hijau (dalam gambar OP)
Kedua adalah ortogonal ke batas merah, dan ketiga adalah ortogonal ke batas biru.

Pada lintasan kedua, penggantian dilakukan untuk semua .karakter yang koordinat "3D" -nya termasuk dalam bmin.. bmaxrange, elemen wise - ini dicentang dalam ungkapan ini all(bmin[j] <= p[j] <= bmax[j] for j in range(0, 3)).

Versi tidak dikoleksi dengan tes, juga di Ideone :

def solve(i):
    ls = i.splitlines()
    lc = len(ls)

    def axes_pos(x, y):
        return y, x + y, lc - y + x

    I = 2 ** 64
    bmin = (I, I, I)
    bmax = (0, 0, 0)

    for y, line in enumerate(ls):
        for x, char in enumerate(line):
            if char != '#': continue
            p = axes_pos(x, y)
            bmax = tuple(map(max, bmax, p))
            bmin = tuple(map(min, bmin, p))

    result = ''
    for y, line in enumerate(ls):
        for x, char in enumerate(line):
            if char != '.':
                result += char
            else:
                p = axes_pos(x, y)
                f = all(bmin[j] <= p[j] <= bmax[j] for j in range(0, 3))
                result += '#' if f else char
        result += '\n'

    return result


def run_test(a, b):
    result = solve(a)
    if result != b:
        raise AssertionError('\n' + result + '\n\nshould be equal to\n\n' + b)


def run_tests():
    run_test(
        "#\n",

        "#\n")

    run_test(
        " . . \n"
        "# . #\n"
        " . . \n",

        " . . \n"
        "# # #\n"
        " . . \n")

    run_test(
        " . # \n"
        ". . .\n"
        " # . \n",

        " . # \n"
        ". # .\n"
        " # . \n")

    run_test(
        " # . \n"
        ". . .\n"
        " . # \n",

        " # . \n"
        ". # .\n"
        " . # \n")

    run_test(
        " # . \n"
        "# . .\n"
        " . # \n",

        " # . \n"
        "# # .\n"
        " # # \n")

    run_test(
        " . # \n"
        "# . .\n"
        " . # \n",

        " # # \n"
        "# # #\n"
        " # # \n")

    run_test(
        ". . . . . . . . \n"
        " . . # . # . . .\n"
        ". . . . . . . . \n"
        " . . . # . . . .\n",

        ". . . . . . . . \n"
        " . . # # # . . .\n"
        ". . . # # . . . \n"
        " . . . # . . . .\n")

    run_test(
        ". . . . . . . . \n"
        " . . # . . . # .\n"
        ". . . . . . . . \n"
        " . . . # . . . .\n",

        ". . . . . . . . \n"
        " . . # # # # # .\n"
        ". . . # # # # . \n"
        " . . . # # # . .\n")

    run_test(
        ". . . . . . . . \n"
        " . # . . . . . .\n"
        ". . . . . # . . \n"
        " . . . . . . . .\n",

        ". . . . . . . . \n"
        " . # # # # . . .\n"
        ". . # # # # . . \n"
        " . . . . . . . .\n")

    run_test(
        ". . . . . . . . \n"
        " . # . . . . . .\n"
        ". . . . . # . . \n"
        " . . # . . . . .\n",

        ". . . . . . . . \n"
        " . # # # # . . .\n"
        ". . # # # # . . \n"
        " . . # # # . . .\n")

    run_test(
        ". . . . # . . . \n"
        " . # . . . # . .\n"
        ". . . # . . . . \n"
        " . . . . . # . .\n",

        ". . # # # # . . \n"
        " . # # # # # . .\n"
        ". . # # # # # . \n"
        " . . # # # # . .\n")


if __name__ == '__main__':
    run_tests()
Pembaruan 1:

Dihapus tidak perlu -1untuk koordinat imajiner ketiga, karena tidak mengubah apa pun

Perbarui 2,3:

Perbaikan yang diterapkan sebagian disarankan oleh Leaky Nun+ milik saya juga.

Sersan Borsch
sumber
Apakah kita pada dasarnya menggunakan algoritma yang sama? Bisakah Anda menambahkan penjelasan?
Leaky Nun
1
def A(x,y):return y,x+y,len(L)-1-y+x->A=lambda x,y:(y,x+y,len(L)-1-y+x)
Leaky Nun
Juga, daftar pemahaman dapat membantu Anda bermain golf beberapa byte.
Leaky Nun
1
Saya pikir Anda bisa berubah len(L)-y+xmenjadix-y
Leaky Nun
1
Anda dapat menerima daftar baris
Leaky Nun
5

Jelly , 45 35 13 42 41 byte

Ṁ€»\
ṚÇṚ«Çṁ"
ŒDṙZL$ÇṙL’$ŒḌ«Ç
ṚÇṚ«Ç
n⁶aÇo⁶

Ini adalah daftar tautan; yang terakhir harus dipanggil pada input untuk menghasilkan output.

I / O berbentuk array string, di mana .menunjukkan kosong dan @menunjukkan diisi.

Cobalah online! atau verifikasi semua kasus uji .

Latar Belakang

Mari kita perhatikan contoh berikut ini.

. . . . . . . . 
 . @ . . . . . .
. . . . . @ . . 
 . . @ . . . . .

Dengan menggambar sepasang atau garis paralel - pasangan terdekat yang membungkus semua posisi yang diisi - di masing-masing dari tiga arah, kita dapat menentukan kotak pembatas heksagonal.

Dalam implementasinya, kami mengganti semua karakter antara dua garis dengan @, dan semua yang berada di luar garis ini ., dengan kemungkinan pengecualian diagonal yang hanya berisi spasi).

Untuk sumbu horizontal, ini memberi

................
@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@

untuk sumbu diagonal jatuh, itu memberi

..@@@@@@@......
...@@@@@@@......
....@@@@@@@.....
 ....@@@@@@@....

dan untuk sumbu diagonal naik, itu memberi

....@@@@@@@@@...
...@@@@@@@@@....
..@@@@@@@@@....
.@@@@@@@@@.... .

Dengan mengambil karakter minimum dari ketiganya, sejak .< @, kita dapat

...............
...@@@@@@@......
....@@@@@@@....
 ....@@@@@.... .

Yang tersisa untuk dilakukan adalah mengembalikan ruang.

Bagaimana itu bekerja

n⁶aÇo⁶           Main link. Argument: A (array of strings)

n⁶               Not-equal space; yield 0 for spaces, 1 otherwise.
  aÇ             Take the logical AND with the result the 4th helper link.
                 This will replace 1's (corresponding to non-space characters) with
                 the corresponding character that result from calling the link.
    o⁶           Logical OR with space; replaces the 0's with spaces.
ṚÇṚ«Ç            4th helper link. Argument: A

Ṛ                Reverse the order of the strings in A.
 Ç               Call the 3rd helper link.
  Ṛ              Reverse the order of the strings in the resulting array.
    Ç            Call the 3rd helper link with argument A (unmodified).
   «             Take the character-wise minimum of both results.
ŒDṙZL$ÇṙL’$ŒḌ«Ç  3rd helper link. Argument: L (array of strings)

ŒD               Yield all falling diagonals of L. This is a reversible operation,
                 so it begins with the main diagonal.
   ZL$           Yield the length of the transpose (number of columns).
  ṙ              Shift the array of diagonals that many units to the left.
                 This puts the diagonals in their natural order.
      Ç          Call the helper link on the result.
        L’$      Yield the decremented length (number of columns) of L.
       ṙ         Shift the result that many units to the left.
                 This puts the changed diagonals in their original order.
           ŒḌ    Undiagonal; reconstruct the string array.
              Ç  Call the 2nd helper link with argument L (unmodified).
             «   Take the character-wise minimum of both results.
ṚÇṚ«Çṁ"          2nd helper link. Argument: M (array)

Ṛ                Reverse the rows of M.
 Ç               Call the 1st helper link on the result.
  Ṛ              Reverse the rows of the result.
    Ç            Call the 1nd helper link with argument M (unmodified).
   «             Take the minimum of both results.
     ṁ"          Mold zipwith; repeat each character in the result to the left
                 as many times as needed to fill the corresponding row of M.
Ṁ€»\             1st helper link. Argument: N (array)

Ṁ€               Take the maximum of each row of N.
  »\             Take the cumulative maxima of the resulting characters.
Dennis
sumber
2

Python, 237 230 byte

7 byte berkat Dennis.

def f(a):i=range(len(a[0]));j=range(len(a));b,c,d=map(sorted,zip(*[[x,x+y,x-y]for y in i for x in j if"?"<a[x][y]]));return[[[a[x][y],"#"][(a[x][y]>" ")*(b[0]<=x<=b[-1])*(c[0]<=x+y<=c[-1])*(d[0]<=x-y<=d[-1])]for y in i]for x in j]

Port jawaban saya di Pyth .

Mengambil array garis sebagai input, menghasilkan array karakter 2D.

Biarawati Bocor
sumber
2

Perl, 128 126 byte

Termasuk +6 untuk -0F\n

Jalankan dengan input pada STDIN. Gunakan 1untuk diisi, 0untuk kosong. Garis tidak harus diisi dengan spasi di akhir:

perl -M5.010 hexafill.pl
 0 0 0 0 0 0 0 0
0 0 1 1 1 1 0 0 
 0 1 1 1 1 1 0 0
0 0 1 1 1 1 1 0 
 0 0 1 1 1 1 0 0
0 0 0 0 0 0 0 0 
^D

hexafill.pl

#!/usr/bin/perl -0F\n
$-=map{s%$=%$=^!map{/$/;grep{pos=$`;$=?$_|="!"x$`.1:!/\b.*\G./}${--$@}}@F-$-+pos,$-+pos,$-%eeg;--$-;$=||say}@F while$=--

Menggunakan koordinat kubus. Tentukan maksimum dan minimum selama $= == 1loop dan isi koordinat antara batas-batas ini selama $= == 0loop. 58 loop pertama tidak ada gunanya dan hanya ada untuk mengisi $-dengan jumlah garis

Ton Hospel
sumber
1

TSQL, 768 byte

Saya menulis pertanyaan untuk menyelesaikan ini - yang menurut saya cukup sulit. Itu tidak mampu bersaing dengan semua jawaban pendek yang sangat bagus. Tetapi tetap ingin mempostingnya bagi mereka yang tertarik. Maaf tentang panjangnya jawaban - berharap codegolf juga tentang pendekatan yang berbeda.

Golf:

DECLARE @ varchar(max)=
'
. . . . # . . . 
 . # . . . # . .
. . . # . . . . 
 . . . . . # . .
. . . . . . . . 
'

;WITH c as(SELECT cast(0as varchar(max))a,x=0,y=1,z=0UNION ALL SELECT SUBSTRING(@,z,1),IIF(SUBSTRING(@,z,1)=CHAR(10),1,x+1),IIF(SUBSTRING(@,z,1)=CHAR(10),y+1,y),z+1FROM c WHERE LEN(@)>z)SELECT @=stuff(@,z-1,1,'#')FROM c b WHERE((exists(SELECT*FROM c WHERE b.y=y and'#'=a)or exists(SELECT*FROM c WHERE b.y<y and'#'=a)and exists(SELECT*FROM c WHERE b.y>y and'#'=a))and a='.')and(exists(SELECT*FROM c WHERE b.x<=x-ABS(y-b.y)and'#'=a)or exists(SELECT*FROM c WHERE b.x<=x+y-b.y and a='#'and b.y<y)and exists(SELECT*FROM c WHERE b.x<=x+b.y-y and a='#'and b.y>y))and(exists(SELECT*FROM c WHERE b.x>=x+ABS(y-b.y)and'#'=a)or exists(SELECT*FROM c WHERE b.x>=x-y+b.y and b.y<y and'#'=a)and exists(SELECT*FROM c WHERE b.x>=x-b.y+y and a='#'and b.y>y))OPTION(MAXRECURSION 0)PRINT @

Tidak Disatukan:

DECLARE @ varchar(max)=
'
. . . . # . . . 
 . # . . . # . .
. . . # . . . . 
 . . . . . # . .
. . . . . . . . 
'
;WITH c as
(
  SELECT 
    cast(0as varchar(max))a,x=0,y=1,z=0
  UNION ALL
  SELECT
    SUBSTRING(@,z,1),IIF(SUBSTRING(@,z,1)=CHAR(10),1,x+1),
    IIF(SUBSTRING(@,z,1)=CHAR(10),y+1,y),
    z+1
  FROM c
  WHERE LEN(@)>z
)
SELECT @=stuff(@,z-1,1,'#')FROM c b
WHERE((exists(SELECT*FROM c WHERE b.y=y and'#'=a)
or exists(SELECT*FROM c WHERE b.y<y and'#'=a)
and exists(SELECT*FROM c WHERE b.y>y and'#'=a)
)and a='.')
and 
(exists(SELECT*FROM c WHERE b.x<=x-ABS(y-b.y)and'#'=a)
or exists(SELECT*FROM c WHERE b.x<=x+y-b.y and a='#'and b.y<y)
and exists(SELECT*FROM c WHERE b.x<=x+b.y-y and a='#'and b.y>y))
and(exists(SELECT*FROM c WHERE b.x>=x+ABS(y-b.y)and'#'=a)
or exists(SELECT*FROM c WHERE b.x>=x-y+b.y and b.y<y and'#'=a)
and exists(SELECT*FROM c WHERE b.x>=x-b.y+y and a='#'and b.y>y))
OPTION(MAXRECURSION 0) 
PRINT @

Fiddle tidak berbulu

t-clausen.dk
sumber
1

GNU Octave, 212 , 196 byte

Mungkin bukan bahasa pilihan favorit pegolf, tapi itu yang membuat tantangan, bukan? Dengan asumsi m diambil sebagai matriks char: 178 byte berdiri sendiri dan 196 jika dimasukkan ke dalam suatu fungsi .

golf:

function k=f(m)[a,b]=size(m);[y,x]=ndgrid(1:a,1:b);t={y,y+x,x-y};k=m;s=x>0;for j=1:3l{j}=unique(sort(vec(t{j}.*(m==['#']))))([2,end]);s&=(l{j}(1)<=t{j})&(l{j}(2)>=t{j});endk(s&mod(x+y,2))=['#']end

ungolfed:

function k=f(m)
[a,b]=size(m);[y,x]=ndgrid(1:a,1:b);t={y,y+x,x-y};k=m;s=x>0;
for j=1:3
  l{j}=unique(sort(vec(t{j}.*(m==['#']))))([2,end]);
  s&=(l{j}(1)<=t{j})&(l{j}(2)>=t{j});
end
k(s&mod(x+y,2))=['#']
end

Penjelasan : kami membangun sistem koordinat, 3 sumbu - ortogonal ke sisi segi enam, menemukan maks dan minimum masing-masing koordinat, kemudian membangun topeng logis dimulai dengan 1 di mana-mana dan secara logis dan: masing-masing kendala koordinat maks dan minimum, akhirnya mengatur ulang setiap posisi "true" yang tersisa ke char "#".

Jika Anda ingin mengujinya, Anda bisa membuat matriks m seperti ini:

m = [' . . . . . . . .. . . . # . . .  . # . . . # . .. . . # . . . .  . . . . . # . .. . . . . . . . ']; m = reshape(m,[numel(m)/6,6])';

lalu panggil f (m) dan bandingkan dengan m dengan membangun matriks dengan keduanya di:

['     before           after      ';m,ones(6,1)*'|',f(m)]
pembaca matematika
sumber
1
(Belated) Selamat datang di PPCG! Jawaban oktaf lebih dari diterima. :) Dua hal: 1) harap sertakan kode yang sudah Anda hitung (tanpa spasi yang tidak perlu), sehingga orang dapat memeriksa skor dengan lebih mudah. Anda dapat memasukkan versi yang dapat dibaca secara terpisah. 2) Tampaknya kiriman Anda adalah cuplikan yang mengasumsikan input untuk disimpan mdan output untuk disimpan k. Jawaban harus selalu berupa program lengkap atau fungsi yang dapat dipanggil.
Martin Ender
Terima kasih! Ya Anda benar, saya telah menyematkan k dan m dalam suatu fungsi f sekarang dan menambahkan potongan membangun tes m pertama untuk validasi.
mathreadler