[Google CodeJam] Qualification Round 2012 – Speaking in Tongues

Aquí les dejo la solución del problema “Speaking in Tongues”, pueden ver su enunciado (en inglés) aquí . El problema básicamente trata de que tenemos una lengua llamada “Googlerese”, la cual, tiene las mismas letras que el alfabeto inglés, con la particularidad de que para cada letra del alfabeto, existe un equivalente en la lengua Googlerese. Esas equivalencias tenemos que encontrarlas nosotros con los ejemplos que nos dan.

Haciendo un análisis manual, llegue a encontrar una relación. En el código se pueden notar 2 arreglos:

-Googlerese: Alfabeto Googlerese.

-English: Alfabeto Inglés.

Las posiciones de ambos alfabetos son las correspondientes a su traducción, e.g. La letra ‘k’ del alfabeto Googlerese, es equivalente a la letra ‘i’ del alfabeto inglés.

El objetivo de la solución es traducir una serie de frases (N frases) al inglés.

Aquí les dejo la solución, no la explico mucho porque creo que con un poco de esfuerzo se podra deducir todo lo que hice.

Lo que encuentro que puede causar confusión es la línea que dice “if(word[i]-32)”.  Al escribir la sentencia anterior, es equivalente a que escribiera “if(word[i]==32)”, ya que C++ al evaluar una igualdad resta al parámetro de la izquierda de la igualdad, el parámetro de la derecha, y ese resultado lo compara con cero. Lo comparo con 32 debido a que 32 es el código ASCII equivalente al espacio en blanco (‘ ‘).

Ahora sí, el código de mi solución:

#include
#include

using namespace std;

char Googlerese[] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',' '};
char English[] = {'y','h','e','s','o','c','v','x','d','u','i','g','l','b','k','r','z','t','n','w','j','p','f','m','a','q',' '};

void speak(string word)
{
for(int i=0; i<word.length(); i++)
{
if(word[i]-32)
cout << English[word[i]-97];
else
cout << " ";
}
cout N;
cin.ignore();
string word;
while(N--)
{
getline(cin,word);
cout << "Case #" << i++ << ": ";
speak(word);
}
return 0;
}
Anuncios

[Google CodeJam] Qualification Round Africa 2010 – Reverse Words

Les dejo la solución de un problema que no era muy complicado (http://code.google.com/codejam/contest/351101/dashboard#s=p1), pero me costó porque nunca había tenido que solucionar un algoritmo que tuviera que leer una frase (con espacios entre cada palabra) en C++, ya que si usamos el típico “std::cin>>frase”, se lee hasta el primer espacio. La solución fue usar la sentencia “getline(cin,frase)”, a la cual se le puede agregar un tercer parámetro indicando hasta que carácter leer (por ejemplo le puedo decir que lea hasta el primer guion bajo), si se omite, se leerá hasta el primer salto de linea (caracter ‘\n’).

El algoritmo básicamente lee la frase entregada desde el final hasta el primer espacio. Por cada espacio que encuentre, imprimirá lo leído hasta el momento. Es un algoritmo eficiente, o al menos eso supongo, ya que resolvió la entrada “larga” a tiempo.

Nota1: Para cambiar el fichero de entrada, se debe cambiar el primer parámetro en la línea que dice ” freopen(“B-large-practice.in”,”r”,stdin)”, poniendo el nombre del fichero de entrada deseado.

Nota2: El programa genera un fichero de salida llamado “out.out” con la salida formateada correspondiente.

#include <iostream>
#include<cstdio>

using namespace std;

void substring(string word, int start, int end, int spaces)
{
    string substring = "";
    for(int i=start;i<=end;i++)
        cout << word[i];
    if(spaces)
    cout << " ";
}

void reverse(string word)
{
    string reversedWord = "";
    unsigned int end = word.length();
    for(int i=word.length();i>=0;i--)
    {
        if(word[i]==' ')
        {
            substring(word,i+1,end-1,1);
            end = i;
        }
    }
    substring(word,0,end-1,0);
}

int main()
{
    int N;
    string word;
    freopen("B-large-practice.in","r",stdin);
    freopen("out.out","w",stdout);
    cin >> N;
    getline(cin,word);
    int i=1;
    while(N--)
    {
        getline(cin,word);
        cout << "Case #" << i++ << ": ";
        reverse(word);
        cout << endl;
    }
    return 0;
}