Caja XY con bordes de rebote con un marcador en Z


10

Cartel de la primera vez al acecho por mucho tiempo aquí.

Escriba un programa que tome 3 entradas: X, Y y Z.

  • X = a través (columnas)
  • Y = abajo (filas)
  • Z = marcador de ubicación

El programa debe imprimir una cuadrícula visual X a través e Y hacia abajo. Esta cuadrícula se puede hacer de cualquier carácter, excepto "+". Cada 'ubicación' recibe un número de índice, contando desde 1 en la coordenada 1, 1 a través y luego hacia abajo hasta el final.

X e Y siempre serán al menos 3, y Z nunca será más grande que X * Y.

Z representará la ubicación que se imprime como "+", en la ubicación, así como 1 carácter a la izquierda, derecha, arriba y abajo. Por ejemplo:

 +
+++
 +

Finalmente, si los caracteres + interceptarían los bordes (más arriba, más a la izquierda, más a la derecha y / o más abajo), entonces el + debería rebotar a lo largo del mismo eje y desbordar el otro lado.

Ejemplos: Entrada = 5, 5, 13

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

Entrada = 10, 10, 10

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

Entrada = 10, 10, 21

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

Editar: ejemplo no cuadrado 16,3,32

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

Creo que lo he cubierto todo. No debería haber límite para la entrada, pero si su programa lo requiere, limítelo a 64 * 64.

Punto de bonificación (¿puedo hacer eso?): La entrada Z no debe ser> X * Y, pero si es más grande que Y * Z, entonces envíe el centro + al centro de la cuadrícula. EDITAR: la entrada Z no puede ser mayor que X * Y

Edición 2 :. Hice algunos cambios en X e Y para que sea más claro

Este es el código de golf, el código más corto gana.


¡Bienvenido a Programming Puzzles y Code Golf! Este es un buen desafío, pero recomiendo publicar futuros desafíos en el Sandbox donde puedan obtener comentarios antes de ser publicados en el sitio principal.
— betseg

¿De qué se trata el "punto de bonificación"? ¿Implementar esa característica exacta le da una ventaja a su número de bytes? Si lo hace, debe observar explícitamente qué tan grande es un bono. (Como nota al margen, las bonificaciones en el código de golf generalmente se desaconsejan )
— James

@betseg - ¡Uy! Lo siento, espero poder ganar algo de interés por haber perdido ese importante paso.
— Jake Harry

@DrMcMoylex - Notado, gracias, he eliminado la bonificación ahora.
— Jake Harry

2
No debería aceptar una respuesta el primer día de publicación, estoy bastante seguro de que un golfista MATL / Jelly / 05AB1E verá esto y lo resolverá en mucho menos bytes que Python. Creo que la mayoría de las personas tienden a esperar al menos una semana.
— Kade

Respuestas:


1

Python 2, 172 171 bytes

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))

Editar: guardado 1 bytes mediante la conversión a la función.

Anterior (más legible):

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))

buen trabajo, creo que lo rompí con 10,100,300. ¿No parece comportarse en el límite de la extrema derecha?
— Jake Harry

@JakeHarry funciona para mí: ideone.com/G2fwV1
— TFeld

Ahh, soy un títere, el ide que utilicé no era de ancho fijo, por lo que era técnicamente correcto, pero no para los ojos.
— Jake Harry

1

JavaScript (ES6), 165 bytes

(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 bytes

>&: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:#^_$$$>:#,_@

Pruébalo en línea!

La primera línea (y una breve continuación de la segunda línea) es donde se leen los parámetros y se calculan algunas constantes: las coordenadas de la ubicación ( lx , ly ), así como las coordenadas ajustadas que explican el rebote del bordes:

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

La segunda y tercera líneas contienen los bucles principales sobre la altura y el ancho de la cuadrícula, la ruta de ejecución va de derecha a izquierda inicialmente antes de girar hacia la tercera línea de izquierda a derecha. Para cada coordenada en la cuadrícula ( gx , gy ) calculamos la siguiente condición:

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

Si esa condición es verdadera, empujamos a "+"a la pila, si es falso empujamos a "-". Para evitar ramificaciones aquí, en realidad solo estamos presionando 43 + 2 * !condition(43 es el valor ASCII de más y 45 es menos).

Una vez que los bucles han terminado, el bit final de código es solo una rutina de salida estándar que imprime todo en la pila.


0

JavaScript (ES6), 170

Todavía golfable

(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`
`

Menos golf

(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`

Prueba

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>

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.