Професионална програма
Loading...
+ Нов въпрос
Iv_Konov avatar Iv_Konov 385 Точки

C# - Защо Съдията не харесва .Contains() при работа със стрингове - Emoji Sumator, Regex

Здравейте, колеги,

 

Имате ли идея защо Съдията не харесва .Contains() при работа със стрингове? Или къде греша при ползването?!?

 

Гледам, че String.Contains го има и в .NET Framework също, но не виждам друга причина освен подобен проблем с инсталацията на Съдията... VS 2017 ми работи коректно с този метод, или поне не намерих вход, с който да счупя разпознаването...


При дадената задача реших да проверя дали даден стринг примерно:
seven 
се съдържа в стрингова колекция примерно:
:england: :done: :seven: :hamster:

 

Тази идея ми дойде за решение, но Съдията дава грешка 90/100:
(разбира се, време ми отне, за да отгрия, че точно това не се харесва)

            if (string.Join("", matchCollection).Contains(emojiName))
            {
                totalPower *= 2;
            }


Реших задачата по алтернативен начин - 100/100:

            foreach (var match in matchCollection)
            {
                string tempMatch = match.ToString();
                string tempEmojiName = tempMatch.Remove(0, 1);
                tempEmojiName = tempEmojiName.Remove(tempEmojiName.Length - 1, 1);

                if (tempEmojiName == emojiName)
                {
                    totalPower *= 2;
                    break;
                }
            }

 

Мой код - линк.
Съдия - линк.
Условие на задачата - линк.

 

Поздрави,
Иван
 

Тагове:
0
Fundamentals Module
VasilKotsev avatar VasilKotsev 824 Точки
Best Answer

Проблема е, че конкатенираш съвпаденията (както са match-нати в регулярния израз със ':' в двата края) и после ги сравняваш без ':' в началото и края на даденото име при входа. При начина, който си я решил със 100 т., премахваш на всяка итерация символите в крайщата на низа (избягвай такива операции...) и после го сравняваш.

Няма как е да е проблем със Judge, единствената стратегия е Core и предполагам са я ъпдейтнали до 2.2, преди месеци съм проверявал и със сигурност беше 2.1. Така, че не става на въпрос за разлика в оврълоуди на методи при стария фреймуорк. Visual Studio-то също не е фактор, от значение е SDK-то, а не средата за разработка. Според мен проблема е в теста, явно автора е искал да се сетите за някакъв граничен случай или е сбъркан.

По-удачно ще е да си провериш със .Any() LINQ extension метода върху IEnumerable<Match> и да провериш дали Match.Value съвпада. Имай предвид, че string.Contains() по-дефоулт сравнява case-sensitive и culture-insensitive.

Ето поправен код с първото ти решение.

0
21/07/2019 22:29:59
Iv_Konov avatar Iv_Konov 385 Точки

Здравей,

 

Благодаря, поучителни са ти съветите!  Разибира се, и решението ти е добро.

 

Не разбирам съвсем - има ли последствия при употребата на string.Contains()  предвид, че е culture-insensitive? Ясно е, че точка, запетая и др. се различават в различните регионални настройки, но не разбирам как точно рефлектира при сравняването...

 

Допълнително, до колкото разбирам, няма чист/лесен вариант /без изрязване или добавяне на символи/ за стравняване/търсене на стрингове с други стригове? За char да се тъсят в стрингове има решения, но за да реша задачата по трудния и непрепоръчителен начин си беше по принуда... просто не знам как иначе. wink

 

Поздрави,

Иван 

0
VasilKotsev avatar VasilKotsev 824 Точки

string.Contains() е начина за търсене на substring-ове в други низове. И аз не успях да счупя входа (а и не си играх много), но без да видя теста не мога със сигурност да кажа какъв е проблема. Най-вероятно е нещо тъпо, но... Относно сравнението на низове в .Contains(), ще има значение ако очакват да ги сравняваш case-insensitive, което е малко вероятно според мен. Culture-а не би трябвало да играе фактор тук.

Лошото в твоя подход е, че правиш string.Join() върху колекция от Match-ове, вместо да провериш дали има елемент в нея, който да съвпада с входа, а не самото сравнение на низове, въпреки че и това е валиден подход за задачата.

1
Iv_Konov avatar Iv_Konov 385 Точки

Добро утро,

 

Благодаря, обогати ме с идеи за работа, т.е. вече съм готов да архивирам случая.

 

Успешен ден,

Иван :)

0