Codewars Lösung | For Twins: 2. Math operations


coden
Codewars. Achieve mastery through challenge.
Daniel Kaser|27. Februar 2024
3 min.

Inhalt

  1. Die Fakten
  2. Beschreibung
  3. Lösung
    1. Pseudo-Code
    2. Code
  4. Feedback

Die Fakten:

Plattform:codewars.com
Name:For Twins: 2. Math operations
Level:8 kyu
Sprache:TypeScript

Beschreibung:

Task:

A magician in the subway showed you a trick, he put an ice brick in a bottle to impress you. The brick's length and width are equal, forming a square; its height may be different. Just for fun and also to impress the magician and people around, you decided to calculate the brick's volume. Write a function iceBrickVolume that will accept these parameters:

  • radius - bottle's radius (always > 0);
  • bottleLength - total bottle length (always > 0);
  • rimLength - length from bottle top to brick (always < bottleLength);

And return volume of ice brick that magician managed to put into a bottle.

illustration

Note:

All inputs are integers. Assume no irregularities to the cuboid brick. You may assume the bottle is shaped like a cylinder. The brick cannot fit inside the rim. The ice brick placed into the bottle is the largest possible cuboid that could actually fit inside the inner volume.

Example 1:

radius = 1
bottle_length = 10
rim_length = 2

volume = 16

Example 2:

radius = 5
bottle_length = 30
rim_length = 7

volume = 1150

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

Als Erstes müssen wir rauskriegen was die Länge bzw. Breite der Grundfläche des Würfels ist. Dafür machen wir uns am besten eine Zeichnung.

Schritt 2

Dann können wir die Höhe des Würfels berechnen.

Schritt 3

Wenn wir alle 3 Seiten haben, können wir das Volumen berechnen.

Code

Geil. Übersetzen wir unseren Pseudo-Code in TypeScript:

Lösungsschritte
Meine erste Zeile:
export const iceBrickVolume = (radius: number, bottleLength: number, rimLength: number): number => {
Dann berechnen wir also die Länge bzw. Breite der Grundfläche des Würfels:
const brickLength = Math.sqrt(radius ** 2 + radius ** 2);

Wir wissen, dass der größtmögliche Würfel in der Flasche die Flaschenwand an 4 Punkten berührt. Und wir haben den Radius der Flasche.

Wenn wir jetzt 2 Geraden von der Mitte aus mit jeweils der Länge des Radius im rechten Winkel ziehen - etwa so: |_, erhalten wir 2 Berührpunkte des Würfels mit dem Flaschenrand.

Wenn wir diese beiden Punkte miteinander verbinden, erhalten wir die Länge einer der 4 Seiten der Grundfläche des Würfels.

Um die Länge der Seite gegenüber des rechten Winkels in einem Dreieck zu berechnen, können wir den Satz des Pythagoras verwenden.

Satz des Pythagoras:

c2=a2+b2

nach c auflösen, also Wurzel ziehen:

c=

(a2 + b2)

Übersetzt für unseren Fall:

brickLength = Math.sqrt(radius ** 2 + radius ** 2);
Jetzt berechnen wir noch schnell die Höhe des Würfels:
const brickHeight = bottleLength - rimLength;
Und zum Schluss nur noch das Volumen berechnen und zurückgeben:
  return Math.round(brickLength * brickLength * brickHeight);
};
Voilá! 💪

Fragen?

Komplettlösung
export const iceBrickVolume = (
  radius: number,
  bottleLength: number,
  rimLength: number,
): number => {
  const brickLength = Math.sqrt(radius ** 2 + radius ** 2); // c^2 = a^2 + b^2
  const brickHeight = bottleLength - rimLength;

  return Math.round(brickLength * brickLength * brickHeight);
};

Feedback

Schreib mir!