Middle
Toon de unieke combinaties van gebruiker en product-ID voor alle aankopen gedaan door gebruikers voordat ze gebanned werden. Sorteer eerst op gebruikersnaam, daarna op SKU Vind gebruikers die meer dan 5000 rubl hebben uitgegeven. Toon hun namen in het formaat gebruikers-ID | naam | achternaam | aankoopbedrag
sobes.tech AI
Antwoord van 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)
}
}
}
Этот пример демонстрирует логику обработки и вывода данных согласно заданию.