Initial Commit
This commit is contained in:
commit
8a4c85625c
1 changed files with 175 additions and 0 deletions
175
main.c
Normal file
175
main.c
Normal file
|
@ -0,0 +1,175 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
|
||||||
|
bool SolveFor(char* func, uint32_t vars, uint8_t* varMap)
|
||||||
|
{
|
||||||
|
char stack[1024];
|
||||||
|
int stackPtr;
|
||||||
|
int ptr;
|
||||||
|
bool valueA;
|
||||||
|
bool valueB;
|
||||||
|
|
||||||
|
stackPtr = 0;
|
||||||
|
ptr = 0;
|
||||||
|
|
||||||
|
while (func[ptr] != 0)
|
||||||
|
{
|
||||||
|
switch (func[ptr])
|
||||||
|
{
|
||||||
|
case '~':
|
||||||
|
{
|
||||||
|
assert(stackPtr > 0);
|
||||||
|
valueA = stack[stackPtr - 1];
|
||||||
|
stack[stackPtr-1] = !valueA;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case '&':
|
||||||
|
{
|
||||||
|
assert(stackPtr > 1);
|
||||||
|
|
||||||
|
valueA = stack[--stackPtr];
|
||||||
|
valueB = stack[stackPtr-1];
|
||||||
|
|
||||||
|
stack[stackPtr - 1] = valueA && valueB;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case '|':
|
||||||
|
{
|
||||||
|
assert(stackPtr > 1);
|
||||||
|
|
||||||
|
valueA = stack[--stackPtr];
|
||||||
|
valueB = stack[stackPtr-1];
|
||||||
|
|
||||||
|
stack[stackPtr - 1] = valueA || valueB;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
if (func[ptr] == '0') stack[stackPtr++] = 0;
|
||||||
|
else if (func[ptr] == '1') stack[stackPtr++] = 1;
|
||||||
|
else if (func[ptr] >= 'a' && func[ptr] <= 'z')
|
||||||
|
{
|
||||||
|
assert(varMap[func[ptr] - 'a'] != 255);
|
||||||
|
stack[stackPtr++] = (vars >> varMap[func[ptr] - 'a']) & 0x01;
|
||||||
|
}
|
||||||
|
else assert(false);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ptr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(stackPtr == 1);
|
||||||
|
return stack[stackPtr-1] != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char** argv)
|
||||||
|
{
|
||||||
|
char* formula = "p&q|a&b&~d&c|e&f|x&y|z|g&h&i&j";
|
||||||
|
int ptr;
|
||||||
|
char stack[1024];
|
||||||
|
char output[1024];
|
||||||
|
int stackPtr;
|
||||||
|
int outPtr;
|
||||||
|
int varCount;
|
||||||
|
uint8_t varMap[26];
|
||||||
|
|
||||||
|
ptr = 0;
|
||||||
|
stackPtr = 0;
|
||||||
|
outPtr = 0;
|
||||||
|
memset(varMap, 255, 26);
|
||||||
|
varCount = 0;
|
||||||
|
|
||||||
|
while(formula[ptr] != 0)
|
||||||
|
{
|
||||||
|
switch (formula[ptr])
|
||||||
|
{
|
||||||
|
case '~':
|
||||||
|
{
|
||||||
|
stack[stackPtr] = formula[ptr];
|
||||||
|
stackPtr++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case '&':
|
||||||
|
{
|
||||||
|
if (stackPtr > 0 && stack[stackPtr-1] == '~')
|
||||||
|
{
|
||||||
|
output[outPtr++] = stack[--stackPtr];
|
||||||
|
}
|
||||||
|
|
||||||
|
stack[stackPtr] = formula[ptr];
|
||||||
|
stackPtr++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case '|':
|
||||||
|
{
|
||||||
|
if (stackPtr > 0)
|
||||||
|
{
|
||||||
|
output[outPtr++] = stack[--stackPtr];
|
||||||
|
}
|
||||||
|
|
||||||
|
stack[stackPtr] = formula[ptr];
|
||||||
|
stackPtr++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
if (formula[ptr] >= 'a' && formula[ptr] <= 'z')
|
||||||
|
{
|
||||||
|
/** we got a variable **/
|
||||||
|
output[outPtr] = formula[ptr];
|
||||||
|
outPtr++;
|
||||||
|
if (varMap[formula[ptr] - 'a'] == 255)
|
||||||
|
varMap[formula[ptr] - 'a'] = varCount++;
|
||||||
|
}
|
||||||
|
else if (formula[ptr] == '0' || formula[ptr] == '1')
|
||||||
|
{
|
||||||
|
output[outPtr] = formula[ptr];
|
||||||
|
outPtr++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("Unknown symbol %c!\n", formula[ptr]);
|
||||||
|
assert(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ptr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (stackPtr > 0)
|
||||||
|
{
|
||||||
|
output[outPtr++] = stack[--stackPtr];
|
||||||
|
}
|
||||||
|
|
||||||
|
output[outPtr] = 0;
|
||||||
|
|
||||||
|
// print pretty header
|
||||||
|
for (int i = 0; i < 26; i++)
|
||||||
|
if (varMap[i] != 255)
|
||||||
|
printf("%c ", 'a'+i);
|
||||||
|
printf("Result\n");
|
||||||
|
|
||||||
|
// dirty hack
|
||||||
|
for (uint32_t i = 0; i < pow(2, varCount); i++)
|
||||||
|
{
|
||||||
|
// pretty printing
|
||||||
|
for (int j = 0; j < 26; j++)
|
||||||
|
if (varMap[j] != 255)
|
||||||
|
printf("%i ", (i >> varMap[j]) & 0x01);
|
||||||
|
printf("%i\n", SolveFor(output, i, varMap));
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in a new issue