Codewars Lösung | Lottery Ticket


coden
Codewars. Achieve mastery through challenge.
Daniel Kaser|16. 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:Lottery Ticket
Level:6 kyu
Sprache:JavaScript

Beschreibung:

Time to win the lottery!

Given a lottery ticket (ticket), represented by an array of 2-value arrays, you must find out if you've won the jackpot.

Example ticket:

[ [ 'ABC', 65 ], [ 'HGR', 74 ], [ 'BYHT', 74 ] ]
{ { "ABC", 65 }, { "HGR", 74 }, { "BYHT", 74 } }
{ { "ABC", 65 }, { "HGR", 74 }, { "BYHT", 74 } }
[ [ "ABC", 65 ], [ "HGR", 74 ], [ "BYHT", 74 ] ]
[ ( "ABC", 65 ), ( "HGR", 74 ), ( "BYHT", 74 ) ]

To do this, you must first count the 'mini-wins' on your ticket. Each subarray has both a string and a number within it. If the character code of any of the characters in the string matches the number, you get a mini win. Note you can only have one mini win per sub array.

Once you have counted all of your mini wins, compare that number to the other input provided (win). If your total is more than or equal to (win), return 'Winner!'. Else return 'Loser!'.

All inputs will be in the correct format. Strings on tickets are not always the same length.

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

Wir brauchen einen Loop!

Schritt 2

Nein, wir brauchen 2 Loops!

Schritt 3

Im ersten, äußeren Loop, gehen wir durch alle Sub-Arrays.

Schritt 4

Im zweiten, inneren Loop, prüfen wir den Char-Code jedes Zeichens des Strings im Sub-Array, ob er mit der gegebenen Zahl übereinstimmt.

Schritt 5

Wenn ja, addieren wir 1 zu einer Zählvariablen.

Schritt 6

Zum Schluss testen wir, ob wir mehr Mini-Wins haben, als das Input-win-Argument und geben den entsprechenden String zurück.

Code

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

Lösungsschritte
Meine erste Zeile:
function bingo(ticket, win) {
Zuerst der äußere Loop durch die Sub-Arrays:
const miniWins = ticket.reduce((accWins, currSubArr) => {
  const [str, num] = currSubArr;

  // todo
}, 0);

Da wir eine Summe suchen, entscheide ich mich hier für ein .reduce(). Du kannst auch mappen[Link] und die Wins zu einer Summen-Variablen addieren.

Außerdem deconstructe ich mir zur besseren Lesbarkeit das jeweils aktuelle Sub-Array in str und num. Den Startwert setze ich auf 0.

Danach kommt schon direkt der zweite, innere Loop:
    for (const char of str) {

Hier entscheide ich mich für einen for-of-Loop, da wir kein i brauchen und uns die Möglichkeit zum vorzeitigen Beenden des Loops offen halten wollen.

Dann der Check, ob der Char-Code des aktuellen Zeichens im aktuellen String mit der Zahl im Sub-Array übereinstimmt:
      if (char.charCodeAt(0) === num) return ++accWins;
    }

Wenn ja, können wir den inneren Loop vorzeitig beenden und unserem .reduce() einen um 1 erhöhten Win-Accumulator zurückgeben.

Ansonsten geben wir den Win-Accumulator unverändert zurück:
    return accWins;
  }, 0);
Nach dem .reduce()-Loop müssen wir nur noch unser Ergebnis ermitteln und zurückgeben:
  return miniWins >= win ? "Winner!" : "Loser!";
}
Voilá! 💪

Fragen?

Komplettlösung
function bingo(ticket, win) {
  const miniWins = ticket.reduce((accWins, currSubArr) => {
    const [str, num] = currSubArr;

    for (let char of str) {
      if (char.charCodeAt(0) === num) return ++accWins;
    }

    return accWins;
  }, 0);

  return miniWins >= win ? "Winner!" : "Loser!";
}

Feedback

Schreib mir!