Inhalt
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á! 💪
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;
}