fix Sub/Div swap / fix wrong order for prefix/lisp display
This commit is contained in:
2
best.c
2
best.c
@@ -61,7 +61,7 @@ int check_best(res, nops, node, values, ops)
|
||||
nbests=0;
|
||||
found=1;
|
||||
//return 1;
|
||||
}/* else if (diff == bestdiff && nops == bestops) {
|
||||
} /*else if (diff == bestdiff && nops == bestops) {
|
||||
# ifdef DEBUG_BEST
|
||||
printf("NEW BEST SOLUTION (%d): res=%d diff=%d nops=%d\n", nbests+1, res, diff, nops);
|
||||
print_node(node, TREE_TOP, 0, 0);
|
||||
|
43
eval.c
43
eval.c
@@ -66,34 +66,33 @@ int eval_node(node, depth, pvals, pops, ncalcs)
|
||||
res=val1*val2;
|
||||
break;
|
||||
case Sub:
|
||||
if (val1 != val2) {
|
||||
if (val1 > val2) {
|
||||
res=val1-val2;
|
||||
} else {
|
||||
# ifdef DEBUG_EVAL2
|
||||
printf("eval: Sub: swapping val1=%d val2=%d\n", val1, val2);
|
||||
# endif
|
||||
res=val2-val1;
|
||||
}
|
||||
if (res == val2) /* already found in subtree */
|
||||
res=-1;
|
||||
if (val1<val2) {
|
||||
NODE *tmp=node->left;
|
||||
# ifdef DEBUG_EVAL2
|
||||
printf("eval: Sub: swapping val1=%d val2=%d\n", val1, val2);
|
||||
# endif
|
||||
node->left=node->right;
|
||||
node->right=tmp;
|
||||
}
|
||||
if (val1 != val2) {
|
||||
res=val1-val2;
|
||||
}
|
||||
if (res == val2) /* already found in subtree */
|
||||
res=-1;
|
||||
break;
|
||||
case Div:
|
||||
if (val1 >= val2) {
|
||||
if (val2 != 1 && (val1 % val2 == 0))
|
||||
res=val1/val2;
|
||||
if (res == val2) /* already found in subtree */
|
||||
res=-1;
|
||||
} else {
|
||||
if (val1<val2) {
|
||||
NODE *tmp=node->left;
|
||||
# ifdef DEBUG_EVAL2
|
||||
printf("eval: Div: swapping val1=%d val2=%d\n", val1, val2);
|
||||
printf("eval: Sub: swapping val1=%d val2=%d\n", val1, val2);
|
||||
# endif
|
||||
if (val1 != 1 && (val2 % val1 == 0))
|
||||
res=val2/val1;
|
||||
if (res == val1) /* already found in subtree */
|
||||
res=-1;
|
||||
node->left=node->right;
|
||||
node->right=tmp;
|
||||
}
|
||||
if (val2 != 1 && (val1 % val2 == 0))
|
||||
res=val1/val2;
|
||||
if (res == val2) /* already found in subtree */
|
||||
res=-1;
|
||||
break;
|
||||
case Nop:
|
||||
case End:
|
||||
|
4
lceb.c
4
lceb.c
@@ -36,14 +36,14 @@ void help()
|
||||
fprintf(stderr, " -d TYPE: Solutions display type. TYPE can be:\n");
|
||||
fprintf(stderr, " r: RPN (default)\n");
|
||||
fprintf(stderr, " p: Polish\n");
|
||||
fprintf(stderr, " l: Lisp\n");
|
||||
fprintf(stderr, " l: Lisp (binary operators)\n");
|
||||
fprintf(stderr, " i: Infix (full parentheses)\n");
|
||||
fprintf(stderr, " d: Suitable for dc(1) input\n");
|
||||
fprintf(stderr, " t: Tree\n");
|
||||
fprintf(stderr, " -i: Show intermediate solutions\n");
|
||||
fprintf(stderr, " -s: Do not show summary (time, nodes evaluated)\n");
|
||||
fprintf(stderr, " -t: Use less trees (Wedderburn–Etherington instead of Catalan)\n");
|
||||
fprintf(stderr, " -h: this help:\n");
|
||||
fprintf(stderr, " -h: This help\n");
|
||||
}
|
||||
|
||||
int main(ac, av)
|
||||
|
18
tree.c
18
tree.c
@@ -66,19 +66,19 @@ void print_node(node, side, depth, details)
|
||||
return;
|
||||
|
||||
switch (details) {
|
||||
case 1:
|
||||
case 1: /* prefix */
|
||||
if (node->type==TREE_NODE) {
|
||||
printf("%c ", node->op);
|
||||
} else {
|
||||
printf("%d ", node->val);
|
||||
}
|
||||
print_node(node->left, TREE_LEFT, depth+1, details);
|
||||
print_node(node->right, TREE_RIGHT, depth+1, details);
|
||||
print_node(node->left, TREE_LEFT, depth+1, details);
|
||||
break;
|
||||
case 0:
|
||||
case 5:
|
||||
print_node(node->left, TREE_LEFT, depth+1, details);
|
||||
case 0: /* postfix */
|
||||
case 5: /* dc suitable */
|
||||
print_node(node->right, TREE_RIGHT, depth+1, details);
|
||||
print_node(node->left, TREE_LEFT, depth+1, details);
|
||||
if (node->type==TREE_NODE) {
|
||||
printf("%c ", node->op);
|
||||
} else {
|
||||
@@ -87,7 +87,7 @@ void print_node(node, side, depth, details)
|
||||
if (details==5 && depth==0)
|
||||
printf("p");
|
||||
break;
|
||||
case 3:
|
||||
case 3: /* lisp */
|
||||
if (node->type==TREE_NODE) {
|
||||
if (!depth) {
|
||||
printf("(%c", node->op);
|
||||
@@ -105,17 +105,17 @@ void print_node(node, side, depth, details)
|
||||
printf(")");
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
case 4: /* infix */
|
||||
if (node->type==TREE_NODE) {
|
||||
printf("(");
|
||||
}
|
||||
print_node(node->left, TREE_LEFT, depth+1, details);
|
||||
print_node(node->right, TREE_RIGHT, depth+1, details);
|
||||
if (node->type==TREE_NODE) {
|
||||
printf(" %c ", node->op);
|
||||
} else {
|
||||
printf("%d", node->val);
|
||||
}
|
||||
print_node(node->right, TREE_RIGHT, depth+1, details);
|
||||
print_node(node->left, TREE_LEFT, depth+1, details);
|
||||
if (node->type==TREE_NODE) {
|
||||
printf(")");
|
||||
}
|
||||
|
Reference in New Issue
Block a user