요정 체스 "리퍼"운동 패턴


14

뛰는은 으로 이동 변형 체스 기물의 카테고리는 "점프." 일반 기사는 (1,2)-리퍼입니다. 즉, 각 이동에는 직교 방향으로 1 스퀘어, 수직 방향으로 2 스퀘어의 거리를 이동해야합니다.

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

많은 다른 도약이 있습니다. (1,3)-리퍼는 Long Knight 또는 Camel이라고합니다. 이동 패턴은 다음과 같습니다.

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

(2,2) Alfil도 있습니다 ...

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

... 그리고 심지어 (0,1) Wazir.

.o.
oWo
.o.

도전

한 쌍의 숫자가 입력으로 주어지면 해당 이동 다이어그램을 출력하십시오. STDIN / 명령 줄을 통해 제공되는 입력 또는 인수로 프로그램 또는 함수를 작성하고 STDOUT 또는 반환 값으로 출력을 제공 할 수 있습니다. 이것은 code-golf 입니다.

입력

입력은 쉼표로 구분 된 두 정수와 대문자의 목록입니다. 두 정수는 범위를 0-7포함하고 감소하지 않는 순서로 나타납니다. 입력 및 출력에 대한 후행 줄 바꿈 옵션.

위의 네 가지 예에 대한 입력은 다음과 같습니다.

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

산출

출력은 사각형 모양의 여러 줄 문자열입니다. 대문자는 작품의 현재 위치를 나타 내기 위해 중앙에 배치됩니다. 이동 위치는 4 또는 8 개의 소문자로 표시됩니다 o. 사각형의 다른 모든 공간은 마침표로 채워집니다.

이동 패턴이 0,0인 경우 대문자 만 출력하십시오.

힌트로, 두 번째 정수 (더 큰 정수)의 값이 N이면 정사각형의 변의 길이는 항상 2N + 1입니다. o들 항상 광장의 주변에있을 것입니다.

추가 테스트 케이스

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

테스트 프로그램에서 언 골프

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

자바 스크립트 (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리터럴 줄 바꾸기 문자는 어디에 있습니까 ? 오른쪽 아래 사분면을 생성하고 두 축을 따라 미러링하여 작동합니다.

편집 : @ edc65 덕분에 2 바이트가 절약되었습니다.

(나는 19 바이트 더 짧은 배열 결과를 허용했지만 8 바이트를 낭비하지 않는 비 감소 순서를 보장하지 않는 중복 질문을 통해 여기에왔다.)


대괄호가없는 템플릿 문자열과 fill리터럴 개행 문자 를 사용하여 3 바이트를 절약 할 수 있습니다.
edc65

@ edc65 나는 이미 리터럴 개행을 조정하려고 시도했다 \n.
Neil

0

자바 스크립트 (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>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.