Sobes.tech
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)
        }
    }
}

Этот пример демонстрирует логику обработки и вывода данных согласно заданию.