Middle
Prikažite jedinstvene kombinacije korisnika i ID proizvoda za sve kupovine koje su izvršili korisnici pre nego što su banovani. Sortirajte prvo po imenu korisnika, zatim po SKU Pronađite korisnike koji su napravili kupovine u vrednosti većoj od 5000 rublji. Prikažite njihova imena u formatu id korisnika | ime | prezime | suma kupovina
sobes.tech АИ
Одговор од АИ
Для решения первой задачи нужно иметь данные о покупках, пользователях и статусе их блокировки. Предположим, что у нас есть структуры и срезы с данными:
// Структуры для примера
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)
}
}
}
Этот пример демонстрирует логику обработки и вывода данных согласно заданию.