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 36000
since banks consider that there are360
days 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);
}