突出显示边界框,第一部分:笛卡尔网格


19

您会得到一个由.和组成的矩形网格#,如下所示:

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

你的任务是填补的整个轴线对齐边框#进一步#

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

轴对齐的边框是包含所有的最小矩形#

想要更多?尝试第二部分!

规则

您可以使用任意两个不同的打印的ASCII字符(0x20至0x7E的,包容性的),代替#.。我会继续提到他们作为#.对规范虽然剩下的时间。

输入和输出可以是单个换行符分隔的字符串,也可以是字符串列表(每行一个),但是格式必须一致。

您可以假定输入至少包含一行,#并且所有行的长度均相同。

您可以编写程序或函数,并使用我们的任何标准方法来接收输入和提供输出。

您可以使用任何编程语言,但是请注意,默认情况下,这些漏洞是禁止的。

这是,因此以字节为单位的最短有效答案为准。

测试用例

每个测试用例具有彼此相邻的输入和输出。

#    #

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

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

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

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

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

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

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

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

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

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

您所说的“格式必须一致”是什么意思?输入格式是否需要与输出格式一致?或者这意味着输入格式需要一致并且输出格式也必须一致?
Emigna '16

@Emigna输入和输出格式必须相同。
马丁·恩德

@MartinEnder我的程序输入2D字符数组并对其进行处理。结果仍然是2D char数组,但默认情况下显示为数组的内容,即用换行符分隔的字符串。可以接受吗?还是显示的输出应该是该2D数组的字符串表示形式?
Luis Mendo

@LuisMendo我希望类型的字符串表示形式。我不能说换行分隔的字符串是否是您语言中嵌套数组的自然字符串表示形式。(尽管,由于您输入的格式不同,所以它似乎不是“可逆的”表示形式,可能不是。)
Martin Ender

允许图形输出吗?
17Me21年

Answers:


17

VBA Excel,150字节 146字节

指令:

用两个空白工作表创建工作簿:Sheet1和Sheet2。在Sheet1中设置输入,然后将以下代码放入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

解开代码:

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

说明:

  1. 遍历使用范围Sheet1中的每个单元格
  2. 设置条件语句,以复制使用范围Sheet1中每个包含字符标签(#)的单元格,并将粘贴到Sheet2中具有与Sheet1相同地址的单元格中。
  3. 再次循环遍历使用范围Sheet2中的每个单元格以复制其中的每个单元格地址,然后使用它为Sheet1中具有与使用范围Sheet2相同地址的单元格分配字符主题标签(#)。

I / O示例:

输入

输出值

警告:确保每次运行程序时Sheet2中的每个单元格始终为空白。


1
=C.Value在第一行="#"
莱利

@Riley是的,可以。谢谢。
Anastasiya-Romanova秀

看来我可以通过删除Sub和End Sub部分,然后在立即窗口中运行程序来节省更多的字节。我会尝试过明天不管它是否有效。现在无法访问Excel ...
Anastasiya-Romanova秀

但是,如果您这样做的话,这仍算作程序或功能吗?
尼尔

@Neil Dunno关于正式定义,但对我来说,程序是一组指令,如果我们将代码放在“即时窗口”中,尽管有限制,但它仍然像普通程序一样工作。其中之一是无法在此处执行此代码。哈哈:D
Anastasiya-Romanova秀

8

05AB1E70 68 69 61 58 60 40字节

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

说明

€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

在线尝试


7

Mathematica,91 70字节

由于@MartinEnder节省了21个字节。

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

匿名函数。将字符矩阵作为输入,并返回字符矩阵作为输出。的Unicode字符为U + F3C7 \[Transpose]


5

C#,262251字节

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

当我有更多时间时,会打高尔夫球吗?

它编译成一个Func<string[], string[]>

格式化版本:

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

果冻21 19 18 17 字节

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

这是一个完整程序。输入和输出是01的字符串,由换行符分隔。

在线尝试!验证所有测试用例

怎么运行的

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


3

Scala,317个字符

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)

可读性更高的版本,可能更喜欢它:

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个字节

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

将输入作为多行字符串。通过递归地.从所有行中剥离开头和结尾的s,直到至少一行开始并以a结尾结束#,然后选择尽可能多的行,但是在包含#所有.s的行上开始并将它们更改为#。大概很容易打高尔夫球。


3

R,158155字节

该程序逐行输入输入点.和标签#

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

松散

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

这是第三行的详细信息:

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

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

将输入作为字符串数组$n使用0代替.1代替#。然后,我们遍历$n,每次迭代测试当前字符串是否小于0(即其中有一个1),如果是,则输出一个字符串。使用伪三元数代替if/ else运算。

该字符串是通过循环遍历输入字符串的宽度来构造的。每次迭代时,我们在对应的垂直列中的某个位置找到a 0或a,1取决于是否1找到。例如,对于最后一个测试用例,这将导致类似的字符串0011001001。要求v​​3 +为-in操作员。该字符串与花式正则表达式replace配对,以01s 替换任何“ inner” 。非常感谢Business Cat在聊天中提供的帮助。我们的字符串将0011111111在此时。

否则,输出当前(全零)字符串$_

结果字符串保留在管道上,并且输出是隐式的。Write-Output字符串数组的默认值是每个元素之间都有换行符,因此从视觉上看会发生什么。

例子

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,219212字节

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]

(尽管我认为另一种方法可能会更短)

获取并返回一个字符列表。

ideoone测试


2

Perl 6,62个字节

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

一个匿名例程,可以将一组字符数组(表示矩阵)作为参数传递,并就地对其进行修改,以便调用作用域之后具有修改后的数组。

用途a,而不是#作为“上”字。“ off”字符可以是任何东西,无关紧要。


2

Python 3,153个字节

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

输入和输出是字符串列表。

不打高尔夫球

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

操作理论

主要思想是删除数组外部没有“#”的行和列。剩下的所有内容都应该用“#”填充。

它是使用递归函数实现的。

情况1:第0行不包含“#”。结果是第0行+其余行的递归调用。

情况2:第0行的确包含“#”。无法删除更多行。旋转数组cw,以使第0列现在成为第0行。然后递归处理旋转后的数组。结果是逆时针旋转。

基本情况:阵列已旋转4次,这意味着如果可能的话,所有外部行/列均已删除。剩下的都应该用“#”填充


2

Perl,51个字节

包括+2 -0p

在STDIN上输入,关闭字符为A,打开字符为a,例如:

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

相同长度:

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

1

Python 2,184个字节

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

输入和输出是字符串列表。

在Ideone上尝试一下(Jonathan Allan的测试页的叉子)


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.