[Programming Fundamentals] String, Dicts, LINQ - проблеми
Понеже решавам задачите напред искам да докладвам на екипа за няколко неточности със задачите напред.
В contest-a Strings, Dictionaries, Lambda and LINQ - Lab последната задача: Population Aggregation липсва в условията и реално не може да се реши без условие.
В contest-a Strings, Dictionaries, Lambda and LINQ - Exercises задача 04. Extract Sentences е вероятно да има сгрешени тестове, понеже никой от опиталите се не е успял да извади 100/100. Може и проблема да е в нас и да не съобразяваме някой краен случай, но ако може да я погледнете за всеки случай.
Също така още няма упражнения по темата: Objects and Classes - Exercises, има само Lab за момента.
Благодаря! :)
Аз първо направих списък от изреченията и после всеки елемент на списъка (тоест изречение) го разбих на масив от думите. Използвах Регекс и сплитнах по всички символи, които не са думи. Ако масива от думи от едно изречение съдържа ключовата дума - печатам изречението.
Ами аз в общи линии правя същото:
static void Main(string[] args)
{
string keyWord = Console.ReadLine();
//string check = "(" + keyWord;
string inputText = Console.ReadLine();
char[] sentenceSeparators = { '.', '!', '?' };
char[] wordSeparator = { ' ' };
Regex rgx = new Regex("[^a-zA-Z0-9 /+=&%@$[]'\"();:,-]");
string[] sentences = inputText.Split(sentenceSeparators, StringSplitOptions.RemoveEmptyEntries).ToArray();
for (int i = 0; i < sentences.Length; i++)
{
sentences[i] = rgx.Replace(sentences[i], " ");
string[] words = sentences[i].Split(wordSeparator, StringSplitOptions.RemoveEmptyEntries).ToArray();
if (words.Contains(keyWord))
Console.WriteLine(sentences[i].Trim());
}
}
Regex-а оригинално беше само [^a-zA-Z0-9 -]. В последствие започнах да добавям още символи, защото както текста съдържа числа, тирета и запетаи, така би могъл да има и кавички, скоби и прочие. Промените обаче нямаха ефект - продължавам да изкарвам 80/100. Явно проблемът не е в някой от изброените characters. Между другото, не виждам никъде да тримваш текста. Как избягваш 2-то, 3-то и т.н. изречения да се появяват с отстояние в output-a? Или Judge не го гледа това?
Ти променяш изреченията с този ред sentences[i] = rgx.Replace(sentences[i], " "); И после ги печаташ. Според мен е малко чудо че ти дава 80 от 100 след като променяш изреченията и ги печаташ променени.
Аз никъде не променям изреченията. Аз просто ги сплитвам и после ги печатам без да съм ги променял.
Закоментирах тези редове Regex rgx = new Regex("[^a-zA-Z0-9 /+=&%@$[]'\"();:,-]"); и sentences[i] = rgx.Replace(sentences[i], " "); Пак даде 80/100 - явно не вършат работа. Предполагам, че причината е, че променяш изреченията. Не съм много добър в regular expressions, но е възможно по този начин и да пропускаш някой символ, затова използвай по-простото var words = Regex.Split(sentences[i], @"\W+"). Така нищо не реплейсваш, а само сплитваш по "не-думи".
Иначе си прав - не тримвам текста и ако има повече интервали се появяват отместени. Явно Judge не проверява за това. Но си редактирах кода и вече тримвам, за да не ги отмества. Явно помага още някой да ти гледа кода. :)
Ами от условието не стана ясно дали изреченията трябва да се печатат в оригиналния им вид (с всякакви странни символи, използвани като разделители) или в "чистия" им вид. Като видях, че имам 80/100 и реших, че съм на прав път да печатам "изчистените" изречения.