Middle
Rodyti unikalius naudotojo ir produkto ID derinius visiems pirkimams, kuriuos atliko naudotojai prieš juos užbaninant. Rūšiuoti pirmiausia pagal naudotojo vardą, tada pagal SKU Raskite naudotojus, kurie atliko pirkimus už daugiau nei 5000 rublų. Rodykite jų vardus šiuo formatu: naudotojo ID | vardas | pavardė | pirkimų suma
sobes.tech AI
Atsakymas iš 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)
}
}
}
Этот пример демонстрирует логику обработки и вывода данных согласно заданию.