Scatola XY con bordi rimbalzanti con un pennarello su Z


10

Poster per la prima volta in agguato da molto tempo qui.

Scrivi un programma che accetta 3 input: X, Y e Z.

  • X = attraverso (colonne)
  • Y = giù (righe)
  • Z = Indicatore di posizione

Il programma dovrebbe quindi stampare una griglia visiva tra X e Y verso il basso. Questa griglia può essere composta da qualsiasi carattere tranne "+". A ogni 'posizione' viene assegnato un numero indice, contando da 1 a coordinate 1, 1 e poi verso il basso fino alla fine.

X e Y saranno sempre almeno 3 e Z non sarà mai più grande di X * Y.

Z rappresenterà la posizione stampata come "+", sulla posizione e 1 carattere a sinistra, a destra, su e giù. Per esempio:

 +
+++
 +

Infine, se i caratteri + intercettano i bordi (più in alto, più a sinistra, più a destra e / o più in basso del bordo), allora il + dovrebbe rimbalzare lungo lo stesso asse e traboccare dall'altro lato.

Esempi: input = 5, 5, 13

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

Input = 10, 10, 10

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

Input = 10, 10, 21

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

Modifica: esempio non quadrato 16,3,32

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

Penso di aver coperto tutto. Non ci dovrebbero essere limiti per l'input, ma se il tuo programma lo richiede, limitalo a 64 * 64.

Punto bonus (posso farlo?): L' ingresso Z non dovrebbe essere> X * Y, ma se è più grande di Y * Z, quindi emettere il centro + al centro della griglia. EDIT: l' ingresso Z non può essere maggiore di X * Y

Modifica 2 :. Ho apportato alcune modifiche a X e Y per essere più chiari

Questo è il codice golf, il codice più corto vince.


Benvenuto in Puzzle di programmazione e Code Golf! Questa è una bella sfida, ma raccomando di pubblicare sfide future su Sandbox dove possono ricevere feedback prima di essere pubblicati sul sito principale.
Betseg,

In cosa consiste il "Punto bonus"? L'implementazione di quella funzione esatta offre un vantaggio al conteggio dei byte? In tal caso, dovresti notare esplicitamente quanto è grande un bonus. (Come nota a margine, i bonus nel code-golf sono generalmente scoraggiati )
James

@betseg - oops. Mi dispiace, spero di poter guadagnare un po 'di interesse dopo aver perso quel passaggio importante.
Jake Harry,

@DrMcMoylex - Notato, grazie, ho rimosso il bonus ora.
Jake Harry,

2
Non dovresti accettare una risposta nel primo giorno di pubblicazione, sono abbastanza sicuro che un golfista MATL / Jelly / 05AB1E lo vedrà e lo risolverà in molti meno byte di Python. Penso che molte persone tendano ad aspettare almeno una settimana.
Kade,

Risposte:


1

Python 2, 172 171 byte

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

Modifica: salvato 1 byte convertendolo in funzione.

Precedente (più leggibile):

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

bel lavoro, penso di averlo rotto con 10.100.300. Non sembra comportarsi al limite dell'estrema destra?
Jake Harry,

@JakeHarry Funziona per me: ideone.com/G2fwV1
TFeld

Ah, sono un fantoccio, l'ide che ho usato non era a larghezza fissa, quindi tecnicamente era giusto, ma non per gli occhi.
Jake Harry,

1

JavaScript (ES6), 165 byte

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

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

Provalo online!

La prima riga (e una breve continuazione sulla seconda riga) è dove vengono letti i parametri e vengono calcolate alcune costanti: le coordinate della posizione ( lx , ly ), nonché le coordinate regolate che spiegano il rimbalzo del bordi:

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

La seconda e la terza linea contengono gli anelli principali sopra l'altezza e la larghezza della griglia, il percorso di esecuzione va inizialmente da destra a sinistra prima di girare intorno alla terza linea da sinistra a destra. Per ogni coordinata nella griglia ( gx , gy ) calcoliamo la seguente condizione:

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

Se tale condizione è vera, spingiamo "+"a nello stack, se falso spingiamo a "-". Per evitare la ramificazione qui, stiamo semplicemente spingendo 43 + 2 * !condition(43 è il valore ASCII di più e 45 è meno).

Una volta terminati i loop, l'ultimo bit di codice è solo una routine di output standard che stampa tutto nello stack.


0

JavaScript (ES6), 170

Ancora golfabile

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

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

Test

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>

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.