1. C# / Говнокод #13814

    +107

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    public class Visit 
    {
    	public DateTime Start {get; set;}
    	public DateTime Finish {get; set;}
    }
    
    public bool IsConflict(Visit a, Visit b)
    {
    	var s = GetArray(a);
    	var s2 = GetArray(b);
    	return Compare(s,s2);
    }
    
    private List<string> GetArray(Visit visit)
    {
    	var list = new List<string>();
    	while (visit.Start < visit.Finish)
    	{ 
    	  list.Add(visit.Finish.ToString()); // в строках!
    	  visit.Finish -= TimeSpan.FromMinutes(1); // по 1й минуте!!!
    	}
    	return list;
    }
    private bool Compare(List<string> list1, List<string> list2)
    {
    
    	foreach (var s in list1)
    	{
    		if (list2.Any(x => x == s))
    		{
    			return false;
    		}
    	}
    	return true;
    }

    Основная здесь функция, предназначенная для вызова, - IsConflict(Visit a, Visit b)
    Она должна проверять, пересекаются ли меджу собой два промежутка времени.
    Вот такая проверка со сложностью O(n*n) , где n - кол-во минут в промежутках времени.

    Запостил: kasitan, 18 Сентября 2013

    Комментарии (9) RSS

    • И это вместо 2 сравнений...
      Прикольно, что IsConflict = true когда конфликта нет. И наоборот
      Ответить
      • а не 3-х?
        Ответить
        • ну тут как посмотреть. всего - 3, а за проход - 2

          public class Visit
                  {
                      public DateTime Start { get; set; }
                      public DateTime Finish { get; set; }
                  }
          
                  public bool IsConflict(Visit a, Visit b)
                  {
                      if (a.Start > b.Start)
                          return a.Start < b.Finish;
                      return b.Start < a.Finish;
                  }
          Ответить
          • return a.Start <= b.Finish && b.Start <= a.Finish;
            Вроде бы достаточно для проверки отрезков на пересечение.
            Ответить
    • 1) Завел бы класс Range<T>. Раз уж интервалы понадобились, наверняка понадобятся еще не раз.
      2) Добавил бы метод IsCrossing. Потом наверняка понадобятся Before, After.
      Ответить
    • Особенно мне понравилось, что во время СРАВНЕНИЯ многократно изменяется класс Visit.
      Ответить
    • а меня улыбнуло то, что List<string> GetArray(... какая блин разница, лист это или аррай ;)
      Ответить

    Добавить комментарий