wordle-clone-thing/main.c

192 lines
4.3 KiB
C
Raw Normal View History

2022-01-05 18:52:24 -08:00
#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;
}
2022-01-05 19:38:26 -08:00
int wsuccess(uint8_t* m, uint l) {
2022-01-05 18:52:24 -08:00
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;
}
2022-01-05 19:38:26 -08:00
uint8_t* worle(char* word, char* guess) {
2022-01-05 18:52:24 -08:00
uint wordlen = strlen(word);
if(strlen(guess) != wordlen) return NULL;
uint* lctab = gentab(word, wordlen);
2022-01-05 19:38:26 -08:00
uint8_t* ret = malloc(sizeof(int8_t) * wordlen);
2022-01-05 18:52:24 -08:00
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);
2022-01-05 19:38:26 -08:00
int in;
2022-01-05 18:52:24 -08:00
rd:
2022-01-05 19:38:26 -08:00
in = 0;
2022-01-05 18:52:24 -08:00
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]);
2022-01-05 19:38:26 -08:00
uint8_t* res = worle(word, guesstab[guesses - 1]);
2022-01-05 18:52:24 -08:00
if(!res) {
printf("\033[%u;%uH", guesses + 2, 1);
2022-01-05 19:30:41 -08:00
printf("wrong number of characters? (should be %u)\n", l);
2022-01-05 18:52:24 -08:00
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();
2022-01-05 19:38:26 -08:00
if(win) printf("success! ");
printf("word was %s\n", word);
2022-01-05 18:52:24 -08:00
for(uint s = 0; s < guesses; s++) {
2022-01-05 19:38:26 -08:00
rgw(word, guesstab[s], l);
2022-01-05 18:52:24 -08:00
free(guesstab[s]);
}
free(guesstab);
}