crwld.org » Blog Archive » Google Code Jam 08 - Alien Numbers
203 views

Google Code Jam 08 - Alien Numbers

1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...

Hi there

Here is my solution for the first practice exercise of Google Code Jam 2008, called Alien Numbers.
I haven’t had much time to code recently, due to exams, but didn’t resist and took a look at the first exercise :P
I did it in C.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//Constants
#define min_size_number 1
#define min_size_input_lang 2
#define min_size_target_lang 2
#define max_size_number 4
#define max_size_input_lang 10
#define max_size_target_lang 10

//Multiplies a number for itself e times
int exponent(int number, int e)
{
	int n=1;

	while (e>0)
	{
		n = n * number;
		e--;
	}

	return n;
}

//Converts a number in a given base, to base 10
int fromXto10(char * number, char * base)
{
	//Variables
	int i, j, n, decNumber=0, e, baseNumber = strlen(base); //Int variables

	//Get maximum exponent in number (0-n)
	e = strlen(number)-1;

	//Go through the number
	for (i=0;i<strlen(number);i++)
	{
		//Get the decimal number of the current symbol, using input base
		for (j=0;j<strlen(base);j++)
		{
			if (number[i]==base[j])
			{
				n = j;
				break;
			}
		}
		//Get decimal number
		decNumber += n * exponent(baseNumber, e);
		e--;
	}

	//Return decimal number
	return decNumber;
}

char * from10toX(int number, char * base)
{
	//Variables
	int i, divRes, rest, baseNumber = strlen(base); //Int variables
	char * Xnumber; //String variables

	//Calculate space needed for X number
	i=0;
	divRes = number;
	while (divRes>0)
	{
		divRes = divRes / baseNumber; //Divide
		i++;
	}

	//Allocate space for Xnumber (i=number of digits)
	Xnumber = (char*) malloc((sizeof(char)+1)*i);
	Xnumber[i] = '\0';

	//Go through the number
	divRes = number;
	while (divRes>0)
	{
		rest = divRes % baseNumber; //Get rest (last digit in target language)
		divRes = divRes / baseNumber; //Divide

		//Convert r to target digit, and put it in Xnumber (starts from the end)
		Xnumber[i-1] = base[rest];
		i--;
	}

	//Return X number
	return Xnumber;
}

int main()
{
	//Variables
	FILE * fin, * fout; //Input file
	int totalCases=0, i, dec; //Int variables
	char number[max_size_number], inputLang[max_size_input_lang], targetLang[max_size_target_lang], * targetNumber; //String variables

	//Open file for reading
	fin = fopen("A-small.in", "r");
	fout = fopen("output.in", "w");
	if (fin==NULL) return 0;

	//Get total numbers of cases
	fscanf(fin, "%d", &totalCases);

	//Go through all cases
	for (i=0;i<totalCases;i++)
	{
		//Get case
		fscanf(fin, "%s %s %s", number, inputLang, targetLang);
		//Convert from input to decimal
		dec = fromXto10(number, inputLang);
		//Convert from decimal to target and print
		targetNumber = from10toX(dec, targetLang);
		printf("Case #%d: %s\n", i+1, targetNumber);
		fprintf(fout, "Case #%d: %s\n", i+1, targetNumber);
	}

	return 0;
}

Take care! :)

Leave a Comment

Please note: Comment moderation is enabled and may delay your comment. There is no need to resubmit your comment.

crwld.org@2008 || WordPress @ Red Star edited by Buttpt || Header by ashlik