Avatar billede shako Novice
03. december 2011 - 11:24 Der er 4 kommentarer og
1 løsning

Hjælp til wordsolver

Uden at være ligge vægt på et programmeringssprog hvad er hemmeligheden bag en word solver?

Jeg skal have udviklet et program hvor man sender et input i form af bogstaver, og den så danner alle de ord der kan laves ud at de bogstaver ud fra en dictionary (txt fil eller database) (har allerede fundet en dictionary)


Af hensyn til min udvikling inden for programmering vil jeg gerne have lidt hjælp og vejledning i stedet for at nogen laver det til mig.

Så hvad er hemmeligheden? Jeg skriver C#, C++, Python, Java etc...
Avatar billede claes57 Ekspert
03. december 2011 - 12:39 #1
det skal nok være en database - jeg ville lave en række opslag
hvis du har fx 'aerb'
så start loop ved at slå op på første tegn
select * where ord like 'a*'
hvis der er hit, så kør loop, hvor du tjekker på 2. tegn
select * where ord like 'ae*'
select * where ord like 'ar*'
select * where ord like 'ab*'
hvor der er hit (fx ab) kører du loop med 3. tegn
select * where ord like 'abr*'
select * where ord like 'abe*'
hvor der er hit (fx abe) kører du loop med 4. tegn
select * where ord like 'aber'
og tæller op hvis hit.
Avatar billede Qobra Nybegynder
03. december 2011 - 15:20 #2
Jeg har selv lavet et lignende program, så jeg kan snyde i Whirley Words på min iPhone. Hemmeligheden er at den sorterer alle input bogstaverne, og den sorterer alle ordene  i ordlisten. Derefter er det let at checke om et ord fra ordlisten er et subset af bogstaverne.

Herunder er C koden jeg lavede. Den er lavet meget hurtigt, og det er sikkert meget grimt, men det virker da ;-)


#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int comparec ( const void * a, const void * b ) {
  return strcmp( (char *)a, (char *)b );
}
int compares ( const void * a, const void * b ) {
  char * c = *(char **)a;
  char * d = *(char **)b;
  int cl = strlen(c);
  int dl = strlen(d);
  return cl == dl ? strcmp( c, d ) : cl-dl ;
}

int main(int argc, char ** argv) {

  if (argc != 4) {
    printf("Usage %s: %s letters minlength /usr/share/dict/danish\n", argv[0], argv[0]);
    return 0;
  }

  char * letters = argv[1]; //"suwalr"; // letters
  int minword = atoi(argv[2]); // min word length

  int i, j;
  int llen = strlen(letters);
  for (i = 0; i < llen; ++i) if (letters[i] > 'Z' && letters[i] <= 'z') letters[i] -= 'a'-'A';
  qsort(letters, llen, 1, comparec);

  printf ("Letters: %s\n", letters);

  char * words = malloc(sizeof(char)*10000000);
  FILE * fp = fopen(argv[3], "r"); // american-english
  fread(words, 1, 10000000, fp);
  if (!feof(fp)) puts("Buffer too small, more to read.");
  fclose(fp);

  char * results[100000];
  int nresults = 0;

  char word[100];
  char * pch = strtok(words, "\n");
  while (pch != NULL) {
    int wlen = strlen(pch);
    if (wlen >= minword) {
      for (i = 0; i < wlen; ++i) if (pch[i] > 'Z' && pch[i] <= 'z') pch[i] += 'A'-'a';
      memcpy(word, pch, wlen);
      qsort(word, wlen, 1, comparec);
      for (i = 0, j = 0; j < wlen && i < llen; ++i) if (word[j] == letters[i]) j++;
      if (j == wlen) results[nresults++] = pch;
    }
    pch = strtok (NULL, "\n");
  }

  qsort(results, nresults, sizeof(char *), compares);

  for (i = 0; i < nresults; ++i) puts(results[i]);

  return 0;
}
Avatar billede Druesukker Nybegynder
04. december 2011 - 02:48 #3
Det kan være at det her slet ikke er effektivt nok, eller at det simpelthen er for svært at implementere.

Men måske er det en god ide at gemme summen af bogstaverne i din dictionary og samtidig sortere din dictionary efter denne sum.

I starten af din dictionary (eller et andet sted) kan du have alle de forskellige summer gemt i en sorteret liste så du kan lave en binær søgning på denne liste.

Når du har fundet den rigtige sum i listen kan du fx have en pointer som fører dig til det rigtige sted i din dictionary.

Her har du fået det hele indskrænket en del og kan begynde at søge efter ord der har de samme bogstaver som dit input.
Avatar billede shako Novice
03. oktober 2012 - 12:21 #4
Qobra læg et svar hvis du vil ha point
Avatar billede Qobra Nybegynder
04. oktober 2012 - 07:47 #5
Håber det kunne bruges.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester