2023W-EFFPROG

Magic Hexagon.
Log | Files | Refs | README

commit f8195a4318a5071e9d0c054114468539c60fce8d
parent 324d19aba6d421f73c66264a76b5046cde609fae
Author: Markus Hunner <26381538+markhun@users.noreply.github.com>
Date:   Wed, 20 Dec 2023 11:48:25 +0100

Add CHANGE_IDENTIFIER enum for mutation functions

Diffstat:
Mmagichex/src/magichex.c | 61+++++++++++++++++++++++++++++++------------------------------
1 file changed, 31 insertions(+), 30 deletions(-)

diff --git a/magichex/src/magichex.c b/magichex/src/magichex.c @@ -65,44 +65,45 @@ long max(long a, long b) 2 if there was no change */ +typedef enum RESULTTYPE { NOSOLUTION = 0, CHANGED = 1, NOCHANGE = 2 } CHANGE_IDENTIFIER; -int sethi(HexagonEntry *hexagonEntry, long x) { +CHANGE_IDENTIFIER sethi(HexagonEntry *hexagonEntry, long x) { assert(hexagonEntry->id != PLACEHOLDER_ENTRY_ID); if (x < hexagonEntry->hi) { hexagonEntry->hi = x; if (hexagonEntry->lo <= hexagonEntry->hi) - return 1; + return CHANGED; else - return 0; + return NOCHANGE; } - return 2; + return NOCHANGE; } -int setlo(HexagonEntry *hexagonEntry, long x) { +CHANGE_IDENTIFIER setlo(HexagonEntry *hexagonEntry, long x) { assert(hexagonEntry->id != PLACEHOLDER_ENTRY_ID); if (x > hexagonEntry->lo) { hexagonEntry->lo = x; if (hexagonEntry->lo <= hexagonEntry->hi) - return 1; + return CHANGED; else - return 0; + return NOSOLUTION; } - return 2; + return NOCHANGE; } -/* returns 0 if there is no solution, 1 if one of the variables has changed */ -int lessthan(HexagonEntry *v1, HexagonEntry *v2) +/* returns NOSOLUTION if there is no solution, CHANGED if one of the variables has changed */ +CHANGE_IDENTIFIER lessthan(HexagonEntry *v1, HexagonEntry *v2) { assert(v1->id != PLACEHOLDER_ENTRY_ID); assert(v2->id != PLACEHOLDER_ENTRY_ID); - int f = sethi(v1, v2->hi-1); - if (f < 2) + CHANGE_IDENTIFIER f = sethi(v1, v2->hi-1); + if (f == NOSOLUTION || f == CHANGED) return f; return (setlo(v2, v1->lo+1)); } -int sum(HexagonEntry hexagon[], unsigned long nv, unsigned long stride, long sum, +CHANGE_IDENTIFIER sum(HexagonEntry hexagon[], unsigned long nv, unsigned long stride, long sum, HexagonEntry *hexagonStart, HexagonEntry *hexagonEnd) { unsigned long i; @@ -128,17 +129,17 @@ int sum(HexagonEntry hexagon[], unsigned long nv, unsigned long stride, long sum } /* hi is the upper bound of sum-sum(hexagon), lo the lower bound */ for (i=0, hexagonEntry_p=hexagon; i<nv; i++, hexagonEntry_p+=stride) { - int f = sethi(hexagonEntry_p,hi+hexagonEntry_p->lo); /* readd hexagonEntry_p->lo to get an upper bound of hexagonEntry_p */ + CHANGE_IDENTIFIER f = sethi(hexagonEntry_p,hi+hexagonEntry_p->lo); /* readd hexagonEntry_p->lo to get an upper bound of hexagonEntry_p */ assert(hexagonEntry_p>=hexagonStart); assert(hexagonEntry_p<hexagonEnd); assert(hexagonEntry_p->id != PLACEHOLDER_ENTRY_ID); - if (f < 2) + if (f == NOSOLUTION || f == CHANGED) return f; f = setlo(hexagonEntry_p,lo+hexagonEntry_p->hi); /* likewise, readd hexagonEntry_p->hi */ - if (f < 2) + if (f == NOSOLUTION || f == CHANGED) return f; } - return 2; + return NOCHANGE; } /* reduce the ranges of the variables as much as possible (with the @@ -185,33 +186,33 @@ int solve(unsigned long n, long d, HexagonEntry hexagon[]) /* the < constraints; all other corners are smaller than the first one (eliminate rotational symmetry) */ for (i=1; i<sizeof(corners)/sizeof(corners[0]); i++) { - int f = lessthan(&hexagon[corners[0]],&hexagon[corners[i]]); - if (f==0) return 0; - if (f==1) goto restart; + CHANGE_IDENTIFIER f = lessthan(&hexagon[corners[0]],&hexagon[corners[i]]); + if (f==NOSOLUTION) return 0; + if (f==CHANGED) goto restart; } /* eliminate the mirror symmetry between the corners to the right and left of the first corner */ { - int f = lessthan(&hexagon[corners[2]],&hexagon[corners[1]]); - if (f==0) return 0; - if (f==1) goto restart; + CHANGE_IDENTIFIER f = lessthan(&hexagon[corners[2]],&hexagon[corners[1]]); + if (f==NOSOLUTION) return 0; + if (f==CHANGED) goto restart; } /* sum constraints: each line and diagonal sums up to M */ /* line sum constraints */ for (i=0; i<r; i++) { - int f; + CHANGE_IDENTIFIER f; /* line */ f = sum(hexagon+r*i+max(0,i+1-n), min(i+n,r+n-i-1), 1, M, hexagon, hexagon+r*r); - if (f==0) return 0; - if (f==1) goto restart; + if (f==NOSOLUTION) return 0; + if (f==CHANGED) goto restart; /* column (diagonal down-left in the hexagon) */ f = sum(hexagon+i+max(0,i+1-n)*r, min(i+n,r+n-i-1), r, M, hexagon, hexagon+r*r); - if (f==0) return 0; - if (f==1) goto restart; + if (f==NOSOLUTION) return 0; + if (f==CHANGED) goto restart; /* diagonal (down-right) */ f = sum(hexagon-n+1+i+max(0,n-i-1)*(r+1), min(i+n,r+n-i-1), r+1, M, hexagon, hexagon+r*r); - if (f==0) return 0; - if (f==1) goto restart; + if (f==NOSOLUTION) return 0; + if (f==CHANGED) goto restart; } return 1; }