Z'de bir işaretleyici ile bouncey kenarlı XY kutusu


10

Uzun zamandır lurker ilk kez poster burada.

3 giriş alan bir program yazın: X, Y ve Z.

  • X = genelinde (sütunlar)
  • Y = aşağı (satırlar)
  • Z = Konum İşaretleyici

Program daha sonra X karşısında ve Y aşağı görsel bir ızgara yazdırmalıdır. Bu ızgara "+" dışında herhangi bir karakterden yapılabilir. Her 'konum', 1 koordinatında 1'den 1'e kadar ve sonra sona kadar aşağıya doğru sayan bir dizin numarası verilir .

X ve Y her zaman en az 3 olacak ve Z asla daha büyük olmayacak X * Y.

Z, konuma "+" olarak basılan konumu ve sol, sağ, yukarı ve aşağı 1 karakteri temsil edecektir. Örneğin:

 +
+++
 +

Son olarak, + karakterleri kenarları keserse (en üst, en sol, en sağ ve / veya en kenardan aşağı), + aynı eksen boyunca geri sıçramalı ve diğer taraftan taşmalıdır.

Örnekler: Giriş = 5, 5, 13

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

Giriş = 10, 10, 10

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

Giriş = 10, 10, 21

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

Düzenleme: kare olmayan örnek 16,3,32

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

Sanırım her şeyi ele aldım. Giriş için bir sınır olmamalıdır, ancak programınız gerektiriyorsa 64 * 64'te kapatın.

Bonus noktası (bunu yapabilir miyim?): Z girişi> X * Y olmamalı, ancak Y * Z'den büyükse, orta + ızgarasının ortasına çıkar. DÜZENLEME: Z girişi X * Y'den büyük olamaz

Düzenleme 2 :. Umarım daha net olmak için X ve Y'de bazı değişiklikler yaptı

Bu kod golf, en kısa kod kazanır.


Programlama Bulmacaları ve Kod Golf hoş geldiniz! Bu güzel bir meydan okuma, ancak ana siteye gönderilmeden önce geri bildirim alabilecekleri Sandbox'a gelecekteki zorlukları göndermenizi tavsiye ederim .
16'da

"Bonus puanı" ne hakkında? Bu özelliğin uygulanması bayt sayımınıza avantaj sağlıyor mu? Varsa, bir bonusun ne kadar büyük olduğunu açıkça not etmelisiniz. (Bir yan not olarak, kod golfündeki bonuslar genellikle önerilmez )
James

@betseg - ayy. Üzgünüm, umarım bu önemli adımı kaçırmış olabilirim.
Jake Harry

@DrMcMoylex - Teşekkürler, teşekkürler, bonusu şimdi çıkardılar.
Jake Harry

2
Gönderinin ilk gününde bir cevabı kabul etmemelisiniz, bir MATL / Jelly / 05AB1E golfçüsünün bunu göreceğinden ve Python'dan çok daha az baytta çözeceğinden oldukça eminim. Bence çoğu insan en az bir hafta beklemektedir.
Kade

Yanıtlar:


1

Python 2, 172171 bayt

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

Düzenleme: İşleve dönüştürülerek 1 bayt kaydedildi.

Önceki (daha okunabilir):

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

güzel iş, 10.100.300 ile kırdı düşünüyorum. En sağ sınırda gibi görünmüyor mu?
Jake Harry

@JakeHarry Benim için çalışıyor: ideone.com/G2fwV1
TFeld

Ahh, ben bir yardakçıyım, kullandığım ide sabit genişlik değildi, bu yüzden teknik olarak doğru, gözler için değil.
Jake Harry

1

JavaScript (ES6), 165 bayt

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

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

Çevrimiçi deneyin!

İlk satır (ve ikinci satıra kısa bir devam) parametrelerin okunduğu ve birkaç sabitin hesaplandığı yerdir - konumun koordinatları ( lx , ly ) ve ayrıca sıçramanın neden olduğu ayarlanmış koordinatlar kenarlar:

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

İkinci ve üçüncü satırlar, ızgaranın yüksekliği ve genişliği üzerindeki ana halkaları içerir; yürütme yolu, soldan sağa doğru giden üçüncü satıra dönmeden önce sağdan sola gider. Izgaradaki her bir koordinat için ( gx , gy ) aşağıdaki koşulu hesaplıyoruz:

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

Bu koşul doğruysa, "+"yığının üstüne a doğru iteriz, yanlışsa a tuşuna basarız "-". Burada dallanmayı önlemek için gerçekten itiyoruz 43 + 2 * !condition(43 artı ASCII değeri ve 45 eksi).

Döngüler bittikten sonra, son kod biti yalnızca yığındaki her şeyi basan standart bir çıktı yordamdır.


0

JavaScript (ES6), 170

Hala golf oynayabilir

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

Daha az 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`

Ölçek

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>

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.