Sjrsmile
Sjrsmile

Reputation: 253

C# check given word to answer word

I'm making a simple spell checker for C#, I want to try and compare a given answer to the randomly chosen word.

I want to compare the first letter to all the letters given in the answer so I can tell if it's correct, it's there was a swap of letters, a deletion or an added letter. I would ultimately like to be able to tell if only one letter was wrong to see a substitution was used.

For example, correct answer hello:

    checking first letter ~H 
    h e l l o
    1 0 0 0 0

    h h e l l o
    1 1 0 0 0 0

    e l l o 
    0 0 0 0

Then go through it for the second letter.

I've absolutely no idea when it comes to C#.

I've tried

int CheckErrors(string Answer, string Guess)
        {
            if (Answer == Guess)
            {
                return 1;
            }

            if (Answer == null || Guess == null)
            {
                return -1;
            }

            for (int i = 0; i <= Answer.Length; i++)
            {

                if (Guess[i] != Answer[i])
                {
                    count++;

                    //substitution = -4
                    //deletion = -5
                    //transposition = -6
                    //insertion = -7
                }
                return count;
            }
            return -9;
        }

but I just can't get any further.

UPDATE:

with further research I guess what I was trying to do is something like:

STRING answer = answer_given
STRING input = correct_answer

int check = 0;

FOR (int i = 0; i < input.Length; i++)
{
   FOR (int ii = 0; ii < answer.Length; ii++)
   {
     if (input[i] == answer[i])
     {
        int check++;
     }
   }
}

Obviously I know this would keep adding check up, but I can't guess what how else to do it.

ANOTHER UPDATE!

I can use this-

int CheckErrors(string Answer, string Guess)
        {
            int[,] d = new int[Answer.Length + 1, Guess.Length + 1];
            for (int i = 0; i <= Answer.Length; i++)
                d[i, 0] = i;
            for (int j = 0; j <= Guess.Length; j++)
                d[0, j] = j;
            for (int j = 1; j <= Guess.Length; j++)
                for (int i = 1; i <= Answer.Length; i++)
                    if (Answer[i - 1] == Guess[j - 1])
                        d[i, j] = d[i - 1, j - 1];  //no operation
                    else
                        d[i, j] = Math.Min(Math.Min(
                            d[i - 1, j] + 1,    //a deletion

                            d[i, j - 1] + 1),   //an insertion

                            d[i - 1, j - 1] + 1 //a substitution

                            );
            return d[Answer.Length, Guess.Length];
        }

But I need a way to do a count for the amount of times each error is used?

Upvotes: 1

Views: 776

Answers (3)

redtuna
redtuna

Reputation: 4600

You may get inspiration by looking at Approximate String Matching in Wikipedia and StackOverflow.

Upvotes: 1

Otaia
Otaia

Reputation: 451

Several issues with your function:

  • You're trying to use a single return value to handle multiple scenarios in which the meaning of that value is not consistent. It's not advisable for a function to be able to return both a state (match, one or both values null, no match, etc) and a counter.
  • If you're going to use numbers to represent return states, use enum to make it more readable.
  • Your for loop always terminates after one iteration because it hits the return statement every time. Your return statement needs to be moved after the for loop.
  • if (Guess[i] != Answer[i]) will throw an exception if i is greater than the length of Guess.
  • It's not clear what count is supposed to represent, and it's not defined in the function.

You need to better define what exactly is your function supposed to do. If answer is "Hello" and guess is "Hhello", what are you returning? The number of letters that don't match (1)? A code that represents what the error was (Insertion)? Where the error is located? If you need more than one of those things, then you need a separate function.

Upvotes: 1

Dave
Dave

Reputation: 740

Have you considered trying string.Compare(...)?

http://msdn.microsoft.com/en-us/library/zkcaxw5y.aspx

Upvotes: 0

Related Questions