fix Sub/Div swap / fix wrong order for prefix/lisp display

This commit is contained in:
2021-01-25 17:36:40 +01:00
parent add6d02749
commit 5bd19cbe22
4 changed files with 33 additions and 34 deletions

2
best.c
View File

@@ -61,7 +61,7 @@ int check_best(res, nops, node, values, ops)
nbests=0; nbests=0;
found=1; found=1;
//return 1; //return 1;
}/* else if (diff == bestdiff && nops == bestops) { } /*else if (diff == bestdiff && nops == bestops) {
# ifdef DEBUG_BEST # ifdef DEBUG_BEST
printf("NEW BEST SOLUTION (%d): res=%d diff=%d nops=%d\n", nbests+1, res, diff, nops); printf("NEW BEST SOLUTION (%d): res=%d diff=%d nops=%d\n", nbests+1, res, diff, nops);
print_node(node, TREE_TOP, 0, 0); print_node(node, TREE_TOP, 0, 0);

43
eval.c
View File

@@ -66,34 +66,33 @@ int eval_node(node, depth, pvals, pops, ncalcs)
res=val1*val2; res=val1*val2;
break; break;
case Sub: case Sub:
if (val1 != val2) { if (val1<val2) {
if (val1 > val2) { NODE *tmp=node->left;
res=val1-val2; # ifdef DEBUG_EVAL2
} else { printf("eval: Sub: swapping val1=%d val2=%d\n", val1, val2);
# ifdef DEBUG_EVAL2 # endif
printf("eval: Sub: swapping val1=%d val2=%d\n", val1, val2); node->left=node->right;
# endif node->right=tmp;
res=val2-val1;
}
if (res == val2) /* already found in subtree */
res=-1;
} }
if (val1 != val2) {
res=val1-val2;
}
if (res == val2) /* already found in subtree */
res=-1;
break; break;
case Div: case Div:
if (val1 >= val2) { if (val1<val2) {
if (val2 != 1 && (val1 % val2 == 0)) NODE *tmp=node->left;
res=val1/val2;
if (res == val2) /* already found in subtree */
res=-1;
} else {
# ifdef DEBUG_EVAL2 # 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 # endif
if (val1 != 1 && (val2 % val1 == 0)) node->left=node->right;
res=val2/val1; node->right=tmp;
if (res == val1) /* already found in subtree */
res=-1;
} }
if (val2 != 1 && (val1 % val2 == 0))
res=val1/val2;
if (res == val2) /* already found in subtree */
res=-1;
break; break;
case Nop: case Nop:
case End: case End:

4
lceb.c
View File

@@ -36,14 +36,14 @@ void help()
fprintf(stderr, " -d TYPE: Solutions display type. TYPE can be:\n"); fprintf(stderr, " -d TYPE: Solutions display type. TYPE can be:\n");
fprintf(stderr, " r: RPN (default)\n"); fprintf(stderr, " r: RPN (default)\n");
fprintf(stderr, " p: Polish\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, " i: Infix (full parentheses)\n");
fprintf(stderr, " d: Suitable for dc(1) input\n"); fprintf(stderr, " d: Suitable for dc(1) input\n");
fprintf(stderr, " t: Tree\n"); fprintf(stderr, " t: Tree\n");
fprintf(stderr, " -i: Show intermediate solutions\n"); fprintf(stderr, " -i: Show intermediate solutions\n");
fprintf(stderr, " -s: Do not show summary (time, nodes evaluated)\n"); fprintf(stderr, " -s: Do not show summary (time, nodes evaluated)\n");
fprintf(stderr, " -t: Use less trees (WedderburnEtherington instead of Catalan)\n"); fprintf(stderr, " -t: Use less trees (WedderburnEtherington instead of Catalan)\n");
fprintf(stderr, " -h: this help:\n"); fprintf(stderr, " -h: This help\n");
} }
int main(ac, av) int main(ac, av)

18
tree.c
View File

@@ -66,19 +66,19 @@ void print_node(node, side, depth, details)
return; return;
switch (details) { switch (details) {
case 1: case 1: /* prefix */
if (node->type==TREE_NODE) { if (node->type==TREE_NODE) {
printf("%c ", node->op); printf("%c ", node->op);
} else { } else {
printf("%d ", node->val); 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->right, TREE_RIGHT, depth+1, details);
print_node(node->left, TREE_LEFT, depth+1, details);
break; break;
case 0: case 0: /* postfix */
case 5: case 5: /* dc suitable */
print_node(node->left, TREE_LEFT, depth+1, details);
print_node(node->right, TREE_RIGHT, depth+1, details); print_node(node->right, TREE_RIGHT, depth+1, details);
print_node(node->left, TREE_LEFT, depth+1, details);
if (node->type==TREE_NODE) { if (node->type==TREE_NODE) {
printf("%c ", node->op); printf("%c ", node->op);
} else { } else {
@@ -87,7 +87,7 @@ void print_node(node, side, depth, details)
if (details==5 && depth==0) if (details==5 && depth==0)
printf("p"); printf("p");
break; break;
case 3: case 3: /* lisp */
if (node->type==TREE_NODE) { if (node->type==TREE_NODE) {
if (!depth) { if (!depth) {
printf("(%c", node->op); printf("(%c", node->op);
@@ -105,17 +105,17 @@ void print_node(node, side, depth, details)
printf(")"); printf(")");
} }
break; break;
case 4: case 4: /* infix */
if (node->type==TREE_NODE) { if (node->type==TREE_NODE) {
printf("("); printf("(");
} }
print_node(node->left, TREE_LEFT, depth+1, details); print_node(node->right, TREE_RIGHT, depth+1, details);
if (node->type==TREE_NODE) { if (node->type==TREE_NODE) {
printf(" %c ", node->op); printf(" %c ", node->op);
} else { } else {
printf("%d", node->val); 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) { if (node->type==TREE_NODE) {
printf(")"); printf(")");
} }