Skip to content

Commit

Permalink
Add dojo 056
Browse files Browse the repository at this point in the history
  • Loading branch information
zsinx6 committed Jul 17, 2024
1 parent 0e7896c commit a6418f0
Show file tree
Hide file tree
Showing 5 changed files with 237 additions and 1 deletion.
99 changes: 99 additions & 0 deletions 056/ex1.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
"""
Dada uma string que contenha números, obter a soma e o produto dos
números inteiros contidos na string.
A função deve receber uma string e retornar uma tupla com o resultado.
Caso a string não possua números, deve-se retonar None e não a tupla.
Exemplos:
a8b2 -> (10, 16)
nnn -> None
a101 1 -> (102, 101)
>>> valor_da_soma("a8n2")
10
>>> valor_da_soma("a8n3")
11
>>> valor_da_soma("a101 1")
102
>>> valor_da_soma("1000")
1000
>>> valor_da_soma("")
>>> valor_da_mul("a8n2")
16
>>> valor_da_mul("a8n3")
24
>>> valor_da_mul("a101 8")
808
>>> valor_da_mul("1")
1
>>> valor_da_mul("8")
8
>>> valor_da_mul("")
>>> resultado("a8b2")
(10, 16)
>>> resultado("a8b3")
(11, 24)
>>> resultado("abc")
>>> resultado("a101 1")
(102, 101)
>>> extrai_numeros("a8b2")
[8, 2]
>>> extrai_numeros("a8b3")
[8, 3]
>>> extrai_numeros("aaaa")
[]
>>> extrai_numeros("")
[]
"""

def valor_da_soma(string):
numeros = extrai_numeros(string)
return sum(numeros) if len(numeros) > 0 else None

def valor_da_mul(string):
numeros = extrai_numeros(string)
if len(numeros) == 0:
return None
resultado = 1
for valor in numeros:
resultado *= valor
return resultado

def resultado(string):
soma, multi = valor_da_soma(string), valor_da_mul(string)
if all([soma, multi]):
return soma, multi
return

def extrai_numeros(string):
numeros = []
atual = ""
for caracter in string:
if caracter.isnumeric():
atual += caracter
else:
if atual != "":
numeros.append(int(atual))
atual = ""
if atual != "":
numeros.append(int(atual))
return numeros
76 changes: 76 additions & 0 deletions 056/ex2.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
"""
Um endereço IPv4 é representado como quatro números decimais separados por pontos.
Cada número deve estar no intervalo de 0 a 255.
Por exemplo, 192.168.0.1 é um endereço IPv4 válido, enquanto 256.100.50.0 não é.
A função deve receber uma string e retornar uma tupla.
O primeiro elemento da tupla deve ser um booleano (True se a string for um endereço
IPv4 válido, False caso contrário).
O segundo elemento deve ser uma mensagem de erro detalhando o motivo da falha,
ou None se for válido.
"192.168.0.1" -> (True, None)
"256.100.50.0" -> (False, "Um ou mais octetos estão fora do intervalo de 0 a 255")
"192.168.0" -> (False, "Formato incorreto, deve ter exatamente 4 octetos")
"192.168.0.abc" -> (False, "Um ou mais octetos não são números inteiros")
>>> is_ipv4("192.168.0.1")
True
>>> is_ipv4("192.168.0")
False
>>> is_ipv4("192.168.0.abc")
False
>>> is_ipv4("192.168.999.999")
False
>>> error("192.168.999.999")
'Um ou mais octetos estão fora do intervalo de 0 a 255'
>>> error("192.168.0")
'Formato incorreto, deve ter exatamente 4 octetos'
>>> error("192.168.0.abc")
'Um ou mais octetos não são números inteiros'
>>> error("192.168.0.1")
''
>>> resultado("192.168.0.1")
(True, None)
>>> resultado("192.168.0")
(False, 'Formato incorreto, deve ter exatamente 4 octetos')
>>> resultado("192.168.0.abc")
(False, 'Um ou mais octetos não são números inteiros')
"""

def is_ipv4(ip):
valores = ip.split(".")
if len(valores) != 4:
return False
for valor in valores:
if not valor.isnumeric():
return False
if not (0 <= int(valor) <= 255):
return False
return True

def error(ip):
valores = ip.split(".")
if len(valores) != 4:
return "Formato incorreto, deve ter exatamente 4 octetos"
for valor in valores:
if not valor.isnumeric():
return "Um ou mais octetos não são números inteiros"
if not (0 <= int(valor) <= 255):
return "Um ou mais octetos estão fora do intervalo de 0 a 255"
return ''

def resultado(ip):
return (is_ipv4(ip), error(ip) if error(ip) else None)
49 changes: 49 additions & 0 deletions 056/ex3.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
"""
Um endereço IPv6 é representado como oito grupos de quatro dígitos hexadecimais
separados por dois pontos. Os dígitos podem incluir números de 0 a 9 e letras de
A a F (maiúsculas ou minúsculas).
Por exemplo, 2001:0db8:85a3:0000:0000:8a2e:0370:7334 é um endereço IPv6 válido,
enquanto 2001:db8:85a3::8a2e:370g:7334 não é.
A função deve receber uma string e retornar uma tupla. O primeiro elemento da
tupla deve ser um booleano (True se a string for um endereço IPv6 válido, False
caso contrário).
O segundo elemento deve ser uma mensagem de erro detalhando o motivo da falha,
ou None se for válido.
"2001:0db8:85a3:0000:0000:8a2e:0370:7334" -> (True, None)
"2001:db8:85a3:0:0:8a2e:370g:7334" -> (False, "Um ou mais grupos contêm caracteres inválidos")
"2001:0db8:85a3" -> (False, "Formato incorreto, deve ter exatamente 8 grupos")
>>> erro("2001:db8:85a3:0:0:8a2e:370a:7334")
>>> erro("2001:db8:85a3:0:0:8a2g:370a:7334")
'Um ou mais grupos contêm caracteres inválidos'
>>> erro("2001:0db8:85a3")
'Formato incorreto, deve ter exatamente 8 grupos'
>>> is_ipv6("2001:db8:85a3:0:0:8a2e:370a:7334")
(True, None)
>>> is_ipv6("2001:db8:85a3:0:0:8a2g:370a:7334")
(False, 'Um ou mais grupos contêm caracteres inválidos')
>>> is_ipv6("2001:db8:85a3:0:0:8a2a:370a")
(False, 'Formato incorreto, deve ter exatamente 8 grupos')
"""

def erro(ip):
if ip.count(":") != 7:
return 'Formato incorreto, deve ter exatamente 8 grupos'
validos = "0123456789abcdefABCDEF:"
for valor in ip:
if valor not in validos:
return 'Um ou mais grupos contêm caracteres inválidos'
return

def is_ipv6(ip):
err = erro(ip)
return (err is None, err)
10 changes: 10 additions & 0 deletions 056/retro.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
## O que foi bom?
- Vários aprendizados

## O que podemos melhorar?
- Mais gente, divulgar melhor

## O que aprendemos?
- Função all
- return implicito

4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ Dojos realizados pelos membros do grupy-sanca

## Dojos realizados

### [057 - 16/07/2024](https://github.com/grupy-sanca/dojos/tree/master/047)
### [057 - 16/07/2024](https://github.com/grupy-sanca/dojos/tree/master/057)

### [056 - 11/06/2024](https://github.com/grupy-sanca/dojos/tree/master/056)

### [054 - 16/04/2024](https://github.com/grupy-sanca/dojos/tree/master/054)

Expand Down

0 comments on commit a6418f0

Please sign in to comment.