Kotak XY bouncingy-bermata dengan spidol di Z

10

Poster lama pertama kali bersembunyi di sini.

Tulis program yang membutuhkan 3 input: X, Y dan Z.

  • X = lintas (kolom)
  • Y = turun (baris)
  • Z = Penanda Lokasi

Program kemudian harus mencetak grid visual X menyeberang dan Y turun. Kisi ini dapat dibuat dari karakter apa pun kecuali "+". Setiap 'lokasi' diberi nomor indeks, dihitung dari 1 pada koordinat 1, 1 melintasi dan kemudian turun hingga akhir.

X dan Y akan selalu setidaknya 3, dan Z tidak akan pernah lebih besar dari X * Y.

Z akan mewakili lokasi yang dicetak sebagai "+", di lokasi serta 1 karakter kiri, kanan, atas dan bawah. Sebagai contoh:

 +
+++
 +

Akhirnya, jika karakter + akan memotong tepi (paling atas, paling kiri, paling kanan dan / atau paling bawah), maka + harus memantul kembali di sepanjang sumbu yang sama dan melimpah di sisi lain.

Contoh: Input = 5, 5, 13

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

Input = 10, 10, 10

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

Input = 10, 10, 21

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

Sunting: contoh non persegi 16,3,32

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

Saya pikir saya sudah membahas semuanya. Seharusnya tidak ada batasan untuk input, tetapi jika program Anda mengharuskan, tutup di 64 * 64.

Poin bonus (dapatkah saya melakukannya?): Input Z tidak boleh> X * Y, tetapi jika lebih besar dari Y * Z, maka output pusat + ke tengah grid. EDIT: Input Z tidak boleh lebih besar dari X * Y

Edit 2 :. Buat beberapa perubahan pada X dan Y agar mudah-mudahan menjadi lebih jelas

Ini golf kode, kode terpendek menang.

Jake Harry
sumber
Selamat Datang di Programming Puzzles dan Code Golf! Ini adalah tantangan yang bagus, tapi saya sarankan memposting tantangan di masa depan ke Sandbox di mana mereka bisa mendapatkan umpan balik sebelum diposting ke situs utama.
betseg
Tentang "Poin Bonus" apa? Apakah menerapkan fitur persis itu memberikan keuntungan bagi byte-count Anda? Jika ya, Anda harus secara eksplisit mencatat seberapa besar bonus itu. (Sebagai catatan, bonus dalam kode-golf umumnya tidak disarankan )
James
@betseg - oops. Maaf, semoga saya bisa mendapatkan minat setelah melewatkan langkah penting itu.
Jake Harry
@DrMcMoylex - Tercatat, terima kasih, telah menghapus bonus sekarang.
Jake Harry
2
Anda seharusnya tidak menerima jawaban di hari pertama posting, saya cukup yakin pegolf MATL / Jelly / 05AB1E akan melihat ini dan menyelesaikannya dalam byte yang jauh lebih sedikit daripada Python. Saya pikir kebanyakan orang cenderung menunggu setidaknya seminggu.
Kade

Jawaban:

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

Sunting: Disimpan 1 byte dengan mengonversi fungsinya.

Sebelumnya (lebih mudah dibaca):

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
sumber
pekerjaan yang bagus, saya pikir saya memecahkannya dengan 10.100.300. Tampaknya tidak berperilaku di batas paling kanan?
Jake Harry
@JakeHarry Pekerjaan bagi saya: ideone.com/G2fwV1
TFeld
Ahh, saya antek, ide yang saya gunakan tidak lebar sehingga secara teknis benar, hanya saja tidak di mata.
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`
Neil
sumber
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:#^_$$$>:#,_@

Cobalah online!

Baris pertama (dan kelanjutan singkat ke baris kedua) adalah di mana parameter dibaca dan beberapa konstanta dihitung - koordinat lokasi ( lx , ly ), serta koordinat yang disesuaikan yang menjelaskan memantul dari tepi:

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

Baris kedua dan ketiga berisi loop utama di atas tinggi dan lebar grid, jalur eksekusi dari kanan ke kiri pada awalnya sebelum berbalik ke garis ketiga ke kiri ke kanan. Untuk setiap koordinat dalam kotak ( gx , gy ) kami menghitung kondisi berikut:

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

Jika kondisi itu benar, kita dorong a "+"ke stack, jika salah kita dorong a "-". Untuk menghindari percabangan di sini, kami benar-benar hanya mendorong 43 + 2 * !condition(43 menjadi nilai ASCII plus dan 45 menjadi minus).

Setelah loop selesai, bit terakhir kode hanyalah rutin output standar yang mencetak semua yang ada di stack.

James Holderness
sumber
0

JavaScript (ES6), 170

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

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

Uji

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
sumber