带有弹跳线的XY框,在Z处有一个标记


10

长期潜伏在这里的第一次海报。

编写一个包含3个输入的程序:X,Y和Z。

  • X =跨(列)
  • Y =下降(行)
  • Z =位置标记

然后,程序应在X上和Y上向下打印可视网格。该网格可以由“ +”以外的任何字符组成。每个“位置”都有一个索引号,从坐标1处的1开始,从1开始计数,然后一直向下直到结束。

X和Y始终至少为3,Z永远不会大于X * Y

Z将代表该位置,并在该位置以及左,右,上和下1个字符上打印为“ +”。例如:

 +
+++
 +

最后,如果+字符将截取边缘(最上,最左,最右和/或最下边缘),则+应当沿同一轴弹回并从另一侧溢出。

示例:输入= 5、5、13

-----
--+--
-+++-
--+--
-----

输入= 10、10、10

-------+++
---------+
---------+
----------
----------
----------
----------
----------
----------
----------

输入= 10、10、21

----------
+---------
+++-------
+---------
----------
----------
----------
----------
----------
----------

编辑:非正方形​​示例16,3,32

---------------+
-------------+++
---------------+

我想我已经涵盖了所有内容。输入应该没有限制,但是如果您的程序需要,则将其上限设置为64 * 64。

奖励点(我可以这样做吗?):输入Z不应大于X * Y,但是如果它大于Y * Z,则将中心+输出到网格的中间。 编辑:输入Z不能大于X * Y

编辑2:对X和Y进行了一些更改,希望更加清晰

这是代码高尔夫球,最短的代码获胜。


欢迎来到编程难题和Code Golf!这是一个很好的挑战,但是我建议将未来的挑战发布到沙盒中,在发布到主站点之前,他们可以先获得反馈。
betseg 2016年

什么是“奖励积分”?实现该确切功能是否会使您的字节数有所增加?如果是这样,您应该明确指出这是多少奖金。(作为补充,通常不鼓励在代码高尔夫球中获得奖金)
詹姆斯(James

@betseg-哎呀。抱歉,错过了这一重要步骤,希望能引起我一些兴趣。
杰克·哈里

@DrMcMoylex-注意,谢谢,现在已经删除了奖金。
杰克·哈里

2
您在发布的第一天就不应该接受答案,我非常有信心MATL / Jelly / 05AB1E高尔夫球手会看到此问题,并以比Python少的字节数解决它。我认为大多数人倾向于至少等待一个星期。
卡德

Answers:


1

Python 2,172 171字节

def f(x,y,z):A=[['-']*x for _ in' '*y];z-=1;X,Y=z%x,z/x;a=[2,-1];A[Y][X]=A[Y+a[Y>0]][X]=A[Y-a[Y<y-1]][X]=A[Y][X+a[X>0]]=A[Y][X-a[X<x-1]]='+';print'\n'.join(map(''.join,A))

编辑:通过转换为函数保存1个字节。

上一篇(更具可读性):

x,y,z=inputtt
A=[['-']*x for _ in' '*y]
z-=1
X,Y=z%x,z/x
a=[2,-1]
A[Y][X]=A[Y+a[Y>0]][X]=A[Y-a[Y<y-1]][X]=A[Y][X+a[X>0]]=A[Y][X-a[X<x-1]]='+'
print'\n'.join(map(''.join,A))

干得好,以为我用10,100,300打破了它。似乎在最右边的边界上没有表现吗?
杰克·哈里

@JakeHarry为我工作:ideone.com/G2fwV1
TFeld

啊,我是个笨蛋,我使用的ide并非固定宽度,因此从技术上来说是正确的,只是不适合眼睛。
杰克·哈里

1

JavaScript(ES6),165个字节

(x,y,z,a=[...Array(y)].map(_=>Array(x).fill`-`))=>a.map(a=>a.join``,a[b=--z/x|0][c=z%x]=a[b?b-1:2][c]=a[b][c?c-1:2]=a[y+~b?b+1:y-3][c]=a[b][++c<x?c:x-3]=`+`).join`\n`

1

Befunge,175个字节

>&:10p60p&:00p&1-:10g%:20p\10g/:30p::1+00g-!-\!+2-50p::1+1v
vg02g01*`\4\`0:-g05\!-g03:g00p01-1<g06+p00-1<p04-2+!\-!-g0<
>-!*\10g40g-:0`\4\`**+!2*"+"+10g:#^_$5500g:#^_$$$>:#,_@

在线尝试!

第一行(和第二行的短延续)是读取参数并计算一些常量的位置-位置的坐标(lxly),以及调整后的坐标,这些坐标说明了边缘:

ax = lx - (lx+1==w) + (lx==0) - 2 
ay = ly - (ly+1==h) + (ly==0) - 2

第二行和第三行包含网格高度和宽度上的主循环,执行路径最初从右到左,然后转向第三行从左到右。对于网格中的每个坐标(gxgy),我们计算以下条件:

(gx==lx && gy>ay && gy<ay+4) || (gy==ly && gx>ax && gx<ax+4)

如果该条件为true "+",则将a压入堆栈,如果为false,则压入a "-"。为了避免在这里分支,我们实际上只是在推送43 + 2 * !condition(43是ASCII值加号,而45是减号)。

循环完成后,代码的最后一部分只是一个标准输出例程,该例程输出堆栈中的所有内容。


0

JavaScript(ES6),170

仍可打高尔夫球

(w,h,z,t=--z%w,u=z/w|0,r='-'.repeat(w),S=(f,j)=>(r+f+r).substr(w-j,w))=>[...Array(h)].map((q=u-!!u-!(u+1-h),y)=>y-u?y>=q&y<q+3?S('+',t):r:S('+++',t-!!t-!(t+1-w))).join`
`

少打高尔夫球

(w, h, z
, t=--z%w
, u=z/w|0
, r='-'.repeat(w)
, S=(f,j)=>(r+f+r).substr(w-j,w)
) => [...Array(h)].map(
    (q = u-!!u-!(u+1-h), 
     y) => y-u?y>=q&y<q+3?S('+',t):r:S('+++',t-!!t-!(t+1-w))
).join`\n`

测试

F=
(w,h,z,t=--z%w,u=z/w|0,r='-'.repeat(w),S=(f,j)=>(r+f+r).substr(w-j,w))=>[...Array(h)].map((q=u-!!u-!(u+1-h),y)=>y-u?y>=q&y<q+3?S('+',t):r:S('+++',t-!!t-!(t+1-w))).join`
`

function update() {
  var [x,y,z] = I.value.match(/\d+/g)
  O.textContent = F(+x,+y,+z)
}

update()
<input value='5 6 10' oninput='update()' id=I>
<pre id=O>

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.