Codewars Lösung | Clean up after your dog


coden
Codewars. Achieve mastery through challenge.
Daniel Kaser|21. September 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:Clean up after your dog
Level:7 kyu
Sprache:JavaScript

Beschreibung:

You have stumbled across the divine pleasure that is owning a dog and a garden. Now time to pick up all the cr@p! :D

Given a 2D array to represent your garden, you must find and collect all of the dog cr@p - represented by '@'.

You will also be given the number of bags you have access to (bags), and the capactity of a bag (cap). If there are no bags then you can't pick anything up, so you can ignore cap.

You need to find out if you have enough capacity to collect all the cr@p and make your garden clean again.

If you do, return 'Clean', else return 'Cr@p'.

Watch out though - if your dog is out there ('D'), he gets very touchy about being watched. If he is there you need to return 'Dog!!'.

For example:

bags = 2
cap = 2
x (or garden) =
[[ _ , _ , _ , _ , _ , _ ],
 [ _ , _ , _ , _ , @ , _ ],
 [ @ , _ , _ , _ , _ , _ ]]

returns 'Clean'

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

Als Erstes können wir die Inneren Arrays auflösen, so dass wir nur noch 1 Array haben.

Schritt 2

Sollte Fiffi ("D") im Garten sein, können wir sofort "Dog!!" zurückgeben.

Schritt 3

Ich schlage vor, dass wir uns die Gesamt-Crap-Kapazität in einer Variablen speichern.

Schritt 4

Dann zählen wir die Craps.

Schritt 5

Zum Schluss nur noch der Test, ob unsere Kapazitäten ausreichen. Wenn ja, geben wir "Clean" zurück, ansonsten "Cr@p".

Code

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

Lösungsschritte
Meine erste Zeile (ich habe x in garden umbenannt):
function crap(garden, bags, cap) {
Als Erstes machen wir aus dem Array-Wust ein einziges Array:
const flatGarden = garden.flat();

Seit ES10 geht das ziemlich easy mit flat() .

Dann kucken wir direkt, ob wir Fiffi ("D") im Garten finden. Wenn ja, können wir sofort "Dog!!" zurückgeben (und damit die Funktion beenden):
if (flatGarden.includes("D")) return "Dog!!";

Dank unseres geflatteten Gartens brauchen wir hier nicht doppelt und dreifach loopen.

Ansonsten speichern wir uns unsere Gesamt-Crap-Kapazität in einer Variablen ab (optional):
const totalCrapCap = bags * cap;

Optional, aber macht die ganze Sache schön übersichtlich!

Dann zählen wir alle Häufchen zusammen:
const numCraps = flatGarden.filter((spot) => spot === "@").length;

Auch hier brauchen wir dank unseres geflatteten Gartens nicht doppelt und dreifach loopen. Wir filtern einfach 1x.

Zum Schluss nur noch der Test, ob unsere CrapCap ausreicht um alle Häufchen ordnungsgemäß einzusammeln:
  if (totalCrapCap >= numCraps) return "Clean";
  return "Cr@p";
}

Wenn ja, geben wir "Clean" zurück, ansonsten "Cr@p".

Voilà! 💩

Fragen?

Komplettlösung
function crap(garden, bags, cap) {
  const flatGarden = garden.flat();

  if (flatGarden.includes("D")) return "Dog!!";

  const totalCrapCap = bags * cap;
  const numCraps = flatGarden.filter((spot) => spot === "@").length;

  if (totalCrapCap >= numCraps) return "Clean";
  return "Cr@p";
}

Feedback

Schreib mir!