from itertools import groupby, islice
def morris():
morris = '1'
yield morris
while True:
morris = groupby(morris)
morris = ((len(list(group)), key) for key, group in morris)
morris = ((str(l), k) for l, k in morris)
morris = ''.join(''.join(t) for t in morris)
yield morris
print list(islice(morris(), 10))
tout d'abord je voudrais faire l'itérateur infini et laisser le consommateur décider, combien il qu'il veut. De cette façon, il peut soit obtenir tous les nombres de morris qui sont plus courts que x ou les premiers nombres x, etc.
Ensuite, il n'est évidemment pas nécessaire de stocker la liste entière des nombres morris précédents dans une liste, puisque la récursivité est seulement n := f(n-1)
de toute façon.
Enfin, utiliser itertools pour lui donner une touche fonctionnelle vaut toujours un point geek ou deux;) Je divise l'expression du générateur en plusieurs lignes pour le rendre un peu plus facile pour l'œil.
La principale laideur de cette solution vient du fait que len()
ne peut pas être appelée sur un itérateur et nous donne un int où nous avons besoin d'un str. L'autre hickup est le str.join imbriqué) pour aplatir le tout en str.
Si vous voulez commencer la séquence de nombres arbitraires, définir la fonction comme ceci:
def morris(morris=None):
if morris is None:
morris = '1'
[...]
Si vous voulez tourner autour de ce générateur, vous pouvez l'écrire comme ceci:
def morris():
morris = '1'
yield morris
while True:
print morris
morris = ''.join(''.join(t)
for t in ((str(len(list(group))), key)
for key, group in groupby(morris)))
yield morris
Je ne suis pas sûr que j'aime le fractionnement en deux fonctions, mais cela semble être la solution la plus lisible:
def m_groupby(s):
for key, group in groupby(s):
yield str(len(list(group)))
yield key
def morris():
morris = '1'
yield morris
while True:
morris = ''.join(m_groupby(morris))
yield morris
J'espère que vous l'aimez!
Il semble que yo Je vous pose des questions sur la danse des claquettes de poisson. Cela combine Monty Python et Morris Dancing ... :-) –
Si cette chose ne nécessitait pas au moins 10 caractères j'aurais juste répondu avec: D –
pourquoi êtes-vous à la fois yield() et stocker des valeurs sur un [] ? – Javier