Codewars Lösung | Graceful Tipping


coden
Codewars. Achieve mastery through challenge.
Daniel Kaser|22. Januar 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:Graceful Tipping
Level:7 kyu
Sprache:TypeScript

Beschreibung:

Adding tip to a restaurant bill in a graceful way can be tricky, thats why you need make a function for it.

The function will receive the restaurant bill (always a positive number) as an argument. You need to 1) add at least 15% in tip, 2) round that number up to an elegant value and 3) return it.

What is an elegant number? It depends on the magnitude of the number to be rounded. Numbers below 10 should simply be rounded to whole numbers. Numbers 10 and above should be rounded like this:

10 - 99.99... ---> Round to number divisible by 5

100 - 999.99... ---> Round to number divisible by 50

1000 - 9999.99... ---> Round to number divisible by 500

And so on...

Good luck!

Examples

 1  -->    2
 7  -->    9
12  -->   15
86  -->  100

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 berechnen wir den Gesamtbetrag inkl. 15% Trinkgeld.

Schritt 2

Dann müssen wir rausfinden, wie viele Ziffern es vor dem Komma gibt.

Schritt 3

Dann den Rundungs-Faktor berechnen.

Schritt 4

Zum Schluss müssen wir prüfen, ob die Gesamtsumme größer als 10 ist und wenn ja, den Faktor richtig darauf anwenden.

Code

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

Lösungsschritte
Meine erste Zeile:
export function gracefulTipping(bill: number): number {
Den Gesamtbetrag inklusive 15% Trinkgeld berechnen:
const billPlus15Percent = bill * 1.15;
Jetzt die Stellen vor dem Komma zählen:
const numDigits = Math.trunc(billPlus15Percent).toString().length;
Dann können wir unseren Rundungs-Faktor berechnen:
const factor = 5 * 10 ** (numDigits - 2);

Ist unsere Gesamtsumme z.B. 123, hat also 3 Stellen vor dem Komma, ziehen wir 2 ab und erhalten 1. Die 1 ist jetzt die Potenz für 10.

Also: 101=10

Dann noch mit 5 malnehmen. Der Faktor ist also 50.

Bei einer vierstelligen Gesamtsumme wäre unser Faktor also: 5x10(4-2)=5x102=500

Bei einer zweistelligen Zahl: 5x10(2-2)=5x100=5x1=5

Jetzt nur noch die Bedingung und die Berechnung der aufgerundeten Gesamtsumme inkl. 15%:
  return billPlus15Percent < 10
    ? Math.ceil(billPlus15Percent)
    : Math.ceil(billPlus15Percent / factor) * factor;
}

Wenn der Gesamtbetrag unter 10 Euro ist, geben wir einfach den aufgerundeten Gesamtbetrag zurück. Ansonsten teilen wir unseren Gesamtbetrag durch den Faktor, runden auf und multiplizieren das Ganze wieder mit unserem Faktor.

Voilá! 💪

Fragen?

Komplettlösung
export function gracefulTipping(bill: number): number {
  const billPlus15Percent = bill * 1.15;
  const numDigits = Math.trunc(billPlus15Percent).toString().length;
  const factor = 5 * 10 ** (numDigits - 2);

  return billPlus15Percent < 10
    ? Math.ceil(billPlus15Percent)
    : Math.ceil(billPlus15Percent / factor) * factor;
}

Feedback

Schreib mir!