Enunciados Algoritmos

171 views
Skip to first unread message

Cássio Botaro

unread,
Feb 16, 2012, 10:15:22 PM2/16/12
to pyth...@googlegroups.com
Uma boa prática de programadores é se confrontarem com problemas diferentes do que estão habituados em seu quotidiano,pensando nisso será lançado aqui na lista uma série de desafios(fáceis e difíceis) visando a todos aprenderem e aprimorarem.Para iniciantes é uma boa maneira de se confrontar com problemas e tentar resolve-los.Para veteranos da linguagem pode ser encarado como passatempo ou uma forma de treinar suas habilidades.
Nesse tópico sempre serão colocados os desafios e em um tópico separado serão dada as respostas e dúvidas que venham a surgir.
Convido a todos da lista participarem e discutam a resposta alheia de forma a aprimorar ou entender o que está sendo feito.
O Fábio já iniciou o desafio em outro tópico.vou traze-lo pra cá e junto já coloco mais um desafio.
Tentaremos usar sempre um padrão na postagem de desafios,virá o enunciado,um exemplo ou vários e valores de teste a qual o programa deve passar.
Esse padrão foi pensado em trazer um pouco de testes(TDD) aos nossos problemas e ajudar compreensão  trazendo exemplos.
Aqueles que quiserem enviar um desafio sigam nosso padrão e postem como resposta a este tópico.
Algumas regras:

-não poste respostas neste tópico e sim em tópico separado
-a intenção é todos participarem e não gerar divergência
-mesmo que outro já tenha postado resposta poste a sua
-discutiremos todas para ver o melhor caminho de fazer aquilo

Conto com participação de todos!

obs:a única exceção a regra é o primeiro do Fábio que foi divulgado antes deste tópico.
___________________________________________________________________________________________________________________________________________________________
1 - Faça um programa recursivo para gerar a decomposição de um número
inteiro positivo na soma de todos os
possíveis factores como mostrado a seguir. Por exemplo, para n = 5,
temos:

5
4 + 1
3 + 2
3 + 1 + 1
2 + 2 + 1
2 + 1 + 1 + 1
1 + 1 + 1 + 1 + 1

Obs:Solução postada em outro tópico
_________________________________________________________________________________________________________________________________________________________

2-Nós queremos fazer uma linha de pedras de tamanho tam cm. Tijolos pequenos representam 1 cm e grande 5 cm. Faça uma função que retorne  True se é possível fazer a linha usando os tijolos passados como parâmetro escolhendo a quantidade entre eles(Ex: 2 pequenos e 1 grande para linha de 7 cm ).

Exemplos:
linha_tijolos(3, 1, 8)  retorna True
linha_tijolos(3, 1, 9)  retorna False
linha_tijolos(3, 2, 10)retorna True

Testes:
assert  linha_tijolos(3, 2, 8)==True
assert  linha_tijolos(3, 2, 9)==False
assert  linha_tijolos(6, 1, 11)==True
assert  linha_tijolos6, 0, 11)==False
assert  linha_tijolos(3, 1,7)==True
assert  linha_tijolos(1, 1,7)==False
assert  linha_tijolos(2, 1,7)==True
assert  linha_tijolos(7, 1, 11)==True
assert  linha_tijolos(7, 1, 8)==True
assert  linha_tijolos(7, 1, 13)==False
assert  linha_tijolos(43,1, 46)==True

__________________________________________________________________________________________________________________________________________________________





Cássio Botaro

unread,
Feb 16, 2012, 10:51:41 PM2/16/12
to pyth...@googlegroups.com
Errata do desafio:
A função recebe como parametro linha_tijolos(pequeno,grande,tam)*

Cássio Botaro

unread,
Feb 28, 2012, 11:19:03 AM2/28/12
to pyth...@googlegroups.com
ERRATA DO DESAFIO NUMÉRO 2:
Não é necessário utilizar todos os tijolos.Caso sobre tijolos ainda assim o retorno será verdadeiro.

Cássio Botaro

unread,
Mar 2, 2012, 6:06:12 PM3/2/12
to pyth...@googlegroups.com
Desafio 3

1-Crie um programa que efetue calculos de forma posfixa.Quando apenas um elemento é passado o retorno é ele mesmo.Qualquer erro na operação deve ser retornado 'Erro'.A entrada já está formatada de forma correta e será apenas com valores inteiros.

Exemplos:
calcula('1 2 + 3 - ')  retorna '0'
calcula('3 1 * 2 + ')  retorna '5'
calcula('2 2 / 2 / ')  retorna '0.5'// '0' no python 2
calcula('3') retorna '3'
calcula('3 0 /') retorna ' Erro'
calcula('5 0 + 3 - 2 * 1 +') retorna '5'


Testes:
assert calcula('1 1 +')=='2'
assert calcula('1 1 *')=='1'
assert calcula('1 1 /')=='1'
assert calcula('1 1 -')=='0'
assert  calcula('')=='Erro'
assert  calcula('3 1 * 2 + ')=='5'
assert  calcula('3 0 /') =='Erro'
assert  calcula('1 2 + 1 - 1 - ') =='1'
assert  calcula('4 3 - 10 - ')=='-9'
assert calcula('1 3 - ')=='-2'
assert  calcula('1 2 + 3 - 4 + 4 * 4 /') == '4'
assert  calcula('1 2 + 3 - 4 + 4 * 0 /') == 'Erro'
assert  calcula('6') retorna '6'
assert  calcula('0') retorna '0'
assert  calcula('2 2 * 2 / ')=='2'
#assert calcula('2 2 / 2 / ')=='0.5'  Descomente este teste caso utilize python 3.x
#assert calcula('2 2 / 2 / ')=='0     Descomente este teste caso utilize python 2.x




Cássio Botaro

unread,
Mar 2, 2012, 6:38:51 PM3/2/12
to pyth...@googlegroups.com
Errata do desafio 3:


assert  calcula('6') retorna '6'
assert  calcula('0') retorna '0'

Na verdade os testes são:

assert  calcula('6') == '6'
assert  calcula('0') == '0'
Message has been deleted
Message has been deleted
Message has been deleted
Message has been deleted

Cássio Botaro

unread,
Mar 3, 2012, 8:47:54 AM3/3/12
to pyth...@googlegroups.com
Errata do desafio 3:

Como foi notado,os testes não cobrem integralmente a notação pós-fixa.Algumas soluções propostas não solucionam certos casos desta notação.Tornando assim o problema aparentemente mais simples.
As soluções propostas estão corretas para os testes antigos mas possivelmente falham em outros casos da notação.
Visando abranger por completo a notação pós-fixa esta errata errata trás alguns novos testes.
 
assert calcula('1 2 3 4 5 * * * *') == '120'
assert calcula('1 2 + 1 2 + -') == '0'
assert calcula('5 4 3 2 2 - * + *') == '20'
assert calcula('1 2 + 2 1 - * 2 * 2 /') == '3'
assert calcula('9 3 2 2 / * * ') == '27'
assert calcula('1 2 - 1 2 - -') == '0'

Se ainda existirem casos  que os testes não cobrem por favor entre em contato comigo que posto aqui uma errata.
Qualquer erro postado aqui reporte a mim por email pois posso ter errado algo, embora revise bem antes de postar.
Aqueles que já postaram soluções,peço desculpas e fica ai o desafio de refatorar o código para passar em todos os testes.

[ ]'s


Message has been deleted

Cássio Botaro

unread,
Mar 10, 2012, 3:24:24 PM3/10/12
to pyth...@googlegroups.com
  4-Projete um decodificador para a seguinte codificação.Mas com um problema.A codificação utilizada não será dada.Será um desafio deduzir a codificação a partir dos testes  e exemplos.Caso descubra codificação poste também na resposta.Considere que as entradas não possuem acentos.
 

Exemplos:
decodifica('teste')  retorna 'grfgr'
decodifica('bola')  retorna 'obyn'
decodifica('labio')retorna 'ynovb'

Testes:
assert  decodifica('a')=='n'
assert  decodifica('A')=='N'
assert  decodifica('rio')=='evb'
assert  decodifica('Mala')=='Znyn'
assert  decodifica(' ')==' '
assert  decodifca('MITO')=='ZVGB'
assert  decodifica('MaTo')== 'ZnGb'
assert  decodifica("MiToLoGia")=='ZvGbYbTvn'
assert decodifica('sApo')=='fNcb'
assert  decodifica('rato1')=='engb1'
assert  decodifica('sapo2/')=='fncb2/'
   assert  decodifica('<html>Isto foi um teste</html>') =='<ugzy>Vfgb sbv hz grfgr</ugzy>'

Cássio Botaro

unread,
Mar 10, 2012, 6:22:42 PM3/10/12
to pyth...@googlegroups.com
Pequena erra sobre os testes:

O correto é:

assert  decodifica('MITO')=='ZVGB'



Message has been deleted

Rafael Alencar

unread,
Mar 21, 2012, 1:12:46 PM3/21/12
to pyth...@googlegroups.com
Desafio 5

Escreva uma função que receba como argumento uma string com código (X)HTML e remova as tags, retornando apenas o texto.
Só é permitido o uso da biblioteca padrão da linguagem.

Testes:

assert  remove_tags(' ') == ' '
assert  remove_tags('1<!-- 2 -->3') == '13'
assert  remove_tags('lingua-<br>gem') == 'lingua-gem'
assert  remove_tags('<head><meta charset="utf-8"></head>') == ''
assert  remove_tags('<h1>Python:</h1> <p>Python é uma linguagem de programação de alto nível...</p> <a href="#">Ler mais</a>') == 'Python: Python é uma linguagem de programação de alto nível... Ler mais'
assert  remove_tags('<div id="42">Python <br />Ruby <br />Lua<br /><br/></div>') == 'Python Ruby Lua'
assert  remove_tags('<strong>Foto: </strong><img src="foo.png" alt="Foo" /><p class="texto-oculto">Logotipo da linguagem</p>') == 'Foto: Logotipo da linguagem'
assert  remove_tags('<ul><li ><br >Item 1<br> </li><li>Item 2</li><p style="float: left; margin-top: 0;"></p></ul>') == 'Item 1 Item 2'
assert  remove_tags('<div name="1">A<div class="a">B<div id="0"></div></div><a href="#" onclick="javascript: alert(42);">C</a></div>') == 'ABC'

Rafael Alencar

unread,
Mar 21, 2012, 5:02:38 PM3/21/12
to pyth...@googlegroups.com
Mais alguns testes:

assert  remove_tags('<p>1 < 2 < 3</p>') == '1 < 2 < 3'
assert  remove_tags('''<h1
>Teste</h1>''') == 'Teste'
assert  remove_tags('<p onclick="javascript:alert(10 > 2);">Teste</p>') == 'Teste'
assert  remove_tags('<img class="0" name="a" id="a" style="margin: 10px 0"\nsrc="/img/x.png" alt="Teste"\n title="Teste">') == ''

[ ] 's

Rafael Alencar

Pinguim Azul

unread,
Mar 21, 2012, 5:20:33 PM3/21/12
to pyth...@googlegroups.com
Acho que isso aqui não é html válido não hein, o certo seria <p> 1
&lt; 2 &lt; 3</p>

assert  remove_tags('<p>1 < 2 < 3</p>') == '1 < 2 < 3'

--
Ricardo Bittencourt
http://www.ricbit.com

Pinguim Azul

unread,
Mar 21, 2012, 5:44:47 PM3/21/12
to pyth...@googlegroups.com
Aliás, eu retiro o que disse. Conferi no spec, e uma start tag não
pode ter espaços logo após o <, então esse código é válido sim.

Cássio Botaro

unread,
Apr 4, 2012, 10:22:56 PM4/4/12
to pyth...@googlegroups.com
Se tem uma coisa que não perco é minha determinação de ter movimento nesta lista.Acredito no poder da comunidade e da linguagem por isso hoje apresento o desafio 6.Espero ter maior participação de todos.Sei que a lista não é feita só de problemas portanto convido todos a participarem enviando dúvidas.A dúvida de um pode contribuir com o projeto de outro.
Um detalhe neste problema é..para cada um que postar a resposta deve junto propor 2 novos testes...assim aumentamos a abrangência dos nossos testes.
Então vamos então ao problema:

6-Faça um Programa que leia um número inteiro menor que 1000  e imprima a quantidade de centenas, dezenas e unidades do mesmo.

Exemplo:
converte(10)  retorna "1 dezena"
converte(22)  retorna "2 dezenas e 2 unidades"
converte(121) retorna "1 centena e 2 dezenas e 1 unidade"

Testes:

assert converte(10)=="1 dezena"
assert converte(0)=="0 unidades"
assert converte(100)=="1 centena"
assert converte(1)=="1 unidade"
assert converte(101)=="1 centena e 1 unidade"
assert converte(202)=="2 centenas e 2 unidades"
assert converte(333)=="3 centenas e 3 dezenas e 3 unidades"
assert converte(-1)=="1 unidade"
assert converte(-10)=="1 dezena"
assert converte(-202)=="2 centenas e 2 unidades"
assert converte(1001)=="Erro"
assert converte(-1001)=="Erro"
assert converte(11)=="1 dezena e 1 unidade"
assert converte(-22)=="2 dezenas e 2 unidades"
assert converte(795)=="7 centenas e 9 dezenas e 5 unidades"







Cássio Botaro

unread,
Apr 4, 2012, 11:31:05 PM4/4/12
to pyth...@googlegroups.com
Testes extras do Rafael Alencar:

assert converte(100000000) == 'Erro'
assert converte(00) == '0 unidades'

Cássio Botaro

unread,
Jul 8, 2012, 1:01:35 AM7/8/12
to pyth...@googlegroups.com
Este tópico foi criado a algum tempo com intuito citado no primeiro tópico.Porém foi abandonado por causa de baixa participação dos membros e falta de tempo para formualção dos exercícios.Na ultima reunião discutimos sobre a volta destes problemas mas reformulados.Inicialmente gostaria de saber opnião da comunidade.Caso alguém se sinta encomodado poderemos levar os exercicios para o site do grupo.[1].E discutimos aqui as resoluções.Outra discussão foi acerca da criação de um ranking valorizando quem participar.
Seria no seguinte formato:
1 pt participação
1 pt acertar
1 pt primeiro a acertar
Alguns outros assuntos como categorias,dificuldade e tudo mais também estão em aberto.

Discutam a respeito.Semana que vem iniciaremos as atividades(seja lá como ficar decidido).

[1] http://python-mg.github.com/

Rafael Alencar

unread,
Jul 8, 2012, 11:03:28 AM7/8/12
to pyth...@googlegroups.com
Cássio, não ia ser:

1 ponto por participação, com resposta incompleta ou errada
2 pontos para quem acertar
3 pontos para o primeiro a acertar

* Pontos por exercício não cumulativos

Isac Sandin

unread,
Jul 9, 2012, 7:46:37 AM7/9/12
to pyth...@googlegroups.com
Galera, sou um dos que está tendo pouco tempo para resolver os desafios, mas se tiverem com pouco tempo para bolar os desafios, existe um site que sou membro, Project Euler que tem vários desafios com vários graus de dificuldade, a galera pode se cadastrar e colocar as friendkeys aqui e todo mundo adiciona todo mundo, assim vc pode ver o progresso dos seus amigos, isso te incentiva a resolver mais problemas e a discutir as soluções que foram pensadas muito legal mesmo...

Cássio Botaro

unread,
Jul 17, 2012, 10:23:24 PM7/17/12
to pyth...@googlegroups.com
Até final desta semana pretendo trazer de volta o tópico.Mais alguma sugestão,crítica ou discussão a respeito?

[ ]'s
Cássio

Cássio Botaro

unread,
Jul 20, 2012, 10:30:40 PM7/20/12
to pyth...@googlegroups.com
Como já disse a semana toda,estamos de volta.Quem acompanha no twitter(pythonmg) e no nosso canal do irc(#python-mg) já deve estar sabendo de antemão que retornaremos o topico.
estamos com algumas mudanças.Agora teremos um ranking...que será colocado no site do grupo.

Tentarei ser sucinto e claro...e apresento a todos as novas(talvez não) regras.Para entender algumas decisões atuais, leiam o tópico desde
o inicio.

* Os desafios serão postados pontualmente no domingo, às 12:00.
* Caso acerte tem direito(não obrigatório) a adicionar 2 novos testes ao problema(leia discussões anteriores para explicação dessa medida).
* Prazo para resolução é de 7 dias.Ou seja, serão aceitos resultados até 11:59 da semana seguinte
* não poste respostas neste tópico e sim em tópico separado
* a intenção é todos participarem e não gerar divergência
* discutiremos as respostas

Como funciona o ranking:
1 pt participação
2 pt acertar
3 pt primeiro a acertar

Detalhes sobre o ranking:

* Para ganhar o ponto de participação é necessário tentar.
* Respostas iguais serão desconsideradas.
* O primeiro a acertar é o primeiro a postar,caso sua solução esteja correta seu ponto será computado.
* Caso alguém que solucione posteriormente apresente teste em que o software do primeiro a postar falhe este tem direito a correção do código dentro do prazo.

Reiniciaremos neste domingo,dia 22 de julho.

Cássio Botaro

unread,
Jul 21, 2012, 3:57:39 PM7/21/12
to pyth...@googlegroups.com
Leve mudança:

* prazo é de 15 dias e exercicios serão postados quinzenalmente.

Cássio Botaro

unread,
Jul 22, 2012, 10:17:26 AM7/22/12
to pyth...@googlegroups.com
Primeiro desafio lançado, aguardo a resposta de todos.

https://gist.github.com/3159834

[ ]'s

Pinguim Azul

unread,
Jul 22, 2012, 12:04:00 PM7/22/12
to pyth...@googlegroups.com
O enunciado está com problema, ele diz que tem uma linha em branco
após cada idade, mas no exemplos não tem nenhuma linha em branco.

2012/7/22 Cássio Botaro <cassio...@gmail.com>:
> Primeiro desafio lançado, aguardo a resposta de todos.
>
> https://gist.github.com/3159834
>
> [ ]'s
>
> --

Cássio Botaro

unread,
Jul 22, 2012, 1:22:49 PM7/22/12
to pyth...@googlegroups.com
corrigido!

Pinguim Azul

unread,
Jul 22, 2012, 1:26:49 PM7/22/12
to pyth...@googlegroups.com
O nome da função está inconsistente também, no enunciado é problema1()
e nos exemplos é problema().

On Sun, Jul 22, 2012 at 2:22 PM, Cássio Botaro <cassio...@gmail.com> wrote:
> corrigido!

Cássio Botaro

unread,
Jul 22, 2012, 1:31:54 PM7/22/12
to pyth...@googlegroups.com
Corrigido!...só reportar que faço a correção.
Mais uma vez obrigado!

Rafael Alencar

unread,
Aug 2, 2012, 11:19:43 AM8/2/12
to pyth...@googlegroups.com
Pessoal,

O prazo para participação no desafio foi prorrogado até o final da semana que vem, quando será postado o segundo desafio e o ranking será atualizado.

[ ]' s

Rafael Alencar

Cássio Botaro

unread,
Aug 12, 2012, 10:48:26 AM8/12/12
to pyth...@googlegroups.com
Segundo desafio postado:

https://gist.github.com/3332137

Lembro que ranking pode ser encontrado em :

http://python-mg.github.com/pages/ranking.html

Alguns detalhes:
* Quem acerta pode adicionar 2 novos testes ao problema.
* O ranking foi montado mas caso ainda seja encontrado erro nos problemas anteriores
o autor da resolução será advertido e poderá reenviar resposta com correção.
* É sempre importatante entender as resoluções, portanto você iniciante, não tenha vergonha de perguntar.
* Próximo desafio será dia 26/08 e será prazo para envio deste.

Pinguim Azul

unread,
Aug 12, 2012, 11:13:42 AM8/12/12
to pyth...@googlegroups.com
Eu esqueci de avisar mas tinha uma das soluções que falhava, peraí que
vou construir um caso de teste.

2012/8/12 Cássio Botaro <cassio...@gmail.com>:

Cássio Botaro

unread,
Aug 21, 2012, 1:35:30 PM8/21/12
to pyth...@googlegroups.com
Ranking atualizado.
Segue link para visualização. ( http://python-mg.github.com/pages/ranking.html)
Caso seu nome tenha sido retirado, procure ver se sua solução estava correta para todos os testes(https://github.com/python-mg/DesafiosPython-mg)
Mandei email alertando sobre testes que falham e outras correções necessárias.
Assim que seu problema for corrigido seu ponto será computado.
Lembro que neste domingo será apresentado um novo problema com isso encerramos o prazo de correção do 1º desafio.
O prazo para correção do segundo é dia 9 de setembro.
Obrigado por sua participação .

[ ]'s


Rafael Alencar

unread,
Aug 26, 2012, 2:39:05 PM8/26/12
to pyth...@googlegroups.com
Pessoal, segue o enunciado do terceiro desafio:


O ranking pode ser encontrado em:


O prazo para postagem de soluções é até dia 02/09/2012. Lembrando que quem postar uma solução correta pode adicionar 2 novos testes ao problema.

SleX Luthor

unread,
Aug 27, 2012, 11:16:48 AM8/27/12
to pyth...@googlegroups.com
def telefone(texto, ignoreAccents=True):
    from unicodedata import normalize
    encode = type(texto) is str
    if encode: texto = texto.decode('LATIN-1')
    d=list(u'ABCDEFGHIJKLMNOPQRSTUVWXYZ')
    p=list(u'22233344455566677778889999')
    dp = {}
    if ignoreAccents:
        texto = normalize('NFKD', texto).encode('ASCII','ignore')
    for i in xrange(0,len(d)): dp[d[i]]=p[i]
    resp = ''.join([dp.get(s,s) for s in texto])
    return resp.encode('ASCII','ignore') if encode else resp


def test_string_grande(self):
    '''teste de string grande'''
    self.assertEquals(telefone('THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG'), '843 78425 27696 369 58677 6837 843 5299 364')

def test_string_acento(self):
    '''teste de string acento'''
    self.assertEquals(telefone('OLÁ MUNDO CRUEL!'), '652 68636 27835!')

def test_string_acento_unicode(self):
    '''teste de string acento unicode'''
    self.assertEquals(telefone(u'OLÁ MUNDO CRUEL!'), u'652 68636 27835!')


Rafael Alencar

--
 
 
 



--
Alexandre Villela Eiras Brandão de Oliveira
or simply "SleX"

"Dispõe o Eterno Escriba e, havendo escrito, a folha vira. E não há ciência ou devoção que apague uma linha. E não há pranto sofrido que risque uma palavra. Ah, todo choro é vão!" (Omar Khayyam no livro Rubayat)

SleX Luthor

unread,
Aug 27, 2012, 11:43:45 AM8/27/12
to pyth...@googlegroups.com
usando string.maketrans


#-*- coding:utf-8
import string

def telefone(
        texto,
        ignoreAccents=True,
        ignoreSensitiveCharacter=True,
        validCharacters=string.ascii_letters + string.digits + '- !'

    ):
    from unicodedata import normalize
    encode = type(texto) is str
    if encode: texto = texto.decode('LATIN-1')
    if ignoreAccents: texto = normalize('NFKD', texto).encode('ASCII','ignore')
    if ignoreSensitiveCharacter: texto = texto.upper()
    for s in texto:
        if not s in validCharacters:
            raise ValueError
    depara = string.maketrans(
        u'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
        u'22233344455566677778889999'
    )
    resp = texto.translate(depara)

    return resp.encode('ASCII','ignore') if encode else resp



def test_string_grande(self):
    '''teste de string grande'''
    self.assertEquals(telefone('
THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG'), '843 78425 27696 369 58677 6837 843 5299 364')

def test_string_acento(self):
    '''teste de string acento'''
    self.assertEquals(telefone('OLÁ MUNDO CRUEL!'), '652 68636 27835!')

def test_string_acento_unicode(self):
    '''teste de string acento unicode'''
    self.assertEquals(telefone(u'OLÁ MUNDO CRUEL!'), u'652 68636 27835!')



Em 26 de agosto de 2012 15:39, Rafael Alencar <raf...@gmail.com> escreveu:

Rafael Alencar

--
 
 
 

Cássio Botaro

unread,
Sep 11, 2012, 11:15:05 PM9/11/12
to pyth...@googlegroups.com
Desculpem pela demora da atualização do ranking e de novos desafios.Estive envolvido em alguns projeos que estão tomando muito meu tempo.Aqueles que tiverem interesse em contribuir para que não acabe os exercicios entrem em contato.
[ ]'s


Reply all
Reply to author
Forward
0 new messages