Codewars Lösung | Target Date


coden
Codewars. Achieve mastery through challenge.
Daniel Kaser|8. Januar 2024
2 min.

Inhalt

  1. Die Fakten
  2. Beschreibung
  3. Lösung
    1. Pseudo-Code
    2. Code
  4. Feedback

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 are 360 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á! 💪

Fragen?

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);
}

Feedback

Schreib mir!