กล่อง XY ขอบ Bouncey ที่มีเครื่องหมายที่ Z


10

lurker นานมากโปสเตอร์ครั้งแรกที่นี่

เขียนโปรแกรมที่มี 3 อินพุต: X, Y และ Z

  • X = ข้าม (คอลัมน์)
  • Y = ลง (แถว)
  • Z = เครื่องหมายบอกตำแหน่ง

โปรแกรมควรพิมพ์กริด visual X ข้ามและ Y ลง กริดนี้สามารถสร้างตัวละครใดก็ได้ยกเว้น "+" 'สถานที่ตั้ง' แต่ละแห่งจะได้รับหมายเลขดัชนีนับจาก1ที่พิกัด 1, 1 ข้ามและจากนั้นลงไปจนถึงจุดสิ้นสุด

X และ Y จะต้องมีอย่างน้อย 3 เสมอและ Z จะไม่มีวันยิ่งใหญ่กว่าX * Yนี้

Z จะแสดงตำแหน่งที่พิมพ์เป็น "+" บนตำแหน่งรวมทั้งตัวอักษรซ้ายขวาขึ้นและลง 1 ตัว ตัวอย่างเช่น:

 +
+++
 +

สุดท้ายหากอักขระ + จะดักจับขอบ (ส่วนบนสุด, ซ้ายสุด, ขวาสุดและ / หรือลงสุดขอบ), + จะเด้งกลับไปตามแกนเดียวกันและล้นด้านอื่น ๆ

ตัวอย่าง: อินพุต = 5, 5, 13

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

อินพุต = 10, 10, 10

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

อินพุต = 10, 10, 21

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

แก้ไข: ไม่ใช่สแควร์ตัวอย่าง 16,3,32

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

ฉันคิดว่าฉันได้ครอบคลุมทุกอย่าง ไม่ควรมีการ จำกัด อินพุต แต่ถ้าโปรแกรมของคุณต้องการให้ปิดที่ 64 * 64

จุดโบนัส (ฉันสามารถทำสิ่งนั้นได้หรือไม่?):อินพุต Z ไม่ควร> X * Y แต่ถ้ามันใหญ่กว่า Y * Z ให้เอาจุดศูนย์กลาง + ไปที่กึ่งกลางของตาราง แก้ไข:อินพุต Z ไม่สามารถมากกว่า X * Y

แก้ไข 2: ทำการเปลี่ยนแปลง X และ Y เพื่อหวังว่าจะชัดเจนขึ้น

นี่คือรหัสกอล์ฟรหัสที่สั้นที่สุดชนะ


ยินดีต้อนรับสู่การเขียนโปรแกรมปริศนาและรหัสกอล์ฟ! นี่เป็นความท้าทายที่ดี แต่ฉันขอแนะนำให้โพสต์ความท้าทายในอนาคตไปยังSandboxซึ่งพวกเขาสามารถรับข้อเสนอแนะก่อนโพสต์ในเว็บไซต์หลัก
betseg

"คะแนนโบนัส" เกี่ยวกับอะไร? การนำคุณลักษณะที่แน่นอนไปใช้นั้นให้ประโยชน์กับจำนวนไบต์ของคุณหรือไม่ ถ้าเป็นเช่นนั้นคุณควรทราบอย่างชัดเจนว่าโบนัสนั้นใหญ่แค่ไหน (ตามหมายเหตุด้านข้างโบนัสในสนามกอล์ฟมักจะไม่ได้รับการสนับสนุน )
James

@betseg - โอ๊ะโอ ขออภัยหวังว่าฉันจะได้รับความสนใจโดยไม่พลาดขั้นตอนสำคัญนั้น
Jake Harry

@DrMcMoylex - สังเกตแล้วขอบคุณได้ลบโบนัสทันที
Jake Harry

2
คุณไม่ควรรับคำตอบในวันแรกของการโพสต์ฉันมั่นใจว่านักกอล์ฟ MATL / Jelly / 05AB1E จะเห็นสิ่งนี้และแก้มันด้วยไบท์น้อยกว่า Python ฉันคิดว่าคนส่วนใหญ่มักจะรออย่างน้อยหนึ่งสัปดาห์
Kade

คำตอบ:


1

Python 2, 172 171 ไบต์

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

แก้ไข: บันทึก 1 ไบต์โดยแปลงเป็นฟังก์ชัน

ก่อนหน้า (อ่านเพิ่มเติม):

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

เป็นงานที่ดีคิดว่าฉันทำลายมันด้วย 10,100,300 ดูเหมือนจะไม่ประพฤติตนที่ขอบด้านขวาสุดใช่ไหม
Jake Harry

@ JakeHarry ใช้งานได้สำหรับฉัน: ideone.com/G2fwV1
TFeld

Ahh ฉันเป็นลูกไล่อุดมคติที่ฉันใช้ไม่ใช่ความกว้างคงที่ดังนั้นจึงเป็นเทคนิคที่ถูกต้องไม่ใช่แค่กับดวงตา
Jake Harry

1

JavaScript (ES6), 165 ไบต์

(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 ไบต์

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

ลองออนไลน์!

บรรทัดแรก (และความต่อเนื่องสั้น ๆ ไปยังบรรทัดที่สอง) คือตำแหน่งที่พารามิเตอร์ถูกอ่านและคำนวณค่าคงที่สองสามค่า - พิกัดของที่ตั้ง ( lx , ly ) เช่นเดียวกับพิกัดที่ปรับซึ่งสะท้อนการสะท้อน ขอบ:

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

บรรทัดที่สองและสามประกอบด้วยลูปหลักเหนือความสูงและความกว้างของกริดเส้นทางของการดำเนินการไปจากขวาไปซ้ายในตอนแรกก่อนที่จะหันไปยังบรรทัดที่สามไปทางซ้ายไปขวา สำหรับแต่ละพิกัดในกริด ( gx , gy ) เราคำนวณเงื่อนไขต่อไปนี้:

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

ถ้าเงื่อนไขที่เป็นจริงที่เราผลักดันเข้าสู่กองถ้าเท็จเราผลักดัน"+" "-"เพื่อหลีกเลี่ยงการแตกสาขาที่นี่เราแค่ผลัก43 + 2 * !condition(43 เป็นค่า ASCII ของบวกและ 45 ถูกลบ)

เมื่อลูปเสร็จสิ้นบิตสุดท้ายของรหัสจะเป็นเพียงแค่เอาต์พุตมาตรฐานที่พิมพ์ออกมาทุกอย่างบนสแต็ก


0

JavaScript (ES6), 170

ยังคงเล่นกอล์ฟได้

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

น้อย golfed

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

ทดสอบ

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>

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.