Волшебные шахматные «прыгающие» модели движения


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 строчными буквами o. Все остальные места в квадрате будут заполнены точками.

Если шаблон движения 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"? Я знаю, что это не имеет значения, но может быть полезно поменять на «С».
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}}

Неуправляемый в тестовой программе

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

Я учу Pyth! Попробуйте это .

объяснение

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 Я уже пытался приспособиться к буквальному переводу строки (я всегда пишу «Где \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.