Fairy Chess "leaper" Bewegungsmuster

14

Ein Leaper ist eine Kategorie von Feenschachfiguren, die sich durch "Springen" bewegen. Ein normaler Ritter ist ein (1,2) -billiger, was bedeutet, dass jeder Zug eine Strecke von 1 Quadrat in orthogonaler Richtung und 2 Quadrate in senkrechter Richtung umfasst.

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

Es gibt viele verschiedene Springer. Der (1,3) -Billigere wird der Lange Ritter oder Kamel genannt. Das Bewegungsmuster sieht folgendermaßen aus:

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

Es gibt auch die (2,2) Alfil ...

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

... und sogar der (0,1) Wazir.

.o.
oWo
.o.

Herausforderung

Geben Sie bei einem Zahlenpaar als Eingabe das entsprechende Bewegungsdiagramm aus. Sie können ein Programm oder eine Funktion schreiben, wobei die Eingabe über STDIN / Befehlszeile oder als Argument erfolgt und die Ausgabe über STDOUT oder den Rückgabewert erfolgt. Das ist Code-Golf .

Eingang

Die Eingabe besteht aus einer durch Kommas getrennten Liste mit zwei Ganzzahlen und einem Großbuchstaben. Die zwei ganzen Zahlen liegen im Bereich 0-7(einschließlich) und in nicht abnehmender Reihenfolge. Optionaler Zeilenumbruch für Ein- und Ausgabe.

Hier sind die Eingaben für die obigen vier Beispiele:

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

Ausgabe

Die Ausgabe erfolgt als quadratische mehrzeilige Zeichenfolge. Der Großbuchstabe wird in der Mitte platziert, um die aktuelle Position des Stücks darzustellen. Die Bewegungsorte werden durch 4 oder 8 Kleinbuchstaben dargestellt o. Alle anderen Felder auf dem Platz werden mit Punkten gefüllt.

Wenn das Bewegungsmuster ist 0,0, geben Sie nur den Großbuchstaben aus.

Wenn die zweite Ganzzahl (die größere) den Wert N hat, hat das Quadrat immer die Seitenlänge 2N + 1. Das os befindet sich immer am Umfang des Quadrats.

Zusätzliche Testfälle

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
quelle
Warum ist der Kameltestbuchstabe ein "L"? Ich weiß, dass es keine Rolle spielt, aber es könnte hilfreich sein, auf ein "C" zu wechseln.
9.
1
@RikerW Meine Wahl war nicht völlig willkürlich, das ist der "standardisierte" Buchstabe.
PhiNotPi
1
Okay. Das macht Sinn.
9.
1
Sind für eine Funktion 3 Argumente in Ordnung oder möchten Sie ein einzelnes Zeichenfolgenargument durch Kommas trennen?
EDC65

Antworten:

2

Rubin, 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 im Testprogramm

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
quelle
1

Pyth, 40 Bytes

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

Ich lerne Pyth! Probieren Sie es aus .

Erläuterung

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
quelle
1

JavaScript (ES6), 163 161 145 Bytes

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

Wo \nist das wörtliche Zeichen für eine neue Zeile? Generiert den unteren rechten Quadranten und spiegelt ihn entlang beider Achsen.

Bearbeiten: 2 Bytes dank @ edc65 gespeichert.

(Ich kam hierher über eine doppelte Frage, die ein Array-Ergebnis ermöglichte, das 19 Byte kürzer gewesen wäre, aber keine abnehmende Reihenfolge garantierte, was 8 Byte verschwendete.)

Neil
quelle
Sie können 3 Bytes mit einer Vorlagenzeichenfolge ohne Klammern für fillund einer wörtlichen Newline
edc65
@ edc65 Ich habe bereits versucht, die wörtliche Zeilenumbruch zu korrigieren (ich schreibe dabei immer "Wo \nist das wörtliche Zeilenumbruchzeichen"), aber danke für den anderen Tipp.
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`
`

Weniger golfen

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

Prüfung

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
quelle