Codewars Lösung | 16+18=214


coden
Codewars. Achieve mastery through challenge.
Daniel Kaser|30. September 2023
3 min.

Inhalt

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

Die Fakten:

Plattform:codewars.com
Name:16+18=214
Level:7 kyu
Sprache:TypeScript

Beschreibung:

For this kata you will have to forget how to add two numbers.

It can be best explained using the following meme:

Dayane Rivas adding up a sum while competing in the Guatemalan television show "Combate" in May 2016

In simple terms, our method does not like the principle of carrying over numbers and just writes down every number it calculates :-)

You may assume both integers are positive integers.

Examples

\large
\begin{array}{lll}
    & 1 & 6 \\
  + & 1 & 8 \\ \hline
  & 2 & 1 4 \\
\end{array}
\qquad
\large
\begin{array}{lll}
    & 2 & 6  \\
  + & 3 & 9  \\ \hline
    & 5 & 15 \\
\end{array}
\qquad

 

\large
\begin{array}{lll}
    & 1 & 2  & 2 \\
  + &   & 8  & 1 \\ \hline
    & 1 & 10 & 3 \\
\end{array}
\qquad
\large
\begin{array}{lll}
    & 7  & 2 \\
  + &    & 9 \\ \hline
    & 7 & 11 \\
\end{array}

You may assume both integers are positive integers and the result will not be bigger than `Integer.MAX_VALUE`

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

Erst wandeln beide Input-Zahlen in Arrays mit ihren Ziffern um.

Schritt 2

Dann drehen wir die Arrays um.

Schritt 3

Jetzt loopen wir durch die Ziffern,

Schritt 4

addieren die beiden korrespondierenden Ziffern beider Arrays

Schritt 5

und fügen das jeweilige Ergebnis (an den Anfang) einer Ergebnis-Variablen hinzu.

Schritt 6

Nach dem Loop müssen wir noch unser Ergebnis zu einer Zahl umwandeln.

Code

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

Lösungsschritte
Meine erste Zeile:
export function add(num1: number, num2: number): number {
Definieren wir unsere Ergebnis-Variable:
let result = "";

Ich habe mich hier für einen String entschieden. Es ginge auch ein Array.

Jetzt beide Zahlen in Ziffern-Arrays umwandeln:
const reversedNumArr1 = num1.toString().split("").reverse();
const reversedNumArr2 = num2.toString().split("").reverse();

Ich habe sie auch gleich mit .reverse() umgedreht, damit wir die Ziffern beider Arrays an der selben Stelle haben und addieren können. Also Einer mit Einer, Zehner mit Zehner usw...

Jetzt der Loop:
  const longerNumLength = Math.max(
    reversedNumArr1.length,
    reversedNumArr2.length
  );

  for (let i = 0; i < longerNumLength; i++) {

Damit wir immer so lange loopen, wie die größere beider Zahlen lang ist, ermitteln wir vorher mit Math.max() die Länge des längeren Arrays.

Jetzt die jeweiligen Ziffern beider Arrays addieren:
const digitArr1 = Number(reversedNumArr1[i]) || 0;
const digitArr2 = Number(reversedNumArr2[i]) || 0;
const digitSum = digitArr1 + digitArr2;

Sollte eine der beiden Ziffern nicht vorhanden, also undefined sein, setzen wir sie auf 0. Mit Number() wandeln wir die String-Zahl in eine echte Zahl um.

Jetzt setzen wir die Summe an den Anfang unseres Ergebnisses:
    result = digitSum + result;
  }

Da result ein String ist, können wir hier einfach die Summe mit + anfügen.

Nach dem Loop nur noch unser Ergebnis zurückgeben:
  return Number(result);
}

Vorher noch in eine Zahl umwandeln.

Voilá! 💪

Fragen?

Komplettlösung
export function add(num1: number, num2: number): number {
  let result = "";

  const reversedNumArr1 = num1.toString().split("").reverse();
  const reversedNumArr2 = num2.toString().split("").reverse();

  const longerNumLength = Math.max(
    reversedNumArr1.length,
    reversedNumArr2.length,
  );

  for (let i = 0; i < longerNumLength; i++) {
    const digitArr1 = Number(reversedNumArr1[i]) || 0;
    const digitArr2 = Number(reversedNumArr2[i]) || 0;
    const digitSum = digitArr1 + digitArr2;

    result = digitSum + result;
  }

  return Number(result);
}

Feedback

Schreib mir!