Казкові шахові «стрибаючі» моделі руху


14

Стрибун категорія чарівної шахової фігури , яка рухається по «стрибків» . Звичайний лицар - це (1,2) -ліфер, тобто кожен хід передбачає переміщення відстані 1 квадрата в ортогональному напрямку та 2 квадратів у перпендикулярному напрямку.

.o.o.
o...o
..N..
o...o
.o.o.

Існує безліч різних стрибаючих людей. (1,3) -липер називається Довгим лицарем, або Верблюдом. Її схема руху виглядає приблизно так:

..o.o..
.......
o.....o
...L...
o.....o
.......
..o.o..

Є також (2,2) Alfil ...

o...o
.....
..A..
.....
o...o

... і навіть (0,1) Вазір.

.o.
oWo
.o.

Виклик

Давши пару чисел як вхід, виведіть відповідну діаграму руху. Ви можете написати програму або функцію, введення якої надається через командний рядок STDIN або як аргумент, а вихід надається STDOUT або повернене значення. Це код-гольф .

Вхідні дані

Введенням буде список, розділений комами, з двох цілих чисел та великої літери. Два цілих числа будуть знаходитись у діапазоні 0-7(включно) та у незменшеному порядку. Недоступний новий рядок для введення та виводу.

Ось дані для наведених вище чотирьох прикладів:

1,2,N
1,3,L
2,2,A
0,1,W

Вихідні дані

Виходом буде багаторядкова квадратна форма. Велика літера буде розміщена в центрі для відображення поточного місця розташування деталі. Місця руху будуть представлені або 4, або 8 малі os. Усі інші місця на площі будуть заповнені періодами.

Якщо шаблон руху є 0,0, виведіть лише велику літеру.

Як підказка, якщо друге ціле число (більший) має значення N, то квадрат завжди матиме довжину сторони 2N + 1. oS завжди буде по периметру площі.

Додаткові тести

1,1,F

o.o
.F.
o.o

5,7,Q

..o.........o..
...............
o.............o
...............
...............
...............
...............
.......Q.......
...............
...............
...............
...............
o.............o
...............
..o.........o..


0,0,J

J

Чому букву на верблюдах на верблюді букву "L"? Я знаю, що це не має значення, але може бути корисним змінити значення "C".
Rɪᴋᴇʀ

1
@RikerW Мій вибір не був абсолютно довільним, це його "стандартизований" лист.
PhiNotPi

1
Добре. Що має сенс.
Rɪᴋᴇʀ

1
Для функції 3 аргументи добре
edc65

Відповіді:


2

Рубі, 107

->a,b,n{(-b..b).map{|i|s='..'*b+?.
i%b==0&&(i==0?s[b]=n :s[b+a]=s[b-a]=?o)
i.abs==a&&s[0]=s[-1]=?o
puts s}}

Ungolfed в тестовій програмі

f=->a,b,n{
  (-b..b).map{|i|                           #iterate from -i to i (lines of grit)
    s='..'*b+?.                             #make a string of 2n+1 .'s
    i%b==0&&(i==0?s[b]=n :s[b+a]=s[b-a]=?o) #if i%b=0 plot the centre character (if i=0) or the o's on the top and bottom rows
    i.abs==a&&s[0]=s[-1]=?o                 #if i.abs=a plot the o's in left and right columns
    puts s                                  #having substituted the .'s with o and centre as necessary, output the current line
  }
}

a=gets.to_i
b=gets.to_i
n=gets.chop
f[a,b,n]

1

Pyth, 40 байт

JASv<2zFZK+rH_1SHFY,LZKp?qJSY\o?sY\.ez)k

Я вчу Піта! Спробуйте .

Пояснення

J             J =
 A                (G, H) =
  S                        sorted(
   v<2z                           eval(input[:-2]))

FZK+rH_1SH    for Z in K = [H, H-1, ..., 0] + [1, 2, ..., H]:
  FY,LZK          for Y in [(Z, k) for k in K]:
    p                 print the following value without newline:
     ?qJSY\o              if J = sorted(Y): 'o'
       ?sY\.              if sum(Y) != 0:   '.'
         ez               else:             input[-1]
  )               end for
k                 print newline

1

JavaScript (ES6), 163 161 145 байт

(x,y,c,m=a=>`\n`+a.slice(1).reverse().join``+a.join``,a=Array(y+1).fill`.`,q=a.map(_=>[...a]))=>m(q.map(m,q[x][y]=q[y][x]='o',q[0][0]=c)).slice(2)

Де \nбуквальний символ нового рядка. Працює, генеруючи нижній правий квадрант і відображаючи його по обох осях.

Редагувати: збережено 2 байти завдяки @ edc65.

(Я потрапив сюди через повторне запитання, яке дозволило отримати результат масиву, який був би на 19 байт коротшим, але не гарантував зменшення порядку, що витрачається на 8 байт.)


Ви можете зберегти 3 байти, використовуючи рядок шаблону без дужок для fillта буквальний новий рядок
edc65

@ edc65 Я вже намагався налаштувати буквальний новий рядок (я завжди пишу "Де \nбуквальний символ нового рядка", коли це роблю), але дякую за іншу пораду.
Ніл

0

JavaScript (ES6) 144 150

(a,b,c,g=Array(b-~b).fill`.`)=>(g=g.map(x=>[...g])).map(x=>x.join``,[b-a,b+a].map(t=>g[t][0]=g[0][t]=g[t][2*b]=g[2*b][t]='o'),g[b][b]=c).join`
`

Менше гольфу

(a,b,c)=> {
  var g=Array(b*2+1).fill('.');
  g=g.map(x=>[...g]);
  var q=(t)=>
    g[t][0] =
    g[0][t] =
    g[t][2*b] =
    g[2*b][t] = 'o';
  q(b+a);
  q(b-a);
  g[b][b] = c;
  return g.map(x=> x.join('')).join('\n')
}

Тест

f=(a,b,c,g=Array(b-~b).fill`.`)=>(g=g.map(x=>[...g])).map(x=>x.join``,[b-a,b+a].map(t=>g[t][0]=g[0][t]=g[t][2*b]=g[2*b][t]='o'),g[b][b]=c).join`
`

console.log=x=>O.textContent+=x+'\n'

t=`1,2,N
1,3,L
2,2,A
0,1,W
1,1,F
5,7,Q`.split`\n`
.forEach(t=>([x,y,z]=t.split`,`, console.log(t+'\n'+f(+x,+y,z)+'\n')))
<pre id=O></pre>

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