Коробка XY, що підстрибується, із маркером на Z


10

Тут давно прихований перший плакат.

Напишіть програму, яка займає 3 входи: X, Y і Z.

  • X = поперек (стовпці)
  • Y = вниз (рядки)
  • Z = Маркер розташування

Потім програма повинна надрукувати візуальну сітку 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, то виведіть центр + до середини сітки. EDIT: Вхід Z не може перевищувати X * Y

Редагувати 2:. Були внесені деякі зміни в X і Y, щоб, мабуть, бути зрозумілішими

Це код гольфу, найкоротший виграш коду.


Ласкаво просимо до головоломки програмування та коду для гольфу! Це приємне завдання, але я рекомендую розміщувати майбутні виклики в пісочниці, де вони зможуть отримати зворотній зв'язок перед тим, як розмістити їх на головному сайті.
— betseg

Про що "Бонусна точка"? Чи реалізація цієї точної функції дає перевагу вашому рахунку байтів? Якщо це так, вам слід чітко зазначити, наскільки великий бонус. (Як зауваження, бонуси в коді-гольфі, як правило, не рекомендуються )
— Джеймс

@betseg - ой. Вибачте, сподіваюся, я можу зацікавитись, пропустивши цей важливий крок.
— Джейк Гаррі

@DrMcMoylex - Помітив, спасибі, бонус видалено зараз.
— Джейк Гаррі

2
Ви не повинні приймати відповідь у перший день публікації, я впевнений, що гольфіст MATL / Jelly / 05AB1E побачить це і вирішить його набагато менше байтів, ніж Python. Я думаю, що більшість людей прагнуть чекати хоча б тиждень.
— Каде

Відповіді:


1

Пітон 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. Здається, він не веде себе на крайній правій межі?
— Джейк Гаррі

@JakeHarry працює для мене: ideone.com/G2fwV1
— TFeld

А-а-а, я стожер, ідея, яку я використав, не була фіксованої ширини, тому це було технічно правильно, просто не для очей.
— Джейк Гаррі

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)

Якщо ця умова справжня, ми натискаємо a "+"на стек, якщо false - натискаємо a "-". Щоб уникнути розгалуження тут, ми насправді просто натискаємо 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`
`

Менше гольфу

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.