Hoje na Fa7 o PugCE realizou o evento PyLestras, tivemos 3 palestras e a resolução de problema em um pequeno Dojo.
As palestras foram:
- 09:00-09:20 – Conhecendo o PugCe (Italo Maia)
- 09:30-10:20 – AppEngine (Filipe Fernandes)
- 10:30-11:20 – Rest com Python (Eu \o)
- 11:30-12:00 – DOJO
O problema proposto para Dojo foi implementar a sequência de Conway da seguinte forma:
# -*- coding: utf-8 -*-
import doctest
def next(prev):
"""
>>> next(1)
'11'
>>> next(2)
'12'
>>> next(312311)
'1311121321'
>>> next(22)
'22'
"""
prev = str(prev)
res = ''
pa = prev[0]
acc = 0
for a in prev:
if a == pa:
acc += 1
else:
res += "%d%s" % (acc, pa)
acc = 1
pa = a
res += '%d%s' % (acc, pa)
return res
def conway(ini, lim):
"""
>>> conway(1, 1)
'1'
>>> conway(1, 6)
'1 11 21 1211 111221 312211'
>>> conway(3, 4)
'3 13 1113 3113'
>>> conway(22, 5)
'22 22 22 22 22'
"""
res = str(ini)
for i in range(lim - 1):
prev = res.split()[-1]
res += " %s" % next(prev)
return res
if __name__ == "__main__":
doctest.testmod(verbose=True)
Um segunda versão usando o módulo itertools do Python e geradores, mostra também como representar exceptions no doctest:
# -*- coding: utf-8 -*-
import doctest
from itertools import groupby
def conway_generator(ini, lim):
"""
>>> a = conway_generator(1, 1)
>>> a.next()
'1'
>>> a = conway_generator(2, 3)
>>> a.next()
'2'
>>> a.next()
'12'
>>> a.next()
'1112'
>>> a.next()
Traceback (most recent call last):
...
StopIteration
"""
res = str(ini)
yield res
for i in range(1, lim):
res = ''.join(["%d%s" % (len(list(g)), k) for k, g in groupby(res)])
yield res
def conway(ini, lim):
"""
>>> conway(1, 1)
'1'
>>> conway(1, 6)
'1 11 21 1211 111221 312211'
>>> conway(3, 4)
'3 13 1113 3113'
>>> conway(22, 5)
'22 22 22 22 22'
"""
return ' '.join(conway_generator(ini,lim))
if __name__ == "__main__":
doctest.testmod(verbose=True)
O problema não foi resolvido na hora do Dojo, mas serviu para mostrar algumas coisas interessante do Python 😀
Os slides da minha palestra seguem abaixo assim como o link para o código usado de exemplo:
source: github.com/fabiocerqueira/murl
livro citado em inglês e português