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;
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
View File

@@ -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
View File

@@ -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 (WedderburnEtherington instead of Catalan)\n");
fprintf(stderr, " -h: this help:\n");
fprintf(stderr, " -h: This help\n");
}
int main(ac, av)

18
tree.c
View File

@@ -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(")");
}