From d3dea5da8f44ae42b92643264bc4f030d1524ed8 Mon Sep 17 00:00:00 2001 From: Sergey Kosovsky Date: Wed, 20 Mar 2024 12:46:34 +0300 Subject: [PATCH] Add solutions for 3 tasks --- me-sms/main.go | 47 +++++++++++++ on-battle-conditioner/README.md | 89 ++++++++++++++++++++++++ on-battle-conditioner/main.go | 119 ++++++++++++++++++++++++++++++++ on-car-plates/main.go | 14 ++-- 4 files changed, 263 insertions(+), 6 deletions(-) create mode 100644 me-sms/main.go create mode 100644 on-battle-conditioner/README.md create mode 100644 on-battle-conditioner/main.go diff --git a/me-sms/main.go b/me-sms/main.go new file mode 100644 index 0000000..04e866b --- /dev/null +++ b/me-sms/main.go @@ -0,0 +1,47 @@ +package main + +import ( + "log" + "regexp" + "strconv" + "strings" +) + +type Message struct { + Content string +} + +func main() { + sms := []Message{ + {Content: "СЧЁТ7999 10:02 Перевод 350р от Ирина С. Баланс: 1150.28р"}, + {Content: "Перевод из Тинькофф Банк +7968р от АЛЕКСАНДР М. СЧЁТ7999 — Баланс: 9933.28р"}, + {Content: "Перевод из Газпромбанк +2778р от КИРИЛЛ П. СЧЁТ3550 — Баланс: 18044.43р"}, + {Content: "СЧЁТ3550 19:25 Перевод 10 790р от Людмила Д. Баланс: 15 266.43р"}, + } + + for _, v := range sms { + NewSms(v) + } + +} + +func NewSms(sms Message) { + log.Println("new sms -", sms.Content) + r, _ := regexp.Compile(`[+ ]((?:\d+ )*\d+)р`) + f := r.FindAllStringSubmatch(sms.Content, -1) + f[0][1] = strings.ReplaceAll(f[0][1], " ", "") + + if len(f) != 1 { + log.Println("В теле сообщения отсутствует сумма") + return + } + + amount, err := strconv.ParseFloat(f[0][1], 64) + + if err == nil { + log.Println("Идентификация суммы", amount) + } else { + log.Println("Сумма не идентифицирована") + return + } +} diff --git a/on-battle-conditioner/README.md b/on-battle-conditioner/README.md new file mode 100644 index 0000000..5d32db4 --- /dev/null +++ b/on-battle-conditioner/README.md @@ -0,0 +1,89 @@ +# Тренировочный раунд Route 256: Junior Go-разработчик + +## 4. Битва за кондиционер + +| Показатель | значение | +|----------------------|--------------------| +| Ограничение времени | 2 000 Мс | +| Ограничение памяти | 512Mb | +| Ввод | стандартный ввод | +| Вывод | стандартный вывод | + +В офисе стоит кондиционер, на котором можно установить температуру от `15` до `30` градусов. + +В офис по очереди приходят `n` сотрудников. `i`-й из них желает температуру не больше или не меньше `ai`. + +После прихода каждого сотрудника определите, можно ли выставить температуру, которая удовлетворит всех в офисе. + +### Входные данные + +Каждый тест состоит из нескольких наборов входных данных. Первая строка содержит целое число `t` (`1 ≤ t ≤ 10^3`) — количество наборов входных данных. Далее следует описание наборов входных данных. + +Первая строка каждого набора содержит целое число `n` (`1 ≤ n ≤ 10^3`) — количество сотрудников. + +`i`-я из следующих `n` строк каждого набора входных данных содержит требование к температуре от `i`-го сотрудника: либо `≥ ai`, либо `≤ ai` (`15 ≤ ai ≤ 30`, `ai` — целое число). Требование `≥ ai` означает, что `i`-й сотрудник желает температуру не ниже `ai`; требование `≤ ai` означает, что `i`-й сотрудник желает температуру не выше `ai`. + +Гарантируется, что сумма `n` по всем наборам входных данных не превосходит `10^3`. + +### Выходные данные + +Для каждого набора входных данных выведите `n` строк, `i`-я из которых содержит температуру, удовлетворяющую всех сотрудников с номерами от `1` до `i` включительно. Если такой температуры не существует, выведите `−1`. После вывода ответа на очередной набор входных данных выводите пустую строку. + +Если ответов несколько, выведите любой. + +Пояснение к первому примеру: + +1. добавляется требование `≥ 30`, диапазон возможных температур — `[30, 30]`, поэтому единственный возможный ответ — `30` градусов. + +Пояснение ко второму примеру: + +1. добавляется требование `≥ 18`, диапазон возможных температур — `[18, 30]`, поэтому в качестве примера взяли `29` градусов; + +2. добавляется требование `≤ 23`, диапазон возможных температур — `[18, 23]`, поэтому в качестве примера взяли `19` градусов; + +3. добавляется требование `≥ 20`, диапазон возможных температур — `[20, 23]`, поэтому в качестве примера взяли `22` градуса; + +4. добавляется требование `≤ 27`, диапазон возможных температур — `[20, 23]`, поэтому в качестве примера взяли `21` градус; + +5. добавляется требование `≤ 21`, диапазон возможных температур — `[20, 21]`, поэтому в качестве примера взяли `20` градусов; + +6. добавляется требование `≥ 28`, диапазон возможных температур — `[28, 21]`, поэтому ответа нет и нужно вывести `-1`. + +Пояснение к третьему примеру: + +1. добавляется требование `≤ 25`, диапазон возможных температур — `[15, 25]`, поэтому в качестве примера взяли `23` градуса; + +2. добавляется требование `≥ 20`, диапазон возможных температур — `[20, 25]`, поэтому в качестве примера взяли `22` градуса; + +3. добавляется требование `≥ 25`, диапазон возможных температур — `[25, 25]`, поэтому в качестве примера можно взять только `25` градусов. + +Пояснение к четвертому примеру: + +1. добавляется требование `≤ 15`, диапазон возможных температур — `[15, 15]`, поэтому в качестве примера можно взять только `15` градусов; + +2. добавляется требование `≥ 30`, диапазон возможных температур — `[30, 15]`, поэтому ответа нет и нужно вывести `-1`; + +3. добавляется требование `≤ 24`, диапазон возможных температур — `[30, 15]`, поэтому ответа нет и нужно вывести `-1`. + +#### Пример 1 + +| Ввод | Вывод | +|-------|-------| +| 4 | | +| 1 | | +| >= 30 | 30 | +| 6 | | +| >= 18 | 18 | +| <= 23 | 18 | +| >= 20 | 20 | +| <= 27 | 20 | +| <= 21 | 20 | +| >= 28 | -1 | +| 3 | | +| <= 25 | 15 | +| >= 20 | 20 | +| >= 25 | 25 | +| 3 | | +| <= 15 | 15 | +| >= 30 | -1 | +| <= 24 | -1 | diff --git a/on-battle-conditioner/main.go b/on-battle-conditioner/main.go new file mode 100644 index 0000000..ff276d0 --- /dev/null +++ b/on-battle-conditioner/main.go @@ -0,0 +1,119 @@ +package main + +import ( + "fmt" + "log" + "unicode" +) + +const ( + fourCharacters = 4 + fiveCharacters = 5 +) + +func main() { + carPlatesPackage := parseCarPlates() + for _, carPlates := range carPlatesPackage { + showMessage(iterateCarPlates(carPlates)) + } +} + +func parseDataTemperaturePackage() [][]string { // TODO: проверить сначала что работает + var dataTemperaturePackage [][]string + var dateTemperatureKit []string + var err error + var countTemperaturePackage int + + _, err = fmt.Scan(&countTemperaturePackage) + if err != nil { + log.Println(err) + } + + for i := 0; i < countTemperaturePackage; i++ { + var countTemperatureKit int + + _, err = fmt.Scan(&countTemperatureKit) + if err != nil { + log.Println(err) + } + + for i := 0; i < countTemperatureKit; i++ { + var dataTemperature string + _, err = fmt.Scan(&dataTemperature) + if err != nil { + log.Println(err) + } + + dateTemperatureKit = append(dateTemperatureKit, dataTemperature) + } + dataTemperaturePackage = append(dataTemperaturePackage, dateTemperatureKit) + } + + return dataTemperaturePackage +} + +func isValidCarPlate(carPlate string) bool { + if len(carPlate) == fourCharacters { + character1 := rune(carPlate[0]) + character2 := rune(carPlate[1]) + character3 := rune(carPlate[2]) + character4 := rune(carPlate[3]) + + if unicode.IsLetter(character1) && unicode.IsDigit(character2) && unicode.IsLetter(character3) && unicode.IsLetter(character4) { + return true + } + } + if len(carPlate) == fiveCharacters { + character1 := rune(carPlate[0]) + character2 := rune(carPlate[1]) + character3 := rune(carPlate[2]) + character4 := rune(carPlate[3]) + character5 := rune(carPlate[4]) + + if unicode.IsLetter(character1) && unicode.IsDigit(character2) && unicode.IsDigit(character3) && unicode.IsLetter(character4) && unicode.IsLetter(character5) { + return true + } + } + + return false +} + +func iterateCarPlates(carPlates string) string { + if len(carPlates) < fourCharacters { + return "-" + } + + var carPlatesList string + var currentIdx int + var remainCharactersCarPlates = len(carPlates) + + for remainCharactersCarPlates != 0 { + var fourCharactersCarPlate string + var fiveCharactersCarPlate string + + if remainCharactersCarPlates >= fourCharacters { + fourCharactersCarPlate = carPlates[currentIdx : currentIdx+fourCharacters] + } + if remainCharactersCarPlates >= fiveCharacters { + fiveCharactersCarPlate = carPlates[currentIdx : currentIdx+fiveCharacters] + } + + if isValidCarPlate(fourCharactersCarPlate) && remainCharactersCarPlates >= fourCharacters { + carPlatesList += fourCharactersCarPlate + " " + currentIdx += fourCharacters + remainCharactersCarPlates -= fourCharacters + continue + } else if isValidCarPlate(fiveCharactersCarPlate) && remainCharactersCarPlates >= fiveCharacters { + carPlatesList += fiveCharactersCarPlate + " " + currentIdx += fiveCharacters + remainCharactersCarPlates -= fiveCharacters + continue + } + return "-" + } + return carPlatesList +} + +func showMessage(msg string) { + fmt.Printf("%s\n", msg) //nolint:forbidigo // it's not debug +} diff --git a/on-car-plates/main.go b/on-car-plates/main.go index c17818e..47e0054 100644 --- a/on-car-plates/main.go +++ b/on-car-plates/main.go @@ -6,6 +6,11 @@ import ( "unicode" ) +const ( + fourCharacters = 4 + fiveCharacters = 5 +) + func main() { carPlatesPackage := parseCarPlates() for _, carPlates := range carPlatesPackage { @@ -37,7 +42,7 @@ func parseCarPlates() []string { } func isValidCarPlate(carPlate string) bool { - if len(carPlate) == 4 { + if len(carPlate) == fourCharacters { character1 := rune(carPlate[0]) character2 := rune(carPlate[1]) character3 := rune(carPlate[2]) @@ -47,7 +52,7 @@ func isValidCarPlate(carPlate string) bool { return true } } - if len(carPlate) == 5 { + if len(carPlate) == fiveCharacters { character1 := rune(carPlate[0]) character2 := rune(carPlate[1]) character3 := rune(carPlate[2]) @@ -63,9 +68,6 @@ func isValidCarPlate(carPlate string) bool { } func iterateCarPlates(carPlates string) string { - const fourCharacters = 4 - const fiveCharacters = 5 - if len(carPlates) < fourCharacters { return "-" } @@ -102,5 +104,5 @@ func iterateCarPlates(carPlates string) string { } func showMessage(msg string) { - fmt.Printf("%s\n", msg) //nolint:forbidigo - it's not debug + fmt.Printf("%s\n", msg) //nolint:forbidigo // it's not debug }