Sorot Bounding Box, Bagian I: Cartesian Grid

19

Anda diberi kisi-kisi persegi panjang karakter .dan #, seperti ini:

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

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

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

Kotak bounded aligned axis adalah kotak terkecil yang berisi semua #.

Ingin lebih? Coba Bagian II!

Aturan

Anda dapat menggunakan dua karakter ASCII yang dapat dicetak yang berbeda (0x20 hingga 0x7E, inklusif), sebagai ganti dari #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.

Anda dapat menulis 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 , sehingga jawaban terpendek yang valid - diukur dalam byte - menang.

Uji Kasus

Setiap test case memiliki input dan output yang bersebelahan.

#    #

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

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

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

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

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

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

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

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

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

.........#    ..########
..#.......    ..########
....#..#..    ..########
...#......    ..########
Martin Ender
sumber
Apa yang Anda maksud dengan "formatnya harus konsisten"? Apakah format input harus konsisten dengan format output atau apakah itu berarti format input harus konsisten dan format output juga harus konsisten?
Emigna
@Emigna format input dan output harus sama.
Martin Ender
@ MartinEnder Program saya memasukkan array char 2D dan memprosesnya. Hasilnya masih berupa array char 2D, tetapi yang ditampilkan secara default sebagai konten array, yaitu string yang dipisahkan oleh baris baru. Apakah itu dapat diterima? Atau haruskah output yang ditampilkan menjadi representasi string dari array 2D itu?
Luis Mendo
@LuisMendo Saya harapkan representasi string dari tipe. Apakah string yang dipisahkan oleh linefeed adalah representasi string alami dari array bersarang dalam bahasa Anda, saya tidak bisa mengatakannya. (Meskipun, karena itu sepertinya bukan representasi "reversibel", karena format input Anda berbeda, mungkin tidak.)
Martin Ender
apakah output grafis diperbolehkan?
12Me21

Jawaban:

17

VBA Excel, 150 byte 146 byte

Petunjuk:

Buat buku kerja dengan dua lembar kerja kosong: Sheet1 dan Sheet2. Atur input di Sheet1 dan kemudian masukkan kode berikut dalam modul kode Sheet1

Sub A:For Each C In UsedRange:If C.Value="#"Then Sheet2.Range(C.Address)="#"
Next:For Each C In Sheet2.UsedRange:Range(C.Address)="#":Next:End Sub

Ungolfed the code:

Sub A()

For Each C In UsedRange
    If C.Value = "#" Then Sheet2.Range(C.Address) = "#"
Next

For Each C In Sheet2.UsedRange
    Range(C.Address) = "#"
Next

End Sub

Penjelasan:

  1. Loop melalui setiap sel dalam rentang yang digunakan Sheet1
  2. Setel pernyataan bersyarat untuk menyalin setiap sel berisi tagar karakter (#) dalam rentang Sheet1 yang digunakan dan tempel ke sel di Sheet2 dengan alamat yang sama dengan Sheet1.
  3. Loop sekali lagi setiap sel dalam rentang yang digunakan Sheet2 untuk menyalin setiap alamat sel di dalamnya dan kemudian menggunakannya untuk menetapkan tagar karakter (#) ke sel di Sheet1 dengan alamat yang sama dengan rentang yang digunakan Sheet2.

Contoh I / O:

MEMASUKKAN

KELUARAN

Peringatan: Pastikan setiap sel di Sheet2 selalu kosong setiap kali Anda menjalankan program.

Anastasiya-Romanova 秀
sumber
1
Mungkinkah =C.Valuedi baris pertama ="#"?
Riley
@Riley Ya, itu bisa. Terima kasih.
Anastasiya-Romanova 秀
Sepertinya saya dapat menyimpan beberapa byte lagi dengan menghapus bagian Sub dan End, kemudian menjalankan program di Jendela Segera. Saya akan mencobanya besok apakah berfungsi atau tidak. Tidak dapat mengakses Excel sekarang ...
Anastasiya-Romanova 秀
Tetapi apakah itu masih dianggap sebagai program atau fungsi jika Anda melakukannya?
Neil
@Neil Entahlah tentang definisi formal tetapi bagi saya, sebuah program adalah serangkaian instruksi dan masih berfungsi seperti program normal jika kita meletakkan kode di Jendela Segera meskipun ada batasan. Salah satunya adalah kode ini tidak dapat dieksekusi di sana. Ha-ha: D
Anastasiya-Romanova 秀
8

05AB1E , 70 68 69 61 58 60 40 byte

€S`¹gG~}Dg©L*0KŸ<U¹v¼y1åi®FXNå}ë0®×}J}¾ä

Penjelasan

€S`                                       # split each string in input to a charlist and place separately on stack
   ¹gG~}                                  # OR the char arrays to produce a single list with 1's in the columns that have 1's and 0 in the rest
        Dg L*                             # multiply by indices (1-indexed)
          ©                               # store row length in register
             0K                           # remove 0's (the indices which should not have 1's
               Ÿ<U                        # store a list of the indices that should have 1's in X
                  ¹v                 }    # for each string in input
                    ¼                     # increase counter
                     y1åi      ë   }      # if the row contains at least one 1
                         ®FXNå}           # push 1 for indices which should have 1 and else 0
                                0®×       # else push a row of 0's
                                    J     # join into a string
                                      ¾ä  # split the string in rows

Cobalah online

Emigna
sumber
7

Mathematica, 91 70 byte

21 byte disimpan karena @MartinEnder .

ReplacePart["."+0#,Tuples[Range@@@MinMax/@(#~Position~"#")]]->"#"]&

Fungsi anonim. Mengambil matriks karakter sebagai input dan mengembalikan matriks karakter sebagai output. Karakter Unicode adalah U + F3C7 untuk \[Transpose].

LegionMammal978
sumber
5

C #, 262 251 byte

s=>{int l,t,r,b,i,j,k;l=t=r=b=i=-1;for(;++i<s.Length;){j=s[i].IndexOf('#');if(j>-1){k=s[i].LastIndexOf('#');l=l==-1|j<l?j:l;t=t==-1?i:t;r=k>r?k:r;b=i;}}for(i=t;i<=b;++i)for(j=l;j<=r;){var c=s[i].ToCharArray();c[j++]='#';s[i]=new string(c);}return s;};

Akan bermain golf lebih jauh ketika saya punya lebih banyak waktu.

Mengkompilasi menjadi a Func<string[], string[]>.

Versi yang diformat:

s =>
{
    int l, t, r, b, i, j, k;
    l = t = r = b = i = -1;

    for (; ++i < s.Length;)
    {
        j = s[i].IndexOf('#');
        if (j > -1)
        {
            k = s[i].LastIndexOf('#');

            l = l == -1 | j < l ? j : l;

            t = t == -1 ? i : t;

            r = k > r ? k : r;

            b = i;
        }
    } 

    for (i = t; i <= b; ++i)
        for (j = l; j <= r;)
        {
            var c = s[i].ToCharArray();
            c[j++] = '#';
            s[i] = new string(c);
        }

    return s;
};
TheLethalCoder
sumber
5

Jelly , 21 19 18 17 byte

|/Tr/FṬ|
ỴµZÇZ&ÇY

Ini adalah program lengkap. Input dan output adalah string 0 's dan 1 's, dibatasi oleh linefeeds.

Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

ỴµZÇZ&ÇY  Main link. Argument: s (string)

Ỵ         Split s at linefeeds into the array A.
 µ        Begin a new, monadic chain. Argument: A
  Z       Zip/transpose A.
   Ç      Apply the helper link to the transpose.
    Z     Zip/transpose to restore the original order.
      Ç   Apply the helper link to A.
     &    Take the bitwise AND of both results.
       Y  Join, separating by linefeeds.

|/Tr/FṬ|  Helper link. Argument: A (array of strings)

|/        Reduce A columnwise by bitwise OR. This casts to integer.
  T       Truth; yield the indices of 1's.
   r/     Reduce by range. This yields an exponentially growing, nested, ragged
          array that contains all integers between the lowest and highest index
          in the previous result, at least once but possibly multiple times.
     F    Flatten the result.
      Ṭ   Untruth; yield an array with 1's at the specified indices.
          Multiple occurrences of the same index are ignored.
       |  Take the bitwise OR of the result and each row of A.
Dennis
sumber
4

Retina , 87 byte

Hitungan byte mengasumsikan penyandian ISO 8859-1.

Tm`A` `^\GA+¶|(¶A+)+\Z|^(A+?)(?<=(?=\D*^\2Z)\A\D*)|(A+)$(?=\D*\Z(?<!(?<!\3)$\D*))
T`p`L

Penggunaan Auntuk .dan Zuntuk #.

Cobalah online!

Martin Ender
sumber
3

Scala, 317 karakter

val a=input.split("\n");val e=a.map{s=>(s.indexOf("#"),s.lastIndexOf("#"))}.zipWithIndex.filter(_._1._1!= -1);val b=(e.map{s=>s._1._1}.min,e.map{s=>s._1._2}.max,e.head._2,e.last._2);print((0 to a.length-1).map{y=>(0 to a(y).length-1).map{x=>if(x>=b._1&&x<=b._2&&y>=b._3&&y<=b._4)"#" else "."}.mkString+"\n"}.mkString)

Versi yang lebih mudah dibaca, mungkin bisa membuatnya lebih golf:

val a=input.split("\n")
val e=a.map{s=>
    (s.indexOf("#"),s.lastIndexOf("#"))
}.zipWithIndex        // Need the indexes for the Y values
.filter(_._1._1!= -1) // Ugly because of tupleception: (actual tuple, index)

val b=(
    e.map{s=>s._1._1}.min,
    e.map{s=>s._1._2}.max,
    e.head._2,
    e.last._2)

print(
    (0 to a.length-1).map{y=>
        (0 to a(y).length-1).map{x=>
            if(x>=b._1&&x<=b._2&&y>=b._3&&y<=b._4)"#" 
            else "."
        }.mkString+"\n"
    }.mkString
)
AmazingDreams
sumber
3

JavaScript (ES6), 168 byte

s=>/^#/gm.test(s)?/#$/gm.test(s)?s.replace(/^.*#[^]*#.*$/m,s=>s.replace(/./g,'#'))?f(s.replace(/.$/gm,'')).replace(/$/gm,'.'):f(s.replace(/^./gm,'')).replace(/^/gm,'.')

Mengambil input sebagai string multiline. Bekerja dengan menelanjangi secara terdepan dan membuntuti .dari semua baris hingga setidaknya satu baris dimulai dan satu berakhir dengan a #, lalu memilih sebanyak mungkin garis tetapi memulai dan menyelesaikan garis yang berisi #dan mengubah semua .s #. Mungkin siap golf.

Neil
sumber
3

R, 158 155 byte

Program ini menerima poin input .dan tagar #, baris demi baris.

v=c();f=which((d=matrix(strsplit(paste0(a<-scan(,""),collapse=""),"")[[1]],nr=sum(a<0),b=T))=="#",a=T);d[min(f[,1]):max(f[,1]),min(f[,2]):max(f[,2])]="#";d

Tidak Disatukan:

a<-scan(,"")             #Input

v=c()                   #Empty vector
f=which((d=(matrix(strsplit(paste0(a,collapse=""),"")[[1]],nr=length(a),b=T)))=="#",a=T) #Main work is here !


d[min(f[,1]):max(f[,1]),min(f[,2]):max(f[,2])]="#"                        #Creates 
                                                                          #the new figure

d                       #Displays it

Berikut detail dari baris ketiga:

paste0(a,collapse="") 
#Collapses the input into a single string

strsplit(paste0(a,collapse=""),"")[[1]] 
#Split this string character-wise

matrix(strsplit(paste0(a,collapse=""),"")[[1]],nr=sum(a<0),b=T) 
#Creates and fills (by row) a matrix with number of row the number of line of the input

which((d=(matrix(strsplit(paste0(a,collapse=""),"")[[1]],nr=l,b=T)))=="#",a=T)
#Gives the index of the matrix's elements that are "#"
Frédéric
sumber
3

PowerShell v3 +, 215 162 148 144 139 byte

param($n)$n|%{(((-join(0..($n[0].length-1)|%{$i=$_;+('1'-in(0..($n.length-1)|%{$n[$_][$i]}))}))-replace'(?<=1.*?).(?=.*?1)',1),$_)[0-ge$_]}

Mengambil input sebagai array string $n, dengan 0bukannya .dan 1bukan #. Kemudian, kita mengulang $n, setiap iterasi menguji apakah string saat ini lebih kecil dari 0(yaitu, ada 1di dalamnya), dan jika demikian, output sebuah string. Menggunakan pseudo-ternary sebagai ganti operasi if/ else.

String dibangun dari loop melalui lebar string input. Setiap iterasi, kami memakukan pada 0atau 1tergantung pada jika 1ditemukan di suatu tempat di kolom vertikal yang sesuai. Untuk kasus uji terakhir, misalnya, ini akan menghasilkan string seperti 0011001001. Membutuhkan v3 + untuk -inoperator. Tali itu dipasangkan dengan pengganti regex-dancy mewah untuk menggantikan "batin" 0dengan 1s. Terima kasih banyak kepada Business Cat dalam obrolan untuk bantuannya. String kita akan menjadi0011111111 di titik ini.

Lain, output string saat ini (semua-nol) $_ .

String yang dihasilkan ditinggalkan pada pipa, dan output tersirat. Default Write-Outputuntuk array string adalah dengan baris baru di antara setiap elemen, jadi itulah yang terjadi secara visual.

Contohnya

PS C:\Tools\Scripts\golfing> .\highlight-the-bounding-box-cartesian.ps1 '0000000001','0010000000','0000100100','0001000000'
0011111111
0011111111
0011111111
0011111111

PS C:\Tools\Scripts\golfing> .\highlight-the-bounding-box-cartesian.ps1 '0000000000','0000000000','0000100000','0001000000'
0000000000
0000000000
0001100000
0001100000
AdmBorkBork
sumber
2

Python, 219 212 byte

def b(a):j=len(a[0]);g=range;z=g(len(a));h=[i for i in z if'#'in a[i]];w=[i for i,c in[(i,[r[i]for r in a])for i in g(j)]if'#'in c];return[[any((r<h[0],h[-1]<r,c<w[0],w[-1]<c))and'.'or'#'for c in g(j)]for r in z]

(Meskipun saya pikir metode lain mungkin lebih pendek)

Mengambil dan mengembalikan daftar daftar karakter.

Uji di ideoone

Jonathan Allan
sumber
2

Perl 6 , 62 byte

{.[.grep(/a/,:k).minmax;$_».grep('a',:k).flat.minmax]='a'xx*}

Rutin anonim yang dapat dilewatkan array array karakter (mewakili matriks) sebagai argumen, dan memodifikasinya di tempat sehingga ruang lingkup panggilan memiliki array yang dimodifikasi sesudahnya.

Menggunakan aalih-alih #sebagai karakter "on". Karakter "tidak aktif" bisa apa saja, tidak peduli.

seseorang
sumber
2

Python 3, 153 byte

r=lambda w:list(zip(*w[::-1]))
f=lambda w,n=4:list(map(''.join,n and(('#'in w[0])and r(r(r(f(r(w),n-1))))or[w[0]]+foo(w[1:],n))or['#'*len(w[0])]*len(w)))

Input dan output adalah daftar string.

ungolfed

r=lambda w:list(zip(*w[::-1]))   # rotate grid cw 90 degrees

def f(w,n=4):
    if n:
        if '#' in w[0]:
            u = r(r(r(f(r(w), n-1))))

        else:
            u = [w[0]] + foo(w[1:], n)

    else:
        u = ['#'*len(w[0])]*len(w)

 return list(map(''.join,u))

Teori Operasi

Gagasan utamanya adalah menghapus baris dan kolom di sekitar bagian luar array jika mereka tidak memiliki '#'. Apa pun yang tersisa harus diisi dengan '#' s.

Diimplementasikan menggunakan fungsi rekursif.

Kasus 1: baris 0 tidak mengandung '#'. Hasilnya adalah baris 0 + panggilan rekursif pada baris yang tersisa.

Kasus 2: baris 0 memang mengandung '#'. Tidak ada lagi baris yang bisa dihapus. Putar array cw sehingga kolom 0 sekarang menjadi baris 0. Kemudian proses array yang diputar secara rekursif. Hasilnya diputar ccw.

Kasing dasar: Array telah diputar 4 kali, artinya semua baris luar / kolom telah dihapus jika memungkinkan. Apa pun yang tersisa harus diisi dengan '#' s

RootTwo
sumber
2

Perl, 51 byte

Termasuk +2 untuk -0p

Berikan input pada STDIN, off karakter A, on karakter a, misalnya:

bounding.pl
AAAAAAAAAA
AAaAAAAAAA
AAAAaAAaAA
AAAaAAAAAA
AAAAAAAAAA
^D

bounding.pl:

#!/usr/bin/perl -0p
s%(?=\D*a).+%$a|=$&%eg;s%.*a.*%$a%g;s/a.*a/\L$&/g

Sama panjang:

#!/usr/bin/perl -0p
s%.+%${a./a/g}|=$&%eg;s%.*a.*%$a1%g;s/a.*a/\L$&/g
Ton Hospel
sumber
1

Python 2, 184 byte

def c(i):
 m=n=();e,z=enumerate,'for j,r in e(i):\n for k,c in e(r):%s'
 exec z%'\n  if"#"==c:m+=j,;n+=k,'
 exec z%'\n  if min(m)<=j<=max(m)<[]>min(n)<=k<=max(n):i[j][k]="#"'
 return i

Input dan output adalah daftar string.

Cobalah di Ideone (percabangan halaman uji Jonathan Allan)

Neorej
sumber
0

Pyth , 50 byte

L}hbebjuXGhHX@GhHeH\#*yhMJs.e,Lkfq\#@bTUb.zySeMJ.z

Cobalah online!

Biarawati Bocor
sumber