Problem 42: Coded triangle numbers

The nth term of the sequence of triangle numbers is given by, tn = ½n(n+1); so the first ten triangle numbers are:

1, 3, 6, 10, 15, 21, 28, 36, 45, 55, …

By converting each letter in a word to a number corresponding to its alphabetical position and adding these values we form a word value. For example, the word value for SKY is 19 + 11 + 25 = 55 = t10. If the word value is a triangle number then we shall call the word a triangle word.

Using words.txt (right click and ‘Save Link/Target As…’), a 16K text file containing nearly two-thousand common English words, how many are triangle words?

 

Here is my solution in C++

 

#include <iostream>
#include <fstream>
#include <vector>
#include <sstream>

std::vector<unsigned long long int> buildTriList(void);
int wordToNumb(std::string passedWord);
bool triangleCheck(std::vector<unsigned long long int> triList, int passedNumb);
std::vector<std::string> readFromFile(std::ifstream &inFile);

int main(void)
{
	int triangleCount = 0;
	std::string filePath = "words.txt";
	std::vector<unsigned long long int> triangleList = buildTriList();
	std::ifstream inFile(filePath.c_str());
	std::vector<std::string> wordList = readFromFile(inFile);


	for(auto it : wordList)
	{
		if(triangleCheck(triangleList, wordToNumb(it)))
		{
			triangleCount++;
		}
	}

	std::cout << "There are " << triangleCount << " coded triangle words." << std::endl;

	return 0;
}

std::vector<std::string> readFromFile(std::ifstream &inFile)
{
	std::vector fileBuff<std::string>;
	std::string line;

	while(std::getline(inFile, line))
	{
		std::stringstream ss(line);
		std::string szBuff;
		while(getline(ss, szBuff, ','))
		{
			szBuff.erase(0, 1);
			szBuff.erase(szBuff.size()-1);
			fileBuff.push_back(szBuff);
		}
	}

	return fileBuff;
}

std::vector<unsigned long long int> buildTriList(void)
{
	std::vector<unsigned long long int> triangleList;
	for(int i = 1; i < 100000; i++)
	{
		triangleList.push_back((.5*i)*(i+1));
	}
	return triangleList;
}

int wordToNumb(std::string passedWord)
{
	int count = 0;

	for(auto it: passedWord)
	{
		count += (static_cast(it)-64);
	}

	return count;
}

bool triangleCheck(std::vector<unsigned long long int> triList, int passedNumb)
{
	for(auto it = triList.begin(); it != triList.end(); it++)
	{
		if((*(it)) == passedNumb)
		{
			return true;
		}
		else if((*(it)) > passedNumb)
		{
			return false;
		}
	}
}

Leave a Reply

Your email address will not be published. Required fields are marked *