Inhalt
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
.
Dann noch mit 5
malnehmen. Der Faktor ist also 50
.
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á! 💪
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;
}