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.


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

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`

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.


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>

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.