Назад к вопросам
OZON
Middle
9
Вывести уникальные комбинации пользователя и id товара для всех покупок, совершенных пользователями до того, как их забанили. Отсортировать сначала по имени пользователя, потом по SKU Найти пользователей, которые совершили покупок на сумму больше 5000р. Вывести их имена в формате id пользователя | имя | фамилия | сумма покупок
Компании, где спрашивали
Ответ от нейросети
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)
}
}
}
Этот пример демонстрирует логику обработки и вывода данных согласно заданию.