Codewars Lösung | How Much?


coden
Codewars. Achieve mastery through challenge.
Daniel Kaser|24. März 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:How Much?
Level:6 kyu
Sprache:TypeScript

Beschreibung:

I always thought that my old friend John was rather richer than he looked, but I never knew exactly how much money he actually had. One day (as I was plying him with questions) he said:

  • "Imagine I have between m and n Zloty..." (or did he say Quetzal? I can't remember!)
  • "If I were to buy 9 cars costing c each, I'd only have 1 Zloty (or was it Meticals?) left."
  • "And if I were to buy 7 boats at b each, I'd only have 2 Ringglets (or was it Zloty?) left."

Could you tell me in each possible case:

  1. how much money f he could possibly have ?
  2. the cost c of a car?
  3. the cost b of a boat?

So, I will have a better idea about his fortune. Note that if m-n is big enough, you might have a lot of possible answers.

Each answer should be given as ["M: f", "B: b", "C: c"] and all the answers as [ ["M: f", "B: b", "C: c"], ... ]. "M" stands for money, "B" for boats, "C" for cars.

Note: m, n, f, b, c are positive integers, where 0 <= m <= n or m >= n >= 0. m and n are inclusive.

Examples:

howmuch(1, 100)      => [["M: 37", "B: 5", "C: 4"], ["M: 100", "B: 14", "C: 11"]]
howmuch(1000, 1100)  => [["M: 1045", "B: 149", "C: 116"]]
howmuch(10000, 9950) => [["M: 9991", "B: 1427", "C: 1110"]]
howmuch(0, 200)      => [["M: 37", "B: 5", "C: 4"], ["M: 100", "B: 14", "C: 11"], ["M: 163", "B: 23", "C: 18"]]

Explanation of the results for howmuch(1, 100):

  • In the first answer his possible fortune is 37:
  • so he can buy 7 boats each worth 5: 37 - 7 * 5 = 2
  • or he can buy 9 cars worth 4 each: 37 - 9 * 4 = 1
  • The second possible answer is 100:
  • he can buy 7 boats each worth 14: 100 - 7 * 14 = 2
  • or he can buy 9 cars worth 11: 100 - 9 * 11 = 1

Note

See "Sample Tests" to know the format of the return.

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

Da mal m und mal n größer sein können, müssen wir zuerst herausfinden welches das Größere und welches das Kleinere ist.

Schritt 2

Dann brauchen wir einen Loop.

Schritt 3

Jetzt macht sich mein Mathe-Leistungskurs bezahlt.

Schritt 4

Wenn der Wert aller Boote durch 7 teilbar ist und der Wert aller Autos durch 9, haben wir eine mögliche Konstellation.

Schritt 5

In diesem Fall hängen wir diese Konstellation an ein Array an.

Code

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

Lösungsschritte
Meine erste Zeile:
export function howMuch(m: number, n: number): string[][] {
Als Erstes also ermitteln wir, welches die große und welches die kleine Zahl ist:
const [min, max] = [m, n].sort((a, b) => a - b);
const result: string[][] = [];

Bei dieser Gelegenheit initialisiere ich mir auch gleich das Ergebnis-Array für die möglichen Konstellationen.

Jetzt können wir fröhlich loopen:
  for (let i = min; i <= max; i++) {
Der Lesbarkeit halber speichere ich mir den Wert aller Boote und Autos jeweils in einer Variablen ab (optional):
const allBoatsValue = i - 2;
const allCarsValue = i - 1;
Jetzt können wir prüfen, ob der Wert aller Boote durch 7 und der Wert aller Autos durch 9 teilbar ist:
    if (allBoatsValue % 7 === 0 && allCarsValue % 9 === 0) {
Wenn ja, können wir diese mögliche Konstellation ans Ergebnis-Array anhängen:
      const money = i;
      const costBoat = allBoatsValue / 7;
      const costCar = allCarsValue / 9;

      result.push([`M: ${money}`, `B: ${costBoat}`, `C: ${costCar}`]);
    }
  }

Der Lesbarkeit halber speichere ich mir die Werte vorher noch mal jeweils in einer Variablen ab (optional).

Nach dem Loop nur noch unsere Ergebnisse zurückgeben:
  return result;
}
Voilá! 💪

Fragen?

Komplettlösung
export function howMuch(m: number, n: number): string[][] {
  const [min, max] = [m, n].sort((a, b) => a - b);
  const result: string[][] = [];

  for (let i = min; i <= max; i++) {
    const allBoatsValue = i - 2;
    const allCarsValue = i - 1;

    if (allBoatsValue % 7 === 0 && allCarsValue % 9 === 0) {
      const money = i;
      const costBoat = allBoatsValue / 7;
      const costCar = allCarsValue / 9;

      result.push([`M: ${money}`, `B: ${costBoat}`, `C: ${costCar}`]);
    }
  }

  return result;
}

Feedback

Schreib mir!