[C#] Домашно Strings and Text Processing - 13 задача


10

Условие: Write a program that reverses the words in given sentence. Example:

C# is not C++, not PHP and not Delphi!
Delphi not and PHP, not C++ not is C#!

Решениеsource.

Обяснение: Първо четем думите и ги вкарваме в стек (Regex.Split()). След това четем препинателните знаци, заедно с интервалите (Regex.Match()) и махаме дума от стека. Ето и решение с масиви.

По този начин запазваме местата на препинателните знаци (дори и броя на интервалите) и се обръщат само думите.




Отговори



7

Решение:

http://pastebin.com/Wr6WUgdr

Обяснение:

Разделям string-a по препинателните знаци м/у думите, за да получа само думите от текста. След това, разделям по буквите, за да получа препинателните знаци.

Накрая пускам for цикъл и с StringBuilder-a долепям от един и същи индекс първо от масива с думите след това от масива с препинателните знаци.

ВЪПРОС:

Ако някой знае, как мога да не пиша цялата азбука два пъти и т.н. нящо по кратко. Аз се опитвах многократно и с какво ли не да му задам един вид старт индекс на чара например 65 до 90 са главните букви. И така по диапазони да си задавам.

Чакам коментари и мнения от по компетентните, но ще помоля отговора да като за начинаещ :) без LINQ, регулярни изрази, краен автомат.

EDIT 1:

Ето и по елегантното решение след препоръкара на jasssonpet

http://pastebin.com/Dypjg2KH

EDIT 2:

По препоръка на Svgn_H, защото имаше гадости като PHP++

EDIT 3: По препоръка на Diana_Gospodinova, може да видите и този вариант:

Отпадат следните редове:
List<char> listLetters = new List<char>();

            for (char i = 'a'; i <= 'z'; i++) listLetters.Add(i);
            for (char i = 'A'; i <= 'Z'; i++) listLetters.Add(i);
            for (char i = '0'; i <= '9'; i++) listLetters.Add(i);

            listLetters.Add('@'); listLetters.Add('#'); listLetters.Add('$');
            listLetters.Add('%'); listLetters.Add('&'); listLetters.Add('&');
            listLetters.Add('*'); listLetters.Add('+'); listLetters.Add('-');
            listLetters.Add('^'); listLetters.Add('~');
И променяме ред:
string[] signs = quote.Split(strWords, StringSplitOptions.RemoveEmptyEntries);
Заменяме listLetters.ToArray() с strWords.

 


от Assi.NET (3050 точки)


0
Ето с цикли: for (char i = 'a'; i <= 'z'; i++) Console.Write(i); for (char i = 'A'; i <= 'Z'; i++) Console.Write(i);

от jasssonpet (6814 точки)

0
Това го схванах и е много яко, само че вече не мога да мисля кажи къде EXACTLY да го сложа :D

от Assi.NET (3050 точки)



3

Разделям текста на думите и на символите, които са между тях.

Думите ги разделям, като използвам char масив, в който изброявам по кои символи искам да отделя думите.

Символите, които разделят думите ги взимам чрез регулярен израз, който означава всички големи, всички малки букви, цифри или + или # [A-Za-Z0-9#+].

След като получих разделителите чрез регулярния израз, голям проблем беше, че получих и множество празни стрингове, като ги премахвам като си правя List и добавям в него само интервали, удивителни и запетаи.

След това във for цикъл печатам съответната дума и символ.

http://pastebin.com/dkcj3KnT




3
@jassonpet
Благодаря, че споделяш!



0

Решение с прочитане с foreach на текста, с листове и използване на функциите за char - isLetterOrDigit, isSeparator, IsSymbol, isPunctuation, isWhitheSpace.

http://pastebin.com/mmP9dFsr


от sylviapsh (302 точки)


0

Ето и от мен едно решение което се получи сравнително семпло.

http://pastebin.com/AFxdfUVe

ползвам regex, един list и един цикъл.

с regex запомням думите в един MatchCollection
после пак с regex взимам всички симовли.
после пъхам думите отзад напред в един лист
когато дължината на join-атите стрингове от листа е равна или по-голяма от бившата позицията на символа тогава добава и символа.


от m4r71n (0 точки)


0

Аз имам следния върпос:

В примера към задачата е дадено:

C# is not C++, not PHP and not Delphi!
Delphi not and PHP, not C++ not is C#!

не требва ли отговора да е:

Delphi not and PHP not ,C++ not is C#!

Запетайката в оригиналния стринг е между "C++, not", в решението е между "PHP, not". И пак в този ред на мисли, запетайка следвана от интервал как се обръща (", " -> " ," или си остава ", ")?




0
Щом така е даден отговорът, значи искат препинателните знаци да останат по местата си и само думите да се разменят. Иначе трябваше и да започва с "!".

от jasssonpet (6814 точки)

0
OK, благодаря :)



0

jasssonpet, много хубави решения с регулярни изрази! Второто решение с List<> сякаш работи по-добре. Естествено може да се запази резултатния стринг преди да го отпечатаме на конзолата, и в шаблона за регулярния израз да добавим повече препинателни знаци. Лошото е , че дава грешен резултат, ако в началото на текста има интервал/интервали, наистина рядко срещан случай, но знае ли човек... 

А пък първото решение което даваш, хвърля ексепшън ако накрая имаме препинателен знак, нещо не си доогледал стринга , с който си тествал ;)


от pdrenovska (2196 точки)


0
Благодаря за забележката, ще го оправя след изпитите.

от jasssonpet (6814 точки)


1
http://pastebin.com/b8WdbJrU ....Направих го само с масиви.Решението е кратко, но ми се наложи да въвеждам препинателните знаци ръчно като предварително трявва да знам къде седят .Запетаята е сложих преди Ц++ защото мисля ,че в презентацията има грешка:)

от borro (15 точки)


0

Гледам че няма такова решение та да пусна и аз нещо. Без Реголярни Изрази, просто два масива единя само думи другия с думи и знаци, този с думите го обръщам и взиам от него думите в обърнатият ред и ги заместван в другият като   прескачам знаците(, . ! ?). Пропуска само случаи когато знака е преди думата и е залепен за нея => ,дума, не е болка за умиране тъи или иначе е правописна грешка ;).


от ybachev (144 точки)


1

Идеята ми за решението е същата като на ybache, но с по-малко код:

решение + обяснение

Трябва да се отбележи, че ако изречението се сплитва само по знаците, а не по знак+интервал, то датата, например, ще се раздели на отделни думи по точките.


от didi.zlatkova (100 точки)


0
Колежке, никой не е казал че дата, зададена в какъвто и да е формат е дума ;) Иначе много хубав блог :)

от loloto (1073 точки)