Sınırlayıcı Kutuyu Vurgulayın, Bölüm I: Kartezyen Izgara


19

Size karakterlerin dikdörtgen bir ızgarası verilir .ve #şöyle:

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

Göreviniz tüm eksen hizalı sınırlayıcı kutu doldurmaktır #ayrıca ile #:

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

Eksen hizalı sınırlama kutusu, tümünü içeren en küçük dikdörtgendir #.

Daha fazla istemek? Bölüm II'yi deneyin!

kurallar

Herhangi iki kullanabilir ayrı yerine yazdırılabilir ASCII karakterleri (0x7E için 0x20 dahil), #ve .. Yine de şartnamenin geri kalanı olarak #ve onlardan bahsetmeye devam edeceğim ..

Giriş ve çıkış tek satır besleme ile ayrılmış bir dize veya bir dize listesi (her satır için bir tane) olabilir, ancak biçim tutarlı olmalıdır.

Girişin en az bir tane içerdiğini #ve tüm satırların aynı uzunlukta olduğunu varsayabilirsiniz .

Bir program veya işlev yazabilir ve standart girdi alma ve çıktı sağlama yöntemlerimizden herhangi birini kullanabilirsiniz .

Herhangi bir programlama dili kullanabilirsiniz , ancak bu boşlukların varsayılan olarak yasaklandığını unutmayın .

Bu , bu nedenle bayt cinsinden ölçülen en kısa geçerli cevap kazanır.

Test Durumları

Her test senaryosunun yan yana giriş ve çıkışları vardır.

#    #

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

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

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

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

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

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

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

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

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

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

"Biçim tutarlı olmalı" ile ne demek istiyorsun? Giriş biçiminin çıktı biçimiyle tutarlı olması gerekiyor mu, yoksa giriş biçiminin tutarlı olması ve çıktı biçiminin de tutarlı olması gerektiği anlamına mı geliyor?
Emigna

@Emigna giriş ve çıkış biçimlerinin aynı olması gerekir.
Martin Ender

@MartinEnder Programım bir 2D karakter dizisi girer ve işler. Sonuç hala bir 2D karakter dizisidir, ancak varsayılan olarak dizinin içeriği, yani satırsonu ile ayrılmış dizeler olarak görüntülenir. Kabul edilebilir mi? Yoksa görüntülenen çıktı bu 2B dizinin dize olarak temsil edilmesi mi?
Luis Mendo

@LuisMendo Türü bir dize temsili beklenir. Satır besleme ayrılmış dizeleri olsun olan kendi dilinizde iç içe dizinin doğal dize gösterimi Söyleyemem. (Yine de, bu "geri dönüşümlü" bir gösterim olarak görünmediğinden, giriş biçiminiz farklı olduğundan, muhtemelen değil.)
Martin Ender

grafik çıktıya izin verilir mi?
12

Yanıtlar:


17

VBA Excel, 150 bayt 146 bayt

Talimat:

İki boş çalışma sayfası içeren bir çalışma kitabı oluşturun: Sayfa1 ve Sayfa2. Sayfa1 girişini ayarlayın ve Sayfa1 kod modülüne aşağıdaki kodu koyun

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

Kodu çözdü:

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

Açıklama:

  1. Kullanılan sayfadaki her hücreye döngü Sayfa1
  2. Koşullu deyimi ayarlayın kopyalamak kullanılan aralık Sayfa1 karakter hashtag (#) içeren her hücreyi ve yapıştırmak Sayfa1'ın aynı adresle Sayfa2'de hücreye.
  3. İçindeki her hücre adresini kopyalamak için kullanılan Sayfa2 aralığındaki her hücreyi bir kez daha döndürün ve bunu Sayfa1'deki kullanılan sayfa Sayfa2 ile aynı adresle hücreye karakter hashtag'i (#) atamak için kullanın.

Örnek G / Ç:

GİRİŞ

ÇIKTI

Uyarı: Programı her çalıştırdığınızda Sayfa2'deki her hücrenin her zaman boş olduğundan emin olun.


1
Could =C.Valueilk satırda olmak ="#"?
Riley

@Riley Evet, olabilir. Teşekkürler.
Anastasiya-Romanova 秀

Görünüşe göre Sub ve End Sub parçalarını silerek, ardından Programı Hemen Penceresinde çalıştırarak birkaç bayt daha kaydedebilirim. Çalışıp çalışmadığını yarın deneyeceğim. Excel'e şu anda erişilemedi ...
Anastasiya-Romanova 秀

Ama bunu yaparsanız yine de bir program veya işlev olarak sayılır mı?
Neil

@Neil Dunno resmi tanım hakkında ama benim için bir program talimatlar dizisidir ve sınırlamalar olmasına rağmen kodu Anında Pencereye koyarsak yine de normal program gibi çalışır. Bunlardan biri, bu kodun orada yürütülememesidir. Ha-ha: D
Anastasiya-Romanova 秀

8

05AB1E , 70 68 69 61 58 60 40 bayt

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

açıklama

€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

Çevrimiçi deneyin


7

Mathematica, 91 70 bayt

@MartinEnder nedeniyle 21 bayt kaydedildi .

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

Anonim işlev. Bir karakter matrisini girdi olarak alır ve bir karakter matrisini çıktı olarak döndürür. Unicode karakteri U + F3C7'dir \[Transpose].


5

C #, 262251 bayt

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

Daha fazla zamanım olduğunda daha da golf olacak.

Bir derler Func<string[], string[]>.

Biçimlendirilmiş sürüm:

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

5

Jöle , 21 19 18 17 bayt

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

Bu tam bir program. Giriş ve çıkış, satır beslemeleri ile sınırlandırılmış 0 've 1 ' dizeleridir .

Çevrimiçi deneyin! veya tüm test senaryolarını doğrulayın .

Nasıl çalışır

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

4

Retina , 87 bayt

Bayt sayımı ISO 8859-1 kodlamasını varsayar.

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

Aİçin .ve Ziçin kullanır #.

Çevrimiçi deneyin!


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)

Daha okunabilir versiyon, muhtemelen daha fazla golf oynayabilirdi:

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
)

3

JavaScript (ES6), 168 bayt

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,'.')

Girişi çok satırlı bir dize olarak alır. Yinelemeli ön ve arka sıyırma Works .bir olan en az bir hat başlar ve bir sona erene kadar tüm hatlardan s #, ihtiva hatlarında mümkün fakat başlangıç ve bitirme gibi birçok çizgiler olarak daha sonra seçer #tüm değiştirir ve .hiç s #. Muhtemelen kolayca golf edilebilir.


3

R, 158155 bayt

Bu program satırlar halinde giriş noktalarını .ve hashtag'leri alır #.

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

Kurtulmamış:

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

Üçüncü satırın detayları:

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

3

PowerShell V3 +, 215 162 148 144 139 bayt

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

Dizelerden oluşan bir dizi olarak girişi alır $nile, 0yerine .ve 1yerine #. Daha sonra, $nher bir yinelemenin geçerli dizenin küçük olup olmadığını test etmesi 0(yani, 1içinde bir tane var) ve eğer öyleyse bir dize çıkışı. Bir / işlemi yerine sözde üçlü kullanır .ifelse

Dize, giriş dizesinin genişliği boyunca döngülerden oluşturulur. Her bir yineleme, ilgili dikey sütunda bir yerde bulunup bulunmadığına bağlı olarak a 0veya a 1üzerine 1yapışır. Örneğin, son test durumu için, bu gibi bir dize ile sonuçlanacaktır 0011001001. -inOperatör için v3 + gerekir . Bu dize, herhangi bir "iç" 0leri s ile değiştirmek için süslü bir normal regex değiştirme ile eşleştirilir 1. Bu konuda yardım için sohbette Business Cat'e çok teşekkürler . Dize 0011111111bu noktada olurdu .

Aksi takdirde, geçerli (sıfırlar) dizeyi çıktılar $_.

Ortaya çıkan dizeler boru hattında kalır ve çıktı örtüktür. Bir Write-Outputdizgi dizisi için varsayılan , her öğe arasında bir satırsonu işaretidir, dolayısıyla görsel olarak böyle olur.

Örnekler

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

2

Python, 219 212 bayt

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]

(Başka bir yöntemin daha kısa olabileceğini düşünüyorum)

Karakterlerin listesini alır ve döndürür.

İdeoon üzerinde test edin


2

Perl 6 , 62 bayt

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

Bağımsız değişken olarak bir dizi karakter dizisini (matrisi temsil eden) geçirebilen ve çağıran kapsamın daha sonra değiştirilmiş diziye sahip olmasını sağlayacak şekilde değiştirilen anonim bir yordam.

"Açık" karakteri ayerine kullanır #. "Kapalı" karakter herhangi bir şey olabilir, umursamıyor.


2

Python 3, 153 bayt

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

Girdi ve çıktı dizelerin bir listesidir.

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

Operasyon teorisi

Ana fikir, '#' yoksa dizinin dış çevresindeki satırları ve sütunları kaldırmaktır. Kalan her şey '#' ile doldurulmalıdır.

Özyinelemeli bir işlev kullanılarak uygulanır.

Durum 1: satır 0 '#' içermiyor. Sonuç, kalan satırlarda satır 0 + özyinelemeli çağrıdır.

Durum 2: satır 0 '#' içeriyor. Başka satır kaldırılamaz. Cw dizisini 0 sütunu şimdi 0 satırı olacak şekilde döndürün. Sonra döndürülen diziyi yinelemeli olarak işleyin. Sonuç ccw döndürülür.

Temel durum: Dizi 4 kez döndürülmüştür, yani mümkünse tüm dış satırlar / sütunlar kaldırılmıştır. Kalanlar '#' ile doldurulmalıdır


2

Perl, 51 bayt

İçin +2 içerir -0p

STDIN, off karakteri A, on karakteri a, örn.

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

Aynı uzunlukta:

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

1

Python 2, 184 bayt

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

Girdi ve çıktı dizelerin bir listesidir.

Ideone'da deneyin (Jonathan Allan'ın test sayfasının çatalı)


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.