
Inhalt
Die Fakten:
Plattform: | codewars.com |
Name: | The Spider and the Fly (Jumping Spider) |
Level: | 6 kyu |
Sprache: | TypeScript |
Beschreibung:
Background
A spider web is defined by
-
"rings" numbered out from the centre as
0
,1
,2
,3
,4
-
"radials" labelled clock-wise from the top as
A
,B
,C
,D
,E
,F
,G
,H
Here is a picture to help explain:

Web Coordinates
As you can see, each point where the rings and the radials intersect can be described by a "web coordinate".
So in this example the spider is at H3
and the fly is at E2
Kata Task
Our friendly jumping spider is resting and minding his own spidery business at web-coordinate spider
.
An inattentive fly bumbles into the web at web-coordinate fly
and gets itself stuck.
Your task is to calculate and return the distance the spider must jump to get to the fly.
Example
The solution to the scenario described by the picture is 4.63522
Notes
- The centre of the web will always be referred to as
A0
- The rings intersect the radials at evenly spaced distances of 1 unit
DM
Quelle: codewars.com
Lösung
Pseudo-Code
Wie immer gibt's reichlich Varianten, hier ist eine meiner.
Erst die Lösungsschritte in Pseudo-Code. Los geht’s:
Lösungsschritte
Schritt 1
Zuerst erstellen wir uns eine Variable für die Buchstaben der Strahlen.
Schritt 2
Außerdem können wir uns die Entfernungen von Spinne und Fliege vom Mittelpunkt in Variablen speichern (also den Zahlteil der Koordinate).
Schritt 3
Wenn wir die Spinne und die Fliege mit einer Linie verbinden, haben wir (zusammen mit den beiden Geraden vom Mittelpunkt zur Spinne und vom Mittelpunkt zur Fliege) ein Dreieck.
Schritt 4
Wenn wir einen Winkel hätten, könnten wir die Länge dieser Linie berechnen.
Schritt 5
Also berechnen wir die Winkel der Strahlen, auf denen jeweils die Spinne und die Fliege sitzen.
Schritt 6
Wenn wir beide Winkel haben, können wir den Winkel zwischen Spinne und Fliege berechnen.
Schritt 7
Von diesem Winkel wiederum können wir den Kosinus berechnen.
Schritt 8
Und mit dem Kosinus können wir die Entfernung zwischen Spinne und Fliege berechnen.
Code
Geil. Übersetzen wir unseren Pseudo-Code in TypeScript:
Lösungsschritte
Meine erste Zeile:
export function spiderToFly(spider: string, fly: string): number {
Zuerst die Buchstaben der Strahlen in eine Variable:
const radials = "ABCDEFGH";
Dann bekommen die Zahlen der Koordinaten, also die Entfernungen von Spinne und Fliege vom Mittelpunkt, auch ihre eigenen Variablen:
const a = Number(spider[1]);
const b = Number(fly[1]);
Jetzt berechnen wir die Winkel der Strahlen auf denen die Tierchen jeweils sitzen:
const angleSpider = radials.indexOf(spider[0]) * 45;
const angleFly = radials.indexOf(fly[0]) * 45;
Dafür schlagen wir den Buchstaben der Koordinate in unserer radials
-Variablen nach. Sitzt die Fliege beispielsweise wie im Bild auf dem Strahl E
, erhalten wir den Index 4
. 4 x 45°
sind 180°
.
Da wir jetzt beide Winkel haben, können wir den Winkel zwischen Spinne und Fliege berechnen:
const angleSpiderFly = Math.abs(angleSpider - angleFly);
Und mit dem Winkel können wir den Kosinus des Winkels berechnen:
const cosine = Math.cos(degreesToRadians(angleSpiderFly));
Für den Kosinus brauchen wir hier den Winkel im Bogenmaß. Da wir unseren Winkel aber im Gradmaß berechnet haben, müssen wir kurz umrechnen.
Dafür hab ich mir eine kleine Hilfsfunktion gebaut:
function degreesToRadians(degrees: number): number {
return degrees * (Math.PI / 180);
}
Weiter mit der Hauptfunktion.
Mit dem Kosinus können wir dann die Seite gegenüber des Winkels berechnen:
const distance = Math.sqrt(a ** 2 + b ** 2 - 2 * a * b * cosine);
Dann nur noch das Ergebnis zurückgeben:
return distance;
}
Voilá! 💪
Fragen? 🪰🕷️
Komplettlösung
export function spiderToFly(spider: string, fly: string): number {
const radials = "ABCDEFGH";
const a = Number(spider[1]);
const b = Number(fly[1]);
const angleSpider = radials.indexOf(spider[0]) * 45;
const angleFly = radials.indexOf(fly[0]) * 45;
const angleSpiderFly = Math.abs(angleSpider - angleFly);
const cosine = Math.cos(degreesToRadians(angleSpiderFly));
const distance = Math.sqrt(a ** 2 + b ** 2 - 2 * a * b * cosine);
return distance;
}
function degreesToRadians(degrees: number): number {
return degrees * (Math.PI / 180);
}