Професионална програма
Loading...
KatyaMarincheva avatar KatyaMarincheva 572 Точки

[Useful Info] whitespace - какво представлява; сплитване по whitespace в изпитните задачи

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

поради зачестилото използване на понятието whitespace в изпитните задачи по Programming Basics, и недоразуменията по въпроса как точно трябва да се разбира това понятие, искам да посоча малко справочна информация по въпроса:

Първо MSDN: C# Language Specification 2. Lexical structure 2.3 Lexical analysis 2.3.2 White space

"White space is defined as any character with Unicode class Zs (which includes the space character) as well as the horizontal tab character, the vertical tab character, and the form feed character. " - общо 20 различни символа.

Въпрос: Whitespace означава ли ' ' (т.е. space)?

Отговор: Не: space е whitespace, но whitespace не е space. Освен space ' ', whitespace включва още 19 различни символа, 16 от които са други видове space:

http://www.fileformat.info/info/unicode/category/Zs/list.htm

плюс още tab '\t', new line '\n' (само за Windows users), form feed '\f'.

Въпрос: Ако сплитваме string по space (' '), това значи ли, че го спливаме по whitespace?

Отговор: Не. Означава че сплитваме само по един от 20-те вида whitespace characters. В част от тестовете в judge това ще мине;

или, в частен случай, ако в условието на задачата пише whitespace, но в тестовете в judge е включен от всичките 20 вида separators само space ' ', то тогава такова спливане по space, по изключение, ще мине.

Въпрос: Можем ли да опитаме да налучкаме какви whitespace characters има в тестовете в judge?

Отговор: Може да мине, това например минава на задачата 04. Olympics Are Coming от Advanced C# Exam 31 May 2015, защото по логика няма вероятност някой да си е играл да сложи повече от 2-3 вида whitespace characters в тестовете в judge.

line[0].Split(new[] {' ', '\n', '\t'}, StringSplitOptions.RemoveEmptyEntries);

но има по-лесни начини - съществуват решения, които са по-прости и по-универсални, ето две:

1.

line[0].Split(new char[0], StringSplitOptions.RemoveEmptyEntries); това не налучква използваните whitespaces, а ги замества всичките:

"If the separator parameter is null or contains no characters, white-space characters are assumed to be the delimiters."

Справка тука: http://stackoverflow.com/questions/6111298/best-way-to-specify-whitespace-in-a-string-split-operation

2. "Of course, if you don't like using options, just use the regex alternative"

Regex.Split(line[0], @"\s+");

Това му е хубавото на програмирането, че винаги съществува повече от едно решение.

Поздрави,

Катя

7
Programming Basics
PavelManahilov avatar PavelManahilov 216 Точки

Много полезно мерси за което! Тествах  StringSplitOptions.RemoveEmptyEntries и действа много добре, имам само един въпрос относно Regex.Split(line[0], @"\s+");

Когато стринга който съм въвел започва със спейс или с таб не ми се получават нещо нещата, първият елемент отново ми е спейс. Някаква идея как да "разкарам" и първият whitespace.

1
KatyaMarincheva avatar KatyaMarincheva 572 Точки

Здравей, Павел,

да, прав си - има вариант за отстраняване на empty entries и с regex, ето един:

string[] nameInput = Regex.Split(line[0], @"\s+").Where(s => s != string.Empty).ToArray();

ако е само в началото или края - може също:

            string[] nameInput = Regex.Split(line[1], @"\s+");
            var name = string.Join(" ", nameInput).Trim();

но няма как да си сигурен, че само в началото и края ще имаш empty entries, така че първият вариант си е по-добър.

0
Filkolev avatar Filkolev 4486 Точки

Regex.Split(line[0].Trim(), @"\s+");

1
13/09/2015 20:20:45
PavelManahilov avatar PavelManahilov 216 Точки

Тъкмо четох за Regex.Replace , а то Trim()  го прави доста по-елегантно. Благодаря Ви!

0