Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: amchacon en 13 Marzo 2014, 12:00 pm



Título: Problema extraño
Publicado por: amchacon en 13 Marzo 2014, 12:00 pm
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:

Citar
E. 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:
Citar
No 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:

Citar
NoO 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
  1. #include <iostream>
  2. #include <fstream>
  3. #include <sstream>
  4. using namespace std;
  5.  
  6. string Traducir(string &e);
  7.  
  8. int main()
  9. {
  10.    ifstream fin("Ekani1.in");
  11.    ofstream fout("salida.txt");
  12.    string palabra,linea;
  13.    getline(fin,linea);
  14.  
  15.    while (fin.good())
  16.    {
  17.  
  18.        {
  19.            stringstream Buffer(linea);
  20.            unsigned int i = 0;
  21.            while (Buffer.good())
  22.            {
  23.                while (i < linea.size() && linea[i] == ' ')
  24.                {
  25.                    fout<<' ';
  26.                    i++;
  27.                }
  28.  
  29.                Buffer>>palabra;
  30.  
  31.                i += palabra.size();
  32.                fout<<Traducir(palabra);
  33.                palabra.clear();
  34.            }
  35.            fout<<endl;
  36.  
  37.        }
  38.        getline(fin,linea);
  39.    }
  40.  
  41.    return 0;
  42. }
  43.  
  44. inline bool esVocal(char a)
  45. {
  46.    return a == 'a' || a == 'e' || a == 'i' || a == 'o' || a== 'u' || a == 'A' || a == 'E' || a == 'I' ||a == 'O' ||a=='U';
  47. }
  48.  
  49. string Traducir(string &e)
  50. {
  51.    string buffer;
  52.    int consonante = 1;
  53.    char letra;
  54.  
  55.    if (esVocal(e[e.size()-1])) // Si la ultima es vocal, añadimos una vocal al final
  56.        e += e[e.size()-1];
  57.  
  58.    for (unsigned int i = 0; i < e.size(); i++)
  59.    {
  60.        if (esVocal(e[i])) // es vocal?
  61.        {
  62.            buffer += e[i]; // la anyadimos
  63.            bool mayus = 1;
  64.            i++;
  65.  
  66.            // listamos todas las vocales adyacentes (y las h, ya que son "mudas")
  67.  
  68.            while (i < e.size() && (esVocal(e[i]) || e[i] == 'h' || e[i] == 'H'))
  69.            {
  70.                if (e[i] == 'h' || e[i] == 'H'){i++; continue;} // las haches se descartan
  71.  
  72.                if (mayus == 1) buffer += toupper(e[i]); // si toca mayuscula, anyadimos una mayuscula
  73.                else buffer += e[i]; // sino, la anyadimos tal cual
  74.  
  75.                mayus = !mayus;
  76.                i++;
  77.            }
  78.            i--;
  79.            continue;
  80.        }
  81.  
  82.        // no es vocal
  83.  
  84.        if (e[i] == 'h' || e[i] == 'H') // si es h, se ignora
  85.        {
  86.            if (i != 0 && (e[i-1] == 'c' || e[i-1] == 'C')) // si la anterior era una c
  87.            {
  88.                if (e[i-1] == 'C') letra = 'X'; // la sustituimos por una X
  89.                else letra = 'x'; // o x minuscula
  90.  
  91.                if (consonante % 2 == 0) // si es una posicion par, toca mayuscula
  92.                {
  93.                    buffer[buffer.size()-1] = toupper(letra); // cambiamos la ultima posicion
  94.                    consonante = 1;
  95.                }
  96.                else buffer[buffer.size()-1] = letra;
  97.  
  98.            }
  99.            continue;
  100.        }
  101.  
  102.        letra = e[i]; // la letra se anyade al final, segun resulte ser mayuscula o minuscula
  103.        consonante++;
  104.        //  else buffer += e[i];
  105. //
  106.        if (e[i] == 'b') // sustituir b por v
  107.        {
  108.            letra = 'v';
  109.        }
  110.        else if (e[i] == 'B') // sustituir B por V
  111.        {
  112.            letra = 'V';
  113.        }
  114.        else if (e[i] == 'v')
  115.        {
  116.            letra = 'b';
  117.        }
  118.        else if (e[i] == 'V')
  119.        {
  120.            letra = 'B';
  121.        }
  122.  
  123.        else if (e[i] == 'c' || e[i] == 'C') // las c, por z o por k
  124.        {
  125.            if (i+1 < e.size() && (e[i+1] =='e' || e[i+1] == 'E' ||e[i+1] == 'i' || e[i+1] == 'I'))
  126.            {
  127.                if (e[i] == 'c') letra = 'z';
  128.                else letra = 'Z';
  129.               // i++;
  130.            }
  131.            else
  132.            {
  133.                if (e[i] == 'c') letra = 'k';
  134.                else letra = 'K';
  135.            }
  136.        }
  137.  
  138.        if (consonante % 2 == 0) // si es una consonante en posicion par
  139.        {
  140.            buffer += toupper(letra); // se anyade mayuscula
  141.            consonante = 0;
  142.        }
  143.        else buffer += letra; // se anyade tal cual
  144.    }
  145.  
  146.    return buffer;
  147. }
  148.  

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 :(



Título: Re: Problema extraño
Publicado por: eferion en 13 Marzo 2014, 12:28 pm
No se si es que no han implementado bien las reglas pero...

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

Y la que saca tu programa es

Código:
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.


Título: Re: Problema extraño
Publicado por: amchacon en 13 Marzo 2014, 12:34 pm
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


Título: Re: Problema extraño
Publicado por: eferion en 13 Marzo 2014, 12:42 pm
Por cierto... si pruebo el código que has puesto... se come la última línea...


Título: Re: Problema extraño
Publicado por: amchacon en 13 Marzo 2014, 12:45 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 *_*


Título: Re: Problema extraño
Publicado por: eferion en 13 Marzo 2014, 12:48 pm
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.


Título: Re: Problema extraño
Publicado por: amchacon en 13 Marzo 2014, 13:32 pm
Hize una pregunta y resulta que habían puesto el ejemplo mal:
Citar
Sin 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...


Título: Re: Problema extraño
Publicado por: eferion en 13 Marzo 2014, 13:50 pm
jajajajaja

Con razón recomendaban utilizar un comparador de ficheros XDDD


Título: Re: Problema extraño
Publicado por: 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?


Título: Re: Problema extraño
Publicado por: leosansan en 13 Marzo 2014, 19:33 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! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Problema extraño
Publicado por: dato000 en 13 Marzo 2014, 20:13 pm
¡No hombre!, es un ejercicio de una página de retos.

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


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Aunque la verdad si parece que hay gente que si se expresa así  :laugh: :laugh: :laugh:

muy interesante el post, estare pendiente de todo, no he tenido tiempo de compilar nuevos proyectos


Título: Re: Problema extraño
Publicado por: amchacon en 13 Marzo 2014, 22:12 pm
Sólo digo que me parece bien raro ese lenguaje. ¿Quién lo usa? ¿Es algo parecido a los sms?
En España lo usan gente de cultura muyyy baja... Nosotros les llamamos "Canis"
http://www.frikipedia.es/friki/Cani

Imaginate a esos especimenes escribiendo en el facebook. Su escritura no es muy diferente de lo que sale en el ejemplo xD.

Cuando suben una foto suelen poner títulos así:
Citar
dulse i cavron este ninioh vasilon
Esta nenah ..... parteh la panah con estiloh dorchin gabanah
Flamenkah con arteh ....... dispuestah a camelarteh
niniah, recojeh esas babas, que este morenoh se resbalah
Si eR RixaRd Te VasIlah Tu Te Callah y lo asimilahhh
er pedoh esh un aireh oshkuro que saleh por tuh culohh
TehH SusHh VoiHhH a EsTaYaRhHhH


Título: Re: Problema extraño
Publicado por: BlackM4ster en 14 Marzo 2014, 18:24 pm
Ese problema me recuerda a ésta gilipollez que hice para mi web xD
http://zonaisc.com/web/?q=chonificador


Título: Re: Problema extraño
Publicado por: Yoel Alejandro en 15 Marzo 2014, 21:59 pm
En España lo usan gente de cultura muyyy baja... Nosotros les llamamos "Canis"

Imaginate a esos especimenes escribiendo en el facebook. Su escritura no es muy diferente de lo que sale en el ejemplo xD.


Sinceramente me terminará doliendo la cabeza de leer frases en ese lenguaje  :laugh:  :huh:


Título: Re: Problema extraño
Publicado por: leosansan en 15 Marzo 2014, 22:52 pm

Aquí en Canarias les llamamos "chonis", supongo que de ahó lo de "chonificador". :laugh:

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


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Problema extraño
Publicado por: Gh057 en 16 Marzo 2014, 00:43 am
jajajajaaa me encantó lo del "chonificador" jajajajaa están por todos lados ya, a veces con diferentes nombre... yo pienso que es un dialecto de una tribu urbana, en pleno crecimiento jajajaa ;D