Java - tipo de poema

 
Vista:
sin imagen de perfil
Val: 45
Ha disminuido 1 puesto en Java (en relación al último mes)
Gráfica de Java

tipo de poema

Publicado por Joker (16 intervenciones) el 03/02/2020 19:56:36
Hola!
Estoy haciendo un programa en el cual al introducir unos versos de un poema hay que analizar la rima que tiene.
Por ejemplo al introducir estos dos versos:
La primavera ha venido.
Nadie sabe como ha sido.

Me tendría que decir que es un Pareado.

La parte de introducir los versos en un fichero lo tengo hecho pero no sé cómo hacer para que me analice las rimas de los dos versos del fichero y me diga de qué tipo es.
Cualquier tipo de ayuda es bienvenida.

Gracias!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 1.951
Oro
Ha aumentado 1 puesto en Java (en relación al último mes)
Gráfica de Java

tipo de poema

Publicado por Kabuto (482 intervenciones) el 04/02/2020 01:46:47
Pero, ¿siempre van a ser poemas de únicamente dos versos?

Me refiero a que el pareado puede ser de dos versos, 4 versos, 6... siempre que las rimas vayan de dos en dos y contiguas.
Por ejemplo este poema de Rubén Darío:
1
2
3
4
5
6
7
8
Sire de ojos azules, gracias: por los laureles
de cien bravos vestidos de honor; por los claveles
de la tierra andaluza y la Alhambra del moro;
por la sangre solar de una raza de oro;
por la armadura antigua y el yelmo de la gesta;
por las lanzas que fueron una vasta floresta
de gloria y que pasaron Pirineos y Andes;
por Lepanto y Otumba; por el Perú, por Flandes;


Por lo tanto, si son varios versos la cosa se complica.


Si solo son dos, pues bueno, es un poco menos difícil.

Supongo que habría que tratar cada verso/linea como un String individual.
Entonces, habría que identificar cuales son las dos últimas vocales de cada String, y comprobar si coinciden.

No soy experto en poesía, pero entiendo que puesto que los pareados son válidos tanto los de rima consonante como los de asonante, te bastaría con lo dicho, identificar las dos últimas vocales.

Pareado consonante:
1
2
La primavera ha venido.
Nadie sabe como ha sido.

Pareado asonante:
1
2
Ante una vidriera rota
coso mi lírica ropa.

Ambos son pareados, por lo tanto, basta con identificar vocales, sin necesidad de comprobar consonantes.

Así que lo dicho:
- guardamos las dos líneas de versos en String separados.
- recorremos el String empezando por el final, buscando las dos últimas vocales.
- comprobamos si las dos vocales encontradas, coinciden.


Ahora bien, ya depende de si el programa solo ha de identificar Pareados o ha de identificar más tipos de rimas.
En cuyo caso, antes de escribir ningún código, habría que conocerse dichas rimas y las reglas que han de cumplir.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil
Val: 45
Ha disminuido 1 puesto en Java (en relación al último mes)
Gráfica de Java

tipo de poema

Publicado por Joker (16 intervenciones) el 04/02/2020 15:45:41
En este caso solo van a ser de dos versos. A la hora de pasarlo al código cómo sería esto?
- guardamos las dos líneas de versos en String separados.
- recorremos el String empezando por el final, buscando las dos últimas vocales.
- comprobamos si las dos vocales encontradas, coinciden.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Rodrigo
Val: 1.067
Plata
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

tipo de poema

Publicado por Rodrigo (258 intervenciones) el 04/02/2020 15:55:56
Hay que corregir el hecho que la rima funciona desde la ultima vocal acentuada, no desde laa ultimas 2 vocales.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Sandro
Val: 133
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

tipo de poema

Publicado por Sandro (71 intervenciones) el 04/02/2020 17:25:14
además por programa y codificación se puede hacer lo mas complejo que sea la rima o variada, aceptando todos y todas las terminaciones posibles, por lenguaje es infinito las posibilidades.

pueden ser 3 estrofas, o cuatro o seis o diez, eso no es la limitante.

en párrafos de igual forma-

salí corriendo
y no se en donde estoy yendo

mientras me encontraba en mi casa
y la recamara estaba hecha
dormí profundamente
mientras soñaba permanentemente

en el profundo bienestar
de mi perfecta ancianidad
solo contaba con un millón del horizonte estelar
en mi cama de seguridad

etc, etc, etc, etc

en infinidad de combinaciones

saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

tipo de poema

Publicado por Tom (1540 intervenciones) el 04/02/2020 21:17:17
Y además está la métrica, porque en teoría los dos versos pareados deberían tener la misma.
¿ Es esto un pareado ?
Pepito
en el árbol de su vecino clavó un clavito.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 1.951
Oro
Ha aumentado 1 puesto en Java (en relación al último mes)
Gráfica de Java

tipo de poema

Publicado por Kabuto (482 intervenciones) el 04/02/2020 20:37:06
Con la clase Scanner o con BufferedReader (prefiero esta) se pueden leer las dos lineas y guardarlas en String separados.
Estos dos String se los pasas a un método tipo boolean que se encargará de comprobar si es un pareado o no.

Este método, con un bucle for, ha de recorrer el primer verso comenzando desde el final y extraer cada caracter del String uno a uno.
Cada vez que extraiga uno, ha de comprobar si es una vocal.
Si es una consonante, no hace nada y pasa al siguiente carácter.

Si es vocal, la ha de guardar en algún sitio, por ejemplo en un array de tipo char con espacio para dos vocales.
El bucle for se ha de repetir hasta que encuentre las dos vocales, cosa que podemos controlar con un contador...
o bien hasta que no queden caracteres por comprobar, es decir, que el indice del bucle haya llegado a 0.

Luego repite el mismo proceso para el segundo verso, que usará un segundo array de char para guardar sus propias vocales

Tras esto, se supone que tendremos ya las vocales localizadas. Pues comparamos las vocales encontradas que tenemos en los arrays y devolvemos true o false según si son las mismas o no.

Ahora bien, ¿Cómo sabemos si un carácter es una vocal o no? Hay varias formas como por ejemplo comprobar su valor ASCII, o usar un switch con 5 posibilidades (una para cada vocal):
1
2
3
4
5
6
7
8
9
10
switch(caracter) {
    case 'a':
    case 'e':
    case 'i':
    case 'o':
    case 'u':
        return true; //SI es vocal
    default:
        return false; //No es vocal
}

Otra forma más rápida es crear un String con las 5 vocales "aeiou" y comprobar si el carácter que tenemos entre manos esta contenido dentro de ese String. Para ello podemos usar el método lastIndexOf(), a quien le pasamos el carácter y nos devuelve un entero con la posición que ocupa ese carácter dentro del String.

En realidad nos da igual la posición que ocupe, lo que nos importa es si devuelve el valor -1 , en cuyo caso, significa que el caracter no está dentro de ese String y por lo tanto no sería una vocal.

Mira te dejo un código rápido que lee un fichero con dos lineas y se las pasa a un método que decide si es pareado o no.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
 
public class Pareado {
 
	public static void main(String[] args) {
 
		try {
			BufferedReader br = new BufferedReader(new FileReader("poema.txt"));
			//Damos por hecho que el poema solo tiene dos lineas, es decir, dos versos
			String verso1 = br.readLine();
			String verso2 = br.readLine();
			br.close();
 
			System.out.println("Poema leído:");
			System.out.println(" --> " + verso1);
			System.out.println(" --> " + verso2);
 
			System.out.println(esPareado(verso1, verso2)?"Es un Pareado":"No es un Pareado");
 
		} catch (FileNotFoundException e) {
			System.out.println("No se encuentra fichero");
			e.printStackTrace();
		} catch (IOException e) {
			System.out.println("Error al leer fichero");
			e.printStackTrace();
		}
 
	}
 
	static boolean esPareado(String verso1, String verso2) {
 
		final String VOCALES = "aeiou";
 
		//Buscamos las dos últimas vocales del primer verso.
		char[] vocalesVerso1 = new char[2]; //Array para las dos vocales
		int cont = 0; //Variable para apuntar a las posiciones del array de vocales
		/*
		 * El siguiente bucle recorrer el String verso1 empezando por el final.
		 * El bucle se repite mientras queden letras por revisar --> i >= 0
		 * Y mientras no hayamos encontrado las dos vocales --> cont < 2
		 */
		for (int i = verso1.length() - 1 ; i >= 0 && cont < 2; i--) {
			char caracter = verso1.toLowerCase().charAt(i);
			if (VOCALES.indexOf(caracter) != -1) {
				vocalesVerso1[cont] = caracter;
				cont++;
			}
		}
 
		//Mismo proceso para el segundo verso
		char[] vocalesVerso2 = new char[2];
		cont = 0;
		for (int i = verso2.length() - 1 ; i >= 0 && cont < 2; i--) {
			char caracter = verso2.toLowerCase().charAt(i);
			if (VOCALES.indexOf(caracter) != -1) {
				vocalesVerso2[cont] = caracter;
				cont++;
			}
		}
 
		/*
		 * En teoría ya tenemos localizadas las dos vocales de cada verso
		 * y guardadas en sendos arrays. Las comparamos para ver si son iguales
		 * en cuyo caso será un pareado.
		 * De lo contrario, no será pareado
		 */
 
		return (vocalesVerso1[0] == vocalesVerso2[0] && vocalesVerso1[1] == vocalesVerso2[1]);
	}
 
}


Si ejecuto este código con tu poema de ejemplo, sale esto en pantalla:
1
2
3
4
Poema leído:
 --> La primavera ha venido.
 --> Nadie sabe como ha sido.
Es un Pareado

Si lo pruebo con un poema que no es pareado:
1
2
3
4
Poema leído:
 --> Este poema es un asco.
 --> porque Kabuto rima como el culo.
No es un Pareado


Ahora bien, dudo mucho que este código sea perfecto.
Habría que conocer mejor las reglas de la poesía si queremos mayor perfección.

Como bien apunta Rodrigo, que ya imaginaba yo que alguien que lleva sombrero a lo Joaquín Sabina tiene que saber de poesía , no son necesariamente las dos últimas vocales lo que buscamos si no a partir de la última vocal acentuada.

Lo que pasa es que no se me ocurre como "enseñarle" a un ordenador que identifique donde está el acento (golpe de voz) en una palabra...

...habría que usar diccionarios predefinidos, por ejemplo con una clase Palabra y que uno de sus atributos sea algo así como getVocalAcentuada()... pero claro, un humano ha de introducir palabras una a una en estos diccionarios y establecer cuál es dicha vocal.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 45
Ha disminuido 1 puesto en Java (en relación al último mes)
Gráfica de Java

tipo de poema

Publicado por Joker (16 intervenciones) el 04/02/2020 21:22:38
Muchas gracias por la ayuda!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Rodrigo
Val: 1.067
Plata
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

tipo de poema

Publicado por Rodrigo (258 intervenciones) el 04/02/2020 22:53:47
No es necesario tener ningun diccionario predefinido, ni cargar palabras para saber donde esta la ultima vocal acentuada.
Tengo un teclado ingles y me cuesta poner la dieresis (tilde, la raya que acompan~a a la letra cuando se acentúa) cuando corresponde, lo que hago es buscar las letras acentuadas y copio y pego.

Bueno pero .. si el texto esta bien escrito es posible encontrar la ultima vocal acentuada por la diéresis.
Se busca la dieresis, y si esta presente, esa es la ultima acentuada (y ahi el problema es facil) y si no se usan las reglas de acentuacion para saber si es una palabra grave o aguda (terminacion en n, s o vocal)

Espan~ol -> termina en l (no termina en n, s o vocal), ultima acentuada es "o"
Kabuto -> Termina en vocal, ultima acentuada es u

Las esdrujulas siempre tienen tilde.
Las palabras que tienen solo 1 vocal, esa es la ultima :)

etc.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar