Прямоугольная коробка XY с маркером на Z

10

Долгое время скрывался здесь впервые.

Напишите программу, которая принимает 3 входа: X, Y и Z.

  • X = поперек (столбцы)
  • Y = вниз (строки)
  • Z = Маркер местоположения

Затем программа должна распечатать визуальную сетку X поперек и Y вниз. Эта сетка может быть сделана из любого символа, кроме "+". Каждому «местоположению» присваивается порядковый номер, начиная с 1 в точке с координатами 1, 1 поперек и затем до конца.

X и Y всегда будут по крайней мере 3, а Z никогда не будет больше, чем X * Y.

Z будет представлять местоположение, которое печатается в виде «+», на месте, а также 1 символ влево, вправо, вверх и вниз. Например:

 +
+++
 +

Наконец, если символы + будут пересекать края (самый верхний, самый левый, самый правый и / или самый нижний край), то + должен отскочить назад по той же оси и переполнить другую сторону.

Примеры: Input = 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, чтобы быть понятнее

Это код гольф, самый короткий код выигрывает.

Джейк Гарри
источник
Добро пожаловать в Программирование головоломок и Code Golf! Это хороший вызов, но я рекомендую публиковать будущие тесты в Песочнице, где они могут получить обратную связь, прежде чем публиковаться на основном сайте.
betseg
Что такое «Бонусная точка»? Дает ли реализация этой точной функции преимущество в количестве байтов? Если это так, вы должны четко отметить, насколько велик бонус. (Как примечание, бонусы в Code-Golf, как правило, не приветствуются )
Джеймс
@betseg - упс Извините, надеюсь, я смогу проявить некоторый интерес, пропустив этот важный шаг.
Джейк Гарри
@DrMcMoylex - отметил, спасибо, удалили бонус сейчас.
Джейк Гарри
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))
TFeld
источник
хорошая работа, думаю, что я сломал это хотя с 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 "+"в стек, если ложно, мы помещаем 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>

edc65
источник