import java.io.File; import java.util.Scanner; public class DivisionSilabica { public static void main(String[] args) { try { Scanner entrada = new Scanner(new File("palabras_silabas.csv"), "UTF-8"); long totalLineas = 0; long aciertos = 0; long fallos = 0; while ( entrada.hasNext() ) { String linea = entrada.nextLine(); ++totalLineas; String arr[] = linea.split("\t"); if ( arr.length == 2 ) { String palabra = arr[0]; String palabraDividida = arr[1]; if ( dividir(palabra).equals(palabraDividida) ) ++aciertos; else if ( ++fallos <= 15 ) System.out.printf("%s => %s\n", palabra, dividir(palabra)); } else System.err.printf("Linea %,d no valida: {%s}\n", totalLineas, linea); } entrada.close(); double efectividad = aciertos * 100.0 / totalLineas; System.out.printf("%,d aciertos de %,d (%.2f%%)\n", aciertos, totalLineas, efectividad); } catch(Exception excepcion) { System.err.println("Error: " + excepcion); } } public static String dividir(String palabra) { String resultado = ""; for ( int i = 0; i < palabra.length(); ++i ) { char ch1 = palabra.charAt(i); if ( esConsonante(ch1) ) { resultado += ch1; continue; } if ( esVocal(ch1) ) { resultado += ch1; if ( i == palabra.length() - 1 ) break; char ch2 = palabra.charAt(i + 1); if ( esVocal(ch2) ) { if ( i < palabra.length() - 2 && esTriptongo(ch1, ch2, palabra.charAt(i + 2)) ) { resultado = resultado + ch2 + palabra.charAt(i + 2); i += 2; } else if ( esDiptongo(ch1, ch2) ) { resultado = resultado + ch2; i += 1; } } if ( i < palabra.length() - 1 ) { char ch3 = palabra.charAt(i + 1); if ( estaEn(ch3, "bcdfglmnprstz") && (i >= palabra.length() - 2 || ! esVocal(palabra.charAt(i + 2) ) && ! estaEn(palabra.charAt(i + 2), "hlr" ) ) ) { resultado += ch3; ++i; } } if ( i < palabra.length() - 3 ) { char ch4 = palabra.charAt(i + 1); if ( Character.toLowerCase(ch4) == 's' && ! esVocal(palabra.charAt(i + 2)) ) { resultado += ch4; ++i; } } if ( i < palabra.length() - 1 ) resultado += '-'; } } return resultado; } public static boolean estaEn(int ch, String str) { return str.indexOf(Character.toLowerCase(ch)) != -1; } public static boolean esConsonante(int ch) { return estaEn(ch, "bcdfghjklmnñpqrstvwxyz"); } public static boolean esVocal(int ch) { return estaEn(ch, "aeiouáéíóúü"); } public static boolean esDiptongo(int ch1, int ch2) { return esDebil(ch1) && esDebil(ch2) || esDebil(ch1) && esFuerte(ch2) || esFuerte(ch1) && esDebil(ch2); } public static boolean esTriptongo(int ch1, int ch2, int ch3) { return esDebil(ch1) && esFuerte(ch2) && esDebil(ch3) || esDebil(ch1) && esDebil(ch2) && esFuerte(ch3); } public static boolean esDebil(int ch) { return estaEn(ch, "iuü"); } public static boolean esFuerte(int ch) { return estaEn(ch, "aeoáéíóú"); } }