Middle
Rādīt unikālas kombinācijas starp lietotāju un preces ID visiem pirkumiem, kurus veica lietotāji pirms viņu bloķēšanas. Sākumā kārtojiet pēc lietotāja vārda, pēc tam pēc SKU Atrodiet lietotājus, kuri veikuši pirkumus par vairāk nekā 5000 rubļiem. Parādiet viņu vārdus šādā formātā: lietotāja ID | vārds | uzvārds | pirkumu summa
sobes.tech AI
Atbilde no 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)
}
}
}
Этот пример демонстрирует логику обработки и вывода данных согласно заданию.