static int cp_value(MVMThreadContext *tc, MVMCodepoint cp) { if (cp >= '0' && cp <= '9') return cp - '0'; /* fast-path for ASCII 0..9 */ else if (cp >= 'a' && cp <= 'z') return cp - 'a' + 10; else if (cp >= 'A' && cp <= 'Z') return cp - 'A' + 10; else if (cp >= 0xFF21 && cp <= 0xFF3A) return cp - 0xFF21 + 10; /* uppercase fullwidth */ else if (cp >= 0xFF41 && cp <= 0xFF5A) return cp - 0xFF41 + 10; /* lowercase fullwidth */ else if (cp > 0 && MVM_unicode_codepoint_get_property_int(tc, cp, MVM_UNICODE_PROPERTY_NUMERIC_TYPE) == MVM_UNICODE_PVALUE_Numeric_Type_DECIMAL) { /* as of Unicode 9.0.0, characters with the 'de' Numeric Type (and are * thus also of General Category Nd, since 4.0.0) are contiguous * sequences of 10 chars whose Numeric Values ascend from 0 through 9. */ /* the string returned for NUMERIC_VALUE_NUMERATOR contains an integer * value. We can use numerator because they all are from 0-9 and have * denominator of 1 */ return fast_atoi(MVM_unicode_codepoint_get_property_cstr(tc, cp, MVM_UNICODE_PROPERTY_NUMERIC_VALUE_NUMERATOR)); } return -1; }
int main(int argc, const char * argv[]) { FILE *file = fopen(argv[1], "r"); char line[1024]; unsigned int n, k, i, x; while(fgets(line, 1024, file)) { line[strlen(line) - 1] = '\0'; // better than strtok n = fast_atoi(line); x = rev(n); i = 0; do { x += rev(x); i++; } while(x != rev(x)); // faster than for(i = 0; i < 100; i++) apparently ? printf("%d %d\n", i, x); } fclose(file); return 0; }
/* main */ int main(int argc, char *argv[]) { std::ios_base::sync_with_stdio(false); // arguments: p1 p2 [y|(* \ {y})] [true|false] size_t p1 = argc > 2 ? fast_atoi(argv[1]) : 1; // default = 1 size_t p2 = argc > 2 ? fast_atoi(argv[2]) : 1; // default = 1 bool has_constraints = false; // if there are constraints if (argc > 3) has_constraints = strcmp(argv[3],"1") || strcmp(argv[3], "y"); /* if default_constraints_mode is true: * constraints in input mean ONLY THESE MATCH * otherwise: * constraints in input mean ALL EXCEPT THESE MATCH */ bool default_constraints_mode = false; // the semantic of the constraints //if (has_constraints) default_constraints_mode = strcmp(argv[4], "t"); /* (1) read strings, extract sigmas and constraints too */ std::string s1, s2; std::string sigma1(""), sigma2(""); read_stdin(s1, s2); extract_sigma(s1, sigma1); extract_sigma(s2, sigma2); size_t sigma1l = sigma1.size(); size_t sigma2l = sigma2.size(); size_t s1l = s1.size(); size_t s2l = s2.size(); std::vector<p_constr> constraints; if (has_constraints) read_constraints(constraints); /* define the mapping from char -> int */ std::map<char, int> map1; std::map<char, int> map2; define_mapping(sigma1, map1); define_mapping(sigma2, map2); /* integer representations of strings and sigmas */ unsigned* s1i = new unsigned[s1l]; unsigned* s2i = new unsigned[s2l]; unsigned* sigma1i = new unsigned[sigma1l]; unsigned* sigma2i = new unsigned[sigma2l]; for (size_t i = 0; i < sigma1l; ++i) sigma1i[i] = i; // sigma1 for (size_t i = 0; i < sigma2l; ++i) sigma2i[i] = i; // sigma2 for (size_t i = 0; i < s1l; ++i) s1i[i] = map1[s1[i]]; // s1 for (size_t i = 0; i < s2l; ++i) s2i[i] = map2[s2[i]]; // s2 if (_DEBUG) { std::cout << "strings: " << s1 << ", " << s2 << endl; std::cout << "sigmas: " << sigma1 << ", " << sigma2 << endl; std::cout << "int rep (s1): "; for (size_t i = 0; i < s1l; ++i) std::cout << s1i[i]; std::cout << endl; std::cout << "int rep (s2): "; for (size_t i = 0; i < s2l; ++i) std::cout << s2i[i]; std::cout << endl; std::cout << "int rep (sigma1): "; for (size_t i = 0; i < sigma1l; ++i) std::cout << sigma1i[i]; std::cout << endl; std::cout << "int rep (sigma2): "; for (size_t i = 0; i < sigma2l; ++i) std::cout << sigma2i[i]; std::cout << endl; } /* identity (classical) matching schema */ matching_schema<bool> ms(sigma1l, sigma2l, p1, p2, true, default_constraints_mode); ms.set_general(sigma1, sigma2, false); if (has_constraints) ms.set_constraints(map1, map2, constraints, !default_constraints_mode); if (_DEBUG) { if (has_constraints) { std::cout << "Constraints: "; for(std::vector<p_constr>::size_type i = 0; i < constraints.size(); ++i) std::cout << constraints[i].first << ", " << constraints[i].second << endl; } ms.print_matching_schema(sigma1, sigma2); } //int d = bruteforce(s1i, s2i, s1l, s2l, sigma1i, sigma2i, sigma1l, sigma2l, ms); int d = hill_climbing(s1i, s2i, s1l, s2l, sigma1i, sigma2i, sigma1l, sigma2l, p1, ms); std::cout << d << endl; //Alignment<int> a = compute_alignment(s1i, s2i, s1l, s2l, ms); //std::cout << distance_from_alignment(a, sigma1, sigma2, ms, false) << endl; return 0; }