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))
Prima di tutto mi piacerebbe fare l'iteratore infinito e lasciare che il consumatore a decidere, quanto di esso che vuole. In questo modo è possibile ottenere tutti i numeri morris più brevi di x oi primi x numeri, ecc.
Quindi non c'è ovviamente bisogno di memorizzare l'intera lista dei numeri di morris precedenti in una lista, poiché la ricorsione è solo n := f(n-1)
comunque.
Infine, l'uso di itertools per dare un tocco funzionale vale sempre un punto o due geek;) Ho diviso l'espressione del generatore in più righe per renderlo un po 'più facile per gli occhi.
La bruttezza principale di questa soluzione deriva dal fatto che len()
non può essere chiamato su un iteratore e ci fornisce un int dove abbiamo bisogno di uno str. L'altro hickup è lo str.join nidificato) per appiattire di nuovo l'intera cosa in una str.
Se si desidera avviare la sequenza di numeri arbitrari, definire la funzione come questa:
def morris(morris=None):
if morris is None:
morris = '1'
[...]
Se si vuole girare intorno che generatore, è possibile scrivere in questo modo:
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
non sono sicuro che mi piace la scissione in due funzioni, ma questo sembra essere la soluzione più leggibile:
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
Spero che ti piaccia!
suona come yo stai chiedendo del pesce che schiaffeggia la danza. Che combina Monty Python e Morris Dancing ... :-) –
Se questa cosa non richiedesse almeno 10 caratteri, avrei semplicemente risposto con: D –
perché stai sia yield() che memorizzando valori su un [] ? – Javier