Marching Squares是计算机图形学中的一种算法,用于从样本网格中恢复2D等值线(有关3D设置,另请参见其兄长Marching Cubes)。想法是独立处理网格的每个像元,并根据其角处的值确定通过该像元的轮廓。
此过程的第一步是根据拐角是在轮廓值上方还是下方,确定轮廓连接哪些边缘。为简单起见,我们只考虑沿value的轮廓0
,这样我们对拐角是正还是负感兴趣。有一些情况可以区分:24 = 16
图片来源:Wikipedia
白色和黑色的识别在这里并不重要,但是为了明确起见,请说白色为正,黑色为负。我们将忽略其中一个角正好是1的情况0
。
鞍点(案例5和案例10)提供了一些额外的困难:仅通过查看拐角并不清楚应该使用哪些对角线。这可以通过找到四个角的平均值(即中心值的近似值)并选择对角线以使轮廓将中心与带有相反符号的角分开来解决。如果平均值恰好是0
,则可以选择任何一种情况。
通常,这16种情况仅存储在查找表中。这对于提高效率非常有用,但是当然,我们希望此处的代码简短。因此,您的任务是执行此查找步骤,并以尽可能少的代码打印出外壳的ASCII表示形式。
挑战
您将以选择的固定顺序获得四个角(非零整数)的值。然后,您应该生成轮廓的正确布局,以正确解决鞍点情况。
您可以编写程序或函数,通过STDIN(或最接近的替代方案),命令行自变量或函数自变量获取输入,并通过STDOUT(或最接近的替代方案),函数返回值或函数(out)参数输出结果。
输入可以采用任何方便的字符串或列表格式。
这16种情况将使用以下5x5块之一以ASCII艺术形式表示:
o---o o---o o---o
| | | | | | |
| | |---| | | |
| | | | | | |
o---o o---o o---o
o---o o---o o---o o---o
|/ | | \| | | | |
| | | | | | | |
| | | | |\ | | /|
o---o o---o o---o o---o
o---o o---o
|/ | | \|
| | | |
| /| |\ |
o---o o---o
您不得打印任何开头或结尾的空格,但可以打印单个可选的换行符。
这是代码高尔夫球,因此最短的答案(以字节为单位)获胜。
测试用例
测试用例假定输入是按top-left,top-right,bottom-left,bottom-right的顺序给出的。测试用例分为9组,一组对应于上面给出的9种表示形式(以相同的顺序,从空单元格开始,以两个鞍点结束)。
[1, 2, 1, 3]
[-9, -2, -2, -7]
[4, 5, -1, -2]
[-1, -2, 3, 4]
[7, -7, 7, -7]
[-5, 5, -5, 5]
[1, -6, -4, -1]
[-2, 3, 3, 4]
[-1, 6, -4, -1]
[2, -3, 3, 4]
[-1, -6, 4, -1]
[2, 3, -3, 4]
[-1, -6, -4, 1]
[2, 3, 3, -4]
[3, -8, -9, 2]
[-3, 8, 9, -2]
[8, -3, -2, 9]
[-8, 3, 2, -9]
此外,以下测试用例可能会返回两个鞍点(您的选择):
[1, -4, -2, 5]
[-1, 4, 2, -5]