#!/usr/bin/python3 # -*- coding: utf-8 -*- """Generador de frases melodramáticas. Basado en uno parecido para el inglés pero principalmente con vocabulario del libro _Ficciones Patrias_ de Juana Manuela Gorriti, el libro más melodramático que vi en mi vida. Resultados ejemplares: Cien hijos halagüeños de la emoción infinita y monstruosa. Los labios caídos de zorros corruptos y dignos. Un exilio inmaculado dentro de las imprecaciones violáceas y ardientes. Los dos pies insepultos de mis labios profundos e infinitos. El oro bello de una libertad corrompida. El angustia monstruosa de zorros desmoronados. Aquel campo brillante de su princesa destrozada. Una joven emoción de un tronco enmascarado. El viento hermoso de su abandono griego. Una ley romántica del abandono destrozado. """ from __future__ import print_function import sys import random class m_sing: def det(self, s): return random.choice(['aquel ', 'el ', 'el ', 'el ', 'un ', 'su ', 'mi ']) def adj(self, adj): # El final ‘#’ quiere decir “e en masculino, a en femenino”; # lo agregué porque Juana Manuela Gorriti usaba la forma # adjetival “sublima” en alguna parte de _Ficciones Patrias_. # Pero me informan que en castellano actual, sería # “aquellas estrellas sublimes”, no “aquellas estrellas # sublimas”. También podría haber sido error de impresión. # Capaz que no hay adjetivo que lo necesita. return (adj[:-1] + 'o' if adj.endswith('@') else adj[:-1] + 'e' if adj.endswith('#') else adj) class m_pl: def det(self, s): if random.randrange(5): return random.choice(['', '', 'aquellos ', 'los ', 'los ', 'los ', 'sus ', 'mis ']) # Hay forma de hacer “countless”? return random.choice(['dos ', 'los dos ', 'tres ', 'cien ', 'mil ', 'diez mil ']) def adj(self, adj): return (adj[:-1] + 'os' if adj.endswith('@') else adj[:-1] + 'es' if adj.endswith('#') else pl(adj)) class f_sing: def det(self, s): det = random.choice(['una ', 'aquella ', 'la ', 'la ', 'la ', 'su ', 'mi ']) if det == 'la ' and s.startswith('a'): det = 'el ' if det == 'una ' and s.startswith('a'): det = 'un ' return det def adj(self, adj): return adj[:-1] + 'a' if adj[-1] in '@#' else adj class f_pl: def det(self, s): if random.randrange(5): return random.choice(['', 'aquellas ', 'las ', 'las ', 'las ', 'sus ', 'mis ']) return random.choice(['dos ', 'las dos ', 'tres ', 'cien ', 'mil ', 'diez mil ']) def adj(self, adj): return (adj[:-1] + 'as' if adj[-1] in '@#' else pl(adj)) def pl(adj): return (adj if (adj.endswith('ando') or adj.endswith('endo') or adj.endswith('éndose')) else adj + 's' if adj[-1] in 'aeiou' else adj + 'es') # Qué es “lambs”? (“Ovejitas”?) Y “spires”? "Covenant"? "Dunghill"? # “Fetters”? “Harlot”? “Linen”? “Stony”? # saqué: sollozos cordero escribano escribana meteoros rodillas vergeles sustantivos = """monstruo roble hijos cardos cielo cristal linyera puerta lugar tumba mano palabras lluvia nieve luz infección paraíso valle feto portón cedros gritos risas nube calavera hielo reyes gusanos manzana tela asesinato mentira oro madre sicario glaciar espada bala balas precipicio rifle duque cabra bomba caballo letra alma desierto neblina campo escalera flauta exilio oscuridad mirada trono jardines mar paloma flor ángeles hija hijo padre perros robo campana violación amazonas hermana hermano fenómeno princesa falo útero sangre yelmo marido esposa general poeta peregrinación ternura delincuente rostro visión rabia serenidad oasis borrascas iniquidad viento zorros lamentaciones eco herencia piedra tronco árbol hoja algarrobo dolor roca llave silencio dignidad miedo conciencia obispo amigo asombro tempestad libertad mártir sonrisa máscaras crimen arma puños puñal huellas tambor angustia emoción pies eternidad incendio abandono muros terror luna horizonte murallas brisa perfumes gozo corazón sol anfiteatro contemplación carta odisea soledad aguas cuerpo cantantes crepúsculo pecho lágrimas monja monje meditación preocupación declive rosales noche sacrificio cúpulas maravilla resplandores tinieblas ley honor deber cenizas pesadilla claustro estrella estrellas amor debilidad profeta fuente tortura bestia cadáveres relámpago capucha garras alba labios larvas desolación hecatombe azahares corona portal abanico doncellas montaña montañas sacerdote asco imprecaciones huéspedes samurai piano venas nubes torbellino gaviota ataúd mejilla mariposas dientes manantiales viuda viudo alas tiempo época edad tesoro fiebre """.split() excepciones = {'linyera': m_sing(), 'mano': f_sing(), 'nieve': f_sing(), 'luz': f_sing(), 'nube': f_sing(), 'nubes': f_pl(), 'noche': f_sing(), 'madre': f_sing(), 'flor': f_sing(), 'fuente': f_sing(), 'sangre': f_sing(), 'poeta': m_sing(), 'visión': f_sing(), 'llave': f_sing(), 'oasis': m_sing(), 'libertad': f_sing(), 'ley': f_sing(), 'tempestad': f_sing(), 'profeta': m_sing(), 'hecatombe': f_sing()} # “Asfálto”? Hay forma de expresar “steel words” o “diamond sky”? # Tenemos que usar otra frase preposicional, o hay adjetivos # igualmente evocativos aunque no sean de materiales? # Qué es “Seething”? Y “defiled”? “Elder”? “Exalted”? # “su mentira sucia” me suena mal también, aunque no es un error. # “La escribana joven” capaz que también, y “la letra vasta”. # Y claramente “una mirada mera” está mal, y peor aún “campo resonando # y mero”, así que saqué “mer@”. Y “joven”. (Después las agregué de vuelta, # después de cometer algunos jacs.) # Saqué alien enflaquecid@ adjetivos = """cristalin@ trémul@ brillante valiente llorando fiel corrupt@ arenos@ vaporizad@ mágic@ quemad@ enrojecid@ viv@ caíd@ congelad@ inmortal oscur@ muriéndose violáce@ resonando desencadenad@ ancian@ glorios@ silencios@ tranquil@ gritando inmund@ nubos@ infectad@ suci@ blanc@ dulce resplendeciente muert@ hermos@ mortal violent@ fatal danzando triste vast@ metálic@ riéndose legendari@ monstruos@ sabi@ eléctric@ abandonad@ borrach@ soñando ilus@ enferm@ sangrient@ bell@ noble tenebros@ suntuos@ bordad@ tempestuos@ profund@ radios@ apacible deforme respirando dorad@ grieg@ inmens@ halagüeñ@ desolad@ lúgubre amarg@ ásper@ vigoros@ interminable indecible encantad@ dichos@ cálid@ solitari@ siniestr@ heroic@ sacríleg@ dign@ impasible inmaculad@ enmascarad@ sublime intrépid@ ensangrentad@ suprem@ pálid@ anhelante febril ennegrecid@ supersticios@ gimiendo desmoronad@ lustros@ alegre tibi@ benévol@ delicios@ sombrí@ embalsamad@ misterios@ nocturn@ romántic@ ardiente imponente vaporos@ fantástic@ hond@ etern@ exuberante impí@ doloros@ tortuos@ irrevocable destrozad@ desesperad@ maravillos@ dolorid@ ondulos@ rubí vengativ@ sant@ diamantin@ devastad@ corrompid@ ungid@ frí@ atómic@ cantando culpable moribund@ insepult@ terrible desdichad@ postrad@ enlutad@ enmudecid@ infinit@ bullicios@ asqueros@ infiel árid@ mer@ joven bellísim@ vengándose purpúre@ voluptuos@ pintoresc@ bendit@ paralític@ fúnebre exigu@ conchud@ """.split() def categoria(sustantivo): if sustantivo in excepciones: return excepciones[sustantivo] return (f_sing() if (sustantivo.endswith('a') or sustantivo.endswith('ción') or sustantivo.endswith('dad')) else f_pl() if (sustantivo.endswith('as') or sustantivo.endswith('ciones')) else m_pl() if sustantivo.endswith('s') else m_sing()) def deberia_seguir(adj): return adj not in ['vasta', 'vasto', 'vastas', 'vastos', 'sucia', 'sucio', 'sucias', 'sucios', 'mera', 'mero', 'meras', 'meros', 'santa', 'santo', 'santas', 'santos', 'joven', 'jovenes', 'noble', 'nobles', 'fatal', 'triste', 'tristes', ] def participio_presente(adj): return (adj.endswith('ando') or adj.endswith('endo') or adj.endswith('éndose') or adj.endswith ('ándose')) def generar(): s1 = random.choice(sustantivos) s_cat = categoria(s1) a1 = s_cat.adj(random.choice(adjetivos)) o = random.choice(sustantivos) o_cat = categoria(o) ao = o_cat.adj(random.choice(adjetivos)) if not random.randrange(4) and deberia_seguir(ao): while True: ao2_r = random.choice(adjetivos) if ao2_r != 'mer@': break ao2 = o_cat.adj(ao2_r) if participio_presente(ao) or participio_presente(ao2): ao = ao + ' ' + ao2 else: ao = ao + (' e ' if ao2[0] == 'i' else ' y ') + ao2 elif not random.randrange(10) and not participio_presente(ao): ao = 'más ' + ao prep = ' de ' if not random.randrange(8): prep = random.choice([' debajo de ', ' dentro de ', ' encima de ', ' en ']) s_det = s_cat.det(s1) while prep == ' de ' and s_det in {'su ', 'sus ', 'mi ', 'mis '}: s_det = s_cat.det(s1) # Mejor “la cabra más noble” que “la más noble cabra”, así que # está bien que deberia_seguir("más noble") → False sp = (s_det + s1 + ' ' + a1 if deberia_seguir(a1) else s_det + a1 + ' ' + s1) op = (o_cat.det(o) + o + ' ' + ao if deberia_seguir(ao) else o_cat.det(o) + ao + ' ' + o) frase = sp + prep + op return frase.replace(' de el ', ' del ') if __name__ == '__main__': for i in range(int(sys.argv[1]) if len(sys.argv) > 1 else 1): phrase = generar() print(phrase[0].capitalize() + phrase[1:] + '.')