Odbite pudełko XY ze znacznikiem w punkcie Z

10

Plakat po raz pierwszy czyhającego tutaj.

Napisz program, który pobierze 3 wejścia: X, Y i Z.

  • X = w poprzek (kolumny)
  • Y = w dół (rzędy)
  • Z = znacznik lokalizacji

Program powinien następnie wydrukować siatkę wizualną X w poprzek i Y w dół. Ta siatka może składać się z dowolnego znaku oprócz „+”. Każda „lokalizacja” otrzymuje numer indeksu, licząc w górę od 1 o współrzędnej 1, 1 w poprzek, a następnie w dół do końca.

X i Y zawsze będą wynosić co najmniej 3, a Z nigdy nie będzie większe niż X * Y.

Z reprezentuje lokalizację, która jest drukowana jako „+”, w lokalizacji, a także 1 znak w lewo, w prawo, w górę iw dół. Na przykład:

 +
+++
 +

Na koniec, jeśli znaki + przechwycą krawędzie (najbardziej na górze, najbardziej na lewo, na prawo i / lub najbardziej na dół), to + powinien odbić się do tyłu wzdłuż tej samej osi i przelać drugą stronę.

Przykłady: Dane wejściowe = 5, 5, 13

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

Wejście = 10, 10, 10

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

Wejście = 10, 10, 21

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

Edycja: przykład inny niż kwadrat 16,3,32

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

Myślę, że wszystko omówiłem. Dane wejściowe nie powinny być ograniczone, ale jeśli Twój program tego wymaga, ogranicz go do wartości 64 * 64.

Punkt bonusowy (czy mogę to zrobić?): Dane wejściowe Z nie powinny być> X * Y, ale jeśli są większe niż Y * Z, wyślij środek + na środek siatki. EDYCJA: Wejście Z nie może być większe niż X * Y

Edycja 2 :. Wprowadziłem pewne zmiany w X i Y, miejmy nadzieję, że będą jaśniejsze

To jest kod golfowy, wygrywa najkrótszy kod.

Jake Harry
źródło
Witamy w Programowaniu zagadek i Code Golf! To miłe wyzwanie, ale zalecam publikowanie przyszłych wyzwań w piaskownicy, gdzie mogą uzyskać opinie przed opublikowaniem na głównej stronie.
betseg
Na czym polega „punkt bonusowy”? Czy wdrożenie tej dokładnej funkcji ma przewagę nad liczbą bajtów? Jeśli tak, powinieneś wyraźnie zauważyć, ile to bonus. (Na marginesie, bonusy w golfie kodowym są ogólnie odradzane )
James
@betseg - ups. Przepraszam, mam nadzieję, że uda mi się zyskać zainteresowanie po tym ważnym kroku.
Jake Harry
@DrMcMoylex - Zauważono, że dzięki, teraz usunąłem bonus.
Jake Harry
2
Nie powinieneś przyjmować odpowiedzi w pierwszym dniu publikacji, jestem całkiem pewny, że golfista MATL / Jelly / 05AB1E to zobaczy i rozwiąże w znacznie mniejszej liczbie bajtów niż Python. Myślę, że większość ludzi zwykle czeka co najmniej tydzień.
Kade

Odpowiedzi:

1

Python 2, 172 171 bajtów

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

Edycja: Zapisano 1 bajt, konwertując na funkcję.

Poprzedni (bardziej czytelny):

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))
TFeld
źródło
niezła robota, myślę, że jednak zepsułem ją z 10 100 300. Nie wydaje się zachowywać na skrajnie prawej granicy?
Jake Harry
@JakeHarry Działa dla mnie: ideone.com/G2fwV1
TFeld
Ahh, jestem głupkiem, ide, którego użyłem, nie miał ustalonej szerokości, więc był technicznie właściwy, tylko nie dla oczu.
Jake Harry,
1

JavaScript (ES6), 165 bajtów

(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`
Neil
źródło
1

Befunge, 175 bajtów

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

Wypróbuj online!

Pierwsza linia (i krótka kontynuacja do drugiej linii) to miejsce, w którym odczytuje się parametry i oblicza kilka stałych - współrzędne położenia ( lx , ly ), a także dostosowane współrzędne, które odpowiadają za odbijanie się krawędzie:

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

Druga i trzecia linia zawierają główne pętle na wysokości i szerokości siatki, ścieżka wykonania początkowo biegnie od prawej do lewej, zanim skręci na trzecią linię od lewej do prawej. Dla każdej współrzędnej w siatce ( gx , gy ) obliczamy następujący warunek:

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

Jeśli ten warunek jest prawdziwy, pchamy a "+"na stos, a jeśli false, pchamy a "-". Aby uniknąć rozgałęziania się tutaj, naprawdę popychamy 43 + 2 * !condition(43 oznacza wartość ASCII plus, a 45 minus).

Po zakończeniu pętli ostatni fragment kodu jest tylko standardową procedurą wyjściową, która drukuje wszystko na stosie.

James Holderness
źródło
0

JavaScript (ES6), 170

Nadal gra w golfa

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

Mniej golfa

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

edc65
źródło