
Inhalt
Die Fakten:
| Plattform: | codewars.com |
| Name: | Target Date |
| Level: | 7 kyu |
| Sprache: | TypeScript |
Beschreibung:
You have an amount of money a0 > 0 and you deposit it with an interest rate of p percent divided by 360 per day on the 1st of January 2016. You want to have an amount a >= a0.
Task:
The function date_nb_days (or dateNbDays...) with parameters a0, a, p will return, as a string, the date on which you have just reached a.
Example:
date_nb_days(100, 101, 0.98) --> "2017-01-01" (366 days)
date_nb_days(100, 150, 2.00) --> "2035-12-26" (7299 days)
Notes:
- The return format of the date is
"YYYY-MM-DD" - The deposit is always on the
"2016-01-01" - Don't forget to take the rate for a day to be
p divided by 36000since banks consider that there are360days in a year. - You have:
a0 > 0, p% > 0, a >= a0
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 definieren wir 3 Variablen. Das Start-Datum, den aktuellen Betrag und die Anzahl der Tage.
Schritt 2
Jetzt können wir die täglichen Zinsen berechnen und zum Ursprungsbetrag hinzu addieren.
Schritt 3
Das machen wir solange bis der Betrag a erreicht ist.
Schritt 4
Die Tage zählen wir mit unserem Tages-Counter.
Schritt 5
Nach dem Loop müssen wir nur noch das End-Datum berechnen und ausgeben.
Code
Geil. Übersetzen wir unseren Pseudo-Code in TypeScript:
Lösungsschritte
Meine erste Zeile:
export function dateNbDays(a0: number, a: number, p: number): string {
3 Variablen definieren:
const startDate = new Date("2016-01-01");
let currAmount = a0;
let numDays = 0;`
Für die Berechnung der täglichen Zinsen nehme ich einen while-Loop:
while (currAmount <= a) {
const dailyInterest = (currAmount * p) / 100 / 360;`
Tägliche Zinsen summieren und Tage zählen:
currAmount += dailyInterest;
numDays++;
}
Nach dem Loop berechnen wir das End-Datum:
const endDate = startDate.setDate(startDate.getDate() + numDays);`
Und geben das End-Datum als String im Format JJJJ-MM-TT aus:
return new Date(endDate).toISOString().slice(0, 10);`
Voilá! 💪
Komplettlösung
export function dateNbDays(a0: number, a: number, p: number): string {
const startDate = new Date("2016-01-01");
let currAmount = a0;
let numDays = 0;
while (currAmount <= a) {
const dailyInterest = (currAmount * p) / 100 / 360;
currAmount += dailyInterest;
numDays++;
}
const endDate = startDate.setDate(startDate.getDate() + numDays);
return new Date(endDate).toISOString().slice(0, 10);
}