only commit. unlicense
This commit is contained in:
commit
347fbf7d30
|
@ -0,0 +1,189 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <termios.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
// WORDLE OF PLASTIC
|
||||
// worle
|
||||
// wordls
|
||||
|
||||
#define uint unsigned int
|
||||
|
||||
#define WORDLE_SLOT 0
|
||||
#define WORDLE_IN 1
|
||||
#define WORDLE_NO 2
|
||||
|
||||
int strcon(char* s, char c) {
|
||||
uint sl = strlen(s);
|
||||
for(uint i = 0; i < sl; i++) if(s[i] == c) return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int wsuccess(int8_t* m, uint l) {
|
||||
for(uint i = 0; i < l; i++) if(m[i] != WORDLE_SLOT) return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
uint* gentab(char* s, uint l) {
|
||||
uint* r = malloc(sizeof(uint) * 256);
|
||||
memset(r, 0, 256);
|
||||
for(uint i = 0; i < l; i++) r[s[i]]++;
|
||||
return r;
|
||||
}
|
||||
|
||||
int8_t* worle(char* word, char* guess) {
|
||||
uint wordlen = strlen(word);
|
||||
|
||||
if(strlen(guess) != wordlen) return NULL;
|
||||
|
||||
uint* lctab = gentab(word, wordlen);
|
||||
int8_t* ret = malloc(sizeof(int8_t) * wordlen);
|
||||
memset(ret, 0xFF, wordlen);
|
||||
|
||||
for(uint i = 0; i < wordlen; i++) {
|
||||
if(word[i] == guess[i]) {
|
||||
ret[i] = WORDLE_SLOT;
|
||||
if(lctab[word[i]] != 0) lctab[word[i]]--;
|
||||
}
|
||||
else {
|
||||
if(lctab[guess[i]] != 0) {
|
||||
ret[i] = WORDLE_IN;
|
||||
lctab[guess[i]]--;
|
||||
}
|
||||
else ret[i] = WORDLE_NO;
|
||||
}
|
||||
}
|
||||
|
||||
free(lctab);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void clrscr() {
|
||||
printf("\x1B\x5B\x48\x1B\x5B\x4A");
|
||||
}
|
||||
char* wcol[3] = {
|
||||
"\033[32m",
|
||||
"\033[33m",
|
||||
"\033[31m",
|
||||
};
|
||||
void rg(char* word, char* guess, uint l) {
|
||||
uint8_t* w = worle(word, guess);
|
||||
for(uint i = 0; i < l; i++) printf("%s%c", wcol[w[i]], guess[i]);
|
||||
printf("\033[0m\n");
|
||||
free(w);
|
||||
}
|
||||
|
||||
void rgw(char* word, char* guess, uint l) {
|
||||
uint8_t* w = worle(word, guess);
|
||||
char* wc = "GYR";
|
||||
for(uint i = 0; i < l; i++) printf("%s%c", wcol[w[i]], wc[w[i]]);
|
||||
printf("\033[0m\n");
|
||||
free(w);
|
||||
}
|
||||
|
||||
void vword(char* s) {
|
||||
}
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
if(argc < 2) printf("argv[1] must contain word\n");
|
||||
char* word = argv[1];
|
||||
uint l = strlen(word);
|
||||
for(uint i = 0; i < l; i++) if(word[i] < 'a' || word[i] > 'z') exit(!!printf("word must be all lowercase letters\n"));
|
||||
|
||||
int win = 0;
|
||||
fcntl(0, F_SETFL, O_NONBLOCK);
|
||||
struct termios t, tsave;
|
||||
tcgetattr(0, &t);
|
||||
tsave = t;
|
||||
t.c_iflag &= ~(ICRNL|IXON);
|
||||
t.c_lflag &= ~(ICANON|ECHO|ISIG|IEXTEN);
|
||||
tcsetattr(0, TCSANOW, &t);
|
||||
setbuf(stdout, NULL);
|
||||
|
||||
char** guesstab = malloc(sizeof(char*));
|
||||
uint guesses = 0;
|
||||
|
||||
while(1) {
|
||||
|
||||
guesstab = realloc(guesstab, sizeof(char*) * ++guesses);
|
||||
guesstab[guesses - 1] = malloc(sizeof(char) * 51);
|
||||
uint guessz = 50, guessl = 0;
|
||||
|
||||
clrscr();
|
||||
for(uint s = 0; s < guesses-1; s++) rg(word, guesstab[s], l);
|
||||
printf("abcdefghijklmnopqrstuvwxyz");
|
||||
printf("\033[%u;%uH", guesses, 1);
|
||||
|
||||
rd:
|
||||
int in = 0;
|
||||
while(1) {
|
||||
unsigned char c;
|
||||
do { c = getchar(); } while(c == 255);
|
||||
if(c == 'e') {
|
||||
break;
|
||||
} else {
|
||||
if(c == '\x1b') {
|
||||
c = getchar();
|
||||
if(c == '[') {
|
||||
c = getchar();
|
||||
switch(c) {
|
||||
case 'B':
|
||||
if(guessl == 0) break;
|
||||
printf("\033[%u;%uH", guesses + 1, 1);
|
||||
for(uint i = 0; i < strlen(guesstab[guesses - 1]); i++) putchar(' ');
|
||||
guesstab[guesses - 1][--guessl] = 0;
|
||||
printf("\033[%u;%uH%s", guesses+1, 1, guesstab[guesses - 1]);
|
||||
printf("\033[%u;%uH", guesses, in+1);
|
||||
break;
|
||||
case 'D':
|
||||
if(!in) in = 26;
|
||||
in = (in - 1) % 26;
|
||||
break;
|
||||
case 'C':
|
||||
in = (in + 1) % 26;
|
||||
break;
|
||||
}
|
||||
printf("\033[%u;%uH", guesses, in+1);
|
||||
}
|
||||
} else if(c == ' ') {
|
||||
if(guessl == guessz) guesstab[guesses - 1] = realloc(guesstab[guesses - 1], guessz += 50);
|
||||
guesstab[guesses - 1][guessl++] = in + 'a';
|
||||
guesstab[guesses - 1][guessl] = 0;
|
||||
printf("\033[%u;%uH%s", guesses+1, 1, guesstab[guesses - 1]);
|
||||
printf("\033[%u;%uH", guesses, in+1);
|
||||
} else if(c == 'q') goto end;
|
||||
}
|
||||
}
|
||||
|
||||
// printf("WORD == %s\n", word);
|
||||
// printf("GUESS == %s\n", guesstab[guesses - 1]);
|
||||
int8_t* res = worle(word, guesstab[guesses - 1]);
|
||||
if(!res) {
|
||||
printf("\033[%u;%uH", guesses + 2, 1);
|
||||
printf("wrong number of characters?\n");
|
||||
printf("\033[%u;%uH", guesses + 1, 1);
|
||||
for(uint i = 0; i < strlen(guesstab[guesses - 1]); i++) putchar(' ');
|
||||
printf("\033[%u;%uH", guesses, 1);
|
||||
guessl = 0;
|
||||
goto rd;
|
||||
}
|
||||
else {
|
||||
if(wsuccess(res, l)) break;
|
||||
free(res);
|
||||
}
|
||||
}
|
||||
|
||||
win = 1;
|
||||
end:
|
||||
tcsetattr(0, TCSANOW, &tsave);
|
||||
clrscr();
|
||||
if(win) printf("success! (%s)\n", word);
|
||||
for(uint s = 0; s < guesses; s++) {
|
||||
if(win) rgw(word, guesstab[s], l);
|
||||
free(guesstab[s]);
|
||||
}
|
||||
free(guesstab);
|
||||
|
||||
}
|
Loading…
Reference in New Issue