渲染ASCII迷宫


18

看!这是一个ASCII迷宫!太酷了,酷炫的东西。

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

但是,但是,但是……很难确定迷宫的所有部分都朝着哪个方向前进。我只想绘制布局,迷宫使自己变得无情,没有时间。

如果我可以将其绘制在...

#############
# #     #   #
# #  ##   # #
# #  ## ### #
#       #   #
######### # #
#         # #
#############

那太甜了!


规则(因为规则很酷):

  • 编写代码以将字符串转换为ascii迷宫并输出结果。
  • 任何非空白字符都将被视为墙。
  • 墙的每个字符都将根据其邻居决定哪个字符(仅在北,南,东和西方向上)。
    • 如果一个字符没有非空白邻居,它将是一个加号(+)。
    • 如果字符在垂直(北-南)和水平(东-西)方向上都具有邻居,则它将为加号(+)。
    • 如果char仅在垂直(南北)方向上具有邻居,则它将是管道符号(|)。
    • 如果char仅在水平(东西向)方向上具有邻居,则它将为减号(-)。
  • 输入可以是单个字符串(用换行符分隔的行或字符串数​​组)。
  • 所有输入字符都是可打印的ASCII字符,您无需处理扩展字符集。
  • 您可以使用任何旧的语言。
  • 如果一行之前有空白,则每行上的空格量应相同。每行输出后的空白都可以。
  • 尝试用最少的字节数解决它。

测试用例:

1:框架

输入:

##########
#        #
#        #
#        #
##########

输出:

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

2:经典迷宫

输入:

#################
        #       #
# ##### # ##### #
#   # # #     # #
# # # # ##### # #
#   # #       # # 
### # ####### # #
#   # #    #  # # 
# ### # ## # ##
#     # ##    #  
#################

输出:

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

3:绿色的鸡蛋,伙计

输入:

I do not like green eggs and ham.
I do not like them, sam I am.
Would you like them here or there?
I would not like them anywhere!

输出:

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

4:冰柱

输入:

Word Icicle!
Word Icicle 
Word  cicle 
 ord  cicle 
 ord   icle 
 ord   i le 
 or    i le 
 or    i l  
 or      l  
 or         
  r         

输出:

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

1
绿色鸡蛋和火腿的第三行不应该结尾---吗?
LiefdeWen

1
混合邻居的结果仍不清楚。不知道为什么冰柱根本没有任何符号-,或者为什么经典迷宫+的最下面一行没有四个符号。
尼尔,

1
我们是否可以将输入作为带空格(即矩阵)填充的正方形?是否允许输出周围有多余的空格?另外,您的意思真的smallest number of characters不是字节吗?
dzaima

1
我认为1)经典迷宫+的第一行中间应该有2)!冰柱的i应当用代替-。您能仔细检查一下这些吗?
Arnauld

1
通过whitespace,您是指空间吗?我不需要支持制表符,并且您也可能不想让我转换换行符
Jo King

Answers:


11

APL(Dyalog Unicode)57 35 字节SBCS

–22感谢ngn提供的新颖解决方案

以字符矩阵为参数的匿名默认函数。

{⊃'+-|+'↓⍨25 4 2⊃¨⊂⍱∘⌽⍨' '≠,⍵}⌺3 3

在线尝试!

{}⌺3 3 在每个3×3社区中,应用以下功能:

,⍵ 拉平(拉平)

' '≠ 布尔值(非空格)

⍱∘⌽⍨ NOR是相反的(包括顶部NOR底部,左侧NOR都不是右)

5 4 2⊃¨⊂挑5 ,4 和2个第二元件从整个列表
  即空自,没有垂直,没有水平

2⊥ 以2为基数(二进制)评估,
  即≥4:空自我;3:没有邻居 2:没有水平邻居;1:无垂直;0:兼有

'+-|+'↓⍨ 从该字符串中删除那么多元素,
  即空的self :; 孤独:+; 仅垂直邻居:|+; 水平:-|+; 都:+-|+

 选择第一个元素(如果没有可用,则填充空格),
  即空self :; 孤独:+; 仅垂直邻居:|; 水平:-; 都:+


旧解决方案

以字符矩阵为参数的匿名默认函数。

{' +-|+'⊃⍨1⍳⍨(' '=5⊃,⍵),(∧/,⊢)∨/2 21' '≠(90 1)/,⍵}⌺3 3

在线尝试!

{}⌺3 3 在每个3×3社区中,应用以下功能:

,⍵ 拉平(拉平)

()/ 使用以下蒙版进行过滤:

  9⍴0 1 循环整形[0,1]为长度9(选择N,W,E,S)

' '≠ 布尔值(非空格)

1⌽ 向左旋转一步; [W,E,S,N]

2 2⍴ 重塑为2 x 2矩阵; [[W,E],[S,N]]

∨/ 按行或减少: [horizontal,vertical]

() 应用以下默认功能:

   身份; [horizontal,vertical]

  ∧/, 在其AND减少之前; [both,horizontal,vertical]

(), 附加以下内容:

  ,⍵ 弄乱(弄平)邻居

  5⊃ 选择第5 元素(本身)

  ' '= 布尔值,如果有空格(即为空)

 现在我们有 [empty,both,horizontal,vertical]

1⍳⍨ 最左边1的索引(如果根本没有邻居则给5)

' +-|+'⊃⍨ 用它来挑选符号

   


6

JavaScript(ES6),110个字节

I / O格式:字符串数组。

a=>a.map((s,y)=>s.replace(/\S/g,(_,x)=>'+|-+'[[-1,p=0,1,2].map(c=>p|=(a[y+c%2]||0)[x+~-c%2]>' '?c&1||2:0)|p]))

在线尝试!

或使用字符矩阵代替108个字节


6

Python 2中181个 168字节

感谢Leaky Nun的-13个字节

m=input()
f=lambda x,y:(['']+m+[''])[y+1][x:x+1]>' '
print[[(c<'!')*' 'or'+-|+'[f(x+1,y)|f(x-1,y)|2*f(x,y+1)|2*f(x,y-1)]for x,c in enumerate(r)]for y,r in enumerate(m)]

在线尝试!


5

MATLAB,113个 110 101字节

function F(A)
B=A>32
c=[1 1 1]
f=@(c)conv2(B,c,'s')>1
h=f(c)
v=f(c')
char((13*h+92*v-94*(h&v)).*B+32)

将输入转换为逻辑,在水平和垂直方向上应用卷积,然后组合输出以形成相应的字符。

@Adriaan保存了3个字节,用于告诉我您可以阻塞PPCG中的输出:P

多亏@flawr注释,节省了9个字节!



2

视网膜0.8.2,92字节

\S
0
(?<=(.)*)0(?=(?>.*\n(?<-1>.)*)0)|0(?=(.)*)(?<=0(?>(?<-2>.)*\n.*))
1
T`d`+|`\b.\b
T`d`-+

在线尝试!需要矩形输入。链接包括测试用例。说明:

\S
0

将所有非空格更改为0s。

(?<=(.)*)0(?=(?>.*\n(?<-1>.)*)0)|0(?=(.)*)(?<=0(?>(?<-2>.)*\n.*))
1

在同一列中在所有0s的0正上方或下方查找另一个,并将它们更改为1。s 1现在是具有垂直邻居的地方,而0s没有垂直邻居。

T`d`+|`\b.\b

查找没有水平邻居的所有数字。该0■找没有垂直的邻居要么,使他们成为+S,而1■找垂直邻居,所以他们变得|秒。

T`d`-+

其余数字具有水平邻居。该1S还具有垂直邻居,使他们成为+S,而0唯一有水平的邻居,所以他们变得-秒。


1

Python 3,336字节

def g(s):
 h,j,s=' +|-+','',s.splitlines()
 s+=['']
 for n in range(len(s)):
  s[n]+=' '
  for i in range(len(s[n])-1):
   l,r,k=s[n][i-1],s[n][i+1],0
   try:u=s[n-1][i]
   except:u=' '
   try:d=s[n+1][i]
   except:d=' '
   if not s[n][i]==' ':
    k+=1
    if not u==d==' ':k+=1
    if not l==r==' ':k+=2
   j+=h[k]
  j+='\n'
 print(j)

在线尝试!

我不得不使用大量代码来处理边缘情况错误。


1

C(gcc),143字节

char**y,*z,h,v;f(char**x){for(y=x;*y;++y)for(z=*y;*z;++z)if(*z-32){h=z[1]-32|z[-1]-32;v=y[1][z-*y]-32|y[-1][z-*y]-32;*z=h?v?43:45:(v?'|':43);}}

在线尝试!

函数f就地修改字符串数组。数组周围的区域必须用空格填充(有些约束)。即使这不能完全满足大多数解决方案使用的要求,但是如果我们说我们用两个空格表示一个换行符(并采用以换行符结尾的字符串数组),则它确实符合规则。

不打高尔夫球

f(char**x){
    char **y;
    for (y = x; *y; ++y) {
        char *z;
        for (z = *y; *z; ++z) {
            if (*z != ' ') {
                if (z[1] != ' ' || z[-1] != ' ') {
                    // Horizontal exists
                    if (y[1][z-*y] != ' ' || y[-1][z-*y] != ' ')
                        // Vertical exists
                        *z = '+';
                    else
                        *z = '-';
                } else {
                    // Horizontal doesn't exist
                    if (y[1][z-*y] != ' ' || y[-1][z-*y] != ' ')
                        // Vertical exists
                        *z = '|';
                    else
                        *z = '+';
                }
            }
        }
    }
}

这是指针算术的一个有趣的挑战。使用C风格的指针迭代,很容易获得水平邻居,但是垂直邻居要困难得多。幸运的是,y指针仍然在周围(它指向z的初始值),因此我可以从中推断出索引,并使用该索引访问不同行上的同一元素。y[-1][z-*y]面对任何合理的风格,它的书写感觉非常错误!


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.