Codewars Lösung | Who has the most money?


coden
Codewars. Achieve mastery through challenge.
Daniel Kaser|30. August 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:Who has the most money?
Level:6 kyu
Sprache:JavaScript

Beschreibung:

You're going on a trip with some students and it's up to you to keep track of how much money each Student has. A student is defined like this:

class Student
  attr_reader :name
  attr_reader :fives
  attr_reader :tens
  attr_reader :twenties
  
  def initialize(name, fives, tens, twenties)
    @name = name
    @fives = fives
    @tens = tens
    @twenties = twenties
  end
end
class Student:
    def __init__(self, name, fives, tens, twenties):
        self.name = name
        self.fives = fives
        self.tens = tens
        self.twenties = twenties
#define NAMELIM     0x8

struct student {
    char name[NAMELIM + 1];
    unsigned fives;
    unsigned tens;
    unsigned twenties;
};
struc student
    .name:      resb 9
                alignb 4
    .fives:     resd 1
    .tens:      resd 1
    .twenties:  resd 1
endstruc

student_sz      equ 0h18
class Student {
  constructor(name, fives, tens, twenties) {
    this.name = name;
    this.fives = fives;
    this.tens = tens;
    this.twenties = twenties;
  }
}
case class Student(name: String, fives: Int, tens: Int, twenties: Int)

As you can tell, each Student has some fives, tens, and twenties. Your job is to return the name of the student with the most money. If every student has the same amount, then return "all".

Notes:

  • Each student will have a unique name
  • There will always be a clear winner: either one person has the most, or everyone has the same amount
  • If there is only one student, then that student has the most money

Quelle: codewars.com

Lösung

Pseudo-Code

Es gibt wie immer viele Varianten, hier ist eine meiner.

Erst die Lösungsschritte in Pseudo-Code. Los geht’s:

Lösungsschritte
Schritt 1

Wenn wir nur einen Schüler haben, hat dieser das meiste Geld und wir können direkt dessen Namen zurückgeben.

Schritt 2

Ansonsten loopen wir durch alle Schüler.

Schritt 3

Wir berechnen für jeden Schüler die Summe des Cashs und speichern alles in einer Variablen.

Schritt 4

Wenn alle das Gleiche haben, geben wir "all" zurück.

Schritt 5

Ansonsten ermitteln wir die größte Summe.

Schritt 6

Und wo sie sich befindet.

Schritt 7

Zum Schluss brauchen wir nur noch den Namen des Schülers mit dem meisten Cash zurückgeben.

Code

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

Lösungsschritte
Meine erste Zeile:
function mostMoney(students) {
Zuerst kucken wir, ob wir nur einen Schüler haben:
if (students.length === 1) return students[0].name;

Wenn ja, können wir direkt dessen Namen zurückgeben.

Ansonsten loopen wir durch alle Schüler:
  const amounts = students.map((student) => {

Hier bietet sich ein .map() an, da wir für jeden Schüler einen Wert zurück haben wollen. Diesen speichern wir uns in einem Array.

Wir berechnen für jeden Schüler die Summe seines Cashs:
    const { fives, tens, twenties } = student;
    return fives * 5 + tens * 10 + twenties * 20;
  });

Der Übersicht halber deconstructe ich mir vorher die Scheine (optional).

Sollte jeder Schüler die gleiche Summe haben, geben wir "all" zurück:
if (amounts.every((amount) => amount === amounts[0])) return "all";
Ansonsten ermitteln wir die größte Summe:
const maxAmount = Math.max(...amounts);
Und kucken dann, wo sie ist:
const indexOfMax = amounts.indexOf(maxAmount);
Dann können wir den Namen des Besitzers ermitteln und zurückgeben:
  return students[indexOfMax].name;
}
Voilá! 💪

Fragen?

Komplettlösung
function mostMoney(students) {
  if (students.length === 1) return students[0].name;

  const amounts = students.map((student) => {
    const { fives, tens, twenties } = student;
    return fives * 5 + tens * 10 + twenties * 20;
  });

  if (amounts.every((amount) => amount === amounts[0])) return "all";

  const maxAmount = Math.max(...amounts);
  const indexOfMax = amounts.indexOf(maxAmount);

  return students[indexOfMax].name;
}

Feedback

Schreib mir!