Sobes.tech
Назад к вопросам
Middle
9

Вывести уникальные комбинации пользователя и id товара для всех покупок, совершенных пользователями до того, как их забанили. Отсортировать сначала по имени пользователя, потом по SKU Найти пользователей, которые совершили покупок на сумму больше 5000р. Вывести их имена в формате id пользователя | имя | фамилия | сумма покупок

Компании, где спрашивали
OZONOZON

Ответ от нейросети

sobes.tech AI

Для решения первой задачи нужно иметь данные о покупках, пользователях и статусе их блокировки. Предположим, что у нас есть структуры и срезы с данными:

// Структуры для примера
type Purchase struct {
    UserID    int
    SKU       string
    Amount    float64
    Timestamp time.Time
}

type User struct {
    ID        int
    FirstName string
    LastName  string
    IsBanned  bool
    BanDate   *time.Time // nil если не забанен
}

1. Уникальные комбинации пользователя и id товара для покупок до бана

Логика:

  • Для каждого пользователя, если он забанен, берем дату бана.
  • Фильтруем покупки пользователя, совершённые до даты бана.
  • Формируем уникальные пары (UserName, SKU).
  • Сортируем по имени пользователя, затем по SKU.

2. Пользователи с суммой покупок > 5000

Считаем сумму покупок по каждому пользователю и выводим тех, у кого сумма больше 5000.


Пример кода:

package main

import (
    "fmt"
    "sort"
    "time"
)

type Purchase struct {
    UserID    int
    SKU       string
    Amount    float64
    Timestamp time.Time
}

type User struct {
    ID        int
    FirstName string
    LastName  string
    IsBanned  bool
    BanDate   *time.Time
}

func main() {
    // Пример данных
    banDate := time.Date(2023, 4, 10, 0, 0, 0, 0, time.UTC)
    users := []User{
        {ID: 1, FirstName: "Иван", LastName: "Иванов", IsBanned: true, BanDate: &banDate},
        {ID: 2, FirstName: "Петр", LastName: "Петров", IsBanned: false, BanDate: nil},
    }

    purchases := []Purchase{
        {UserID: 1, SKU: "A123", Amount: 1000, Timestamp: time.Date(2023, 4, 5, 0, 0, 0, 0, time.UTC)},
        {UserID: 1, SKU: "B456", Amount: 2000, Timestamp: time.Date(2023, 4, 11, 0, 0, 0, 0, time.UTC)}, // после бана
        {UserID: 2, SKU: "A123", Amount: 3000, Timestamp: time.Date(2023, 4, 7, 0, 0, 0, 0, time.UTC)},
        {UserID: 2, SKU: "C789", Amount: 2500, Timestamp: time.Date(2023, 4, 8, 0, 0, 0, 0, time.UTC)},
    }

    // 1. Уникальные комбинации пользователя и SKU для покупок до бана
    type userSKU struct {
        userName string
        sku      string
    }

    uniqueMap := make(map[userSKU]struct{})

    for _, u := range users {
        for _, p := range purchases {
            if p.UserID == u.ID {
                if u.IsBanned && u.BanDate != nil {
                    if p.Timestamp.Before(*u.BanDate) {
                        uniqueMap[userSKU{userName: u.FirstName, sku: p.SKU}] = struct{}{}
                    }
                } else {
                    // Пользователь не забанен, считаем все покупки
                    uniqueMap[userSKU{userName: u.FirstName, sku: p.SKU}] = struct{}{}
                }
            }
        }
    }

    // Преобразуем в срез для сортировки
    var uniqueList []userSKU
    for k := range uniqueMap {
        uniqueList = append(uniqueList, k)
    }

    sort.Slice(uniqueList, func(i, j int) bool {
        if uniqueList[i].userName == uniqueList[j].userName {
            return uniqueList[i].sku < uniqueList[j].sku
        }
        return uniqueList[i].userName < uniqueList[j].userName
    })

    fmt.Println("Уникальные комбинации пользователя и SKU до бана:")
    for _, us := range uniqueList {
        fmt.Printf("%s | %s\n", us.userName, us.sku)
    }

    // 2. Пользователи с суммой покупок > 5000
    sumMap := make(map[int]float64)
    for _, p := range purchases {
        sumMap[p.UserID] += p.Amount
    }

    fmt.Println("\nПользователи с суммой покупок > 5000:")
    for _, u := range users {
        if sum, ok := sumMap[u.ID]; ok && sum > 5000 {
            fmt.Printf("%d | %s | %s | %.2f\n", u.ID, u.FirstName, u.LastName, sum)
        }
    }
}

Этот пример демонстрирует логику обработки и вывода данных согласно заданию.