Codewars Lösung | Simple Fun #88: Sort By Height


coden
Codewars. Achieve mastery through challenge.
Daniel Kaser|12. Januar 2024
3 min.

Inhalt

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

Die Fakten:

Plattform:codewars.com
Name:Simple Fun #88: Sort By Height
Level:7 kyu
Sprache:TypeScript

Beschreibung:

Task

Some people are standing in a row in a park. There are trees between them which cannot be moved.

Your task is to rearrange the people by their heights in a non-descending order without moving the trees.

Example

For a = [-1, 150, 190, 170, -1, -1, 160, 180], the output should be

[-1, 150, 160, 170, -1, -1, 180, 190].

Input/Output

  • [input] integer array a

    If a[i] = -1, then the ith position is occupied by a tree. Otherwise a[i] is the height of a person standing in the ith position.

    Constraints:

    5 ≤ a.length ≤ 30,

    -1 ≤ a[i] ≤ 200.

  • [output] an integer array

    Sorted array a with all the trees untouched.

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 müssen die Bäume aus dem Weg: Wir entfernen die Bäume aus dem Input-Array.

Schritt 2

Das Ergebnis sortieren wir.

Schritt 3

Dann können wir jede Person im Input-Array durch eine Person aus dem sortierten Array (ohne Bäume) ersetzen.

Schritt 4

Das Ergebnis geben wir aus.

Code

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

Lösungsschritte
Meine erste Zeile sieht so aus:
export function sortByHeight(list: number[]): number[] {
Bäume entfernen, Resultat sortieren und in einer Variablen speichern:
const sortedPeople = list
  .filter((element) => element > 0)
  .sort((a, b) => a - b);
Jede Person im Input-Array durch eine Person aus dem sortierten Array ersetzen. Das Wort ‘jede’ gibt uns den Hinweis, dass wir einen Loop brauchen. Zusammen mit dem Wort ‘ersetzen’ wissen wir, dass wir hier .map() benutzen können:
  list.map((element) => {
Woran erkennen wir eine Person? Eine Person wird niemals kleiner als 0 sein:
    if (element > 0)
Aktuelles Element durch das erste Element in unseren sortierten Menschen ersetzen (und das erste Element aus den sortierten Menschen entfernen):
if (element > 0) return sortedPeople.shift()!;

Das Ausrufezeichen am Ende der Zeile sagt TypeScript, dass es dieses Element auf jeden Fall gibt. Sonst hätte es Angst, dass es womöglich auf ein nicht existierendes Element stoßen könnte...

Andernfalls (wenn das Element ein Baum, also -1, ist), geben wir es einfach zurück:
    return element;
  });
Das Ergebnis des Loops können wir direkt ausgeben. Also noch ein return davor. Fertig!
return list.map((element) => {
  if (element > 0) return sortedPeople.shift()!;
  return element;
});
Voilá! 💪

Fragen?

Komplettlösung
export function sortByHeight(list: number[]): number[] {
  const sortedPeople = list
    .filter((element) => element > 0)
    .sort((a, b) => a - b);

  return list.map((element) => {
    if (element > 0) return sortedPeople.shift()!;
    return element;
  });
}

Feedback

Schreib mir!