Коробка 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.