_ums_

final_tracker

Oct 14th, 2023
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 8.60 KB | None | 0 0
  1. package main
  2.  
  3. // импортируйте нужные пакеты
  4. import (
  5.     "fmt"
  6.     // ...
  7.     "strconv"
  8.     "strings"
  9.     "time"
  10. )
  11.  
  12. const (
  13.     K1 = 0.035
  14.     K2 = 0.029
  15. )
  16.  
  17. var (
  18.     Format     = "20060102 15:04:05" // формат даты и времени
  19.     StepLength = 0.65                // длина шага в метрах
  20.     Weight     = 75.0                // вес кг
  21.     Height     = 1.75                // рост м
  22.     Speed      = 1.39                // скорость м/с
  23. )
  24.  
  25. // parsePackage разбирает входящий пакет в параметре data.
  26. // Возвращаемые значения:
  27. // t — дата и время, указанные в пакете
  28. // steps — количество шагов
  29. // ok — true, если время и шаги указаны корректно и false — в противном случае
  30. func parsePackage(data string) (t time.Time, steps int, ok bool) {
  31.     // 1. разделите строку на две части по запятой в слайс ds
  32.     // 2. проверьте, чтобы ds состоял из двух элементов
  33.     // ...
  34.     ds := strings.Split(data, ",")
  35.     if len(ds) != 2 {
  36.         return
  37.     }
  38.     var err error
  39.     // получаем время time.Time
  40.     t, err = time.Parse(Format, ds[0])
  41.     if err != nil {
  42.         return
  43.     }
  44.     // получаем количество шагов
  45.     steps, err = strconv.Atoi(ds[1])
  46.     if err != nil || steps <= 0 {
  47.         return
  48.     }
  49.     // отмечаем, что данные успешно разобраны
  50.     ok = true
  51.     return
  52. }
  53.  
  54. // stepsDay перебирает все записи слайса, подсчитывает и возвращает
  55. // общее количество шагов.
  56. // тема оптимизации не затрагивается, поэтому можно
  57. // использовать parsePackage для каждого элемента списка
  58. // ...
  59. func stepsDay(storage []string) int {
  60.     var stepsForDay int
  61.     for _, v := range storage {
  62.         _, steps, _ := parsePackage(v)
  63.         stepsForDay = stepsForDay + steps
  64.     }
  65.     return stepsForDay
  66. }
  67.  
  68. // calories возвращает количество килокалорий, которые потрачены на
  69. // прохождение указанной дистанции (в метрах) со скоростью 5 км/ч.
  70. func calories(distance float64) float64 {
  71.     timeInMotion := distance / Speed / 60
  72.     caloriesForDay := (K1*Weight + (Speed*Speed/Height)*K2*Weight) * timeInMotion
  73.     return caloriesForDay
  74.     // ...
  75. }
  76.  
  77. // achievement возвращает мотивирующее сообщение в зависимости от
  78. // пройденного расстояния в километрах.
  79. func achievement(distance float64) string {
  80.     var motivation string
  81.     switch {
  82.     case distance >= 6.5:
  83.         motivation = "Отличный результат! Цель достигнута."
  84.     case distance >= 3.9:
  85.         motivation = "Неплохо! День был продуктивный."
  86.     case distance >= 2.0:
  87.         motivation = "Завтра наверстаем!"
  88.     default:
  89.         motivation = "Лежать тоже полезно. Главное — участие, а не победа!"
  90.     }
  91.     return motivation
  92. }
  93.  
  94. // showMessage выводит строку и добавляет два переноса строк.
  95. func showMessage(s string) {
  96.     fmt.Print(s, "\n\n")
  97. }
  98.  
  99. // AcceptPackage обрабатывает входящий пакет, который передаётся в
  100. // виде строки в параметре data. Параметр storage содержит пакеты за текущий день.
  101. // Если время пакета относится к новым суткам, storage предварительно
  102. // очищается.
  103. // Если пакет валидный, он добавляется в слайс storage, который возвращает
  104. // функция. Если пакет не валидный, storage возвращается без изменений.
  105. func AcceptPackage(data string, storage []string) []string {
  106.     // 1. используйте parsePackage для разбора пакета.
  107.     //    t, steps, ok := parsePackage(data)
  108.     //    выведите сообщение в случае ошибки
  109.     //    также проверьте количество шагов на равенство нулю
  110.     // ...
  111.     t, _, ok := parsePackage(data)
  112.     if !ok {
  113.         showMessage("ошибочный формат пакета")
  114.         return storage
  115.     }
  116.  
  117.     /*  if steps <= 0 {
  118.         showMessage("ошибочный формат пакета")
  119.         return storage
  120.     }*/
  121.  
  122.     // 2. получите текущее UTC время и сравните дни
  123.     //    выведите сообщение, если день в пакете t.Day() не совпадает
  124.     //    с текущим днём
  125.     // ...
  126.  
  127.     now := time.Now().UTC()
  128.     if t.Day() != now.Day() {
  129.         showMessage("неверный день")
  130.         return storage
  131.     }
  132.  
  133.     // выводим ошибку, если время в пакете больше текущего времени
  134.     if t.After(now) {
  135.         showMessage("некорректное значение времени")
  136.         return storage
  137.     }
  138.  
  139.     // проверки для непустого storage
  140.     if len(storage) > 0 {
  141.         // 3. достаточно сравнить первые len(Format) символов пакета с
  142.         //    len(Format) символами последней записи storage.
  143.         //    если меньше или равно, то ошибка — некорректное значение времени
  144.         // ...
  145.         /*      lastTime, _, _ := parsePackage(storage[len(storage)-1])
  146.                 if lastTime == t || t.Before(lastTime) {
  147.                     showMessage("некорректное значение времени")
  148.                     return storage
  149.                 }*/
  150.         if data[:len(Format)] <= storage[len(storage)-1][:len(Format)] {
  151.             showMessage("некорректное значение времени")
  152.             return storage
  153.         }
  154.         // смотрим, наступили ли новые сутки — YYYYMMDD — 8 символов
  155.         if data[:8] != storage[len(storage)-1][:8] {
  156.             // если наступили
  157.             // то обнуляем слайс с накопленными данными
  158.             storage = storage[:0]
  159.         }
  160.     }
  161.     // остаётся совсем немного
  162.     // 5. добавить пакет в storage
  163.     storage = append(storage, data)
  164.     // 6. получить общее количество шагов
  165.     stepsInDay := stepsDay(storage)
  166.     // 7. вычислить общее расстояние (в метрах)
  167.     distanceDay := float64(stepsInDay) * StepLength
  168.     // 8. получить потраченные килокалории
  169.     caloriesDay := calories(distanceDay)
  170.     // 9. получить мотивирующий текст
  171.     motivation := achievement(distanceDay / 1000)
  172.     msg := fmt.Sprintf(`Время: %s.
  173. Количество шагов за сегодня: %d.
  174. Дистанция составила %.2f км.
  175. Вы сожгли %.2f ккал.
  176. %s`, t.Format("15:04:05"), stepsInDay, distanceDay/1000, caloriesDay, motivation)
  177.     // 10. сформировать и вывести полный текст сообщения
  178.     /*  fmt.Printf("Время: %s.\n", t.Format("15:04:05"))
  179.         fmt.Printf("Количество шагов за сегодня: %d.\n", stepsInDay)
  180.         fmt.Printf("Дистанция составила %.2f км.\n", distanceDay/1000)
  181.         fmt.Printf("Вы сожгли %.2f ккал.\n", caloriesDay)
  182.         fmt.Println(motivation)*/
  183.     // 11. вернуть storage
  184.     // ...
  185.  
  186.     showMessage(msg)
  187.     return storage
  188. }
  189.  
  190. func main() {
  191.     // вы можете сразу проверить работу функции AcceptPackage
  192.     // на небольшом тесте.
  193.     // Если запустить программу после 05:00 UTC, то последнее
  194.     // сообщение должно быть таким:
  195.     // Время: 04:45:21.
  196.     // Количество шагов за сегодня: 16956.
  197.     // Дистанция составила 11.02 км.
  198.     // Вы сожгли 664.23 ккал.
  199.     // Отличный результат! Цель достигнута.
  200.  
  201.     now := time.Now().UTC()
  202.     today := now.Format("20060102")
  203.  
  204.     // данные для самопроверки
  205.     input := []string{
  206.         "01:41:03,-100",
  207.         ",3456",
  208.         "12:40:00, 3456 ",
  209.         "something is wrong",
  210.         "02:11:34,678",
  211.         "02:11:34,792",
  212.         "17:01:30,1078",
  213.         "03:25:59,7830",
  214.         "04:00:46,5325",
  215.         "04:45:21,3123",
  216.     }
  217.  
  218.     var storage []string
  219.     storage = AcceptPackage("20230720 00:11:33,100", storage)
  220.     for _, v := range input {
  221.         storage = AcceptPackage(today+" "+v, storage)
  222.     }
  223. }
  224.  
Add Comment
Please, Sign In to add comment