RosettaCodeData/Task/Canonicalize-CIDR/Mathematica/canonicalize-cidr.math
2023-07-01 13:44:08 -04:00

28 lines
991 B
Text

ClearAll[CanonicalizeCIDR]
CanonicalizeCIDR[str_String] := Module[{i, ip, chop, keep, change},
If[StringMatchQ[str, "*.*.*.*/*"],
i = StringSplit[str, "." | "/"];
i = Interpreter["Integer"] /@ i;
If[MatchQ[i, {_Integer, _Integer, _Integer, _Integer, _Integer}],
If[AllTrue[i, Between[{0, 255}]],
{ip, {chop}} = TakeDrop[i, 4];
ip = Catenate[IntegerDigits[ip, 2, 8]];
{keep, change} = TakeDrop[ip, chop];
change = ConstantArray[0, Length[change]];
ip = Partition[Join[keep, change], 8];
ip = ToString[FromDigits[#, 2]] & /@ ip;
StringRiffle[ip, "."] <> "/" <> ToString[chop]
,
Failure["Invalid range of numbers", <|"Input" -> str|>]
]
,
Failure["Invalid format", <|"Input" -> str|>]
]
]
]
CanonicalizeCIDR["87.70.141.1/22"]
CanonicalizeCIDR["36.18.154.103/12"]
CanonicalizeCIDR["62.62.197.11/29"]
CanonicalizeCIDR["67.137.119.181/4"]
CanonicalizeCIDR["161.214.74.21/24"]
CanonicalizeCIDR["184.232.176.184/18"]