Exemplo n.º 1
0
// load automata for scanning valid identifiers
void Scanner::load_id_machine() {
	// create the id scan automata
	auto id_machine = FSMachinePtr(
	new FiniteMachineContainer(get_token_info(TokType::MP_ID).first,
	true));
	
	// detects ids without two underscores
	id_machine->add_state("0", true, false);
	id_machine->add_state("1", false, true);
	id_machine->add_state("2", false, true);
	id_machine->add_state("3", false, false);
	id_machine->add_state("4", false, false);
	
	// add transitions
	id_machine->add_alphabet("0", "1");
	id_machine->add_alphabet("1", "1");
	id_machine->add_digits("1", "1");
	id_machine->add_transition("1", '_', "4");
	id_machine->add_alphabet("4", "1");
	id_machine->add_digits("4", "1");
	
	// other part
	id_machine->add_transition("0", '_', "3");
	id_machine->add_alphabet("3", "2");
	id_machine->add_digits("3", "2");
	id_machine->add_alphabet("2", "2");
	id_machine->add_digits("2", "2");
	id_machine->add_transition("2", '_', "3");
	
	// set priority
	id_machine->set_priority(2);
	
	// add to finite machines
	this->fsmachines->push_back(FSMachinePtr(id_machine));
}
Exemplo n.º 2
0
void Scanner::load_strand_machines(unsigned int within) {
	// comments and strings, take that!
	// add nested strings and comments feature using within variable
	auto comment_machine = FSMachinePtr(
	new FiniteMachineContainer(get_token_info(TokType::MP_COMMENT).first, true));
	
	// add states
	comment_machine->add_state("0", true, false);
	comment_machine->add_state("1", false, false);
	comment_machine->add_state("2", false, true);
	
	// for state 1
	comment_machine->add_alphabet("1", "1");
	comment_machine->add_symbols("1", "1");
	comment_machine->add_digits("1", "1");
	comment_machine->add_transition("1", ' ', "1");
	comment_machine->add_transition("1", '\n', "1");
	comment_machine->add_transition("1", '\t', "1");
	comment_machine->add_transition("1", '\v', "1");
	comment_machine->add_transition("1", '\r', "1");
	comment_machine->add_transition("1", '\f', "1");
	comment_machine->remove_transition("1", '{');
	comment_machine->remove_transition("1", '}');
	comment_machine->add_transition("0", '{', "1");
	comment_machine->add_transition("1", '}', "2");
	
	// new machine
	auto string_machine = FSMachinePtr(
	new FiniteMachineContainer(get_token_info(TokType::MP_STRING_LITERAL).first, true));
	
	// add states
	string_machine->add_state("0", true, false);
	string_machine->add_state("1", false, false);
	string_machine->add_state("2", false, true);
	
	// add transitions
	string_machine->add_transition("0", '\'', "1");
	string_machine->add_alphabet("1", "1");
	string_machine->add_symbols("1", "1");
	string_machine->add_digits("1", "1");
	string_machine->add_transition("1", ' ', "1");
	string_machine->remove_transition("1", '\'');
	string_machine->remove_transition("1", '\'');
	string_machine->add_transition("1", '\'', "2");
	
	// set machine priority
	comment_machine->set_priority(1);
	string_machine->set_priority(1);
	
	// add the machines to our FSMachines list
	this->fsmachines->push_back(comment_machine);
	this->fsmachines->push_back(string_machine);
}
Exemplo n.º 3
0
int main(){

	std::set<unsigned long> products;
	unsigned long result = 0;

	//number of digits total must be 9
	//each part of the identity has at least 1 and at most 7 digits

	//multiplicand has at most 7 digits
	for(unsigned long multiplicand = 1; multiplicand < 10000000; ++multiplicand){
		int multiplicand_digits = get_num_digits(multiplicand);
		//digits of multiplier depends on digits of multiplicand and product (which is not known yet)
		for(unsigned long multiplier = 1; multiplier < static_cast<unsigned long>(pow(10,8-multiplicand_digits)); ++multiplier){
			int multiplier_digits = get_num_digits(multiplier);

			int num_digits = multiplicand_digits + multiplier_digits + 
							 (int) (log10(multiplicand) + log10(multiplier) + 1);

			if( num_digits < 9 ){
				continue;
			}
			if( num_digits > 9 ){
				break;
			}
			unsigned long product = multiplicand * multiplier; 
			std::array<bool, 10> digit_table;
			digit_table.fill(false);

			//add digits to digit table. if a digit was already added, continue to next loop
			if(!add_digits(multiplicand, digit_table)){
				continue;
			}
			if(!add_digits(multiplier, digit_table)){
				continue;
			}
			if(!add_digits(product, digit_table)){
				continue;
			}

			//at this point, there are 9 digits in the identity and each one was added
			//also there was no zero added, so there must be all digits in the sum
			if(products.find(product) == products.end()){
				result += product;
				products.insert(product);
			}
		}
	}

	std::cout << result << std::endl;

	return 0;
}
Exemplo n.º 4
0
void Scanner::load_num_machines() {
	// create floating point automata for scanning numeric literals
	auto float_machine = FSMachinePtr(
	new FiniteMachineContainer(get_token_info(TokType::MP_FLOAT_LITERAL).first, true));
	
	// add states to this DFA, first and final
	float_machine->add_state("0", true, false);
	float_machine->add_state("1", false, false);
	float_machine->add_state("2", false, true);
	float_machine->add_state("3", false, false);
	float_machine->add_state("4", false, false);
	float_machine->add_state("5", false, true);
	float_machine->add_digits("0", "1");
	float_machine->add_digits("1", "1");
	float_machine->add_transition("1", '.', "2");
	float_machine->add_digits("2", "2");
	float_machine->add_transition("2", 'e', "3");
	float_machine->add_transition("2", 'E', "3");
	float_machine->add_transition("3", '+', "4");
	float_machine->add_transition("3", '-', "4");
	float_machine->add_digits("3", "5");
	float_machine->add_digits("4", "5");
	float_machine->add_digits("5", "5");
	
	// create integer automata
	auto integer_machine = FSMachinePtr(
	new FiniteMachineContainer(get_token_info(TokType::MP_INT_LITERAL).first, true));
	
	// add states to this DFA
	integer_machine->add_state("0", true, false);
	integer_machine->add_state("1", false, true);
	integer_machine->add_digits("0", "1");
	integer_machine->add_digits("1", "1");
	
	// reset both
	float_machine->reset();
	integer_machine->reset();
	
	// set machine priorities
	float_machine->set_priority(1);
	integer_machine->set_priority(1);
	
	// add both to the finite machines list
	this->fsmachines->push_back(FSMachinePtr(float_machine));
	this->fsmachines->push_back(FSMachinePtr(integer_machine));
}
int add_digits(int x)
{
	static int sum = 0;
	if (x == 0)
	{
		return 0;
	}
	sum = x%10 + add_digits(x / 10);
	return sum;
}
Exemplo n.º 6
0
  void BigInt::add_vector(std::vector<int> &a, std::vector<int> &b) {
    assert(a.size() == b.size());
    int remainder = 0;
    for (int i = 0; i < a.size(); ++i) {
      a[i] = add_digits(a[i], b[i], remainder);
    }

    if (remainder != 0)
      a.push_back(remainder);
  }
int main()
{
	// This function accepts a number and calculates the sum of its digits
	int n, result;
	printf("Enter a number\n");
	scanf_s("%d", &n);

	result = add_digits(n);
	printf("The sum of %d is %d\n", n, result);
	return 0;
}