Problema extraño

Iniciado por amchacon, 13 Marzo 2014, 12:00 PM

0 Miembros y 1 Visitante están viendo este tema.

amchacon

Buenas.

Voy a a hacer un post un poco largo, de modo que los vagos deberían dejar de leer ^^

Estoy haciendo problemas de estos con juez automatico, el problema en el que estoy es el siguiente:

CitarE. KaniI LanGuAgeE

Por razones que no vienen al caso, se quiere convertir grandes clásicos de la literatura española (El Quijote,Don Juan Tenorio, Teo va al parque, etc. . . ) a un lenguaje más cercano a la juventud de hoy en día.

Así pues, se está pensando en realizar un programa que utilice una serie de reglas de conversión al lenguaje conocido como kaNiI LanGuAgeE.

A continuación explicamos dichas reglas:

1. Se eliminan las haches (excepto ch que se transformará en x).
2. Cuando existan una o más vocales juntas, se convierten en mayúscula las de las posiciones pares, contando
la primera vocal como posición 1.
3. Las consonantes siguen una regla similar, pero no tienen que ser consecutivas para pasarlas a mayúsculas. En
este caso, las consonantes se alternan entre mayúsculas y minúsculas dentro de una misma palabra, empezando por mayúscula. (hola caracola!oLaA KaraKolaA) Por simplicidad se puede considerar consonante todo aquello que no es vocal.
4. Si la palabra acaba en vocal se añade la misma vocal (se sigue aplicando la regla de las mayúsculas (regla 2)) (Primo!PriMoO, vivia !BibiAa).
5. Las c con sonido z (ce, ci) se cambian por z, mientras que el resto se cambian por k.
6. Las b cambian por v y las v por b.
7. Las letras ch cambian por x.
8. Las letras que ya están en mayúscula se mantienen: (HOLA CARACOLA!OLAA KARAKOLAA).
9. Una consonante estará en mayúscula si cumple la regla 3 o si la letra original está en mayúscula. Para el
caso especial de la ch (al sustituirse por x), seguirá la regla tomando en cuenta si la c de la ch original es
mayúscula o no. (revancha!RebaNxaA, rebanCHa!RevaNXaA, reVancHa !ReBaNxaA)
10. Una vocal estará en mayúscula si cumple la regla 2 o si la letra original está en mayúscula. (que ! QuEe, quE!QuEE)

Se recomienda revisar los ejemplos detenidamente para ver como se aplican estas reglas. Y utilizar herramientas como diff para ver con más detalle en qué partes está fallando el programa.

Por simplicidad las frases solo contendrán carácteres de a-z y A-Z y espacios como delimitadores. También, debido al caso especial de la eliminación de la h, no existe ninguna palabra que acabe por h.

Y te dan ejemplo la entrada:
CitarNo es verdad angel de amor que en esta apartada orilla mas pura la
luna brilla y acaso se respira mejor
En un lugar de la mancha de cuyo nombre no quiero acordarme vivia
Con diez canyones por banda viento en popa a toda vela no corta el
mar sino vuela un velero bergantil aquel pirata el temido
Este es
un ejemplo
mas corto
Para que
podais gastar la
herramienta diff
y os salgan bien
las cosas
ahi es nada
y ahora
unas frases tipicas
si apruebo todas mi madre me
compra la moto
sin ser chula ni vacilona soy tu envidia campeona

Y la salida:

CitarNoO eS verdad aNgeL DeE aMor QuEe eN eStaA aParTadaA oRilLaA Mas PuraA LaA
LunaA VriLlaA Y aKasoO SeE ResPiraA MejoR
EN uN LugaR DeE LaA ManXaA DeE KuyoO NomVreE NoO QuIeroO aKorDarMeE BibiAa
Kon DiEz KanYoneS Por VanDaA BiEnToO eN PopaA aA TodaA BelaA NoO KorTaA eL
Mar SinoO BuElaA uN BeleRoO VerGanTil aQuEl PiraTaA eL TemiDoO
ESteE eS
uN eJemPloO
Mas KorToO
ParaA QuEe
PodaIS GasTar LaA
eRraMiEnTaA DifF
Y oS SalGan ViEn
Las KosaS
aIi eS NadaA
Y aORaA
uNas FraSes TipiKas
SiI aPruEVoO TodaS MiI MadReE MeE
KomPraA LaA MotoO
Sin Ser XuLaA NiI BaziLonaA Soy TuU eNbiDiAa KamPeOnaA

Total que me pongo a ello y saco este código:
Código (cpp) [Seleccionar]
#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;

string Traducir(string &e);

int main()
{
   ifstream fin("Ekani1.in");
   ofstream fout("salida.txt");
   string palabra,linea;
   getline(fin,linea);
   
   while (fin.good())
   {

       {
           stringstream Buffer(linea);
           unsigned int i = 0;
           while (Buffer.good())
           {
               while (i < linea.size() && linea[i] == ' ')
               {
                   fout<<' ';
                   i++;
               }

               Buffer>>palabra;

               i += palabra.size();
               fout<<Traducir(palabra);
               palabra.clear();
           }
           fout<<endl;

       }
       getline(fin,linea);
   }

   return 0;
}

inline bool esVocal(char a)
{
   return a == 'a' || a == 'e' || a == 'i' || a == 'o' || a== 'u' || a == 'A' || a == 'E' || a == 'I' ||a == 'O' ||a=='U';
}

string Traducir(string &e)
{
   string buffer;
   int consonante = 1;
   char letra;

   if (esVocal(e[e.size()-1])) // Si la ultima es vocal, añadimos una vocal al final
       e += e[e.size()-1];

   for (unsigned int i = 0; i < e.size(); i++)
   {
       if (esVocal(e[i])) // es vocal?
       {
           buffer += e[i]; // la anyadimos
           bool mayus = 1;
           i++;

           // listamos todas las vocales adyacentes (y las h, ya que son "mudas")

           while (i < e.size() && (esVocal(e[i]) || e[i] == 'h' || e[i] == 'H'))
           {
               if (e[i] == 'h' || e[i] == 'H'){i++; continue;} // las haches se descartan

               if (mayus == 1) buffer += toupper(e[i]); // si toca mayuscula, anyadimos una mayuscula
               else buffer += e[i]; // sino, la anyadimos tal cual

               mayus = !mayus;
               i++;
           }
           i--;
           continue;
       }

       // no es vocal

       if (e[i] == 'h' || e[i] == 'H') // si es h, se ignora
       {
           if (i != 0 && (e[i-1] == 'c' || e[i-1] == 'C')) // si la anterior era una c
           {
               if (e[i-1] == 'C') letra = 'X'; // la sustituimos por una X
               else letra = 'x'; // o x minuscula

               if (consonante % 2 == 0) // si es una posicion par, toca mayuscula
               {
                   buffer[buffer.size()-1] = toupper(letra); // cambiamos la ultima posicion
                   consonante = 1;
               }
               else buffer[buffer.size()-1] = letra;

           }
           continue;
       }

       letra = e[i]; // la letra se anyade al final, segun resulte ser mayuscula o minuscula
       consonante++;
       //  else buffer += e[i];
//
       if (e[i] == 'b') // sustituir b por v
       {
           letra = 'v';
       }
       else if (e[i] == 'B') // sustituir B por V
       {
           letra = 'V';
       }
       else if (e[i] == 'v')
       {
           letra = 'b';
       }
       else if (e[i] == 'V')
       {
           letra = 'B';
       }

       else if (e[i] == 'c' || e[i] == 'C') // las c, por z o por k
       {
           if (i+1 < e.size() && (e[i+1] =='e' || e[i+1] == 'E' ||e[i+1] == 'i' || e[i+1] == 'I'))
           {
               if (e[i] == 'c') letra = 'z';
               else letra = 'Z';
              // i++;
           }
           else
           {
               if (e[i] == 'c') letra = 'k';
               else letra = 'K';
           }
       }

       if (consonante % 2 == 0) // si es una consonante en posicion par
       {
           buffer += toupper(letra); // se anyade mayuscula
           consonante = 0;
       }
       else buffer += letra; // se anyade tal cual
   }

   return buffer;
}


Que me genera una salida identica a la anterior.

Total que lo subo al juez y me marca WRONG ANSWER. Lo he revisado varias veces pero no entiendo que puede fallar :(

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

eferion

No se si es que no han implementado bien las reglas pero...

La respuesta que tu pones es
NoO eS verdad aNgeL DeE aMor QuEe eN eStaA aParTadaA oRilLaA Mas PuraA LaA

Y la que saca tu programa es

NoO eS verdad aNgeL DeE aMor QuEe eN eStaA aParTadaA oRilLaA Mas PuraA LaA

ahí veo algunas diferencias en "verdad". Pero lo dicho, no se si será que no está bien redactado el enunciado o que está mal el resultado que te proponen.

amchacon

No he sido yo. Esque el foro me cambia la palabra, lo he editado ya 3 veces Oo

Pongo los archivos en descarga mejor:
https://dl.dropboxusercontent.com/u/69551225/Cani%20Lenguaje.zip
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

eferion

Por cierto... si pruebo el código que has puesto... se come la última línea...

amchacon

Cita de: eferion en 13 Marzo 2014, 12:42 PM
Por cierto... si pruebo el código que has puesto... se come la última línea...
¿Lo has cogido de los archivos o del foro?

Lo digo porque el foro se salta el último salto de línea *_*
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

eferion

Vale sí, era eso.

Lo que pasa es que eso me hace dudar de si el juez no te da por buena la práctica precisamente porque su última línea no termina con un salto.

amchacon

Hize una pregunta y resulta que habían puesto el ejemplo mal:
CitarSin Ser XuLaA NiI BaziLonaA Soy TuU eNbiDiAa KamPeOnaA

No es XuLaa sino XulaA, esa mayuscula estaba mal.

Madre mía, retoqué un poco las ch y lo del salto de linea. Ahora ya me va...
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

eferion

jajajajaja

Con razón recomendaban utilizar un comparador de ficheros XDDD

Yoel Alejandro

Sólo digo que me parece bien raro ese lenguaje. ¿Quién lo usa? ¿Es algo parecido a los sms?
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

leosansan

Cita de: yoel_alejandro en 13 Marzo 2014, 19:19 PM
Sólo digo que me parece bien raro ese lenguaje. ¿Quién lo usa? ¿Es algo parecido a los sms?

¡No hombre!, es un ejercicio de una página de retos.

¡¡¡¡ Saluditos! ..... !!!!