Wróżkowe szachy „ruchy” wzorców ruchu

14

Leaper jest kategorią bajki szachy kawałek, który porusza się przez „skoków”. Normalny rycerz jest (1,2) leaper, co oznacza, że ​​każdy ruch wymaga przesunięcia o 1 kwadrat w kierunku prostopadłym i 2 kwadraty w kierunku prostopadłym.

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

Istnieje wiele różnych leaperów. (1,3) -leaper nazywa się Długi Rycerz lub Wielbłąd. Jego wzór ruchu wygląda następująco:

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

Jest też (2,2) Alfil ...

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

... a nawet (0,1) Wazir.

.o.
oWo
.o.

Wyzwanie

Biorąc pod uwagę parę liczb jako dane wejściowe, wypisz odpowiedni schemat ruchu. Możesz napisać program lub funkcję, z danymi wejściowymi dostarczonymi przez STDIN / wiersz poleceń lub jako argument, a dane wyjściowe dostarczone przez STDOUT lub wartość zwracaną. To jest golf golfowy .

Wejście

Dane wejściowe będą oddzieloną przecinkami listą dwóch liczb całkowitych i dużej litery. Dwie liczby całkowite będą w zakresie 0-7(włącznie) i nie malejącej kolejności. Końcowy znak nowej linii jest opcjonalny dla danych wejściowych i wyjściowych.

Oto dane wejściowe dla powyższych czterech przykładów:

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

Wynik

Wyjście będzie wielowierszowym ciągiem w kształcie kwadratu. Wielka litera zostanie umieszczona na środku, aby reprezentować bieżącą lokalizację utworu. Lokalizacje ruchu będą reprezentowane przez 4 lub 8 małych litero . Wszystkie pozostałe miejsca na kwadracie zostaną wypełnione kropkami.

Jeśli wzór ruchu jest 0,0, wypisz tylko wielką literę.

Jako wskazówka, jeśli druga liczba całkowita (większa) ma wartość N, to kwadrat zawsze będzie miał długość boku 2N + 1. oS zawsze będzie na obwodzie placu.

Dodatkowe przypadki testowe

1,1,F

o.o
.F.
o.o

5,7,Q

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


0,0,J

J
PhiNotPi
źródło
Dlaczego litera testowej wielbłąda ma literę „L”? Wiem, że to nie ma znaczenia, ale może być pomocna zmiana na „C”.
Rɪᴋᴇʀ
1
@RikerW Mój wybór nie był całkowicie arbitralny, to jest „znormalizowana” litera.
PhiNotPi
1
W porządku. To ma sens.
Rɪᴋᴇʀ
1
W przypadku funkcji, czy 3 argumenty są w porządku, czy chcesz oddzielić argument pojedynczego ciągu przecinkiem?
edc65,

Odpowiedzi:

2

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

Niegolfowany w programie testowym

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]
Level River St
źródło
1

Pyth, 40 bajtów

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

Uczę się Pyth! Wypróbuj to .

Wyjaśnienie

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
Lynn
źródło
1

JavaScript (ES6), 163 161 145 bajtów

(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)

Gdzie \n jest dosłownie nowy znak linii. Działa, generując prawy dolny kwadrant i odbijając go wzdłuż obu osi.

Edycja: Zapisano 2 bajty dzięki @ edc65.

(Dostałem się tutaj przez zduplikowane pytanie, które pozwoliło na uzyskanie wyniku tablicy, który byłby o 19 bajtów krótszy, ale nie gwarantowało nie zmniejszania kolejności, co zmarnowało 8 bajtów.)

Neil
źródło
Możesz zapisać 3 bajty, używając ciągu szablonu bez nawiasów filli dosłownego nowego wiersza
edc65
@ edc65 Próbowałem już dostosować się do dosłownego nowego wiersza (zawsze piszę „Gdzie \njest dosłowny znak nowej linii”, kiedy to robię), ale dziękuję za drugą wskazówkę.
Neil,
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`
`

Mniej golfa

(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')
}

Test

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>

edc65
źródło