<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
Step1:  Introdução à Programação em Python
Estruturas de Repetição
Vamos lembrar das aulas de Natureza da Informação quando aprendemos a converter um número decimal para binário.
Começando com o exemplo de dec = 14.
|dec|dec/2|dec%2|bin|
|--|--|--|--|
|14|7|0|0|
|7|3|1|10|
|3|1|1|110|
|1|0|1|1110|
|0|-|-|1110|
O número binário é 1110.
Vamos descrever o processo que realizamos
Step2:  Para resolver o primeiro item, utilizamos o comando while que significa enquanto
Step3:  Reparem que substituindo $2$ por qualquer outro número, convertemos o número para outras bases menores do que $10$.
Nota
Step4:  Como podemos adaptar nossa função para que possamos converter também para bases maiores que 10?
Step5:  Faça um programa que sorteie um número e peça para o usuário adivinhar. 
Informe o usuário se o número sorteado é maior ou menor que o chute dele e repita a operação até que ele adivinhe.
Para sortear um número use a função randint(a,b) da biblioteca random, ele sorteia um número inteiro entre a e b.
Step6:  A multiplicação Etíope é um método de multiplicação que utiliza apenas a divisão e multiplicação por $2$. 
Dado $m$ e $n$, faça
Step7:  Existem algumas sintaxes no Python conhecidas como Syntactic sugar que são formas de reduzir longas sequências de instruções de uma forma mais simples para leitura.
Um exemplo são instruções if-else que contém apenas uma instrução a serem executadas
Step8:  Crie uma função para calcular a soma dos dígitos de um número.
Primeiro, faça o procedimento sem auxílio do computador e tente abstrair a solução do problema.
DICA
Step9:  Crie uma função para verificar se um número é primo!
Pense na condição de repetição e quando podemos retornar o resultado para fazer o menor número de repetições.
<ASSISTANT_TASK:>
Python Code:
def DivResto(num, base):
    
    Retorna o quociente e resto da divisão de num por base
    
    return num//base, num%base
dec = 14
bin = ""   # string vazia
div, resto = DivResto(dec,2)
dec = div
bin = str(resto) + bin
print(bin)
# repete mais uma vez, pois temos outro dígito
div, resto = DivResto(dec,2)
dec = div
bin = str(resto) + bin
print(bin)
Explanation: Introdução à Programação em Python
Estruturas de Repetição
Vamos lembrar das aulas de Natureza da Informação quando aprendemos a converter um número decimal para binário.
Começando com o exemplo de dec = 14.
|dec|dec/2|dec%2|bin|
|--|--|--|--|
|14|7|0|0|
|7|3|1|10|
|3|1|1|110|
|1|0|1|1110|
|0|-|-|1110|
O número binário é 1110.
Vamos descrever o processo que realizamos:
enquanto dec era maior que zero
dividimos dec por 2
o quociente guardamos em dec, o resto concatenamos a esquerda do número binário
para facilitar vamos escrever o número binário como uma string!
Os 3 últimos itens podem ser resolvidos com nosso conhecimento atual. 
Vamos fazer um rascunho desses itens:
End of explanation
def Converte(dec,base):
    num = ""
    while dec > 0:
        div, resto = DivResto(dec,base)
        dec = div
        num = str(resto) + num
    return num
print(Converte(14,2))
Explanation: Para resolver o primeiro item, utilizamos o comando while que significa enquanto:
python
while condicao verdadeira:
    faça alguma coisa
Esse comando instrui o Python a repetir o bloco de instruções abaixo enquanto certa condição for verdadeira.
No nosso caso a condição é que dec seja maior que zero.
End of explanation
def Converte(dec,base=2):
    num = ''
    while dec > 0:
        div, resto = DivResto(dec,base)
        dec = div
        num = str(resto) + num
    return num
print(Converte(14)) # usará a base 2
print(Converte(14, 3)) # usará a base 3
print(Converte(14, base=3)) # usará a base 3
Explanation: Reparem que substituindo $2$ por qualquer outro número, convertemos o número para outras bases menores do que $10$.
Nota: Podemos indicar para uma função um valor padrão para sua variável.
End of explanation
def Converte(dec,base):
    num = ''        
    while dec > 0:
        div, resto = DivResto(dec,base)
        dec = div
        num = ??? + num
    return num
print(Converte(14,16), hex(14)) # hexadecimal
import string
print(dir(string))
print()
print(string.digits, string.ascii_uppercase)
digitos = string.digits+string.ascii_uppercase
print(digitos[0], digitos[10])
def Converte(dec,base):
    digitos = string.digits+string.ascii_uppercase
    num = ''        
    while dec > 0:
        div, resto = DivResto(dec,base)
        dec = div
        num = digitos[resto] + num
    return num
print(Converte(14,16), hex(14)) # hexadecimal
Explanation: Como podemos adaptar nossa função para que possamos converter também para bases maiores que 10?
End of explanation
import random
def Adivinhe():
    x = random.randint(0,100)
    
    
    
    
    
Adivinhe()            
Explanation: Faça um programa que sorteie um número e peça para o usuário adivinhar. 
Informe o usuário se o número sorteado é maior ou menor que o chute dele e repita a operação até que ele adivinhe.
Para sortear um número use a função randint(a,b) da biblioteca random, ele sorteia um número inteiro entre a e b.
End of explanation
def Etiope(m, n):
    
    
    
    
    
    
print(Etiope(12,13), 12*13)
print(Etiope(22,18), 22*18)
Explanation: A multiplicação Etíope é um método de multiplicação que utiliza apenas a divisão e multiplicação por $2$. 
Dado $m$ e $n$, faça:
Se $m$ for ímpar some $n$ ao resultado
Enquanto $m$ for maior ou igual a 1 repita:    
Divida $m$ por $2$, multiplique $n$ por $2$
Se $m$ for ímpar, some $n$ ao resultado
End of explanation
def Etiope(m, n):
    
    
    
print(Etiope(12,13), 12*13)
print(Etiope(22,18), 22*18)
Explanation: Existem algumas sintaxes no Python conhecidas como Syntactic sugar que são formas de reduzir longas sequências de instruções de uma forma mais simples para leitura.
Um exemplo são instruções if-else que contém apenas uma instrução a serem executadas:
python
variavel = valor1 if condicao else valor2
A variável irá receber o valor1 caso a condição seja verdadeira, caso contrário receberá o valor2.
Outra Syntactic Sugar é atribuição de valores para múltiplas variáveis em uma linha:
python
variavel1, variavel2 = valor1, valor
A variavel1 receberá o valor1, enquanto a variavel2 receberá o valor2.
End of explanation
def SomaDigitos(num):
   
    
    
print(SomaDigitos(12345))
Explanation: Crie uma função para calcular a soma dos dígitos de um número.
Primeiro, faça o procedimento sem auxílio do computador e tente abstrair a solução do problema.
DICA: Utilize a nossa função DivResto() criada anteriormente.
End of explanation
def Primo(num):
    # ele não pode ser divisível por nenhum número de 2 a num-1
    
    
    
    
print(Primo(10))
print(Primo(13))
print(Primo(131))
Explanation: Crie uma função para verificar se um número é primo!
Pense na condição de repetição e quando podemos retornar o resultado para fazer o menor número de repetições.
End of explanation
<END_TASK>