放大盒子


17

ASCII框如下所示:

++    +---+    +------+    +---+    +---+
++    |   |    |      |    |   |    |   |
      |   |    |      |    |   |    |   |
+-+   |   |    |      |    |   |    |   |
+-+   |   |    |      |    |   |    +---+
      +---+    |      |    |   |
+--+           |      |    |   |    ++
|  |           |      |    |   |    ||
|  |           +------+    |   |    ||
+--+                       |   |    ||
                           +---+    ||
                                    ||
                  +-----+           ||
+------------+    |     |           ++
|            |    |     |
|            |    |     |
+------------+    +-----+

以下是一些内含相同ASCII框的示例:

++    +- -+    +-    -+    +- -+    +- -+
++    | - |    | -  - |    | - |    | - |
       | |      | -- |      | |      | |
+-+    | |       |  |        "      | - |
+-+   | - |       ||        | |     +- -+
      +- -+      |  |      |   |
+--+            | -- |      | |     ++
|  |           | -  - |      "      ||
|  |           +-    -+     | |     ||
+--+                       | - |   |  |
                           +- -+   |  |
      --                            ||
     -  -         +-   -+           ||
+-  -    -  -+    | - - |           ++
| --      -- |     | = |
| --      -- |    | - - |
+-  -    -  -+    +-   -+
     -  -
      --

是易于复制格式的所有这些测试用例框的链接。顺序是所有输入,然后是相同顺序的所有输出。

您的目标是将ASCII框作为输入,并返回内嵌的框。内爆的规则是:

  1. “ +”永远不变;“-”或“ |”都不 直接邻近“ +”
  2. 从角落开始,“-”和“ |” 向内移动一个空间,比距离拐角处的相同角色多一个空间。如果是“-”和“ |” 永远不会移动到同一地点,也不会移动。
  3. 如果“-”和“-”移动到同一位置,请在该位置放置“ =”。如果是“ |” 和“ |” 移动到相同的位置,在该位置放置一个“。”,它们被视为同一位置中两个相反方向的字符。
  4. 两个“-”或两个“ |” 可以彼此移动,如左下角的示例所示。
  5. 如果盒子足够薄,它将以相同的方式开始向外扩展,始终从其一部分开始的一侧移开。
  6. 结果应该在x和y方向上横跨中心线对称(忽略换行符);这包括空格,因此结果可能需要用空格填充才能满足要求。

规则详细信息:

  1. 这是代码高尔夫球,因此以字节为单位的最短程序获胜。
  2. 有标准漏洞。
  3. 您可以假设每行以换行符结尾。
  4. 输入字符串中的唯一字符将是“ +”,“-”,“ |”,“”和“ \ n”(换行符),并且输出字符串应遵循相同的规则,并加上“ =“和“作为可能的字符。
  5. 您可以选择在最后一行的末尾有一个结尾的换行符。
  6. 您需要处理的最小ASCII框是左上角的示例。每个ASCII框的拐角处将恰好有4个“ +”。
  7. 您将需要处理大小m x n为任何整数的框,以m,n使2<=m,n<256(最大可能的字符串大小为255*(255+1)
  8. 您可以假设您将始终得到一个有效的ASCII框作为输入。

我认为您忘记了在“规则详细信息”数字4的输出中添加“作为可能的字符。编辑:我们可以假设输入没有空行吗?
Theraot

1x6的示例很时髦,为什么它会向外爆炸?我认为||该示例中的其中一个必须是a "或其他内容……
Magic Octopus Urn

@carusocomputing相同左下方例如,壁通过彼此移动(这样的框体积为负) -规则4和5
里茨

@Lyth还应该有空"吗?我猜"唯一出现在3英寸或更大的宽度上?
Magic Octopus Urn

@carusocomputing考虑一下:"去哪里?在左边还是右边?不能两者兼有,但也不能兼有,因为结果是对称的。
HyperNeutrino

Answers:


15

Python 2中591 555 545 527 525 496个 436 351 334 333 303字节

s=input()
w=len(s[0])
h=len(s)
V=max(0,w/2-h)
H=max(0,h/2-w)
p=[[' ']*w]*V
q=[' ']*H
s=[q+k+q for k in p+s+p]
d,c=' -=',' |"'
exec"c,d,V,H,w,h=d,c,H,V,h,w;s=map(list,zip(*s))[::-1]\nfor j in range(h-4):q=s[V+j+2];q[H]=c[q[H]==c[2]];r=H+min(j+1,h-4-j);q[r]=c[1+(q[r]>' ')]\n"*4
for x in s:print''.join(x)

在线尝试!

编辑:我的旧方法首先爆破顶部和底部,然后爆破左侧和右侧。取而代之的是,我们可以使顶部内爆,旋转90度,然后进行4次。另外,我使用的是用户友好的代码,该代码要求输入的形式[['+', '-', '-', '-', '-', '-', '+'], ['|', ' ', ' ', ' ', ' ', ' ', '|'], ['|', ' ', ' ', ' ', ' ', ' ', '|'], ['|', ' ', ' ', ' ', ' ', ' ', '|'], ['+', '-', '-', '-', '-', '-', '+']]丑陋,但对于程序:P来说较短(感谢Phoenix捕获了该代码)

将TIO链接中的头代码用于Leaky Nun,该头代码用于将人类可读输入转换为计算机可读输入。

-85字节感谢泄漏尼姑!
通过从顶部内爆切换到左侧内爆,可以保留-17个字节,从而可以将整行存储到变量中并进行修改。感谢Leaky Nun的建议!
-1字节通过切换周围的东西来删除空格。
-30个字节感谢Leaky Nun!


分配s[0]S[0]变量,以节省几个字节
凯尔德coinheringaahing

@Ilikemydog哦,对。谢谢!
HyperNeutrino

您可以替换p=s[0]P=S[0]使用p=z(s[0]),并P=z(S[0])分别,然后替换所有出现的z(p)p所有z(P)P以节省18个字节。
R. Kap

您也可以替换(z(s)-1)/2-p使用z(s)/2-.5-p,并(p-1)/2-z(s)具有p/2-.5-z(s)保存2个字节。
R. Kap

@ R.Kap哦,好的。感谢您的两个建议!
HyperNeutrino

1

C(clang),693字节

添加了新行以提高可读性。前两个是必需的,其余的不是必需的。

#define P B[i][l]
#define m malloc(8)
I(B,h,V,S,J,Z,i,j,l,n,H,W,c,C,a,z,_,L,G,u,N,M)char**B,**Z;char*L,*G,*u;{
V=strlen(B[0]);
S=J=0;
Z=m;
for(i=0,j=h-1;i<h/2+h%2;i++,j--){
for(l=0,n=V-1;l<V/2+V%2;l++,n--){
if(P!=43&&((B[i][l-1]!=43&&i<1)||(B[i-1][l]!=43&&l<1))){
H=P==45;
W=P=='|';
P=B[j][l]=B[i][n]=B[j][n]=32;
if(H){
c=(N=i+l-1)==(M=j-l+1)?61:45;
if(M<0)L=m,sprintf(L,"%*s",V,""),L[l]=L[n]=c,Z[J]=L,J++;
else B[N][l]=B[N][n]=B[M][l]=B[M][n]=c;
}
if(W){
c=(N=l+i-1)==(M=n-i+1)?34:'|';
if(M<0)G=m,sprintf(G,"|%*s%s%*s|",i-n-2,"",B[i],i-n-2,""),B[i]=B[j]=G,S++;
else B[i][N]=B[j][N]=B[i][M]=B[j][M]=c;
}
}
}
}
for(a=-J+1;a<=h+J;u=a<1?Z[-a]:a<=h?B[a-1]:Z[a-h-1],C=S+1-strlen(u)/2,printf("%*s%s\n",C>0?C:0,"",u),a++);
}

感谢您的巨大挑战!这很棘手,但我仍然很开心。

这将输入作为命令行参数,并将内嵌框的多行字符串输出到STDOUT。与往常一样,非常感谢打高尔夫球的技巧。

在线尝试!

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.