Codewars Lösung | Sorting on planet Twisted-3-7


coden
Codewars. Achieve mastery through challenge.
Daniel Kaser|20. März 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:Sorting on planet Twisted-3-7
Level:6 kyu
Sprache:TypeScript

Beschreibung:

#Sorting on planet Twisted-3-7

There is a planet... in a galaxy far far away. It is exactly like our planet, but it has one difference: #The values of the digits 3 and 7 are twisted. Our 3 means 7 on the planet Twisted-3-7. And 7 means 3.

Your task is to create a method, that can sort an array the way it would be sorted on Twisted-3-7.

7 Examples from a friend from Twisted-3-7:

[1,2,3,4,5,6,7,8,9] -> [1,2,7,4,5,6,3,8,9]
[12,13,14] -> [12,14,13]
[9,2,4,7,3] -> [2,7,4,3,9]

There is no need for a precheck. The array will always be not null and will always contain at least one number.

You should not modify the input array!

Have fun coding it and please don't forget to vote and rank this kata! :-)

I have also created other katas. Take a look if you enjoyed this kata!

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

Als Erstes baue ich mir einen kleinen Helfer, der in einer Zahl jede 7 mit einer 3 und jede 3 mit einer 7 ersetzt.

Schritt 2

Dann loope ich durch alle Zahlen im Input-Array.

Schritt 3

Ich ersetze jede 7 mit einer 3 und umgekehrt.

Schritt 4

Dann kann das Array sortiert werden.

Schritt 5

Zum Schluss noch mal durch das Array loopen.

Schritt 6

Und noch mal jede 7 durch eine 3 und jede 3 durch eine 7 ersetzen.

Code

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

Lösungsschritte
Die erste Zeile meiner Ersetz-Helfer-Funktion:
function swap7sAnd3s(num: number): number {
Jetzt die Ersetz-Logik (mit Method-Chaining):
  return Number(
    num
      .toString()
      .replace(/3/g, "x")
      .replace(/7/g, "3")
      .replace(/x/g, "7")
  );
}

Man kann nicht einfach jede 3 mit einer 7 ersetzen und dann jede 7 mit einer 3, sonst hat man keine 7en mehr. Darum ersetze ich erst jede 3 mit einem Platzhalter x, dann jede 7 mit einer 3 und zum Schluss den Platzhalter x wieder mit einer 7.

Jetzt die Hauptfunktion.

Meine erste Zeile (ich habe array in nums umbenannt):
export function sortTwisted37(nums: number[]): number[] {
Los geht’s (mit Method-Chaining):
  return nums
    .slice()

Erst erstelle ich mir eine Kopie des Input-Arrays. Da ich Method-Chaining betreiben möchte, kann ich das return direkt hier hin schreiben.

Jetzt der erste Loop:
    .map((num) => swap7sAnd3s(num))

Da die Anzahl der Elemente im Array gleich bleibt, ist .map() hier die Wahl. Für den Tausch bemühen wir unser Helferlein.

Nu kann das Array sortiert werden:
    .sort((a, b) => a - b)
Und jetzt der zweite Loop:
    .map((num) => swap7sAnd3s(num));
}

Ist identisch zum Ersten.

Voilá! 💪

Fragen?

Komplettlösung
export function sortTwisted37(nums: number[]): number[] {
  return nums
    .slice()
    .map((num) => swap7sAnd3s(num))
    .sort((a, b) => a - b)
    .map((num) => swap7sAnd3s(num));
}

function swap7sAnd3s(num: number): number {
  return Number(
    num
      .toString()
      .replace(/3/g, "x")
      .replace(/7/g, "3")
      .replace(/x/g, "7")
  );
}

Feedback

Schreib mir!