2

そのアルゴリズム/疑似コードの助けをいただければ幸いです。

基本的に、特定のパターンの単語を探しています (何でも構いません)。私はそれを決定するための特別な関数を持っています。単語が要件を満たしている場合、1 を返します。その場合、その後の 2 番目の単語は省略し、出力に保存しないでください。「選択された」単語が「選択されていない」単語で区切られている場合、問題はありませんでした。問題は、「選ばれた」ものが次々と現れたらどうするかということです。

状況を少し明確にするために、このような疑似コードを用意しました。しかし、残念ながら、「選ばれた」と「選ばれなかった」のすべての組み合わせで機能するわけではありません。

3 つのカウンター/変数を導入して、現在の位置を発見できるようにしました。

次の擬似コードは論理的な順序ではありません!

if (counter == 2 || in_a_row >= 3) {
    erase = 1;
    counter--;
    yes = 0;
    if (!chosen) 
        counter = 0;
}
if (chosen) {
    counter++;
    yes = 1;
    in_a_row++;
} else {
    if (yes = 1) /* yes - is used when the preceeding word is chosen and the next is not chosen, in order to keep track of the counter */
        counter++;
}
if (in_a_row == 5)
    in_a_row = 4; /* just to make sure that counter doesn't go too high */
if (erase == 1)
    /*erasing procedure*/

もっと簡単なアイデアがある場合、またはそのアイデアに誤りがある場合は、助けてください。8時間頑張って…

4

4 に答える 4

1

正規表現の古典的な使い方のように思えます。言語を指定しませんが、多くの言語が RegEx をサポートしています。

次のサイトは、正規表現に慣れていない場合に適した出発点/リファレンスです。http://www.regular-expressions.info/quickstart.html

3 つの部分からなる式を使用します。以下の構文はメモリからのものであるため、再確認する必要があります。

  • (first)- 「最初」という単語に一致
  • [\w]*{1,3}- たとえば 1 ~ 3 回繰り返される任意の単語 -
  • (second)- 「second」という単語に一致
于 2012-08-25T18:32:00.260 に答える
1

疑似コードを使用していないことをお許しください。代わりに、実際のコードを使用しました。問題がそれほど複雑ではないように見えるという私の信念が正確であるように、問題を十分に理解していることを願っています。

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


# define BUFF_SIZE       1024
# define WORD_DELIM     " "
# define MATCH_PATT     "barf"


int main(  int ac ,  char *av[]  )
{
    __u_char    false = ( 1 == 0 ) ;
    __u_char    true = ( 1 == 1 ) ;

    __u_char    match_1_back = false ;
    __u_char    match_2_back = false ;

    char        line_buff[  BUFF_SIZE  ] ;
    char        *buff_ptr ;
    char        *word_ptr ;


    while (  fgets( line_buff ,  BUFF_SIZE ,  stdin )  )
    {
        puts(  "\nInput line was:  "  ) ;
        puts(  line_buff  )  ;

        puts(  "Output line is:  "  ) ;

        buff_ptr = line_buff ;

        while (  ( word_ptr = strtok( buff_ptr ,  WORD_DELIM )  )  !=  NULL  )
        {
            buff_ptr = NULL ;

            if (  strcmp( word_ptr ,  MATCH_PATT  )  ==  0  )
            {
                // Set these to what they should be for next iteration.
                match_2_back = match_1_back ;
                match_1_back = true ;

                // Don't output matched token.
            }
            else
            {
                // Don't output token if a token matched 2 tokens back.
                if (  ! match_2_back  )
                    printf(  "%s " ,  word_ptr  ) ;

                // Set these to what they should be for next iteration.
                match_2_back = match_1_back ;
                match_1_back = false ;
            }
        }

        printf(  "\n"  ) ;
    }
}

この入力で:

barf   barf  barf   healthy     feeling     better   barf  barf barf uh oh sick again
barf   barf  healthy     feeling     better   barf  barf uh oh sick again
barf   healthy     barf   feeling     better     barf   uh   barf   oh sick again
barf   healthy     feeling     better   barf uh oh sick again

私はこの出力を得ました:

Input line was:  
barf   barf  barf   healthy     feeling     better   barf  barf barf uh oh sick again

Output line is:  
better sick again


Input line was:  
barf   barf  healthy     feeling     better   barf  barf uh oh sick again

Output line is:  
better sick again


Input line was:  
barf   healthy     barf   feeling     better     barf   uh   barf   oh sick again

Output line is:  
healthy feeling uh oh again


Input line was:  
barf   healthy     feeling     better   barf uh oh sick again

Output line is:  
healthy better uh sick again

実際の正規表現ではなく、単純な比較を使用しました。アルゴリズムを説明したかっただけです。出力は要件に準拠していますか?

于 2012-08-25T19:54:42.350 に答える
0

このようなもの?

for (i = 0; i<wordcount; i++)
{
    CurrentWord = Words[i]
    if (WordMatchesCritera(CurrentWord))
    {
        if (HavePrecedingWord)
        { 
             success !!!
        } 
        else
        {
            i ++;
            HavePrecedingWord = true
        }
    }
    else
    {
        HavePrecedingWord = false;
    }
}
于 2012-08-25T18:12:02.790 に答える
0

これはうまくいきますか?

    matchID = -1;
    eraseID = -1;


    for(i = 0; i < ... ; i++)
    {
         if( wordMatches ( word[i] ) )
         {                  
            matchID = i;     /* found the chosen one */
            eraseID = -1;         
         }
         else 
         {
            if( matchID != -1 ) /* chosen one was found ? */
            {
                 eraseID = i;   /* erase the next non-matching one */
                 break; /* ? done for now  ? */
            }

          }
    }
于 2012-08-25T19:35:56.647 に答える