Skip to content

Commit

Permalink
Add solutions for 3 tasks
Browse files Browse the repository at this point in the history
  • Loading branch information
skosovsky committed Mar 20, 2024
1 parent c2e3bf2 commit d3dea5d
Show file tree
Hide file tree
Showing 4 changed files with 263 additions and 6 deletions.
47 changes: 47 additions & 0 deletions me-sms/main.go
Original file line number Diff line number Diff line change
@@ -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
}
}
89 changes: 89 additions & 0 deletions on-battle-conditioner/README.md
Original file line number Diff line number Diff line change
@@ -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 |
119 changes: 119 additions & 0 deletions on-battle-conditioner/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
package main

Check failure on line 1 in on-battle-conditioner/main.go

View workflow job for this annotation

GitHub Actions / lint

: # github.com/skosovsky/go-algo.git/on-battle-conditioner

import (
"fmt"
"log"
"unicode"
)

const (
fourCharacters = 4
fiveCharacters = 5
)

func main() {
carPlatesPackage := parseCarPlates()

Check failure on line 15 in on-battle-conditioner/main.go

View workflow job for this annotation

GitHub Actions / lint

undefined: parseCarPlates (typecheck)
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
}
14 changes: 8 additions & 6 deletions on-car-plates/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,11 @@ import (
"unicode"
)

const (
fourCharacters = 4
fiveCharacters = 5
)

func main() {
carPlatesPackage := parseCarPlates()
for _, carPlates := range carPlatesPackage {
Expand Down Expand Up @@ -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])
Expand All @@ -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])
Expand All @@ -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 "-"
}
Expand Down Expand Up @@ -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
}

0 comments on commit d3dea5d

Please sign in to comment.