Z에 마커가있는 바운스 가장자리 XY 상자


10

오랜만에 처음으로 여기에 포스터

X, Y 및 Z의 3 가지 입력을받는 프로그램을 작성하십시오.

  • 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가 약간 더 명확하게 변경되었습니다.

이것은 코드 골프, 가장 짧은 코드 승리입니다.


프로그래밍 퍼즐과 코드 골프에 오신 것을 환영합니다! 이것은 좋은 도전이지만 , 메인 사이트에 게시하기 전에 피드백을 얻을 수 있는 샌드 박스에 향후 도전 과제를 게시하는 것이 좋습니다 .
betseg

"보너스 포인트"란 무엇입니까? 정확한 기능을 구현하면 바이트 수에 이점이 있습니까? 그렇다면 보너스가 얼마나 큰지 명시 적으로 기록해야합니다. (부수적으로, 코드 골프의 보너스는 일반적으로 권장하지 않습니다. )
James

@betseg-죄송합니다. 미안하지만, 그 중요한 단계를 놓친 것에 관심이 생길 수 있기를 바랍니다.
Jake Harry

@DrMcMoylex-감사합니다. 이제 보너스를 제거했습니다.
Jake Harry

2
첫 게시일에 답을 받아들이지 말아야합니다. MATL / Jelly / 05AB1E 골퍼가 이것을보고 파이썬보다 훨씬 적은 바이트로이를 해결할 것이라고 확신합니다. 나는 대부분의 사람들이 적어도 일주일을 기다리는 경향이 있다고 생각합니다.
Kade

답변:


1

파이썬 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으로 돌파했다고 생각한다. 가장 오른쪽 경계에서 동작하지 않는 것 같습니까?
Jake Harry

@JakeHarry 저를 위해 일합니다 : ideone.com/G2fwV1
TFeld

아, 나는 stooge이고, 내가 사용했던 ide는 고정 너비가 아니기 때문에 기술적으로 옳았 고 눈에는 맞지 않았습니다.
Jake Harry

1

자바 스크립트 (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:#^_$$$>:#,_@

온라인으로 사용해보십시오!

첫 번째 라인 (그리고 두 번째 라인으로의 짧은 연속)은 매개 변수를 읽고 몇 가지 상수를 계산하는 위치입니다-위치의 좌표 ( lx , ly )와 튀는 것을 설명하는 조정 된 좌표 가장자리 :

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

두 번째와 세 번째 줄에는 그리드의 높이와 너비에 대한 기본 루프가 포함되어 있으며 실행 경로는 처음부터 오른쪽에서 왼쪽으로 이동하고 왼쪽에서 오른쪽으로 이동하는 세 번째 줄로 돌아갑니다. 그리드의 각 좌표 ( gx , gy )에 대해 다음 조건을 계산합니다.

(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

자바 스크립트 (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>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.