#include <stdio.h>
#include <string>
#include <functional>
#include <vector>
#include <stdlib.h>
#include <stdio.h>
//^ :>=
//~ :<=
//= :==
std::string a = "^2024&~2026"; //>=2024 and <=2026
std::string b = "=2024"; //=2024
std::string c = "=2024|^2027"; //=2024 or >=2027
std::string d = "^2027|~2022"; //>=2027 or <=2022
std::vector<std::function<bool(int)> > f_list;
std::vector<char> operation{'|'};
using namespace std::placeholders;
bool isGE(int target,int standard){
printf("isGE %d >= %d\n",target,standard);
return target >= standard;
}
bool isLE(int target,int standard){
printf("isGE %d <= %d\n",target,standard);
return target <= standard;
}
bool isEQ(int target,int standard){
printf("isGE %d == %d\n",target,standard);
return target == standard;
}
bool test(int i ,int l){
printf("%d,%d\n",i,l);
return true;
}
void parse(std::string s){
const char* ptr = s.c_str();
int len = s.length();
for(int i = 0; i <= len ;i++){
char e = ptr[i];
if(e=='^'|| e=='=' || e=='~'){
//read 4 chars
if(i+4>=len){
printf("out of scope");
}
if(ptr[i+1]>='2'&& ptr[i+1]<'9'
&& ptr[i+2]>='0'&& ptr[i+2]<'9'
&& ptr[i+3]>='0'&& ptr[i+3]<'9'
&& ptr[i+4]>='0'&& ptr[i+4]<'9'
){
int v = (ptr[i+1]-'0')*1000 +
(ptr[i+2]-'0')*100 +
(ptr[i+3]-'0')*10 +
(ptr[i+4]-'0');
if(e == '^'){
printf(" >= %d\n",v);
f_list.emplace_back(std::bind(isGE,_1,v));
}else if(e == '='){
printf(" == %d\n",v);
f_list.emplace_back(std::bind(isEQ,_1,v));
}else if(e == '~'){
printf(" <= %d\n",v);
f_list.emplace_back(std::bind(isLE,_1,v));
}
if(i+5<len){
operation.emplace_back(ptr[i+5]);
}
}
}
}
}
int main(int argc,char** argv){
int input = atoi(argv[1]);
char* input1 = argv[2];
parse(std::string(input1));
bool ret = false;
printf("%d,%d,%d\n",ret,f_list.size(),operation.size());
if(operation.size() != f_list.size()){
printf("bad string\n");
return 0;
}
for(int i=0;i<f_list.size();i++){
if(operation[i]=='|'){
printf("||\n");
ret = ret || f_list[i](input);
}else{
printf("&&\n");
ret = ret && f_list[i](input);
}
}
printf("%d\n",ret);
}
[DEMO] 年份判断
于 2024-01-12 14:24:56 首次发布