Codewars Lösung | IPv4 to int32


coden
Codewars. Achieve mastery through challenge.
Daniel Kaser|6. Mai 2024
2 min.

Inhalt

  1. Die Fakten
  2. Beschreibung
  3. Lösung
    1. Pseudo-Code
    2. Code
  4. Feedback

Die Fakten:

Plattform:codewars.com
Name:IPv4 to int32
Level:6 kyu
Sprache:TypeScript

Beschreibung:

Take the following IPv4 address: 128.32.10.1. This address has 4 octets where each octet is a single byte (or 8 bits).

  • 1st octet 128 has the binary representation: 10000000
  • 2nd octet 32 has the binary representation: 00100000
  • 3rd octet 10 has the binary representation: 00001010
  • 4th octet 1 has the binary representation: 00000001

So 128.32.10.1 == 10000000.00100000.00001010.00000001

Because the above IP address has 32 bits, we can represent it as the 32 bit number: 2149583361.

Write a function ip_to_int32(ip) ( JS: ipToInt32(ip) ) that takes an IPv4 address and returns a 32 bit number.

Example

"128.32.10.1" => 2149583361

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 brauchen wir ein Array, damit wir da durch loopen können.

Schritt 2

Dann der Loop.

Schritt 3

Wir müssen jede der 4 Zahlen in ihre 8-stellige binäre Version verwandeln.

Schritt 4

Dann machen wir aus dem Array wieder einen String.

Schritt 5

Damit wir anschließend diese 32-Bit Binär-Zahl in eine Dezimalzahl umwandeln können.

Code

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

Lösungsschritte
Meine erste Zeile:
export function ipToInt32(ip: string): number {
Jetzt den String in ein Array umwandeln:
const binary32bit = ip.split(".");

Dazu splitten wir den String einfach an den Punkten.

Da wir TypeScript verwenden, müssen wir die String-Zahlen in richtige Zahlen umwandeln:
    .map(Number)

Das ginge auch zusammen mit dem nächsten Schritt, aber mit diesem .map(Number)-Zwischenschritt bleibt alles schön übersichtlich.

Jetzt die Umwandlung von einer Zahl zu einem 8-stelligen binären String:
    .map((num) => num.toString(2).padStart(8, "0"))

Auch hier drängt sich wieder .map() auf. Denn wir wollen genauso viele Elemente zurück haben wie rein gegangen sind.

Das (optionale) Argument 2 in .toString() wandelt die Zahl in einen binären String um.

Da nicht jede binäre Zahl automatisch 8 Stellen (Bits) hat, hängen wir die fehlenden Nullen noch vorne dran.

Dann machen wir aus den Elementen des Arrays einen einzigen String. Die Punkte brauchen wir nicht mehr:
    .join("");

Wir erhalten einen 32-stelligen binären String.

Jetzt nur noch den binären String in eine Dezimalzahl umwandeln und zurückgeben:
  return parseInt(binary32bit, 2);
}
Voilá! 💪

Fragen?

Komplettlösung
export function ipToInt32(ip: string): number {
  const binary32bit = ip
    .split(".")
    .map(Number)
    .map((num) => num.toString(2).padStart(8, "0"))
    .join("");

  return parseInt(binary32bit, 2);
}

Feedback

Schreib mir!