Miranda, miembro de este gran equipo de trabajo, nos ha hecho el favor de redactar este enunciado porque conoce muy bien este tema.
Solución:
Python 2.7
import random
import string
import sys
import re
class Markov(object):
def __init__(self,filename):
with open(filename,'r') as f:
self._words = f.read().split()
self._wordCount = len(self._words)
def getWordList(self,seedWord=None,pattern=r'^.*$'):
if seedWord is not None:
chainWords = [self._words[i+1] for i in range(self._wordCount-1)
if seedWord == self._words[i].lower()]
else:
chainWords = self._words
p = re.compile(pattern,re.IGNORECASE)
return filter(p.match,chainWords)
def getRandWord(self,seedWord=None,pattern=r'^.*$'):
wordList = self.getWordList(seedWord,pattern)
if len(wordList) == 0:
return None
return random.choice(self.getWordList(seedWord,pattern))
def main():
list = Markov('AStudyInScarlet.txt')
for word in sys.argv[1:]:
poem = []
for letter in word:
if len(poem) == 0:
nextWord = list.getRandWord(pattern=r'^[0.*$]'.format(letter))
else:
nextWord = list.getRandWord(poem[-1],r'^0.*$'.format(letter))
if nextWord is None:
nextWord = list.getRandWord(pattern=r'^0.*$'.format(letter))
nextWord = ''.join(ch for ch in nextWord if ch not in string.punctuation)
poem.append(nextWord)
print word
print '='*len(word)
for line in poem:
print line
print ''
if __name__ == '__main__':
main()
Carga un archivo de texto llamado ‘AStudyInScarlet.txt’. Solo las palabras utilizadas en ese documento serán candidatas para su incorporación al poema final. (actualmente no hay palabras que empiecen con x
en este documento, agregaré algunos pronto)
Este programa intenta encontrar palabras en el archivo de texto que siguen a la palabra anterior en el poema. Por ejemplo, si la palabra acróstica es ‘pita’ y hasta ahora el poema es “Privado”, una posible siguiente palabra es “indagación”, ya que la frase de dos palabras “indagación privada” se encuentra en el documento de texto. Si no se encuentran pares de palabras coincidentes, se elige cualquier palabra aleatoria que comience con la letra correcta.
Se elige una palabra de una lista de palabras que cumplen con las calificaciones deseadas. Si una palabra aparece varias veces en la lista de palabras aceptables, es más probable que se elija una que no.
Uso
Las palabras para crear poemas deben especificarse como argumentos de línea de comando. Se imprimirá un poema por cada palabra especificada en la línea de comando.
Ejemplo:
$ acrostic.py laughable codegolf loremipsum
laughable
=========
Looking
a
Union
grievous
his
agitation
be
likely
enough
codegolf
========
couple
of
discoloured
evident
goes
or
late
from
loremipsum
==========
learn
of
revenge
engine
me
it
proved
smartest
up
my
PHP
'and',
'i' => 'if',
'o' => 'or',
'n' => 'not',
'l' => 'list'
);
$funcs = get_defined_functions();
$word = rtrim(fgets(STDIN), "n");
echo "n";
foreach(str_split($word) as $char)
foreach($dict + $funcs['internal'] as $func)
if($func[0] == $char)
echo $func . "n";
break;
Admito que no siempre tiene sentido, pero soy demasiado vago para buscar una lista de palabras reales, así que usé nombres de funciones PHP más un par de palabras reservadas PHP.
Ejemplos:
laughable
list
and
user_error
get_class
hash
and
bzopen
list
each
codegolf
class_exists
or
define
each
get_class
or
list
func_num_args
loremipsum
list
or
restore_error_handler
each
method_exists
if
property_exists
strlen
user_error
method_exists
neurotic
not
each
user_error
restore_error_handler
or
trigger_error
if
class_exists
diplomat
define
if
property_exists
list
or
method_exists
and
trigger_error
Comentarios y puntuaciones del tutorial
Si para ti ha sido útil nuestro post, nos gustaría que lo compartas con otros desarrolladores de esta manera contrubuyes a dar difusión a nuestro contenido.