mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-23 21:11:08 +00:00
Create ipv4_conversion.py (#11008)
* Create ipconversion.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update conversions/ipconversion.py * Update ipconversion.py * Rename ipconversion.py to ipv4_conversion.py * forward_propagation(32, 450_000) # Was 10_000_000 --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Christian Clauss <cclauss@me.com>
This commit is contained in:
parent
444dfb0a0f
commit
aa5c97d72c
85
conversions/ipv4_conversion.py
Normal file
85
conversions/ipv4_conversion.py
Normal file
|
@ -0,0 +1,85 @@
|
|||
# https://www.geeksforgeeks.org/convert-ip-address-to-integer-and-vice-versa/
|
||||
|
||||
|
||||
def ipv4_to_decimal(ipv4_address: str) -> int:
|
||||
"""
|
||||
Convert an IPv4 address to its decimal representation.
|
||||
|
||||
Args:
|
||||
ip_address: A string representing an IPv4 address (e.g., "192.168.0.1").
|
||||
|
||||
Returns:
|
||||
int: The decimal representation of the IP address.
|
||||
|
||||
>>> ipv4_to_decimal("192.168.0.1")
|
||||
3232235521
|
||||
>>> ipv4_to_decimal("10.0.0.255")
|
||||
167772415
|
||||
>>> ipv4_to_decimal("10.0.255")
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
ValueError: Invalid IPv4 address format
|
||||
>>> ipv4_to_decimal("10.0.0.256")
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
ValueError: Invalid IPv4 octet 256
|
||||
"""
|
||||
|
||||
octets = [int(octet) for octet in ipv4_address.split(".")]
|
||||
if len(octets) != 4:
|
||||
raise ValueError("Invalid IPv4 address format")
|
||||
|
||||
decimal_ipv4 = 0
|
||||
for octet in octets:
|
||||
if not 0 <= octet <= 255:
|
||||
raise ValueError(f"Invalid IPv4 octet {octet}") # noqa: EM102
|
||||
decimal_ipv4 = (decimal_ipv4 << 8) + int(octet)
|
||||
|
||||
return decimal_ipv4
|
||||
|
||||
|
||||
def alt_ipv4_to_decimal(ipv4_address: str) -> int:
|
||||
"""
|
||||
>>> alt_ipv4_to_decimal("192.168.0.1")
|
||||
3232235521
|
||||
>>> alt_ipv4_to_decimal("10.0.0.255")
|
||||
167772415
|
||||
"""
|
||||
return int("0x" + "".join(f"{int(i):02x}" for i in ipv4_address.split(".")), 16)
|
||||
|
||||
|
||||
def decimal_to_ipv4(decimal_ipv4: int) -> str:
|
||||
"""
|
||||
Convert a decimal representation of an IP address to its IPv4 format.
|
||||
|
||||
Args:
|
||||
decimal_ipv4: An integer representing the decimal IP address.
|
||||
|
||||
Returns:
|
||||
The IPv4 representation of the decimal IP address.
|
||||
|
||||
>>> decimal_to_ipv4(3232235521)
|
||||
'192.168.0.1'
|
||||
>>> decimal_to_ipv4(167772415)
|
||||
'10.0.0.255'
|
||||
>>> decimal_to_ipv4(-1)
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
ValueError: Invalid decimal IPv4 address
|
||||
"""
|
||||
|
||||
if not (0 <= decimal_ipv4 <= 4294967295):
|
||||
raise ValueError("Invalid decimal IPv4 address")
|
||||
|
||||
ip_parts = []
|
||||
for _ in range(4):
|
||||
ip_parts.append(str(decimal_ipv4 & 255))
|
||||
decimal_ipv4 >>= 8
|
||||
|
||||
return ".".join(reversed(ip_parts))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
import doctest
|
||||
|
||||
doctest.testmod()
|
|
@ -28,7 +28,7 @@ INITIAL_VALUE = 0.02
|
|||
def forward_propagation(expected: int, number_propagations: int) -> float:
|
||||
"""Return the value found after the forward propagation training.
|
||||
|
||||
>>> res = forward_propagation(32, 10000000)
|
||||
>>> res = forward_propagation(32, 450_000) # Was 10_000_000
|
||||
>>> res > 31 and res < 33
|
||||
True
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user