当初次向学生讲解数学归纳的证明技术时,一个常见的示例是将2个N ×2 N的网格与L形的Tromino砖砌在一起的问题,从而将一个预定的网格空间留空。(N是一些非负整数。)
如果您还不知道,我将交给您查看证明。有很多讨论它的资源。
您的任务是编写一个程序,该程序使用N的值以及要保留为空的网格空间的坐标,并输出所生成的Tromino平铺网格的ASCII表示形式。
角色O
将填充空白区域,并且我们的Tromino旋转4次将如下所示:
|
+-
|
-+
-+
|
+-
|
(是的,它可以是含糊其+
与去-
和|
某些安排,但没关系。)
您的程序必须在N = 0(对于1×1网格)下工作,至少N = 8(对于256×256网格)。将给出x和y值,它们是的坐标O
:
- x是水平轴。x = 1是左侧网格边缘,x = 2 N是右侧网格边缘。
- y是垂直轴。y = 1是顶部网格边缘,y = 2 N是底部网格边缘。
x和y都始终在[1,2 N ] 范围内。
因此,对于给定的N,x和y,您的程序必须输出2 N ×2 N的网格,该网格完全用L形的三角骨平铺,但x,y网格坐标为O
。
例子
如果N = 0,则x和y必须都为1。
O
如果N = 1,x = 1,y = 2,则输出为
-+
O|
N = 2,x = 3,y = 2:
+--+
||O|
|+-|
+--+
N = 2,x = 4,y = 1:
+-|O
||+-
|+-|
+--+
N = 3,x = 3,y = 6(例如本页上的图像):
+--++--+
|+-||-+|
||+--+||
+-|-+|-+
+--+||-+
||O|-+||
|+-||-+|
+--++--+
细节
- 您可以编写一个使用3个整数的函数,而不是编写整个程序。它应该打印或返回网格字符串。
- 从标准输入,命令行(或编写函数的函数args)获取输入。
- 输出可以选择包含单个培训换行符。
- 您不需要使用证明通常建议的平铺方法。唯一重要的是,网格除了之外还填充有L形的tromino
O
。(Trominos可能不会被剪切或超出网格范围。)
以字节为单位的最短代码获胜。Tiebreaker是较早的帖子。(方便的字节计数器。)
if p!=i
; 里面的列表.join()
不需要[]
;(1-i%2)
可以这样做~i%2
; 您可以使用可迭代的拆包形式编写t,l,a=[],...
为*t,l,a=...
;if n==0
可以检查,if n<1
因为n
不能为负;最后的"\n".join
操作可能可以通过打印每个元素来完成,因为一般规则允许使用打印来代替返回。if p!=i
可能是if p-i
因为非零值是Truthy。