Софтуерно Инженерство
Loading...
+ Нов въпрос
Yulia avatar Yulia 1343 Точки

[Homework] C# Basics - C# за напреднали

Виждам, че още няма тема за домашното "C# за напреднали",  затова нека започна аз.

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

 

Problem 1. Fibonacci Numbers
Problem 2. Prime Checker
Problem 3. Primes in Given Range
Problem 4. Difference between Dates
Problem 5. Sorting Numbers
Problem 6. Longest Area in Array
Problem 7. Matrix of Palindromes

 

//TODO
Problem 8. * Longest Non-Decreasing Subsequence
Problem 9. Remove Names
Problem 10. Join Lists
Problem 11. Count of Letters
Problem 12. Count of Names
Problem 13. Average Load Time Calculator
Problem 14. Longest Word in a Text
Problem 15. Extract URLs from Text
Problem 16. * Counting a Word in a Text
Problem 17. * Perimeter and Area of Polygon

 

В някои от задачите има коментари, на други тепърва ще добавя, както и самите решения. Започнах да пиша обяснения тук, но реших, че ще е по-добре да отговарям на въпроси и да подам инициативата за споделянето на вашите решения в тази тема.

georgimanov avatar georgimanov 107 Точки

Някой да помогне със задача 13 http://pastebin.com/ht1FpzvU

Логиката ми е : матрица от листове, като във всеки ред информацията, която ми трябва е на позиция 2 и 3 съответно.

2 за лист от webSites и 3 за Load Time.

Само, че за първи път се сблъсквам с матрица от листове и нямам представа как да действам. Тука само налучквам.

0
HPetrov avatar HPetrov 822 Точки

По скоро матрица от стрингове като инпутите ги сплитваш и слагат в матрицата. После си играеш с данните на индексите 2 и 3 както си решил вече ;)

1
HPetrov avatar HPetrov 822 Точки

На края като правиш проверки дали тоя сайт е == на сайта от другата колекция и ги брой и делиш после грешката ти е, че сравняваш елементи от 1 и съща колекция. Демек вместо да сравняваш webSites[i] с webSites[j] трябва да сравняваш printWebSite[i] с webSites[j]. Просто си объркал малко проверката.

П.С. Ще те посъветвам като постваш решения на нови задачи да си редактираш просто стария пост и всичко в него да трупаш като линкове за да не става спам ;)

2
georgimanov avatar georgimanov 107 Точки

Корекцията я направих, но резултатът е все така грешен. Ползвах и Excel. Средното време за зареждане на google трябва да дава като изход: 4.4744375

Fixed :)... пак бях пропъснал нещо.

0
Fleshian avatar Fleshian 378 Точки

Интересно решение, да сложиш най-дългата дума на последно място в масива. 
Ето го моето.решение в което просто проверявам дали думата е по дълга от предишната най-дълга дума.
http://pastebin.com/ysDuJtZg

0
bgatev avatar bgatev 1 Точки

Имам един въпрос - ако може някой да сподели как се намира периметър на полигон. Знам как се намира разстояние между две точки и че периметъра е сбора на всички страни, но как точно да определим кои са страните на полигона.

Нека имаме 10 точки - как да определим страна 1 от кои точки се формира, страна 2 и т.н.

Моля без философски отговори, а само такива с конкретни алгоритми или код

0
HPetrov avatar HPetrov 822 Точки

Дължината на страна се намира като корен квадратен от разликата между 1вата и 2рата точка по X и 1вата и 2рата точка по Y. Нещо такова беше ако не се лъжа. За по-точна формула провери последното демо от лекцията за класове. Мисля, че я имаше под формата на метод.

0
nikola.m.nikolov avatar nikola.m.nikolov 832 Точки

Преди малко реших 6-та задача от домашното, но ми е интересно дали има някое по-лесно и елегантно решение?

06. LongestAreaInArray

2
a_banderov avatar a_banderov 19 Точки

Полезни примери за LINQ :

http://code.msdn.microsoft.com/101-linq-samples-3fb9811b

Пускам линка, понеже си мисля, че повечето от задачите са с идеята да ги упражнявамe.

Освен това, хубав сайт, в който може да се упражняват REGEX конструкции.

http://www.regexr.com

 

5
Kaloyan777 avatar Kaloyan777 17 Точки
Eдно решенийце от мен. 14. Write a program to find the longest word in a text. http://pastebin.com/X6kiPB2Z
0
nikola.m.nikolov avatar nikola.m.nikolov 832 Точки

Реших задача 8 и се получи доста кратка, но може би малко трудна за разчитане на кода ми... Идеята ми е за всяко от числата на входа да проверява всички числа в дясно, които са по-големи, без да търся ненамаляваща поредица. Създавам List, в който поставям първото число от входа. По време на проверката всяко по-голямо число от първото на входа го добавям в същия този List.  Когато намеря всички по-големи числа изчислявам възможните комбинации между числата чрез формулата 2^n - 1. При 5 числа в List-a то възможните комбинации са 31 и съответна започвам от числото 31 до 1. Проверявам за това число кои битове са 1 и взимам числата от List-a със същите индекси. Така при 31 (11111) взимам и 5-те числа и ако е изпълнено условието за ненамаляваща поредица и в същото време това е най-дългата досега намерена поредица, то тази поредица я присвоявам като най-дългата. За всички останали числа от входа правя аналогични проверки. 

Логиката за проверка на битовете естествено е от форума, за което благодаря на колегите. Програмата ми започва да работи бавно, когато има над 20 числа на входа. Вие имале ли такъв проблем с големи поредици?

Ето ги всичките ми задачи от това домашно:

01. FibonacciNumbers

02. PrimeChecker

03. PrimesInGivenRange

04. DifferenceBetweenDates

05. SortingNumbers

06. LongestAreaInArray

07. MatrixOfPalindromes

08. LongestNonDecreasingSubsequence

09. RemoveNames

10. JoinLists

11. CountLetters

12. CountNames

13. AverageLoadTimeCalculator

14. LongestWordInAText

15. Extract URLsFromText

16. CountingAWordInAText

17. PerimeterAreaOfPolygon

3
VenelinGrozev avatar VenelinGrozev 130 Точки

Осма задача ми отне сумарно 2-3 пъти повече време отколкото цялото домашно (дали не беше и повече даже) главно заради това, че се опитвах да изкопирам готови алгоритми от нета. Да не говорим, че и 3 от 4 отговори в домашното са грешни, което допълнително подвежда. Накрая я реших по бабешката, копирайки стъпките от сценарий, който разиграх в ексел.

Това, което си направил честно казано не го разбрах с тези битове. Моята логика беше следната - имаме следният низ

-> 1 0 3 1 6 5 4 -3 8 9 7 5.

Правим List, който съдържа List<int>. В тези List<int> държим отделни поднизове, които удовлетворяват условието за ненамаляваща редица. Ето за илюстрация по-долу:

Започваме с List<int> { 1 }; - това е първият елемент.

1

--

1

0 // следващият елемент е 0. Тъй като е по-малък от единственият съществуващ елемент до момента го слагаме в нов List<int>

--

1

0

1 3 // следващият елемент е 3. Тъй като е по-голям от 0 и 1 клонираме List<int> { 1 } и List<int> { 0 } и добавяме към тях 3.

0 3 // получаваме два нови List<int> { 1 3 } и List<int> { 0 3 }

--

1

1 1 // следващият елемент е 1. Клонираме всички List<int>, където последният елемент е по-малък или равен от 1.

0

0 1

1 3

0 3

..... и така до обхождане на цялата редица. Накрая получаваме няколко най-големи подниза (в конкретният пример с дължина 5) съдържащи ненамаляващи редици. Проверяваме кой е първият най-голям - той е the leftmost според условието.

Така в края на задачата имаме 144 (!) :) листа и няколко най-големи:

1 3 6 8 9, 0 3 6 8 9, 1 1 6 8 9 и т.н.

Готовите алгоритми, които гледах са в http://www.geeksforgeeks.org/longest-monotonically-increasing-subsequence-size-n-log-n/ и книгата на Наков/Добриков но за съжаление те не отчитат варианта че може да има няколко подредици и да се вземе най-лявата от тях (както е всъщност в условието). Мисля, че и Patience Sorting-а решава същата задача но не ми остана време да се задълбая.

Ето решението ми - http://pastebin.com/PGvWWHjR

 

 

0
nikola.m.nikolov avatar nikola.m.nikolov 832 Точки

Не е вярно. Всичките output-и в задачата трябва да са с малки букви. Нямам представа защо си мислиш, че на изхода се очаква Aaa, но си се объркал.

0
nikola.m.nikolov avatar nikola.m.nikolov 832 Точки

Не е вярно. Всичките output-и в задачата трябва да са с малки букви. Нямам представа защо си мислиш, че на изхода се очаква Aaa, но си се объркал.

0
galants avatar galants 12 Точки

Здравейте,

 

Прегледах цялата тема, за да видя как сте решили 12 задача и установих, че никой не е използвал Linq!

Ето и моето решение. https://github.com/galants/CSharp/tree/master/AdvancedTopics/12.CountOfNames

Някой дали знае този вариант е добър ли е или трябва да се използва for if конструкции?

Каква е разликата в скоростта и размера на използваната памет?

 

Благодаря предварително.

0
nikola.m.nikolov avatar nikola.m.nikolov 832 Точки

Колега, не си прегледал явно всички решения. Аз лично съм използвал Linq и може да видиш репението в предния коментар :)

0
galants avatar galants 12 Точки
Да прав си, но в твоето решение ти използваш "method syntax", а аз използвам "query syntax". Може би това е причината да съм пропуснал факта, че и ти използваш Linq. Както и да е. Имаш ли представа, проверявал ли си дали това е по удачния вариант от гледна точка на време и памет? Иначе в твоето решение ми харесва коментара(също и начина на решение). Тъй е не е необходимо да отварям файла със задачите и да проверявам условието. И аз мислех така да го правя но видях, че никой друг не го прави и реших да не пиша и аз.
0
wolfylambova avatar wolfylambova 4 Точки

Здравейте, написах код за задача3, който смятам, че трябваше да работи, но имам проблем.
Ако някой може да помогне и да ми каже къде бъркам.... и защо не върви.


class PrimesRange
{
static List<int> FindPrimesInRange(int startN, int endN)
{
List<int> numbers = new List<int>();

for (int i = startN; i <= endN; i++)
{
foreach (int number in numbers)
{
int factor = number / 2;
bool prime = true;

if (number / factor == 0)
{
prime = true;
}
else if (number == 0 || number == 1)
{
prime = false;
}
else
prime = false;

if (prime)
{

numbers.Add(i);
}
}
}
return numbers;
}

static void Main()
{
int startN = int.Parse(Console.ReadLine());
int endN = int.Parse(Console.ReadLine());

if (startN > endN)
{
Console.WriteLine("Wrong input list");
}
else
{
List<int> primes = FindPrimesInRange(startN, endN);

for (int i = 0; i < primes.Count; i++)
{
if (i < primes.Count - 1)
{
Console.Write(primes[i] + ", ");
}
else
{
Console.WriteLine(primes[i]);
}
}
}
}

}

0
Filkolev avatar Filkolev 4501 Точки

Този foreach цикъл не е наред. В предишно домашно имаше задача да се провери дали дадено число е просто, вземи си от там логиката. Ако имаш нужда от още помощ казвай.

Ползвай също сайтове, за да пускаш код във форума. Обърни внимание на правило 12 от правилата, там са дадени и подходящи инструменти.

1
petiahr avatar petiahr 31 Точки

Имам малко запитване относно зад.14 Longest Word in a Text.

Някой може ли да ми каже как да определя една последователност от символи дали е дума или не.

Първо смятах, че всеки стринг между два интервала е дума, но така се хващат и знаците, които са след думата като '.', ';', '?'. После реших, да пробвам като премахна от въведения стринг някои знаци като ',', ';', ' ', '-', '.' . Но тук възниква въпроса non-negative една дума ли или са две отделни думи non и negative. В този контекст един емайл адрес във формат firstname.lastname@yahoo.com как се приема като една дума или четири отделни думи firstname, lastname, yahoo, com?

Благодаря ви предварително за отговорите.

0
Filkolev avatar Filkolev 4501 Точки

Обикновено при задача за обработване на текст най-ефективният подход е да се ползват регулярни изрази. Препоръчвам ти да разгледаш за какво става въпрос. В общи линии регулярните изрази описват някакъв текст; чрез тях може да провериш дали в даден стринг се съдържа нещо конкретно, например телефонен номер в определен формат.

В страницата на този курс има лекция и уъркшоп за регекс. Тук може да намериш един от по-добрите онлайн туториали.

За да ползваш регекс обаче трябва да знаеш много добре какво точно искаш да намериш, т.е. ясно трябва да е дефинирано какво например се счита за дума. Задачата става по-сложна ако условието оставя място за интерпретации.

1
i.alidzhikov avatar i.alidzhikov 63 Точки

Също така от този линк може да прочетеш още по темата и да си свалиш Expresso, който ще ти помогне изключително много при работа с регулярни изрази. Общо взето с помощта на тази програма може да си тестваш регулярните изрази върху текст, избран от теб самия, и то ти казва дали открива съвпадения на твоя израз в текста. 

2