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.