Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: eRXeTe en 10 Febrero 2017, 08:41 am



Título: Division Silabas Texto
Publicado por: eRXeTe en 10 Febrero 2017, 08:41 am
Buenas. Me gustaría que alguien me pudiese ayudar con este tema. Necesito en código C# la división de un texto por carácteres saltando de línea. Pero en esa division se debe evitar (en la medida de lo posible) la división por sílabas. Añadiendo un -. Ejemplo:
lorem ipsum dolor sit amet consectetur adipiscing elit
Columnas: 5
 
Lorem
ipsum
dolor
sit
amet
con-
secte-
tur a-
dipis-
cing
elit
 

El código que tengo de momento es éste, esta hecho en PHP que me es más facil:

Código
  1. <?php
  2.  
  3. // Texto (Introducido por el usuario)
  4. $text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam accumsan mattis diam vitae finibus. Maecenas id sagittis arcu. Mauris ac augue turpis. Vestibulum rhoncus ultrices placerat. Proin egestas pulvinar velit, a dignissim massa convallis non. Aliquam mi neque, sagittis ac auctor porta, luctus at ligula. Donec tortor diam, consectetur eget turpis id, finibus hendrerit lacus. Vivamus tempus eros sed accumsan venenatis.";
  5.  
  6. // Número de columnas (Introducidas por el usuario)
  7. $columns = 10;
  8.  
  9. // Calcular la longitud del texto
  10. $length = strlen($text);
  11.  
  12. /**
  13. * $i - Permite ir imprimendo el caracter dentro del texto
  14. * $j - Permite controlar el salto de línea
  15. */
  16. for ($i = $j = 0; $i < $length; $i++) {
  17.                // Comprobar si hay que realizar un salto de línea
  18.                if ($j == $columns) {
  19.                               // Imprimir salto de línea
  20.                              echo $text[$i];
  21.                               echo "<br/>";
  22.                               // Reiniciar el contador para el salto de línea
  23.                               $j = 0;
  24.                               // Saltar a la siguiente iteración del bucle
  25.                               continue;
  26.                }
  27.                // El siguiente IF sustituye los espacios por guiones bajos
  28.                // para verlos mejor. Se puede quitar.
  29.                if ($text[$i] == ' ') {
  30.                               echo " ";
  31.                } else {
  32.                               // Imprimir el caracter correspondiente
  33.                               echo $text[$i];
  34.                }
  35.                // Incrementar el contador para el salto de línea
  36.                $j++;
  37. }
  38.  
  39. ?>
  40.  
Muchisimas gracias de antemano.




· Los códigos deben ir en etiquetas GeSHi
>aquí las reglas del foro (http://foro.elhacker.net/reglas.htm)
-Engel Lex


Título: Re: Division Silabas Texto
Publicado por: Eleкtro en 10 Febrero 2017, 17:11 pm
Hola. Primero de todo, las preguntas sobre C# van en el subforo de programación .NET.

Las reglas de divisón que quieres aplicar a las palabras de más de "X" caracteres/columnas no están claras. Aquí abajo te muestro un código de ejemplo que puedes adaptar a tus necesidades:

Código
  1. readonly string input = "Lorem ipsum dolor sit amet consectetur adipiscing elit";
  2. readonly char lfChar = '-'; // Line Feed Character Representation
  3. readonly short maxLen = 5;  // Maximum Length (not counting the line feed char)

Código
  1. StringBuilder sb = new StringBuilder(capacity: input.Length);
  2. IEnumerable<string> words = input.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); // Split entire string into words.
  3.  
  4. foreach (string word in words) {
  5.  
  6.    if ((word.Length <= maxLen)) {
  7.        sb.AppendLine(word);
  8.  
  9.    } else {
  10.        int index = 0;
  11.        while ((index < word.Length))  {
  12.            string str = word.Substring(index, Math.Min(maxLen, (word.Length - index)));
  13.            if ((str.Length == maxLen)) {
  14.                sb.AppendLine(string.Format("{0}{1}", str, lfChar));
  15.            } else {
  16.                sb.AppendLine(str);
  17.            }
  18.            index += maxLen;
  19.        }
  20.  
  21.    }
  22.  
  23. }
  24.  
  25. Console.WriteLine(sb.ToString());

Resultado de ejecución:

Lorem
ipsum
dolor
sit
amet
conse-
ctetu-
r
adipi-
scing-
elit


Saludos!


Título: Re: Division Silabas Texto
Publicado por: Serapis en 10 Febrero 2017, 17:29 pm
BLA,BLA,BLA...


Título: Re: Division Silabas Texto
Publicado por: Eleкtro en 10 Febrero 2017, 18:06 pm
para partir por sílabas en castellano, lo primero que debes hacer es determinar las reglas que rigen lo que es una 'sílaba'...

El usuario no se sabe realmente lo que quiere, por que ha dicho EVITAR partir por sílabas, pero en el ejemplo hay sílabas, y aparte luego está tur a- que incluye un espacio en blanco no sé con qué lógica usada, cuando sit y amet las separa del todo en el ejemplo. Para mi no está nada claro.

De todas formas logicamente llevas mucha razón en eso que has dicho, construir las reglas de distinción de una sílaba para instruir al algoritmo sería algo necesario, tanto para partir la cadena de texto por sílabas, como para evitar partirla por sílabas. Es algo de locos.



Es complicado, mucho...

La parte compleja está en construir ese diccionario de sílabas

Complicado no, lo siguiente. Es que sinceramente, desde el primer momento no merece la pena ni intentarlo. Construir un diccionario/base de datos de palabras con sus sílabas marcadas/delimitadas necesitaría un esfuerzo casi inhumano, ¿y todo para qué?, si el algoritmo seguirá estando condenado a la imperfección y a una refactorización constante. En mi opinión creo que el usuario no se debería comer demasiado la cabeza preocupándose por ese aspecto en concreto. Tampoco ha explicado que motivos le llevan a querer partir por sílabas (o evitar partir por sílabas, como sea) y quizás si supieramos eso se le podría sugerir una solución adaptada a sus necesidades.

Pero si la intención del usuario realmente es partir una cadena de texto distinguiendo las silabas (del castellano), entonces veo bastante complejo perfeccionar un algoritmo (sin diccionario) hasta el punto que sea capaz de sacar las silabas correctas de palabras como salchicha, menstrual, pedigüeñería, pingüino, murciélago u oíamos (por decir algunas aleatorias, pero seguro que hay palabras con mucha mayor complejidad léxica-programática en el Castellano, jeje). Es algo inviable por tiempo y esfuerzo si no existe una motivación profesional y económica detrás de este proyecto.

Saludos!


Título: Re: Division Silabas Texto
Publicado por: Serapis en 10 Febrero 2017, 18:30 pm
Bla,bla,bla...