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