├── .github
├── FUNDING.yml
├── ISSUE_TEMPLATE
│ ├── bug_report.md
│ └── feature_request.md
├── dependabot.yml
├── semantic.yml
└── workflows
│ └── tests.yml
├── .gitignore
├── .golangci.yml
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── Makefile
├── README.md
├── SECURITY.md
├── codewars
├── mergesort_merge_function
│ ├── README.md
│ ├── solution.go
│ └── solution_test.go
└── weird_string_case
│ ├── README.md
│ ├── solution.go
│ └── solution_test.go
├── docs
└── hero-image.jpg
├── go.mod
├── leetcode
├── 1
│ ├── README.md
│ ├── solution.go
│ └── solution_test.go
├── 15
│ ├── README.md
│ ├── solution.go
│ └── solution_test.go
├── 19
│ ├── README.md
│ ├── solution.go
│ └── solution_test.go
├── 33
│ ├── README.md
│ ├── solution.go
│ └── solution_test.go
├── 56
│ ├── README.md
│ ├── solution.go
│ └── solution_test.go
├── 66
│ ├── README.md
│ ├── solution.go
│ └── solution_test.go
├── 88
│ ├── README.md
│ ├── solution.go
│ └── solution_test.go
├── 155
│ ├── README.md
│ ├── solution.go
│ └── solution_test.go
├── 167
│ ├── README.md
│ ├── solution.go
│ └── solution_test.go
├── 328
│ ├── README.md
│ ├── solution.go
│ └── solution_test.go
└── 347
│ ├── README.md
│ ├── solution.go
│ └── solution_test.go
├── yandex_practicum
├── sprint_1
│ ├── final
│ │ ├── A
│ │ │ ├── README.md
│ │ │ ├── input.txt
│ │ │ ├── task.go
│ │ │ └── task_test.go
│ │ └── B
│ │ │ ├── README.md
│ │ │ ├── input.txt
│ │ │ ├── task.go
│ │ │ └── task_test.go
│ └── tasks
│ │ ├── A
│ │ ├── README.md
│ │ ├── input.txt
│ │ └── task.go
│ │ ├── B
│ │ ├── README.md
│ │ ├── input.txt
│ │ └── task.go
│ │ ├── C
│ │ ├── README.md
│ │ └── input.txt
│ │ ├── D
│ │ ├── README.md
│ │ └── input.txt
│ │ ├── E
│ │ ├── README.md
│ │ ├── input.txt
│ │ └── task.go
│ │ ├── F
│ │ ├── README.md
│ │ ├── input.txt
│ │ └── task.go
│ │ ├── G
│ │ ├── README.md
│ │ └── task.go
│ │ ├── H
│ │ ├── README.md
│ │ └── task.go
│ │ ├── I
│ │ ├── README.md
│ │ └── task.go
│ │ ├── J
│ │ ├── README.md
│ │ └── task.go
│ │ ├── K
│ │ └── README.md
│ │ └── L
│ │ ├── README.md
│ │ └── task.go
├── sprint_2
│ ├── final
│ │ ├── A
│ │ │ ├── README.md
│ │ │ ├── input.txt
│ │ │ ├── task.go
│ │ │ └── task_test.go
│ │ └── B
│ │ │ ├── README.md
│ │ │ ├── input.txt
│ │ │ ├── task.go
│ │ │ └── task_test.go
│ └── tasks
│ │ ├── A
│ │ ├── README.md
│ │ ├── input.txt
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── B
│ │ ├── README.md
│ │ └── task.go
│ │ ├── C
│ │ ├── README.md
│ │ └── task.go
│ │ ├── D
│ │ ├── README.md
│ │ └── task.go
│ │ ├── E
│ │ ├── README.md
│ │ └── task.go
│ │ ├── F
│ │ ├── README.md
│ │ ├── input.txt
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── G
│ │ ├── README.md
│ │ ├── input.txt
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── H
│ │ ├── README.md
│ │ ├── input.txt
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── I
│ │ ├── README.md
│ │ ├── input.txt
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── J
│ │ ├── README.md
│ │ ├── input.txt
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── K
│ │ ├── README.md
│ │ ├── task.go
│ │ └── task_test.go
│ │ └── L
│ │ ├── README.md
│ │ ├── task.go
│ │ └── task_test.go
├── sprint_3
│ ├── final
│ │ ├── A
│ │ │ ├── README.md
│ │ │ ├── input.txt
│ │ │ ├── task.go
│ │ │ └── task_test.go
│ │ └── B
│ │ │ ├── README.md
│ │ │ ├── input.txt
│ │ │ ├── task.go
│ │ │ └── task_test.go
│ └── tasks
│ │ ├── A
│ │ ├── README.md
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── B
│ │ ├── README.md
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── C
│ │ ├── README.md
│ │ ├── input.txt
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── D
│ │ ├── README.md
│ │ ├── input.txt
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── E
│ │ ├── README.md
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── F
│ │ ├── README.md
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── G
│ │ ├── README.md
│ │ ├── input.txt
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── H
│ │ ├── README.md
│ │ ├── input.txt
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── I
│ │ ├── README.md
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── J
│ │ ├── README.md
│ │ ├── input.txt
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── K
│ │ ├── README.md
│ │ ├── input.txt
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── L
│ │ ├── README.md
│ │ ├── input.txt
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── M
│ │ ├── README.md
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── N
│ │ ├── README.md
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── O
│ │ ├── README.md
│ │ ├── task.go
│ │ └── task_test.go
│ │ └── P
│ │ ├── README.md
│ │ ├── input.txt
│ │ ├── task.go
│ │ └── task_test.go
├── sprint_4
│ ├── final
│ │ ├── A
│ │ │ ├── README.md
│ │ │ ├── input.txt
│ │ │ ├── task.go
│ │ │ └── task_test.go
│ │ └── B
│ │ │ ├── README.md
│ │ │ ├── input.txt
│ │ │ ├── task.go
│ │ │ └── task_test.go
│ └── tasks
│ │ ├── A
│ │ ├── README.md
│ │ ├── input.txt
│ │ └── task.go
│ │ ├── B
│ │ └── README.md
│ │ ├── C
│ │ ├── README.md
│ │ ├── input.txt
│ │ └── task.go
│ │ ├── D
│ │ ├── README.md
│ │ ├── input.txt
│ │ └── task.go
│ │ ├── E
│ │ ├── README.md
│ │ ├── input.txt
│ │ └── task.go
│ │ ├── F
│ │ └── README.md
│ │ ├── G
│ │ ├── README.md
│ │ ├── input.txt
│ │ └── task.go
│ │ ├── H
│ │ ├── README.md
│ │ ├── input.txt
│ │ └── task.go
│ │ ├── I
│ │ ├── README.md
│ │ ├── input.txt
│ │ └── task.go
│ │ ├── J
│ │ ├── README.md
│ │ ├── input.txt
│ │ └── task.go
│ │ ├── K
│ │ └── README.md
│ │ └── L
│ │ └── README.md
├── sprint_5
│ ├── final
│ │ ├── A
│ │ │ ├── README.md
│ │ │ ├── task.go
│ │ │ └── task_test.go
│ │ └── B
│ │ │ ├── README.md
│ │ │ ├── task.go
│ │ │ └── task_test.go
│ └── tasks
│ │ ├── A
│ │ ├── README.md
│ │ ├── for_tests.txt
│ │ ├── img.png
│ │ └── task.go
│ │ ├── B
│ │ ├── README.md
│ │ ├── for tests.txt
│ │ ├── image.png
│ │ └── task.go
│ │ ├── C
│ │ ├── README.md
│ │ ├── for tests.txt
│ │ ├── image.png
│ │ └── task.go
│ │ ├── D
│ │ ├── README.md
│ │ └── image.png
│ │ ├── E
│ │ ├── README.md
│ │ └── image.png
│ │ ├── F
│ │ ├── README.md
│ │ ├── for tests.txt
│ │ ├── image.png
│ │ └── task.go
│ │ ├── G
│ │ ├── README.md
│ │ └── img.png
│ │ ├── H
│ │ ├── README.md
│ │ └── image.png
│ │ ├── I
│ │ └── README.md
│ │ ├── J
│ │ ├── README.md
│ │ ├── for tests.txt
│ │ ├── image.png
│ │ └── task.go
│ │ ├── K
│ │ ├── README.md
│ │ ├── for tests.txt
│ │ ├── image.png
│ │ └── task.go
│ │ ├── L
│ │ ├── README.md
│ │ ├── for tests.txt
│ │ ├── image.png
│ │ └── task.go
│ │ ├── M
│ │ ├── README.md
│ │ ├── for tests.txt
│ │ ├── image.png
│ │ └── task.go
│ │ └── N
│ │ ├── README.md
│ │ ├── for tests.txt
│ │ └── task.go
├── sprint_6
│ ├── final
│ │ ├── A
│ │ │ ├── README.md
│ │ │ ├── task.go
│ │ │ └── task_test.go
│ │ └── B
│ │ │ ├── README.md
│ │ │ ├── task.go
│ │ │ └── task_test.go
│ └── tasks
│ │ ├── A
│ │ ├── README.md
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── B
│ │ ├── README.md
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── C
│ │ ├── README.md
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── D
│ │ ├── README.md
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── E
│ │ ├── README.md
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── F
│ │ ├── README.md
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── G
│ │ ├── README.md
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── H
│ │ ├── README.md
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── J
│ │ ├── README.md
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── K
│ │ ├── README.md
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── L
│ │ ├── README.md
│ │ ├── task.go
│ │ └── task_test.go
│ │ └── M
│ │ ├── README.md
│ │ ├── img.png
│ │ ├── task.go
│ │ └── task_test.go
├── sprint_7
│ ├── final
│ │ ├── A
│ │ │ ├── README.md
│ │ │ ├── task.go
│ │ │ └── task_test.go
│ │ └── B
│ │ │ ├── README.md
│ │ │ ├── task.go
│ │ │ └── task_test.go
│ └── tasks
│ │ ├── A
│ │ ├── README.md
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── B
│ │ └── README.md
│ │ ├── C
│ │ ├── README.md
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── D
│ │ ├── README.md
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── E
│ │ ├── README.md
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── F
│ │ ├── README.md
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── G
│ │ └── README.md
│ │ ├── H
│ │ ├── README.md
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── I
│ │ └── README.md
│ │ ├── J
│ │ └── README.md
│ │ ├── K
│ │ └── README.md
│ │ ├── L
│ │ ├── README.md
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── M
│ │ ├── README.md
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── N
│ │ └── README.md
│ │ └── O
│ │ ├── README.md
│ │ ├── task.go
│ │ └── task_test.go
├── sprint_8
│ ├── final
│ │ ├── A
│ │ │ ├── README.md
│ │ │ ├── task.go
│ │ │ └── task_test.go
│ │ └── B
│ │ │ ├── README.md
│ │ │ ├── task.go
│ │ │ └── task_test.go
│ └── tasks
│ │ ├── A
│ │ ├── README.md
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── B
│ │ └── README.md
│ │ ├── C
│ │ └── README.md
│ │ ├── D
│ │ ├── README.md
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── E
│ │ └── README.md
│ │ ├── F
│ │ ├── README.md
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── G
│ │ ├── README.md
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── H
│ │ ├── README.md
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── I
│ │ ├── README.md
│ │ ├── task.go
│ │ └── task_test.go
│ │ ├── J
│ │ └── README.md
│ │ ├── K
│ │ ├── README.md
│ │ ├── task.go
│ │ └── task_test.go
│ │ └── L
│ │ ├── README.md
│ │ ├── task.go
│ │ └── task_test.go
└── sprint_interview
│ ├── A
│ ├── README.md
│ ├── task.go
│ └── task_test.go
│ ├── B
│ ├── README.md
│ ├── task.go
│ └── task_test.go
│ ├── C
│ ├── README.md
│ ├── task.go
│ └── task_test.go
│ ├── D
│ ├── README.md
│ ├── task.go
│ └── task_test.go
│ ├── E
│ ├── README.md
│ ├── task.go
│ └── task_test.go
│ ├── F
│ ├── README.md
│ ├── task.go
│ └── task_test.go
│ ├── G
│ ├── README.md
│ ├── task.go
│ └── task_test.go
│ ├── H
│ ├── README.md
│ ├── task.go
│ └── task_test.go
│ ├── I
│ ├── README.md
│ ├── image.png
│ ├── task.go
│ └── task_test.go
│ ├── J
│ ├── README.md
│ ├── task.go
│ └── task_test.go
│ ├── K
│ ├── README.md
│ ├── task.go
│ └── task_test.go
│ ├── L
│ ├── README.md
│ ├── task.go
│ └── task_test.go
│ ├── M
│ ├── README.md
│ ├── task.go
│ └── task_test.go
│ ├── N
│ ├── README.md
│ ├── task.go
│ └── task_test.go
│ ├── O
│ ├── README.md
│ ├── task.go
│ └── task_test.go
│ ├── P
│ ├── README.md
│ ├── task.go
│ └── task_test.go
│ ├── Q
│ ├── README.md
│ ├── task.go
│ └── task_test.go
│ ├── R
│ ├── README.md
│ ├── task.go
│ └── task_test.go
│ ├── S
│ ├── README.md
│ ├── task.go
│ └── task_test.go
│ ├── T
│ ├── README.md
│ ├── task.go
│ └── task_test.go
│ └── U
│ ├── README.md
│ ├── task.go
│ └── task_test.go
└── yandex_training_1
└── study_1
├── A
├── README.md
├── task.go
└── task_test.go
└── B
├── README.md
├── task.go
└── task_test.go
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | github: [dmitryburov]
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug_report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bug report
3 | about: Create a report to help us improve
4 | title: ''
5 | labels: ''
6 | assignees: ''
7 |
8 | ---
9 |
10 | **Describe the bug**
11 | A clear and concise description of what the bug is.
12 |
13 | **To Reproduce**
14 | Steps to reproduce the behavior:
15 | 1. Go to '...'
16 | 2. Click on '....'
17 | 3. Scroll down to '....'
18 | 4. See error
19 |
20 | **Expected behavior**
21 | A clear and concise description of what you expected to happen.
22 |
23 | **Screenshots**
24 | If applicable, add screenshots to help explain your problem.
25 |
26 | **Desktop (please complete the following information):**
27 | - OS: [e.g. iOS]
28 | - Browser [e.g. chrome, safari]
29 | - Version [e.g. 22]
30 |
31 | **Smartphone (please complete the following information):**
32 | - Device: [e.g. iPhone6]
33 | - OS: [e.g. iOS8.1]
34 | - Browser [e.g. stock browser, safari]
35 | - Version [e.g. 22]
36 |
37 | **Additional context**
38 | Add any other context about the problem here.
39 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/feature_request.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Feature request
3 | about: Suggest an idea for this project
4 | title: ''
5 | labels: ''
6 | assignees: ''
7 |
8 | ---
9 |
10 | **Is your feature request related to a problem? Please describe.**
11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
12 |
13 | **Describe the solution you'd like**
14 | A clear and concise description of what you want to happen.
15 |
16 | **Describe alternatives you've considered**
17 | A clear and concise description of any alternative solutions or features you've considered.
18 |
19 | **Additional context**
20 | Add any other context or screenshots about the feature request here.
21 |
--------------------------------------------------------------------------------
/.github/dependabot.yml:
--------------------------------------------------------------------------------
1 | version: 2
2 | updates:
3 | - package-ecosystem: "gomod"
4 | directory: "/"
5 | schedule:
6 | interval: "daily"
7 |
--------------------------------------------------------------------------------
/.github/semantic.yml:
--------------------------------------------------------------------------------
1 | # Always validate the PR title AND all the commits
2 | titleAndCommits: true
3 | # Allows use of Merge commits (eg on github: "Merge branch 'master' into feature/ride-unicorns")
4 | # this is only relevant when using commitsOnly: true (or titleAndCommits: true)
5 | allowMergeCommits: true
--------------------------------------------------------------------------------
/.github/workflows/tests.yml:
--------------------------------------------------------------------------------
1 | name: Test solutions
2 |
3 | on:
4 | push:
5 | branches:
6 | - master
7 |
8 | jobs:
9 | lint:
10 | name: lint check
11 | runs-on: ubuntu-latest
12 | steps:
13 | - uses: actions/checkout@v4
14 |
15 | - uses: actions/setup-go@v5
16 | with:
17 | go-version: 1.21
18 | cache: false
19 |
20 | - name: golangci-lint
21 | uses: golangci/golangci-lint-action@v4
22 | with:
23 | version: latest
24 |
25 | tests:
26 | name: test check
27 | environment: tests
28 | runs-on: ubuntu-latest
29 | steps:
30 | - name: Install Go
31 | uses: actions/setup-go@v5
32 | with:
33 | go-version: 1.21
34 |
35 | - run: go version
36 |
37 | - name: Checkout code
38 | uses: actions/checkout@v4
39 |
40 | - name: Install dependencies
41 | run: go mod download -x
42 |
43 | - name: Run Tests
44 | run: make test
45 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | ### Go template
2 | # Binaries for programs and plugins
3 | *.exe
4 | *.exe~
5 | *.dll
6 | *.so
7 | *.dylib
8 |
9 | # Test binary, built with `go test -c`
10 | *.test
11 |
12 | # Output of the go coverage tool, specifically when used with LiteIDE
13 | *.out
14 |
15 | # Dependency directories (remove the comment below to include it)
16 | .bin/
17 | .idea/
18 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # Contributing
2 |
3 | Thank you for taking the time to contribute. Please read the [CODE of CONDUCT](CODE_OF_CONDUCT.md).
4 | As a contributor, here are the guidelines we would like you to follow:
5 |
6 | - [Commit Message Guidelines](#commit)
7 |
8 | ---
9 |
10 | ## Commit Message Guidelines 😎
11 |
12 | In order to make git commit messages **easier to read** and faster to reason about, we follow some guidelines on most commits to keep the **format predictable**. Check [Conventional Commits specification](https://conventionalcommits.org) for more information about our guidelines.
13 |
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | #!make
2 | TAG=$(shell git describe --tags |cut -d- -f1)
3 | COMMIT=$(shell git rev-parse --short HEAD)
4 | LDFLAGS=-a -installsuffix cgo
5 |
6 | .SILENT:
7 | .DEFAULT_GOAL := help
8 |
9 | help: ## Show this help
10 | @echo "Makefile available targets:"
11 | @grep -h -E '^[a-zA-Z_-].+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf " * \033[36m%-15s\033[0m %s\n", $$1, $$2}'
12 |
13 | test: ## Run tests
14 | go test --short -coverprofile=cover.out -v ./...
15 | make test.coverage
16 |
17 | test.coverage:
18 | go tool cover -func=cover.out
19 |
20 | release: ## Git tag create and push
21 | git tag -s -a v${tag} -m 'chore(release): v$(tag) [skip ci]'
22 | git push origin v${tag}
23 |
24 | release.revert: ## Revert git release tag
25 | git tag -d v${tag}
26 | git push --delete origin v${tag}
27 |
28 | lint: ## Check code (used golangci-lint)
29 | GO111MODULE=on golangci-lint run
30 |
31 | clean: ## Clean build directory
32 | rm -rf ./.bin
--------------------------------------------------------------------------------
/SECURITY.md:
--------------------------------------------------------------------------------
1 | # Security Policy
2 |
3 | ## Supported Versions
4 |
5 | Use this section to tell people about which versions of your project are
6 | currently being supported with security updates.
7 |
8 | | Version | Supported |
9 | | ------- | ------------------ |
10 | | 1.16.x | :white_check_mark: |
11 | | > 1.16 | :white_check_mark: |
12 | | < 1.16 | :x: |
13 |
14 | ## Reporting a Vulnerability
15 |
16 | Use this section to tell people how to report a vulnerability.
17 |
18 | Tell them where to go, how often they can expect to get an update on a
19 | reported vulnerability, what to expect if the vulnerability is accepted or
20 | declined, etc.
21 |
--------------------------------------------------------------------------------
/codewars/mergesort_merge_function/README.md:
--------------------------------------------------------------------------------
1 | # MergeSort "merge" function
2 |
3 | See more about problem: [Click](https://www.codewars.com/kata/52336a4436e0b095d8000093)
--------------------------------------------------------------------------------
/codewars/mergesort_merge_function/solution.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | func mergeSorted(arr1, arr2 []int) []int {
4 | var result = make([]int, len(arr1)+len(arr2))
5 |
6 | i, j, k := 0, 0, 0
7 | for i < len(arr1) && j < len(arr2) {
8 | if arr1[i] <= arr2[j] {
9 | result[k] = arr1[i]
10 | i++
11 | } else {
12 | result[k] = arr2[j]
13 | j++
14 | }
15 | k++
16 | }
17 |
18 | for i < len(arr1) {
19 | result[k] = arr1[i]
20 | i++
21 | k++
22 | }
23 |
24 | for j < len(arr2) {
25 | result[k] = arr2[j]
26 | j++
27 | k++
28 | }
29 |
30 | return result
31 | }
32 |
--------------------------------------------------------------------------------
/codewars/mergesort_merge_function/solution_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "reflect"
6 | "testing"
7 | )
8 |
9 | type TestItemInput struct {
10 | arr1, arr2 []int
11 | }
12 |
13 | type TestItem struct {
14 | input TestItemInput
15 | output []int
16 | }
17 |
18 | func TestTask(t *testing.T) {
19 | for i, v := range generateTasks() {
20 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
21 | res := mergeSorted(v.input.arr1, v.input.arr2)
22 | if !reflect.DeepEqual(res, v.output) {
23 | t.Errorf("Wrong test.\nOutput: \n%v \nExpected: \n%v", res, v.output)
24 | }
25 | })
26 | }
27 | }
28 | func generateTasks() []TestItem {
29 | return []TestItem{
30 | {
31 | input: TestItemInput{
32 | arr1: []int{1, 2, 3, 4},
33 | arr2: []int{5, 6, 7, 8},
34 | },
35 | output: []int{1, 2, 3, 4, 5, 6, 7, 8},
36 | },
37 | {
38 | input: TestItemInput{
39 | arr1: []int{2, 4, 6},
40 | arr2: []int{1, 3, 5},
41 | },
42 | output: []int{1, 2, 3, 4, 5, 6},
43 | },
44 | {
45 | input: TestItemInput{
46 | arr1: []int{1, 1, 1},
47 | arr2: []int{2, 2, 2},
48 | },
49 | output: []int{1, 1, 1, 2, 2, 2},
50 | },
51 | {
52 | input: TestItemInput{
53 | arr1: []int{1},
54 | arr2: []int{1},
55 | },
56 | output: []int{1, 1},
57 | },
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/codewars/weird_string_case/README.md:
--------------------------------------------------------------------------------
1 | # WeIrD StRiNg CaSe
2 |
3 | See more about problem: [Click](https://www.codewars.com/kata/52b757663a95b11b3d00062d/)
--------------------------------------------------------------------------------
/codewars/weird_string_case/solution.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "strings"
5 | "unicode"
6 | )
7 |
8 | func toWeirdCase(str string) string {
9 | var result strings.Builder
10 |
11 | i := 1
12 | for _, ch := range str {
13 | if unicode.IsSpace(ch) || !unicode.IsLetter(ch) {
14 | i = 1
15 | result.WriteRune(ch)
16 | } else {
17 | if i%2 == 0 {
18 | result.WriteByte(byte(unicode.ToLower(ch)))
19 | } else {
20 | result.WriteByte(byte(unicode.ToUpper(ch)))
21 | }
22 | i++
23 | }
24 | }
25 |
26 | return result.String()
27 | }
28 |
--------------------------------------------------------------------------------
/codewars/weird_string_case/solution_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "reflect"
6 | "testing"
7 | )
8 |
9 | type TestItem struct {
10 | input string
11 | output string
12 | }
13 |
14 | func TestTask(t *testing.T) {
15 | for i, v := range generateTasks() {
16 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
17 | res := toWeirdCase(v.input)
18 | if !reflect.DeepEqual(res, v.output) {
19 | t.Errorf("Wrong test.\nOutput: \n%v \nExpected: \n%v", res, v.output)
20 | }
21 | })
22 | }
23 | }
24 |
25 | func generateTasks() []TestItem {
26 | return []TestItem{
27 | {
28 | input: "abc def",
29 | output: "AbC DeF",
30 | },
31 | {
32 | input: "ABC",
33 | output: "AbC",
34 | },
35 | {
36 | input: "This is a test Looks like you passed",
37 | output: "ThIs Is A TeSt LoOkS LiKe YoU PaSsEd",
38 | },
39 | {
40 | input: "Yo",
41 | output: "Yo",
42 | },
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/docs/hero-image.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dmitryburov/algorithm-practice/1501896081a17ead0f3e5571f9f13cabaf889142/docs/hero-image.jpg
--------------------------------------------------------------------------------
/go.mod:
--------------------------------------------------------------------------------
1 | module github.com/dmitryburov/algo-yandex-practicum
2 |
3 | go 1.21
4 |
--------------------------------------------------------------------------------
/leetcode/1/README.md:
--------------------------------------------------------------------------------
1 | # 1. Two Sum
2 |
3 | Подробнее о задаче: [Тыц](https://leetcode.com/problems/two-sum/)
--------------------------------------------------------------------------------
/leetcode/1/solution.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | func twoSum(nums []int, target int) []int {
4 | hMap := make(map[int]int)
5 |
6 | for i := 0; i < len(nums); i++ {
7 | if j, ok := hMap[target-nums[i]]; ok {
8 | return []int{j, i}
9 | }
10 | hMap[nums[i]] = i
11 | }
12 |
13 | return nil
14 | }
15 |
--------------------------------------------------------------------------------
/leetcode/1/solution_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "reflect"
6 | "testing"
7 | )
8 |
9 | type TestItemInput struct {
10 | nums []int
11 | target int
12 | }
13 | type TestItem struct {
14 | input TestItemInput
15 | output []int
16 | }
17 |
18 | func TestTask(t *testing.T) {
19 | for i, v := range generateTasks() {
20 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
21 | res := twoSum(v.input.nums, v.input.target)
22 | if !reflect.DeepEqual(res, v.output) {
23 | t.Errorf("Wrong test.\nOutput: \n%v \nExpected: \n%v", res, v.output)
24 | }
25 | })
26 | }
27 | }
28 |
29 | func generateTasks() []TestItem {
30 | return []TestItem{
31 | {
32 | input: TestItemInput{nums: []int{2, 7, 11, 15}, target: 9},
33 | output: []int{0, 1},
34 | },
35 | {
36 | input: TestItemInput{nums: []int{3, 2, 4}, target: 6},
37 | output: []int{1, 2},
38 | },
39 | {
40 | input: TestItemInput{nums: []int{3, 3}, target: 6},
41 | output: []int{0, 1},
42 | },
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/leetcode/15/README.md:
--------------------------------------------------------------------------------
1 | # 15. 3Sum
2 |
3 | Подробнее о задаче: [Тыц](https://leetcode.com/problems/3sum/description/)
--------------------------------------------------------------------------------
/leetcode/15/solution.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "sort"
5 | )
6 |
7 | func threeSum(nums []int) [][]int {
8 | var res [][]int
9 |
10 | sort.Ints(nums)
11 |
12 | for i := 0; i < len(nums)-2; i++ {
13 | if i == 0 || (i > 0 && nums[i] != nums[i-1]) {
14 | low := i + 1
15 | high := len(nums) - 1
16 | sum := 0 - nums[i]
17 |
18 | for low < high {
19 | if (nums[low] + nums[high]) == sum {
20 | res = append(res, []int{nums[i], nums[low], nums[high]})
21 | for low < high && nums[low] == nums[low+1] {
22 | low++
23 | }
24 | for low < high && nums[high] == nums[high-1] {
25 | high--
26 | }
27 | low++
28 | high--
29 | } else if nums[low]+nums[high] > sum {
30 | high--
31 | } else {
32 | low++
33 | }
34 | }
35 | }
36 | }
37 |
38 | return res
39 | }
40 |
--------------------------------------------------------------------------------
/leetcode/15/solution_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "reflect"
6 | "testing"
7 | )
8 |
9 | type TestItemInput struct {
10 | nums []int
11 | }
12 | type TestItem struct {
13 | input TestItemInput
14 | output [][]int
15 | }
16 |
17 | func TestTask(t *testing.T) {
18 | for i, v := range generateTasks() {
19 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
20 | res := threeSum(v.input.nums)
21 | if !reflect.DeepEqual(res, v.output) {
22 | t.Errorf("Wrong test.\nOutput: \n%v \nExpected: \n%v", res, v.output)
23 | }
24 | })
25 | }
26 | }
27 |
28 | func generateTasks() []TestItem {
29 | return []TestItem{
30 | {
31 | input: TestItemInput{nums: []int{-1, 0, 1, 2, -1, -4}},
32 | output: [][]int{{-1, -1, 2}, {-1, 0, 1}},
33 | },
34 | {
35 | input: TestItemInput{nums: []int{0, 1, 1}},
36 | output: nil,
37 | },
38 | {
39 | input: TestItemInput{nums: []int{0, 0, 0}},
40 | output: [][]int{{0, 0, 0}},
41 | },
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/leetcode/155/README.md:
--------------------------------------------------------------------------------
1 | # 155. Min Stack
2 |
3 | Подробнее о задаче: [Тыц](https://leetcode.com/problems/min-stack/)
--------------------------------------------------------------------------------
/leetcode/155/solution.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | type MinStack struct {
4 | stack, min []int
5 | }
6 |
7 | func Constructor() MinStack {
8 | return MinStack{}
9 | }
10 |
11 | func (this *MinStack) Push(val int) {
12 | this.stack = append(this.stack, val)
13 |
14 | if len(this.min) > 0 {
15 | min := this.GetMin()
16 | if min < val {
17 | val = min
18 | }
19 | }
20 |
21 | this.min = append(this.min, val)
22 | }
23 |
24 | func (this *MinStack) Pop() {
25 | this.stack = this.stack[:len(this.stack)-1]
26 | this.min = this.min[:len(this.min)-1]
27 | }
28 |
29 | func (this *MinStack) Top() int {
30 | return this.stack[len(this.stack)-1]
31 | }
32 |
33 | func (this *MinStack) GetMin() int {
34 | return this.min[len(this.min)-1]
35 | }
36 |
37 | func (this *MinStack) Empty() bool {
38 | return len(this.stack) > 0
39 | }
40 |
--------------------------------------------------------------------------------
/leetcode/167/README.md:
--------------------------------------------------------------------------------
1 | # 167. Two Sum II - Input Array Is Sorted
2 |
3 | See more about problem: [Click](https://leetcode.com/problems/two-sum-ii-input-array-is-sorted/)
--------------------------------------------------------------------------------
/leetcode/167/solution.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | func twoSum(numbers []int, target int) []int {
4 | hMap := make(map[int]int)
5 |
6 | for i := 0; i < len(numbers); i++ {
7 | if j, ok := hMap[target-numbers[i]]; ok {
8 | return []int{j + 1, i + 1}
9 | }
10 | hMap[numbers[i]] = i
11 | }
12 |
13 | return nil
14 | }
15 |
--------------------------------------------------------------------------------
/leetcode/167/solution_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "reflect"
6 | "testing"
7 | )
8 |
9 | type TestItemInput struct {
10 | arr []int
11 | target int
12 | }
13 |
14 | type TestItem struct {
15 | input TestItemInput
16 | output []int
17 | }
18 |
19 | func TestTask(t *testing.T) {
20 | for i, v := range generateTasks() {
21 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
22 | res := twoSum(v.input.arr, v.input.target)
23 | if !reflect.DeepEqual(res, v.output) {
24 | t.Errorf("Wrong test.\nOutput: \n%v \nExpected: \n%v", res, v.output)
25 | }
26 | })
27 | }
28 | }
29 |
30 | func generateTasks() []TestItem {
31 | return []TestItem{
32 | {
33 | input: TestItemInput{
34 | arr: []int{2, 7, 11, 15},
35 | target: 9,
36 | },
37 | output: []int{1, 2},
38 | },
39 | {
40 | input: TestItemInput{
41 | arr: []int{2, 3, 4},
42 | target: 6,
43 | },
44 | output: []int{1, 3},
45 | },
46 | {
47 | input: TestItemInput{
48 | arr: []int{-1, 0},
49 | target: -1,
50 | },
51 | output: []int{1, 2},
52 | },
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/leetcode/19/README.md:
--------------------------------------------------------------------------------
1 | # 19. Remove Nth Node From End of List
2 |
3 | Подробнее о задаче: [Тыц](https://leetcode.com/problems/remove-nth-node-from-end-of-list/)
--------------------------------------------------------------------------------
/leetcode/19/solution.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | type ListNode struct {
4 | Val int
5 | Next *ListNode
6 | }
7 |
8 | func removeNthFromEnd(head *ListNode, n int) *ListNode {
9 | left, right := head, head
10 |
11 | for i := 1; i <= n && right != nil; i++ {
12 | right = right.Next
13 | }
14 | if right == nil {
15 | return head.Next
16 | }
17 |
18 | for right != nil && right.Next != nil {
19 | left = left.Next
20 | right = right.Next
21 | }
22 |
23 | left.Next = left.Next.Next
24 |
25 | return head
26 | }
27 |
--------------------------------------------------------------------------------
/leetcode/328/README.md:
--------------------------------------------------------------------------------
1 | # 328. Odd Even Linked List
2 |
3 | Подробнее о задаче: [Тыц](https://leetcode.com/problems/odd-even-linked-list/)
--------------------------------------------------------------------------------
/leetcode/328/solution.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | type ListNode struct {
4 | Val int
5 | Next *ListNode
6 | }
7 |
8 | func oddEvenList(head *ListNode) *ListNode {
9 | if head == nil {
10 | return nil
11 | }
12 | if head.Next == nil {
13 | return head
14 | }
15 |
16 | var (
17 | current = head
18 | prev = head.Next
19 | next = prev
20 | counter int
21 | )
22 |
23 | for next.Next != nil {
24 | counter++
25 |
26 | current.Next = next.Next
27 | current = next
28 | next = current.Next
29 | }
30 |
31 | if counter%2 == 0 {
32 | current.Next = prev
33 | } else {
34 | current.Next = nil
35 | next.Next = prev
36 | }
37 |
38 | return head
39 | }
40 |
--------------------------------------------------------------------------------
/leetcode/33/README.md:
--------------------------------------------------------------------------------
1 | # 33. Search in Rotated Sorted Array
2 |
3 | Подробнее о задаче: [Тыц](https://leetcode.com/problems/search-in-rotated-sorted-array/)
--------------------------------------------------------------------------------
/leetcode/33/solution.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | func search(nums []int, target int) int {
4 | n := len(nums)
5 | left, right := 0, n-1
6 |
7 | for left < right {
8 | mid := left + (right-left)/2
9 | if nums[mid] > nums[right] {
10 | left = mid + 1
11 | } else {
12 | right = mid
13 | }
14 | }
15 |
16 | pivot := left
17 | left, right = pivot, pivot-1+n
18 |
19 | for left <= right {
20 | mid := left + (right-left)/2
21 | midVal := nums[mid%n]
22 |
23 | if midVal > target {
24 | right = mid - 1
25 | } else if midVal < target {
26 | left = mid + 1
27 | } else {
28 | return mid % n
29 | }
30 | }
31 |
32 | return -1
33 | }
34 |
--------------------------------------------------------------------------------
/leetcode/33/solution_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "reflect"
6 | "testing"
7 | )
8 |
9 | type TestItemInput struct {
10 | nums []int
11 | target int
12 | }
13 | type TestItem struct {
14 | input TestItemInput
15 | output int
16 | }
17 |
18 | func TestTask(t *testing.T) {
19 | for i, v := range generateTasks() {
20 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
21 | res := search(v.input.nums, v.input.target)
22 | if !reflect.DeepEqual(res, v.output) {
23 | t.Errorf("Wrong test.\nOutput: \n%v \nExpected: \n%v", res, v.output)
24 | }
25 | })
26 | }
27 | }
28 |
29 | func generateTasks() []TestItem {
30 | return []TestItem{
31 | {
32 | input: TestItemInput{nums: []int{4, 5, 6, 7, 0, 1, 2}, target: 0},
33 | output: 4,
34 | },
35 | {
36 | input: TestItemInput{nums: []int{4, 5, 6, 7, 0, 1, 2}, target: 3},
37 | output: -1,
38 | },
39 | {
40 | input: TestItemInput{nums: []int{1}, target: 0},
41 | output: -1,
42 | },
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/leetcode/347/README.md:
--------------------------------------------------------------------------------
1 | # 347. Top K Frequent Elements
2 |
3 | Подробнее о задаче: [Тыц](https://leetcode.com/problems/top-k-frequent-elements/)
--------------------------------------------------------------------------------
/leetcode/347/solution.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | func topKFrequent(nums []int, k int) []int {
4 | var result []int
5 |
6 | var numMap = make(map[int]int)
7 | for _, val := range nums {
8 | numMap[val]++
9 | }
10 |
11 | freqMap := make(map[int][]int)
12 | for key, freq := range numMap {
13 | freqMap[freq] = append(freqMap[freq], key)
14 | }
15 |
16 | for i := len(nums); len(result) != k; i-- {
17 | for _, n := range freqMap[i] {
18 | if len(result) != k {
19 | result = append(result, n)
20 | }
21 | }
22 | }
23 |
24 | return result
25 | }
26 |
--------------------------------------------------------------------------------
/leetcode/347/solution_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "reflect"
6 | "testing"
7 | )
8 |
9 | type TestItemInput struct {
10 | arr []int
11 | k int
12 | }
13 |
14 | type TestItem struct {
15 | input TestItemInput
16 | output []int
17 | }
18 |
19 | func TestTask(t *testing.T) {
20 | for i, v := range generateTasks() {
21 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
22 | res := topKFrequent(v.input.arr, v.input.k)
23 | if !reflect.DeepEqual(res, v.output) {
24 | t.Errorf("Wrong test.\nOutput: \n%v \nExpected: \n%v", res, v.output)
25 | }
26 | })
27 | }
28 | }
29 |
30 | func generateTasks() []TestItem {
31 | return []TestItem{
32 | {
33 | input: TestItemInput{
34 | arr: []int{1, 1, 1, 2, 2, 3},
35 | k: 2,
36 | },
37 | output: []int{1, 2},
38 | },
39 | {
40 | input: TestItemInput{
41 | arr: []int{1},
42 | k: 1,
43 | },
44 | output: []int{1},
45 | },
46 | {
47 | input: TestItemInput{
48 | arr: []int{1, 1, 2, 4, 1, 3, 3, 4, 10},
49 | k: 3,
50 | },
51 | output: []int{1, 4, 3},
52 | },
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/leetcode/56/README.md:
--------------------------------------------------------------------------------
1 | # 56. Merge Intervals
2 |
3 | Подробнее о задаче: [Тыц](https://leetcode.com/problems/merge-intervals/)
--------------------------------------------------------------------------------
/leetcode/56/solution.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "sort"
5 | )
6 |
7 | func merge(intervals [][]int) [][]int {
8 | sort.Slice(intervals, func(i, j int) bool {
9 | return intervals[i][0] < intervals[j][0]
10 | })
11 |
12 | result := make([][]int, 0)
13 |
14 | for _, interval := range intervals {
15 | if len(result) == 0 || result[len(result)-1][1] < interval[0] {
16 | result = append(result, interval)
17 | } else {
18 | max := result[len(result)-1][1]
19 | if result[len(result)-1][1] < interval[1] {
20 | max = interval[1]
21 | }
22 | result[len(result)-1][1] = max
23 | }
24 | }
25 |
26 | return result
27 | }
28 |
--------------------------------------------------------------------------------
/leetcode/56/solution_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "reflect"
6 | "testing"
7 | )
8 |
9 | type TestItemInput struct {
10 | nums [][]int
11 | }
12 | type TestItem struct {
13 | input TestItemInput
14 | output [][]int
15 | }
16 |
17 | func TestTask(t *testing.T) {
18 | for i, v := range generateTasks() {
19 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
20 | res := merge(v.input.nums)
21 | if !reflect.DeepEqual(res, v.output) {
22 | t.Errorf("Wrong test.\nOutput: \n%v \nExpected: \n%v", res, v.output)
23 | }
24 | })
25 | }
26 | }
27 |
28 | func generateTasks() []TestItem {
29 | return []TestItem{
30 | {
31 | input: TestItemInput{nums: [][]int{{1, 3}, {2, 6}, {8, 10}, {15, 18}}},
32 | output: [][]int{{1, 6}, {8, 10}, {15, 18}},
33 | },
34 | {
35 | input: TestItemInput{nums: [][]int{{1, 4}, {4, 5}}},
36 | output: [][]int{{1, 5}},
37 | },
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/leetcode/66/README.md:
--------------------------------------------------------------------------------
1 | # 15. 3Sum
2 |
3 | Подробнее о задаче: [Тыц](https://leetcode.com/problems/3sum/description/)
--------------------------------------------------------------------------------
/leetcode/66/solution.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | func plusOne(digits []int) []int {
4 | n := len(digits)
5 |
6 | for i := n - 1; i >= 0; i-- {
7 | if digits[i] < 9 {
8 | digits[i]++
9 | return digits
10 | }
11 |
12 | digits[i] = 0
13 | }
14 |
15 | digits = append([]int{1}, digits...)
16 |
17 | return digits
18 | }
19 |
--------------------------------------------------------------------------------
/leetcode/66/solution_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "reflect"
6 | "testing"
7 | )
8 |
9 | type TestItemInput struct {
10 | nums []int
11 | }
12 | type TestItem struct {
13 | input TestItemInput
14 | output []int
15 | }
16 |
17 | func TestTask(t *testing.T) {
18 | for i, v := range generateTasks() {
19 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
20 | res := plusOne(v.input.nums)
21 | if !reflect.DeepEqual(res, v.output) {
22 | t.Errorf("Wrong test.\nOutput: \n%v \nExpected: \n%v", res, v.output)
23 | }
24 | })
25 | }
26 | }
27 |
28 | func generateTasks() []TestItem {
29 | return []TestItem{
30 | {
31 | input: TestItemInput{nums: []int{1, 2, 3}},
32 | output: []int{1, 2, 4},
33 | },
34 | {
35 | input: TestItemInput{nums: []int{4, 3, 2, 1}},
36 | output: []int{4, 3, 2, 2},
37 | },
38 | {
39 | input: TestItemInput{nums: []int{9}},
40 | output: []int{1, 0},
41 | },
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/leetcode/88/README.md:
--------------------------------------------------------------------------------
1 | # 88. Merge Sorted Array
2 |
3 | See more about problem: [Click](https://leetcode.com/problems/merge-sorted-array/)
--------------------------------------------------------------------------------
/leetcode/88/solution.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | func merge(nums1 []int, m int, nums2 []int, n int) {
4 | i, j, k := m-1, n-1, (m+n)-1
5 |
6 | for ; j >= 0; k-- {
7 | if i >= 0 && nums1[i] > nums2[j] {
8 | nums1[k] = nums1[i]
9 | i--
10 | } else {
11 | nums1[k] = nums2[j]
12 | j--
13 | }
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/leetcode/88/solution_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "reflect"
6 | "testing"
7 | )
8 |
9 | type TestItemInput struct {
10 | num1, num2 []int
11 | n1, n2 int
12 | }
13 |
14 | type TestItem struct {
15 | input TestItemInput
16 | output []int
17 | }
18 |
19 | func TestTask(t *testing.T) {
20 | for i, v := range generateTasks() {
21 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
22 | merge(v.input.num1, v.input.n1, v.input.num2, v.input.n2)
23 | if !reflect.DeepEqual(v.input.num1, v.output) {
24 | t.Errorf("Wrong test.\nOutput: \n%v \nExpected: \n%v", v.input.num1, v.output)
25 | }
26 | })
27 | }
28 | }
29 |
30 | func generateTasks() []TestItem {
31 | return []TestItem{
32 | {
33 | input: TestItemInput{
34 | num1: []int{1, 2, 3, 0, 0, 0},
35 | n1: 3,
36 | num2: []int{2, 5, 6},
37 | n2: 3,
38 | },
39 | output: []int{1, 2, 2, 3, 5, 6},
40 | },
41 | {
42 | input: TestItemInput{
43 | num1: []int{1},
44 | n1: 1,
45 | num2: []int{0},
46 | n2: 0,
47 | },
48 | output: []int{1},
49 | },
50 | {
51 | input: TestItemInput{
52 | num1: []int{0},
53 | n1: 0,
54 | num2: []int{1},
55 | n2: 1,
56 | },
57 | output: []int{1},
58 | },
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_1/final/A/input.txt:
--------------------------------------------------------------------------------
1 | 20
2 | 10 13 31 35 39 0 0 59 0 66 68 73 74 0 0 0 87 89 96 99
3 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_1/final/B/input.txt:
--------------------------------------------------------------------------------
1 | 4
2 | 1111
3 | 9999
4 | 1111
5 | 9911
6 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_1/tasks/A/README.md:
--------------------------------------------------------------------------------
1 | # A. Значения функции
2 |
3 | Вася делает тест по математике: вычисляет значение функций в различных точках. Стоит отличная погода, и друзья зовут Васю гулять. Но мальчик решил сначала закончить тест и только после этого идти к друзьям.
4 | К сожалению, Вася пока не умеет программировать. Зато вы умеете.
5 |
6 | Помогите Васе написать код функции, вычисляющей y = ax2 + bx + c. Напишите программу, которая будет по коэффициентам a, b, c и числу x выводить значение функции в точке x.
7 |
8 | ## Формат ввода
9 |
10 | На вход через пробел подаются числа a, x, b, c. В конце ввода находится перенос строки.
11 |
12 | ## Формат вывода
13 |
14 | Выведите одно число — значение функции в точке x.
15 |
16 |
17 | ### Пример 1
18 |
19 |
20 |
21 |
22 | Ввод |
23 | Вывод |
24 |
25 |
26 |
27 |
28 | -8 -5 -2 7 |
29 | -183 |
30 |
31 |
32 |
33 |
34 | ### Пример 2
35 |
36 |
37 |
38 |
39 | Ввод |
40 | Вывод |
41 |
42 |
43 |
44 |
45 | 8 2 9 -10 |
46 | 40 |
47 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_1/tasks/A/input.txt:
--------------------------------------------------------------------------------
1 | -8 -5 -2 7
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_1/tasks/A/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "bufio"
5 | "os"
6 | "strconv"
7 | "strings"
8 | )
9 |
10 | func main() {
11 | var a, b, c, x int
12 |
13 | reader := bufio.NewReader(os.Stdin)
14 | scanner := bufio.NewScanner(reader)
15 | writer := bufio.NewWriter(os.Stdout)
16 |
17 | scanner.Scan()
18 | line := scanner.Text()
19 |
20 | values := strings.Split(line, " ")
21 |
22 | a, _ = strconv.Atoi(values[0])
23 | x, _ = strconv.Atoi(values[1])
24 | b, _ = strconv.Atoi(values[2])
25 | c, _ = strconv.Atoi(values[3])
26 |
27 | result := a*(x*x) + b*x + c
28 |
29 | _, _ = writer.WriteString(strconv.Itoa(result))
30 | _, _ = writer.WriteString("\n")
31 | _ = writer.Flush()
32 | }
33 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_1/tasks/B/input.txt:
--------------------------------------------------------------------------------
1 | 1 2 -3
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_1/tasks/B/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "bufio"
5 | "os"
6 | "strconv"
7 | "strings"
8 | )
9 |
10 | func main() {
11 |
12 | reader := bufio.NewReader(os.Stdin)
13 | scanner := bufio.NewScanner(reader)
14 | writer := bufio.NewWriter(os.Stdout)
15 |
16 | scanner.Scan()
17 | line := scanner.Text()
18 |
19 | var result = "WIN"
20 | var values = strings.Split(line, " ")
21 | var last int
22 |
23 | for i := 0; i < len(values); i++ {
24 | num, _ := strconv.Atoi(values[i])
25 | if num%2 == 0 {
26 | if last == 1 {
27 | result = "FAIL"
28 | break
29 | }
30 | last = 2
31 | } else {
32 | if last == 2 {
33 | result = "FAIL"
34 | break
35 | }
36 | last = 1
37 | }
38 | }
39 |
40 | _, _ = writer.WriteString(result)
41 | _, _ = writer.WriteString("\n")
42 | _ = writer.Flush()
43 | }
44 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_1/tasks/C/input.txt:
--------------------------------------------------------------------------------
1 | 4
2 | 3
3 | 1 2 3
4 | 0 2 6
5 | 7 4 1
6 | 2 7 0
7 | 3
8 | 0
9 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_1/tasks/D/input.txt:
--------------------------------------------------------------------------------
1 | 7
2 | -1 -10 -8 0 2 0 5
3 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_1/tasks/E/input.txt:
--------------------------------------------------------------------------------
1 | 172
2 | ozmfudehppmivpkrmkvtnnzb ranigcyhpvooglyahlcjtusipmebtblqqquuweugqlkaakfdlcwzxmtcnzrcgyhsdbehy igrzfcsjbjeuhkkcbvbuvfdepdvnsiipkivrmzewqpryndfmvyhrzikzzddlqoovzmoikpwxirwn
3 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_1/tasks/E/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "bufio"
5 | "fmt"
6 | "os"
7 | "strings"
8 | )
9 |
10 | func main() {
11 | inp := GetInputFromFile()
12 | defer inp.Close()
13 |
14 | var find string
15 |
16 | reader := bufio.NewReader(inp)
17 | _, _ = reader.ReadString('\n')
18 | line, _ := reader.ReadString('\n')
19 | strItems := strings.Split(strings.Trim(line, ""), " ")
20 |
21 | for i := 0; i < len(strItems); i++ {
22 | trimStr := strings.TrimSpace(strItems[i])
23 | if len(trimStr) > len(find) {
24 | find = trimStr
25 | }
26 | }
27 |
28 | fmt.Println(find)
29 | fmt.Println(len(find))
30 | }
31 |
32 | func GetInputFromFile() *os.File {
33 | file, err := os.Open("./input.txt")
34 | if err != nil {
35 | panic(err)
36 | }
37 |
38 | return file
39 | }
40 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_1/tasks/F/README.md:
--------------------------------------------------------------------------------
1 | # F. Палиндром
2 |
3 | Помогите Васе понять, будет ли фраза палиндромом.
4 | Учитываются только буквы и цифры, заглавные и строчные буквы считаются одинаковыми.
5 |
6 | Решение должно работать за O(N), где N — длина строки на входе.
7 |
8 | ## Формат ввода
9 |
10 | В единственной строке записана фраза или слово. Буквы могут быть только латинские. Длина текста не превосходит 20000 символов.
11 | Фраза может состоять из строчных и прописных латинских букв, цифр, знаков препинания.
12 |
13 | ## Формат вывода
14 |
15 | Выведите «True», если фраза является палиндромом, и «False», если не является.
16 |
17 | ### Пример 1
18 |
19 |
20 |
21 |
22 | Ввод |
23 | Вывод |
24 |
25 |
26 |
27 |
28 |
29 | A man, a plan, a canal: Panama
30 | |
31 |
32 | True
33 | |
34 |
35 |
36 |
37 |
38 | ### Пример 2
39 |
40 |
41 |
42 |
43 | Ввод |
44 | Вывод |
45 |
46 |
47 |
48 |
49 |
50 | zo
51 | |
52 |
53 | False
54 | |
55 |
56 |
57 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_1/tasks/F/input.txt:
--------------------------------------------------------------------------------
1 | zoz
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_1/tasks/F/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "bufio"
5 | "fmt"
6 | "os"
7 | "regexp"
8 | "strings"
9 | )
10 |
11 | func main() {
12 | var inp = GetInputFromFile()
13 | defer inp.Close()
14 |
15 | reader := bufio.NewReader(inp)
16 | str, _ := reader.ReadString('\n')
17 |
18 | str = strings.ToLower(str)
19 | re := regexp.MustCompile("[^a-z]")
20 | str = re.ReplaceAllString(str, "")
21 |
22 | var result = "True"
23 | for i := 0; i < len(str); i++ {
24 | if str[i] != str[len(str)-(i+1)] {
25 | result = "False"
26 | break
27 | }
28 | }
29 |
30 | fmt.Println(result)
31 | }
32 |
33 | func GetInputFromFile() *os.File {
34 | file, err := os.Open("./input.txt")
35 | if err != nil {
36 | panic(err)
37 | }
38 |
39 | return file
40 | }
41 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_1/tasks/G/README.md:
--------------------------------------------------------------------------------
1 | # G. Работа из дома
2 |
3 | Вася реализовал функцию, которая переводит целое число из десятичной системы в двоичную. Но, кажется, она получилась не очень оптимальной.
4 |
5 | Попробуйте написать более эффективную программу.
6 |
7 | **Не используйте встроенные средства языка по переводу чисел в бинарное представление.**
8 |
9 | ## Формат ввода
10 |
11 | На вход подаётся целое число в диапазоне от 0 до 10000.
12 |
13 | ## Формат вывода
14 |
15 | Выведите двоичное представление этого числа.
16 |
17 | ### Пример 1
18 |
19 |
20 |
21 |
22 | Ввод |
23 | Вывод |
24 |
25 |
26 |
27 |
28 | 5 |
29 | 101 |
30 |
31 |
32 |
33 |
34 | ### Пример 2
35 |
36 |
37 |
38 |
39 | Ввод |
40 | Вывод |
41 |
42 |
43 |
44 |
45 | 14 |
46 | 1110 |
47 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_1/tasks/G/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | )
6 |
7 | func main() {
8 |
9 | var n int
10 |
11 | fmt.Scan(&n)
12 | fmt.Println(numToBinary(n))
13 | }
14 |
15 | func numToBinary(n int) string {
16 | var binaryStr string
17 |
18 | for n > 0 {
19 | binaryStr = fmt.Sprintf("%d%s", n%2, binaryStr)
20 | n = n / 2
21 | }
22 |
23 | return binaryStr
24 | }
25 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_1/tasks/H/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | )
6 |
7 | func main() {
8 |
9 | var one, two int
10 |
11 | fmt.Scanf("%d", &one)
12 | fmt.Scanf("%d", &two)
13 |
14 | fmt.Println("One:", one)
15 | fmt.Println("Two:", two)
16 |
17 | }
18 |
19 | func add(a, b int) int {
20 | if b == 0 {
21 | return a
22 | }
23 | sum := a ^ b
24 | carry := (a & b) << 1
25 | return add(sum, carry)
26 | }
27 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_1/tasks/I/README.md:
--------------------------------------------------------------------------------
1 | # I. Степень четырёх
2 |
3 | Вася на уроке математики изучил степени. Теперь он хочет написать программу, которая определяет, будет ли положительное целое число степенью четвёрки.
4 |
5 | Подсказка: степенью четвёрки будут все числа вида 4n, где n – целое неотрицательное число.
6 |
7 | ## Формат ввода
8 |
9 | На вход подаётся целое число в диапазоне от 1 до 10000.
10 |
11 | ## Формат вывода
12 |
13 | Выведите «True», если число является степенью четырёх, «False» –— в обратном случае.
14 |
15 | ### Пример 1
16 |
17 |
18 |
19 |
20 | Ввод |
21 | Вывод |
22 |
23 |
24 |
25 |
26 | 15 |
27 | False |
28 |
29 |
30 |
31 |
32 | ### Пример 2
33 |
34 |
35 |
36 |
37 | Ввод |
38 | Вывод |
39 |
40 |
41 |
42 |
43 | 15 |
44 | True |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_1/tasks/I/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | )
6 |
7 | func main() {
8 |
9 | var n int
10 |
11 | fmt.Scan(&n)
12 |
13 | if res := numToDegree(n, 4); res {
14 | fmt.Println("True")
15 | } else {
16 | fmt.Println("False")
17 | }
18 | }
19 |
20 | func numToDegree(num int, degree int) bool {
21 | for num%degree == 0 {
22 | num /= degree
23 | }
24 |
25 | return num == 1
26 | }
27 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_1/tasks/J/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "strings"
6 | )
7 |
8 | func main() {
9 | var n int
10 | fmt.Scan(&n)
11 |
12 | var res []string
13 | var i = 2
14 |
15 | for i*i <= n {
16 | if n%i == 0 {
17 | n /= i
18 | res = append(res, fmt.Sprintf("%d", i))
19 | } else {
20 | i += 1
21 | }
22 | }
23 |
24 | if n > 1 {
25 | res = append(res, fmt.Sprintf("%d", n))
26 | }
27 |
28 | fmt.Println(strings.Join(res, " "))
29 | }
30 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_1/tasks/L/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "bufio"
5 | "os"
6 | "sort"
7 | "strings"
8 | )
9 |
10 | func main() {
11 | reader := bufio.NewReader(os.Stdin)
12 | scanner := bufio.NewScanner(reader)
13 | writer := bufio.NewWriter(os.Stdout)
14 |
15 | var find string
16 | var values [][]string
17 |
18 | for i := 1; i <= 2; i++ {
19 | scanner.Scan()
20 |
21 | parse := strings.Split(scanner.Text(), "")
22 | sort.StringSlice(parse).Sort()
23 |
24 | values = append(values, parse)
25 | }
26 |
27 | for i := 0; i < len(values[1]); i++ {
28 | if i+1 > len(values[0]) {
29 | find = values[1][i]
30 | break
31 | }
32 | if values[1][i] != values[0][i] {
33 | find = values[1][i]
34 | break
35 | }
36 | }
37 |
38 | _, _ = writer.WriteString(find)
39 | _, _ = writer.WriteString("\n")
40 | _ = writer.Flush()
41 | }
42 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_2/final/A/input.txt:
--------------------------------------------------------------------------------
1 | 7
2 | 7
3 | pop_front
4 | pop_front
5 | push_front 741
6 | push_front 648
7 | pop_front
8 | pop_back
9 | pop_front
10 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_2/final/B/input.txt:
--------------------------------------------------------------------------------
1 | 4 2 * 4 / 25 * 2 - 12 / 500 2 * + 2 / -999 + 71 + -1 * 2 /
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_2/final/B/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "testing"
6 | )
7 |
8 | type task struct {
9 | Input,
10 | Result string
11 | }
12 |
13 | func TestTask(t *testing.T) {
14 |
15 | var taskItems = generateTasks()
16 |
17 | for i := 0; i < len(taskItems); i++ {
18 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
19 | res, err := solution(taskItems[i].Input)
20 | if err != nil {
21 | t.Errorf("Ошибка выполнения: %s ", err.Error())
22 | } else if fmt.Sprint(res) != taskItems[i].Result {
23 | t.Errorf("Неверный ответ решения!\nОтвет: %f \nВерно: %s", res, taskItems[i].Result)
24 | }
25 | })
26 | }
27 | }
28 |
29 | // generateTasks создает задачи для теста
30 | func generateTasks() (tasks []task) {
31 | tasks = append(
32 | tasks,
33 | task{
34 | Input: "2 1 + 3 *",
35 | Result: "9",
36 | },
37 | task{
38 | Input: "7 2 + 4 * 2 +",
39 | Result: "38",
40 | },
41 | task{
42 | Input: "4 2 * 4 / 25 * 2 - 12 / 1000 + 2 / -999 +",
43 | Result: "-497",
44 | },
45 | task{
46 | Input: "4 2 * 4 / 25 * 2 - 12 / 500 2 * + 2 / -999 + 71 + -1 * 2 / 1000 + 6 * 8065 -",
47 | Result: "-787",
48 | },
49 | task{
50 | Input: "4 2 * 4 / 25 * 2 - 12 / 500 2 * + 2 / -999 + 71 + -1 * 2 / 1000 + 6 * 8065 - 787 + 66 *",
51 | Result: "0",
52 | },
53 | )
54 |
55 | return
56 | }
57 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_2/tasks/A/input.txt:
--------------------------------------------------------------------------------
1 | 9
2 | 5
3 | -7 -1 0 -4 -9
4 | 5 -1 2 2 9
5 | 3 1 -8 -1 -7
6 | 9 0 8 -8 -1
7 | 2 4 5 2 8
8 | -7 10 0 -4 -8
9 | -3 10 -7 10 3
10 | 1 6 -7 -5 9
11 | -1 9 9 1 9
12 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_2/tasks/B/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import "fmt"
4 |
5 | // ListNode
6 | // Comment it before submitting
7 | type ListNode struct {
8 | data string
9 | next *ListNode
10 | }
11 |
12 | // Solution решение
13 | func Solution(head *ListNode) {
14 | fmt.Println(head.data)
15 | if head.next != nil {
16 | Solution(head.next)
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_2/tasks/C/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | )
6 |
7 | // ListNode
8 | // Comment it before submitting
9 | type ListNode struct {
10 | data string
11 | next *ListNode
12 | }
13 |
14 | // Solution решение
15 | func Solution(head *ListNode, idx int) *ListNode {
16 | if idx == 0 {
17 | head = head.next
18 | }
19 |
20 | if head != nil {
21 | fmt.Println(head.data)
22 | }
23 |
24 | if head != nil && head.next != nil {
25 | return Solution(head.next, idx-1)
26 | }
27 | return nil
28 | }
29 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_2/tasks/D/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | // ListNode
4 | // Comment it before submitting
5 | type ListNode struct {
6 | data string
7 | next *ListNode
8 | }
9 |
10 | var idxNode = 0
11 |
12 | // Solution решение
13 | func Solution(head *ListNode, elem string) int {
14 |
15 | if elem == head.data {
16 | return idxNode
17 | }
18 |
19 | if head.next != nil {
20 | idxNode++
21 | } else {
22 | return -1
23 | }
24 |
25 | return Solution(head.next, elem)
26 | }
27 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_2/tasks/E/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | // ListNode
4 | // Comment it before submitting
5 | type ListNode struct {
6 | data string
7 | next *ListNode
8 | prev *ListNode
9 | }
10 |
11 | // Solution решение
12 | func Solution(head *ListNode) *ListNode {
13 | next := head.next
14 | head.prev, head.next = head.next, head.prev
15 |
16 | if next != nil {
17 | return Solution(next)
18 | }
19 |
20 | return head
21 | }
22 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_2/tasks/F/input.txt:
--------------------------------------------------------------------------------
1 | 7
2 | get_max
3 | pop
4 | pop
5 | pop
6 | push 10
7 | get_max
8 | push -9
9 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_2/tasks/G/input.txt:
--------------------------------------------------------------------------------
1 | 10
2 | get_max
3 | push -6
4 | pop
5 | pop
6 | get_max
7 | push 2
8 | get_max
9 | pop
10 | push -2
11 | push -6
12 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_2/tasks/H/input.txt:
--------------------------------------------------------------------------------
1 | {[()]}
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_2/tasks/H/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "testing"
6 | )
7 |
8 | type task struct {
9 | Input,
10 | Result string
11 | }
12 |
13 | func TestTask(t *testing.T) {
14 |
15 | var taskItems = generateTasks()
16 |
17 | for i := 0; i < len(taskItems); i++ {
18 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
19 | res := solution(taskItems[i].Input)
20 | if res != taskItems[i].Result {
21 | t.Errorf("Неверный ответ решения!\nОтвет: %s \nВерно: %s", res, taskItems[i].Result)
22 | }
23 | })
24 | }
25 | }
26 |
27 | // generateTasks создает задачи для теста
28 | func generateTasks() (tasks []task) {
29 | tasks = append(
30 | tasks,
31 | task{
32 | Input: "{[()]}",
33 | Result: "True",
34 | },
35 | task{
36 | Input: "()",
37 | Result: "True",
38 | },
39 | task{
40 | Input: "[()}",
41 | Result: "False",
42 | },
43 | )
44 |
45 | return
46 | }
47 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_2/tasks/I/input.txt:
--------------------------------------------------------------------------------
1 | 17
2 | 8
3 | push -82
4 | push -25
5 | push -57
6 | push -24
7 | size
8 | push 12
9 | push 21
10 | push 62
11 | push 64
12 | push -90
13 | size
14 | pop
15 | peek
16 | push -10
17 | push 60
18 | push 67
19 | size
20 |
21 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_2/tasks/J/input.txt:
--------------------------------------------------------------------------------
1 | 10
2 | put -34
3 | put -23
4 | get
5 | size
6 | get
7 | size
8 | get
9 | get
10 | put 80
11 | size
12 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_2/tasks/K/README.md:
--------------------------------------------------------------------------------
1 | # K. Рекурсивные числа Фибоначчи
2 |
3 | У Тимофея было n(0 ≤ n ≤ 32) стажёров. Каждый стажёр хотел быть лучше своих предшественников, поэтому
4 | i-й стажёр делал столько коммитов, сколько делали два предыдущих стажёра в сумме. Два первых стажёра были менее инициативными —– они сделали по одному коммиту.
5 |
6 | Пусть Fi —– число коммитов, сделанных i-м стажёром (стажёры нумеруются с нуля). Тогда выполняется следующее:
7 | F0 = F1 = 1. Для всех i ≥ 2 выполнено Fi = Fi−1 + Fi−2.
8 |
9 | Определите, сколько кода напишет следующий стажёр –— найдите Fn.
10 |
11 | Решение должно быть реализовано рекурсивно.
12 |
13 | ## Формат ввода
14 |
15 | На вход подаётся n — целое число в диапазоне от 0 до 32.
16 |
17 | ## Формат вывода
18 |
19 | Нужно вывести Fn.
20 |
21 | ### Пример 1
22 |
23 |
24 |
25 |
26 | Ввод |
27 | Вывод |
28 |
29 |
30 |
31 |
32 | 3 |
33 | 3 |
34 |
35 |
36 |
37 |
38 | ### Пример 2
39 |
40 |
41 |
42 |
43 | Ввод |
44 | Вывод |
45 |
46 |
47 |
48 |
49 | 0 |
50 | 1 |
51 |
52 |
53 |
54 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_2/tasks/K/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | )
6 |
7 | func main() {
8 |
9 | var n int
10 |
11 | fmt.Scan(&n)
12 | fmt.Println(solution(n))
13 | }
14 |
15 | // solution решение задачи
16 | func solution(n int) int {
17 | if n <= 1 {
18 | return 1
19 | }
20 |
21 | return solution(n-1) + solution(n-2)
22 | }
23 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_2/tasks/K/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "testing"
6 | )
7 |
8 | type task struct {
9 | Input, Result int
10 | }
11 |
12 | func TestTask(t *testing.T) {
13 |
14 | var taskItems = generateTasks()
15 |
16 | for i := 0; i < len(taskItems); i++ {
17 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
18 | res := solution(taskItems[i].Input)
19 | if res != taskItems[i].Result {
20 | t.Errorf("Неверный ответ решения!\nОтвет: %d \nВерно: %d", res, taskItems[i].Result)
21 | }
22 | })
23 | }
24 | }
25 |
26 | // generateTasks создает задачи для теста
27 | func generateTasks() (tasks []task) {
28 | tasks = append(
29 | tasks,
30 | task{
31 | Input: 3,
32 | Result: 3,
33 | },
34 | task{
35 | Input: 0,
36 | Result: 1,
37 | },
38 | )
39 |
40 | return
41 | }
42 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_2/tasks/L/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "bufio"
5 | "fmt"
6 | "math"
7 | "os"
8 | "strconv"
9 | "strings"
10 | )
11 |
12 | func main() {
13 | n, k, err := getInputData()
14 | if err != nil {
15 | showError(err)
16 | }
17 |
18 | result := solution(n, k)
19 | fmt.Println(result)
20 | }
21 |
22 | func solution(n, k int) int {
23 | if n < 2 {
24 | return 1
25 | }
26 |
27 | var result int
28 | ab := []int{1, 1}
29 | k = int(math.Pow(10, float64(k)))
30 |
31 | for i := 0; i < n-1; i++ {
32 | s := (ab[0] + ab[1]) % k
33 | ab[0] = ab[1]
34 | ab[1] = s
35 | result = ab[1]
36 | }
37 |
38 | return result
39 | }
40 |
41 | // getInputData парсинг входных данных
42 | func getInputData() (n, k int, err error) {
43 |
44 | reader := bufio.NewReader(os.Stdin)
45 |
46 | strNum, _, _ := reader.ReadLine()
47 | strExp := strings.Split(string(strNum), " ")
48 |
49 | n, err = strconv.Atoi(strExp[0])
50 | if err != nil {
51 | return
52 | }
53 |
54 | k, err = strconv.Atoi(strExp[1])
55 | if err != nil {
56 | return
57 | }
58 |
59 | defer reader.Reset(reader)
60 | return
61 | }
62 |
63 | // showError вывод ошибки
64 | func showError(err error) {
65 | panic(err)
66 | }
67 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_2/tasks/L/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "testing"
6 | )
7 |
8 | type task struct {
9 | Input []int
10 | Result int
11 | }
12 |
13 | func TestTask(t *testing.T) {
14 |
15 | var taskItems = generateTasks()
16 |
17 | for i := 0; i < len(taskItems); i++ {
18 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
19 | res := solution(taskItems[i].Input[0], taskItems[i].Input[1])
20 | if res != taskItems[i].Result {
21 | t.Errorf("Неверный ответ решения!\nОтвет: %d \nВерно: %d", res, taskItems[i].Result)
22 | }
23 | })
24 | }
25 | }
26 |
27 | // generateTasks создает задачи для теста
28 | func generateTasks() (tasks []task) {
29 | tasks = append(
30 | tasks,
31 | task{
32 | Input: []int{3, 1},
33 | Result: 3,
34 | },
35 | task{
36 | Input: []int{10, 1},
37 | Result: 9,
38 | },
39 | task{
40 | Input: []int{237, 7},
41 | Result: 471519,
42 | },
43 | task{
44 | Input: []int{1000000, 8},
45 | Result: 26937501,
46 | },
47 | )
48 |
49 | return
50 | }
51 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/final/A/input.txt:
--------------------------------------------------------------------------------
1 | 100
2 | 25
3 | 3271 3298 3331 3397 3407 3524 3584 3632 3734 3797 3942 4000 4180 4437 4464 4481 4525 4608 4645 4803 4804 4884 4931 4965 5017 5391 5453 5472 5671 5681 5959 6045 6058 6301 6529 6621 6961 7219 7291 7372 7425 7517 7600 7731 7827 7844 7987 8158 8169 8265 8353 8519 8551 8588 8635 9209 9301 9308 9336 9375 9422 9586 9620 9752 9776 9845 9906 9918 16 25 45 152 199 309 423 614 644 678 681 725 825 830 936 1110 1333 1413 1617 1895 1938 2107 2144 2184 2490 2517 2769 2897 2970 3023 3112 3156
4 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/final/A/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | // brokenSearch основная функция
4 | func brokenSearch(arr []int, k int) int {
5 | return binarySearch(arr, k, 0, len(arr)-1)
6 | }
7 |
8 | // binarySearch бинарный поиск по массиву
9 | func binarySearch(arr []int, k, left, right int) int {
10 |
11 | if left > right {
12 | return -1
13 | }
14 |
15 | mid := (right + left) / 2
16 | if arr[mid] == k {
17 | return mid
18 | }
19 |
20 | // если левая часть отсортирована
21 | if arr[left] <= arr[mid] {
22 | if k >= arr[left] && k <= arr[mid] {
23 | right = mid - 1
24 | } else {
25 | left = mid + 1
26 | }
27 | // тогда по правой стороне
28 | } else {
29 | if k >= arr[mid] && k <= arr[right] {
30 | left = mid + 1
31 | } else {
32 | right = mid - 1
33 | }
34 | }
35 |
36 | // рекурсивно идем дальше с учетём измененного отрезка
37 | return binarySearch(arr, k, left, right)
38 | }
39 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/final/B/input.txt:
--------------------------------------------------------------------------------
1 | 5
2 | alla 4 100
3 | gena 6 1000
4 | gosha 2 90
5 | rita 2 90
6 | timofey 4 80
7 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/tasks/A/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "strings"
6 | )
7 |
8 | func main() {
9 |
10 | var n int
11 | fmt.Scan(&n)
12 |
13 | res := strings.Builder{}
14 | solution(n, "", 0, 0, &res)
15 | fmt.Println(strings.TrimRight(res.String(), "\n"))
16 | }
17 |
18 | func solution(n int, line string, l, r int, s *strings.Builder) {
19 | if l == n && r == n {
20 | s.WriteString(line + "\n")
21 | } else {
22 | if l < n {
23 | solution(n, line+"(", l+1, r, s)
24 | }
25 | if r < l {
26 | solution(n, line+")", l, r+1, s)
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/tasks/A/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "strings"
6 | "testing"
7 | )
8 |
9 | type task struct {
10 | N int
11 | Result string
12 | }
13 |
14 | func TestTask(t *testing.T) {
15 |
16 | var taskItems = generateTasks()
17 |
18 | for i := 0; i < len(taskItems); i++ {
19 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
20 | s := strings.Builder{}
21 | solution(taskItems[i].N, "", 0, 0, &s)
22 | if strings.TrimRight(s.String(), "\n") != taskItems[i].Result {
23 | t.Errorf("Неверный ответ решения!\nОтвет: %s \nВерно: %s", s.String(), taskItems[i].Result)
24 | }
25 | })
26 | }
27 | }
28 |
29 | func generateTasks() (tasks []task) {
30 | tasks = append(
31 | tasks,
32 | task{
33 | N: 3,
34 | Result: `((()))
35 | (()())
36 | (())()
37 | ()(())
38 | ()()()`},
39 | task{
40 | N: 2,
41 | Result: `(())
42 | ()()`},
43 | )
44 |
45 | return
46 | }
47 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/tasks/B/README.md:
--------------------------------------------------------------------------------
1 | # B. Комбинации
2 |
3 | На клавиатуре старых мобильных телефонов каждой цифре соответствовало несколько букв.
4 |
5 | Примерно так:
6 |
7 | 2:'abc',
8 | 3:'def',
9 | 4:'ghi',
10 | 5:'jkl',
11 | 6:'mno',
12 | 7:'pqrs',
13 | 8:'tuv',
14 | 9:'wxyz'
15 |
16 | Вам известно в каком порядке были нажаты кнопки телефона, без учета повторов. Напечатайте все комбинации букв, которые можно набрать такой последовательностью нажатий.
17 |
18 | 
19 |
20 | ## Формат ввода
21 |
22 | На вход подается строка, состоящая из цифр 2-9 включительно. Длина строки не превосходит 10 символов.
23 |
24 | ## Формат вывода
25 |
26 | Выведите все возможные комбинации букв через пробел.
27 |
28 | ### Пример 1
29 |
30 |
31 |
32 | 23 |
33 | ad ae af bd be bf cd ce cf |
34 |
35 |
36 |
37 | ### Пример 2
38 |
39 |
40 |
41 | 92 |
42 | wa wb wc xa xb xc ya yb yc za zb zc |
43 |
44 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/tasks/B/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "strings"
6 | )
7 |
8 | var numberRules = map[string]string{
9 | "2": "abc",
10 | "3": "def",
11 | "4": "ghi",
12 | "5": "jkl",
13 | "6": "mno",
14 | "7": "pqrs",
15 | "8": "tuv",
16 | "9": "wxyz",
17 | }
18 |
19 | func main() {
20 | var input string
21 | _, _ = fmt.Scan(&input)
22 |
23 | fmt.Println(strings.Trim(fmt.Sprint(solution(input)), "[]"))
24 | }
25 |
26 | func solution(digits string) []string {
27 | if digits == "" {
28 | return nil
29 | }
30 |
31 | var result []string
32 | var words = numberRules[digits[len(digits)-1:]]
33 | var combinations = solution(digits[:len(digits)-1])
34 |
35 | if len(combinations) > 0 {
36 | for _, combination := range combinations {
37 | for _, c := range strings.Split(words, "") {
38 | result = append(result, combination+c)
39 | }
40 | }
41 | } else {
42 | for _, c := range strings.Split(words, "") {
43 | result = append(result, c)
44 | }
45 | }
46 |
47 | return result
48 | }
49 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/tasks/B/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "strings"
6 | "testing"
7 | )
8 |
9 | type task struct {
10 | Input string
11 | Result string
12 | }
13 |
14 | func TestTask(t *testing.T) {
15 | var taskItems = generateTasks()
16 | for i := 0; i < len(taskItems); i++ {
17 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
18 | res := solution(taskItems[i].Input)
19 | if strings.Trim(fmt.Sprint(res), "[]") != taskItems[i].Result {
20 | t.Errorf("Неверный ответ решения!\nОтвет: %s \nВерно: %s", res, taskItems[i].Result)
21 | }
22 | })
23 | }
24 | }
25 |
26 | func generateTasks() (tasks []task) {
27 | tasks = append(
28 | tasks,
29 | task{
30 | Input: "23",
31 | Result: "ad ae af bd be bf cd ce cf",
32 | },
33 | task{
34 | Input: "92",
35 | Result: "wa wb wc xa xb xc ya yb yc za zb zc",
36 | },
37 | )
38 |
39 | return
40 | }
41 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/tasks/C/README.md:
--------------------------------------------------------------------------------
1 | # C. Подпоследовательность
2 |
3 | Гоша любит играть в игру «Подпоследовательность»: даны 2 строки, и нужно понять, является ли первая из них подпоследовательностью второй. Когда строки достаточно длинные, очень трудно получить ответ на этот вопрос, просто посмотрев на них. Помогите Гоше написать функцию, которая решает эту задачу.
4 |
5 |
6 | ## Формат ввода
7 |
8 | В первой строке записана строка s.
9 |
10 | Во второй —- строка t.
11 |
12 | Обе строки состоят из маленьких латинских букв, длины строк не превосходят 150000. Строки могут быть пустыми.
13 |
14 | ## Формат вывода
15 |
16 | Выведите True, если s является подпоследовательностью t, иначе —– False.
17 |
18 |
19 | ### Пример 1
20 |
21 |
22 |
23 |
24 | abc
25 | ahbgdcu
26 | |
27 | True
|
28 |
29 |
30 |
31 |
32 | ### Пример 2
33 |
34 |
35 |
36 |
37 |
38 | abcp
39 | ahpc
40 | |
41 | False
|
42 |
43 |
44 |
45 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/tasks/C/input.txt:
--------------------------------------------------------------------------------
1 | ijha
2 | hmrqvftefyixinahlzgbkidroxiptbbkjmtwpsujevkulgrjiwiwzyhngulrodiwyg
3 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/tasks/C/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "bufio"
5 | "fmt"
6 | "os"
7 | )
8 |
9 | func main() {
10 | str1, str2, err := getInputData()
11 | if err != nil {
12 | showError(err)
13 | }
14 |
15 | fmt.Println(solution(str1, str2))
16 | }
17 |
18 | func solution(s, t string) string {
19 | lenS, lenT := len(s), len(t)
20 | if lenS == 0 || s == " " || s == t {
21 | return "True"
22 | }
23 |
24 | if lenS > lenT {
25 | return "False"
26 | }
27 |
28 | var i, j int
29 | for j < lenT {
30 | if s[i] == t[j] {
31 | i++
32 | if i >= lenS {
33 | return "True"
34 | }
35 | }
36 | j++
37 | }
38 |
39 | return "False"
40 | }
41 |
42 | func getInputData() (s, t string, err error) {
43 | var input *os.File
44 |
45 | input, err = getInputFromFile()
46 | if err != nil {
47 | showError(err)
48 | }
49 | // close file
50 | defer func(input *os.File) {
51 | _ = input.Close()
52 | }(input)
53 |
54 | reader := bufio.NewReader(input)
55 | s, _ = reader.ReadString('\n')
56 | t, _ = reader.ReadString('\n')
57 |
58 | return
59 | }
60 |
61 | func getInputFromFile() (*os.File, error) {
62 | file, err := os.Open("input.txt")
63 | if err != nil {
64 | return nil, err
65 | }
66 |
67 | return file, nil
68 | }
69 |
70 | func showError(err interface{}) {
71 | panic(err)
72 | }
73 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/tasks/D/input.txt:
--------------------------------------------------------------------------------
1 | 2
2 | 1 2
3 | 3
4 | 2 1 3
5 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/tasks/D/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/tasks/E/README.md:
--------------------------------------------------------------------------------
1 | # E. Покупка домов
2 |
3 | Тимофей решил купить несколько домов на знаменитом среди разработчиков Алгосском архипелаге. Он нашёл n объявлений о продаже, где указана стоимость каждого дома в алгосских франках. А у Тимофея есть k франков. Помогите ему определить, какое наибольшее количество домов на Алгосах он сможет приобрести за эти деньги.
4 |
5 | ## Формат ввода
6 |
7 | В первой строке через пробел записаны натуральные числа n и k.
8 |
9 | n — количество домов, которые рассматривает Тимофей, оно не превосходит 1000;
10 |
11 | k — общий бюджет, не превосходит 10000;
12 |
13 | В следующей строке через пробел записано n стоимостей домов. Каждое из чисел не превосходит 10000. Все стоимости — натуральные числа.
14 |
15 | ## Формат вывода
16 |
17 | Выведите одно число —– наибольшее количество домов, которое может купить Тимофей.
18 |
19 | ### Пример 1
20 |
21 |
22 |
23 |
24 | 3 300
25 | 999 999 999
26 | |
27 |
28 | 0
29 |
30 |
31 | |
32 |
33 |
34 | ### Пример 2
35 |
36 |
37 |
38 |
39 | 3 1000
40 | 350 999 200
41 | |
42 |
43 | 2
44 |
45 |
46 | |
47 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/tasks/E/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/tasks/E/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/tasks/F/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/tasks/F/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/tasks/G/README.md:
--------------------------------------------------------------------------------
1 | # G. Гардероб
2 |
3 | Рита решила оставить у себя одежду только трёх цветов: розового, жёлтого и малинового. После того как вещи других расцветок были убраны, Рита захотела отсортировать свой новый гардероб по цветам. Сначала должны идти вещи розового цвета, потом —– жёлтого, и в конце —– малинового.
4 | Помогите Рите справиться с этой задачей.
5 |
6 | Примечание: попробуйте решить задачу за один проход по массиву!
7 |
8 | ## Формат ввода
9 |
10 | В первой строке задано количество предметов в гардеробе: n –— оно не превосходит 1000000. Во второй строке даётся массив, в котором указан цвет для каждого предмета.
11 |
12 | Розовый цвет обозначен 0, жёлтый —– 1, малиновый –— 2.
13 |
14 | ## Формат вывода
15 |
16 | Нужно вывести в строку через пробел цвета предметов в правильном порядке.
17 |
18 | ### Пример 1
19 |
20 |
21 |
22 | 7
23 | 0 2 1 2 0 0 1
24 | |
25 |
26 | 0 0 0 1 1 2 2
27 |
28 |
29 | |
30 |
31 |
32 | ### Пример 2
33 |
34 |
35 |
36 | 5
37 | 2 1 2 0 1
38 | |
39 |
40 | 0 1 1 2 2
41 |
42 |
43 | |
44 |
45 |
46 | ### Пример 3
47 |
48 |
49 |
50 | 6
51 | 2 1 1 2 0 2
52 | |
53 |
54 | 0 1 1 2 2 2
55 |
56 |
57 | |
58 |
59 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/tasks/G/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/tasks/H/README.md:
--------------------------------------------------------------------------------
1 | # H. Большое число
2 |
3 | Вечером ребята решили поиграть в игру «Большое число».
4 | Даны числа. Нужно определить, какое самое большое число можно из них составить.
5 |
6 | ## Формат ввода
7 |
8 | В первой строке записано n — количество чисел. Оно не превосходит 100.
9 | Во второй строке через пробел записаны n неотрицательных чисел, каждое из которых не превосходит 1000.
10 |
11 | ## Формат вывода
12 |
13 | Нужно вывести самое большое число, которое можно составить из данных чисел.
14 |
15 |
16 | ### Пример 1
17 |
18 |
19 |
20 | 3
21 | 15 56 2
22 | |
23 |
24 | 56215
25 |
26 |
27 | |
28 |
29 |
30 | ### Пример 2
31 |
32 |
33 |
34 | 3
35 | 1 783 2
36 | |
37 |
38 | 78321
39 |
40 |
41 | |
42 |
43 |
44 | ### Пример 3
45 |
46 |
47 |
48 | 5
49 | 2 4 5 2 10
50 | |
51 |
52 | 542210
53 |
54 |
55 | |
56 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/tasks/H/input.txt:
--------------------------------------------------------------------------------
1 | 5
2 | 2 4 5 2 10
3 |
4 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/tasks/H/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/tasks/I/README.md:
--------------------------------------------------------------------------------
1 | # I. Любители конференций
2 |
3 | На IT-конференции присутствовали студенты из разных вузов со всей страны. Для каждого студента известен ID университета, в котором он учится.
4 |
5 | Тимофей предложил Рите выяснить, из каких k вузов на конференцию пришло больше всего учащихся.
6 |
7 | ## Формат ввода
8 |
9 | В первой строке дано количество студентов в списке —– n (1 ≤ n ≤ 15 000).
10 | Во второй строке через пробел записаны n целых чисел —– ID вуза каждого студента. Каждое из чисел находится в диапазоне от 0 до 10 000.
11 |
12 | В третьей строке записано одно число k.
13 |
14 | ## Формат вывода
15 |
16 | Выведите через пробел k ID вузов с максимальным числом участников.
17 |
18 | Они должны быть отсортированы по убыванию популярности (по количеству гостей от конкретного вуза). Если более одного вуза имеет одно и то же количество учащихся, то выводить их ID нужно в порядке возрастания.
19 |
20 |
21 | ### Пример 1
22 |
23 |
24 |
25 | 7
26 | 1 2 3 1 2 3 4
27 | 3
28 | |
29 |
30 | 1 2 3
31 |
32 |
33 |
34 | |
35 |
36 |
37 | ### Пример 2
38 |
39 |
40 |
41 | 6
42 | 1 1 1 2 2 3
43 | 1
44 | |
45 |
46 | 1
47 |
48 |
49 |
50 | |
51 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/tasks/I/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/tasks/I/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/tasks/J/input.txt:
--------------------------------------------------------------------------------
1 | 5
2 | 1 1 1 1 1
3 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/tasks/J/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/tasks/K/input.txt:
--------------------------------------------------------------------------------
1 | 2
2 | -19 -3
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/tasks/K/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | func merge(arr []int, left int, mid int, right int) []int {
4 | midCopy := mid
5 | result := make([]int, 0, right-left)
6 |
7 | for left < mid || midCopy < right {
8 | if left == mid {
9 | result = append(result, arr[midCopy])
10 | midCopy++
11 | continue
12 | }
13 | if midCopy == right {
14 | result = append(result, arr[left])
15 | left++
16 | continue
17 | }
18 | if arr[left] <= arr[midCopy] {
19 | result = append(result, arr[left])
20 | left++
21 | } else {
22 | result = append(result, arr[midCopy])
23 | midCopy++
24 | }
25 | }
26 |
27 | return result
28 | }
29 |
30 | func merge_sort(arr []int, lf int, rg int) {
31 | if rg-lf <= 1 {
32 | return
33 | }
34 |
35 | mid := (lf + rg) / 2
36 | merge_sort(arr, lf, mid)
37 | merge_sort(arr, mid, rg)
38 |
39 | res := merge(arr, lf, mid, rg)
40 |
41 | k := 0
42 | for i := lf; i < rg; i++ {
43 | arr[i] = res[k]
44 | k++
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/tasks/K/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/tasks/L/input.txt:
--------------------------------------------------------------------------------
1 | 6
2 | 1 2 4 4 6 8
3 | 3
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/tasks/L/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "testing"
6 | )
7 |
8 | type task struct {
9 | N, X int
10 | Days []int
11 | Result []int
12 | }
13 |
14 | func TestTask(t *testing.T) {
15 |
16 | var taskItems = generateTasks()
17 |
18 | for i := 0; i < len(taskItems); i++ {
19 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
20 | res := solution(taskItems[i].N, taskItems[i].X, taskItems[i].Days)
21 | if fmt.Sprint(res) != fmt.Sprint(taskItems[i].Result) {
22 | t.Errorf("Неверный ответ решения!\nОтвет: %v \nВерно: %v", res, taskItems[i].Result)
23 | } else {
24 | t.Log("OK")
25 | }
26 | })
27 | }
28 | }
29 |
30 | // generateTasks создает задачи для теста
31 | func generateTasks() (tasks []task) {
32 | tasks = append(
33 | tasks,
34 | task{
35 | N: 6,
36 | X: 10,
37 | Days: []int{1, 2, 4, 4, 4, 4},
38 | Result: []int{-1, -1},
39 | },
40 | task{
41 | N: 7,
42 | X: 3,
43 | Days: []int{1, 1, 4, 4, 4, 4, 8},
44 | Result: []int{3, 7},
45 | },
46 | task{
47 | N: 6,
48 | X: 1,
49 | Days: []int{1, 2, 4, 4, 4, 4},
50 | Result: []int{1, 2},
51 | },
52 | task{
53 | N: 17,
54 | X: 28,
55 | Days: []int{12, 19, 29, 31, 33, 37, 52, 62, 66, 68, 71, 75, 75, 88, 90, 93, 98},
56 | Result: []int{3, 8},
57 | },
58 | )
59 |
60 | return
61 | }
62 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/tasks/M/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/tasks/M/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/tasks/N/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/tasks/N/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/tasks/O/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/tasks/O/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/tasks/P/input.txt:
--------------------------------------------------------------------------------
1 | 8
2 | 3 6 7 4 1 5 0 2
--------------------------------------------------------------------------------
/yandex_practicum/sprint_3/tasks/P/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_4/final/A/input.txt:
--------------------------------------------------------------------------------
1 | 6
2 | buy flat in moscow
3 | rent flat in moscow
4 | sell flat in moscow
5 | want flat in moscow like crazy
6 | clean flat in moscow on weekends
7 | renovate flat in moscow
8 | 1
9 | flat in moscow for crazy weekends
10 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_4/final/B/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "strings"
6 | "testing"
7 | )
8 |
9 | type task struct {
10 | N int
11 | Input []string
12 | Result []string
13 | }
14 |
15 | func TestTask(t *testing.T) {
16 | tasks := generateTasks()
17 | for i := 0; i < len(tasks); i++ {
18 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
19 | res := testMain(tasks[i].N, tasks[i].Input)
20 | if strings.Join(res, "") != strings.Join(tasks[i].Result, "") {
21 | t.Errorf("Неверный ответ решения!\nОтвет: %v \nВерно: %v", res, tasks[i].Result)
22 | }
23 | })
24 | }
25 | }
26 |
27 | func generateTasks() []*task {
28 | return []*task{
29 | {
30 | N: 10,
31 | Input: []string{
32 | "get 1",
33 | "put 1 10",
34 | "put 2 4",
35 | "get 1",
36 | "get 2",
37 | "delete 2",
38 | "get 2",
39 | "put 1 5",
40 | "get 1",
41 | "delete 2",
42 | },
43 | Result: []string{
44 | "None",
45 | "10",
46 | "4",
47 | "4",
48 | "None",
49 | "5",
50 | "None",
51 | },
52 | },
53 | {
54 | N: 8,
55 | Input: []string{
56 | "get 9",
57 | "delete 9",
58 | "put 9 1",
59 | "get 9",
60 | "put 9 2",
61 | "get 9",
62 | "put 9 3",
63 | "get 9",
64 | },
65 | Result: []string{
66 | "None",
67 | "None",
68 | "1",
69 | "2",
70 | "3",
71 | },
72 | },
73 | }
74 | }
75 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_4/tasks/A/README.md:
--------------------------------------------------------------------------------
1 | # A. Полиномиальный хеш
2 |
3 | Алле очень понравился алгоритм вычисления полиномиального хеша. Помогите ей написать функцию, вычисляющую хеш строки s. В данной задаче необходимо использовать в качестве значений отдельных символов их коды в таблице ASCII.
4 |
5 | Полиномиальный хеш считается по формуле:
6 |
7 | 
8 |
9 | ## Формат ввода
10 | В первой строке дано число a (1 ≤ a ≤ 1000) –— основание, по которому считается хеш.
11 |
12 | Во второй строке дано число m (1 ≤ m ≤ 109) –— модуль.
13 |
14 | В третьей строке дана строка s (0 ≤ |s| ≤ 106), состоящая из больших и маленьких латинских букв.
15 |
16 | ## Формат вывода
17 | Выведите целое неотрицательное число –— хеш заданной строки.
18 |
19 | ### Пример 1
20 |
21 |
22 |
23 | 123
24 | 100003
25 | a
26 | |
27 |
28 | 97
29 |
30 |
31 | |
32 |
33 |
34 | ### Пример 2
35 |
36 |
37 |
38 | 123
39 | 100003
40 | hash
41 | |
42 |
43 | 6080
44 |
45 |
46 | |
47 |
48 |
49 | ### Пример 3
50 |
51 |
52 |
53 | 123
54 | 100003
55 | HaSH
56 | |
57 |
58 | 6080
59 |
60 |
61 | |
62 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_4/tasks/A/input.txt:
--------------------------------------------------------------------------------
1 | 123
2 | 100003
3 | a
4 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_4/tasks/B/README.md:
--------------------------------------------------------------------------------
1 | # B. Сломай меня
2 |
3 | Гоша написал программу, которая сравнивает строки исключительно по их хешам. Если хеш равен, то и строки равны. Тимофей увидел это безобразие и поручил вам сломать программу Гоши, чтобы остальным неповадно было.
4 |
5 | В этой задаче вам надо будет лишь найти две различные строки, которые для заданной хеш-функции будут давать одинаковое значение.
6 |
7 | Гоша использует следующую хеш-функцию:
8 |
9 | 
10 |
11 | для a = 1000 и m = 123 987 123.
12 |
13 | В данной задаче необходимо использовать в качестве значений отдельных символов их коды в таблице ASCII.
14 |
15 | ## Формат ввода
16 | В задаче единственный тест без ввода
17 |
18 | ## Формат вывода
19 | Отправьте две строки, по одной в строке. Строки могут состоять только из маленьких латинских букв и не должны превышать в длину 1000 знаков каждая. Код отправлять не требуется. Строки из примера использовать нельзя.
20 |
21 | #### Пример вывода:
22 |
23 | ezhgeljkablzwnvuwqvp
24 |
25 | gbpdcvkumyfxillgnqrv
26 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_4/tasks/C/input.txt:
--------------------------------------------------------------------------------
1 | 1000
2 | 1000009
3 | abcdefgh
4 | 7
5 | 1 1
6 | 1 5
7 | 2 3
8 | 3 4
9 | 4 4
10 | 1 8
11 | 5 8
12 |
13 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_4/tasks/D/README.md:
--------------------------------------------------------------------------------
1 | # D. Кружки
2 |
3 | В компании, где работает Тимофей, заботятся о досуге сотрудников и устраивают различные кружки по интересам. Когда кто-то записывается на занятие, в лог вносится название кружка.
4 | По записям в логе составьте список всех кружков, в которые ходит хотя бы один человек.
5 |
6 | ## Формат ввода
7 | В первой строке даётся натуральное число n, не превосходящее 10 000 –— количество записей в логе.
8 |
9 | В следующих n строках —– названия кружков.
10 |
11 | ## Формат вывода
12 | Выведите уникальные названия кружков по одному на строке, в порядке появления во входных данных.
13 |
14 | ### Пример
15 |
16 |
17 |
18 | 8
19 | вышивание крестиком
20 | рисование мелками на парте
21 | настольный керлинг
22 | настольный керлинг
23 | кухня африканского племени ужасмай
24 | тяжелая атлетика
25 | таракановедение
26 | таракановедение
27 | |
28 |
29 | вышивание крестиком
30 | рисование мелками на парте
31 | настольный керлинг
32 | кухня африканского племени ужасмай
33 | тяжелая атлетика
34 | таракановедение
35 |
36 |
37 |
38 | |
39 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_4/tasks/D/input.txt:
--------------------------------------------------------------------------------
1 | 8
2 | вышивание крестиком
3 | рисование мелками на парте
4 | настольный керлинг
5 | настольный керлинг
6 | кухня африканского племени ужасмай
7 | тяжелая атлетика
8 | таракановедение
9 | таракановедение
10 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_4/tasks/D/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "bufio"
5 | "fmt"
6 | "os"
7 | "strconv"
8 | )
9 |
10 | func main() {
11 | var input *os.File
12 | var bufStr string
13 | var err error
14 | var n int
15 |
16 | input, err = getInputFromFile()
17 | if err != nil {
18 | showError(err)
19 | }
20 | // close file
21 | defer func(input *os.File) {
22 | _ = input.Close()
23 | }(input)
24 |
25 | scanner := bufio.NewScanner(input)
26 | scanner.Split(bufio.ScanLines)
27 |
28 | scanner.Scan()
29 | bufStr = scanner.Text()
30 | n, err = strconv.Atoi(bufStr)
31 | if err != nil {
32 | return
33 | }
34 |
35 | items := make(map[string]bool, n)
36 |
37 | for i := 0; i < n; i++ {
38 | scanner.Scan()
39 | bufStr = scanner.Text()
40 | if _, ok := items[bufStr]; !ok {
41 | fmt.Println(bufStr)
42 | items[bufStr] = true
43 | }
44 | }
45 | }
46 |
47 | func getInputFromFile() (*os.File, error) {
48 | file, err := os.Open("input.txt")
49 | if err != nil {
50 | return nil, err
51 | }
52 |
53 | return file, nil
54 | }
55 |
56 | func showError(err interface{}) {
57 | panic(err)
58 | }
59 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_4/tasks/E/README.md:
--------------------------------------------------------------------------------
1 | # E. Подстроки
2 |
3 | На вход подается строка. Нужно определить длину наибольшей подстроки, которая не содержит повторяющиеся символы.
4 |
5 | ## Формат ввода
6 |
7 | Одна строка, состоящая из строчных латинских букв. Длина строки не превосходит 10 000.
8 |
9 | ## Формат вывода
10 |
11 | Выведите натуральное число —– ответ на задачу.
12 |
13 | ### Пример 1
14 |
15 |
16 |
17 | abcabcbb
18 | |
19 |
20 | 3
21 | |
22 |
23 |
24 | ### Пример 2
25 |
26 |
27 |
28 | bbbbb
29 | |
30 |
31 | 1
32 | |
33 |
34 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_4/tasks/E/input.txt:
--------------------------------------------------------------------------------
1 | abcabcbb
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_4/tasks/G/README.md:
--------------------------------------------------------------------------------
1 | # G. Соревнование
2 |
3 | Жители Алгосов любят устраивать турниры по спортивному программированию. Все участники разбиваются на пары и соревнуются друг с другом. А потом два самых сильных программиста встречаются в финальной схватке, которая состоит из нескольких раундов. Если в очередном раунде выигрывает первый участник, в таблицу с результатами записывается 0, если второй, то 1. Ничьей в раунде быть не может.
4 |
5 | Нужно определить наибольший по длине непрерывный отрезок раундов, по результатам которого суммарно получается ничья. Например, если дана последовательность 0 0 1 0 1 1 1 0 0 0, то раунды с 2-го по 9-й (нумерация начинается с единицы) дают ничью.
6 |
7 | ## Формат ввода
8 |
9 | В первой строке задаётся n (0 ≤ n ≤ 105) –— количество раундов. Во второй строке через пробел записано n чисел –— результаты раундов. Каждое число равно либо 0, либо 1.
10 |
11 | ## Формат вывода
12 |
13 | Выведите длину найденного отрезка.
14 |
15 | ### Пример 1
16 |
17 |
18 |
19 | 2
20 | 0 1
21 | |
22 |
23 | 2
24 |
25 | |
26 |
27 |
28 | ### Пример 2
29 |
30 |
31 |
32 | 3
33 | 0 1 0
34 | |
35 |
36 | 2
37 |
38 | |
39 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_4/tasks/G/input.txt:
--------------------------------------------------------------------------------
1 | 2
2 | 0 1
3 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_4/tasks/H/input.txt:
--------------------------------------------------------------------------------
1 | mxyskaoghi
2 | qodfrgmslc
3 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_4/tasks/I/input.txt:
--------------------------------------------------------------------------------
1 | 5
2 | 1 2 3 2 1
3 | 5
4 | 3 2 1 5 6
5 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_4/tasks/J/README.md:
--------------------------------------------------------------------------------
1 | # J. Сумма четвёрок
2 |
3 | У Гоши есть любимое число S. Помогите ему найти все уникальные четвёрки чисел в массиве, которые в сумме дают заданное число S.
4 |
5 | ## Формат ввода
6 |
7 | В первой строке дано общее количество элементов массива n (0 ≤ n ≤ 1000).
8 |
9 | Во второй строке дано целое число S.
10 |
11 | В третьей строке задан сам массив. Каждое число является целым и не превосходит по модулю 109.
12 |
13 | ## Формат вывода
14 |
15 | В первой строке выведите количество найденных четвёрок чисел.
16 |
17 | В последующих строках выведите найденные четвёрки. Числа внутри одной четверки должны быть упорядочены по возрастанию. Между собой четвёрки упорядочены лексикографически.
18 |
19 | ### Пример 1
20 |
21 |
22 |
23 | 8
24 | 10
25 | 2 3 2 4 1 10 3 0
26 |
27 | |
28 |
29 | 3
30 | 0 3 3 4
31 | 1 2 3 4
32 | 2 2 3 3
33 | |
34 |
35 |
36 | ### Пример 3
37 |
38 |
39 |
40 | 6
41 | 0
42 | 1 0 -1 0 2 -2
43 |
44 | |
45 |
46 | 3
47 | -2 -1 1 2
48 | -2 0 0 2
49 | -1 0 0 1
50 | |
51 |
52 |
53 | ### Пример 2
54 |
55 |
56 |
57 | 5
58 | 4
59 | 1 1 1 1 1
60 | |
61 |
62 | 1
63 | 1 1 1 1
64 |
65 | |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_4/tasks/J/input.txt:
--------------------------------------------------------------------------------
1 | 8
2 | 10
3 | 2 3 2 4 1 10 3 0
4 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_4/tasks/L/README.md:
--------------------------------------------------------------------------------
1 | # L. МногоГоша
2 |
3 | Дана длинная строка, состоящая из маленьких латинских букв. Нужно найти все её подстроки длины n, которые встречаются хотя бы k раз.
4 |
5 | ## Формат ввода
6 |
7 | В первой строчке через пробел записаны два натуральных числа n и k.
8 |
9 | Во второй строчке записана строка, состоящая из маленьких латинских букв.
10 |
11 | Длина строки 1 ≤ L ≤ 106.
12 |
13 | n ≤ L, k ≤ L.
14 |
15 | ## Формат вывода
16 |
17 | Для каждой найденной подстроки выведите индекс начала её первого вхождения (нумерация в строке начинается с нуля).
18 |
19 | Выводите индексы в любом порядке, в одну строку, через пробел.
20 |
21 | ### Пример 1
22 |
23 |
24 |
25 | 10 2
26 | gggggooooogggggoooooogggggssshaa
27 | |
28 |
29 | 0 5
30 |
31 |
32 | |
33 |
34 |
35 | ### Пример 2
36 |
37 |
38 |
39 | 3 4
40 | allallallallalla
41 | |
42 |
43 | 0 1 2
44 |
45 | |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_5/tasks/A/README.md:
--------------------------------------------------------------------------------
1 | # A. Лампочки
2 |
3 | Гоша повесил на стену гирлянду в виде бинарного дерева, в узлах которого находятся лампочки. У каждой лампочки есть своя яркость. Уровень яркости лампочки соответствует числу, расположенному в узле дерева. Помогите Гоше найти самую яркую лампочку в гирлянде, то есть такую, у которой яркость наибольшая.
4 |
5 | 
6 |
7 | ## Формат ввода
8 | На вход подается корень дерева.
9 |
10 | **Замечания про отправку решений**
11 |
12 | По умолчанию выбран компилятор make.
13 | Решение нужно отправлять в виде файла с расширением, которое соответствует вашему языку программирования.
14 |
15 | Go:
16 |
17 | ```go
18 | package main
19 |
20 |
21 | /**
22 | Comment it before submitting
23 | type Node struct {
24 | value int
25 | left *Node
26 | right *Node
27 | }
28 | **/
29 |
30 | func Solution(root *Node) int {
31 | // Your code
32 | // “ヽ(´▽`)ノ”
33 | }
34 |
35 | func test() {
36 | node1 := Node{1, nil, nil}
37 | node2 := Node{-5, nil, nil}
38 | node3 := Node{3, &node1, &node2}
39 | node4 := Node{2, &node3, nil}
40 | if Solution(&node4) != 3 {
41 | panic("WA")
42 | }
43 | }
44 |
45 | ```
46 |
47 |
48 | ## Формат вывода
49 |
50 | Функция должна вернуть максимальное значение яркости в узле дерева.
51 |
52 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_5/tasks/A/for_tests.txt:
--------------------------------------------------------------------------------
1 | 10
2 | 0 0 1 2
3 | 1 2 3 None
4 | 2 2 None 4
5 | 3 3 5 6
6 | 4 3 7 8
7 | 5 0 None None
8 | 6 0 None None
9 | 7 111 None None
10 | 8 0 None 9
11 | 9 111 None None
12 | -
13 | 111
14 |
15 | --------
16 |
17 | 10
18 | 0 0 1 2
19 | 1 2 3 None
20 | 2 2 None 4
21 | 3 3 5 6
22 | 4 3 7 8
23 | 5 0 None None
24 | 6 7771 None None
25 | 7 111 None None
26 | 8 0 None 9
27 | 9 0 None None
28 | -
29 | 7771
30 |
31 | -------
32 |
33 | 1
34 | 0 1 None None
35 | -
36 | 1
37 |
38 |
39 | --------
40 |
41 | 2
42 | 0 1 None 1
43 | 1 0 None None
44 | -
45 | 1
--------------------------------------------------------------------------------
/yandex_practicum/sprint_5/tasks/A/img.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dmitryburov/algorithm-practice/1501896081a17ead0f3e5571f9f13cabaf889142/yandex_practicum/sprint_5/tasks/A/img.png
--------------------------------------------------------------------------------
/yandex_practicum/sprint_5/tasks/A/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | // Node
4 | // TODO закомментить перед отправкой
5 | type Node struct {
6 | value int
7 | left *Node
8 | right *Node
9 | }
10 |
11 | var maxValue = 0
12 |
13 | func Solution(root *Node) int {
14 | maxValue = 0
15 | recurse(root)
16 |
17 | return maxValue
18 | }
19 |
20 | func recurse(node *Node) {
21 | if node == nil {
22 | return
23 | }
24 |
25 | if node.value > maxValue {
26 | maxValue = node.value
27 | }
28 |
29 | if node.left != nil {
30 | recurse(node.left)
31 | }
32 | if node.right != nil {
33 | recurse(node.right)
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_5/tasks/B/README.md:
--------------------------------------------------------------------------------
1 | # B. Сбалансированное дерево
2 |
3 | Гоше очень понравилось слушать рассказ Тимофея про деревья. Особенно часть про сбалансированные деревья. Он решил написать функцию, которая определяет, сбалансировано ли дерево.
4 |
5 | Дерево считается сбалансированным, если левое и правое поддеревья каждой вершины отличаются по высоте не больше, чем на единицу.
6 |
7 | 
8 |
9 | ## Формат ввода
10 |
11 | На вход функции подаётся корень бинарного дерева.
12 |
13 | **Замечания про отправку решений**
14 |
15 | По умолчанию выбран компилятор make. Шаблон для Go:
16 |
17 | ```go
18 | package main
19 |
20 | /**
21 | Comment it before submitting
22 | type Node struct {
23 | value int
24 | left *Node
25 | right *Node
26 | }
27 | **/
28 |
29 | func Solution(root *Node) bool {
30 | // Your code
31 | // “ヽ(´▽`)ノ”
32 | }
33 | ```
34 |
35 | ## Формат вывода
36 |
37 | Функция должна вернуть True, если дерево сбалансировано в соответствии с критерием из условия, иначе - False.
--------------------------------------------------------------------------------
/yandex_practicum/sprint_5/tasks/B/for tests.txt:
--------------------------------------------------------------------------------
1 | 1
2 | 0 0 None None
3 | -
4 | True
5 |
6 | ---------
7 |
8 | 3
9 | 0 0 1 2
10 | 1 1 None None
11 | 2 2 None None
12 | -
13 | True
14 |
15 | ----------
16 |
17 | 5
18 | 0 0 1 2
19 | 1 1 None None
20 | 2 2 3 4
21 | 3 3 None None
22 | 4 4 None None
23 | -
24 | True
25 |
26 | -----------
27 |
28 | 2
29 | 0 0 None 1
30 | 1 1 None None
31 | -
32 | True
--------------------------------------------------------------------------------
/yandex_practicum/sprint_5/tasks/B/image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dmitryburov/algorithm-practice/1501896081a17ead0f3e5571f9f13cabaf889142/yandex_practicum/sprint_5/tasks/B/image.png
--------------------------------------------------------------------------------
/yandex_practicum/sprint_5/tasks/B/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | // Node
4 | // TODO Comment it before submitting
5 | type Node struct {
6 | value int
7 | left *Node
8 | right *Node
9 | }
10 |
11 | func Solution(root *Node) bool {
12 | if _, balanced := checkThree(root); !balanced {
13 | return false
14 | }
15 |
16 | return true
17 | }
18 |
19 | func checkThree(node *Node) (int, bool) {
20 | if node == nil {
21 | return 0, true
22 | }
23 |
24 | leftLen, leftStatus := checkThree(node.left)
25 | rightLen, rightStatus := checkThree(node.right)
26 | if !leftStatus || !rightStatus {
27 | return 0, false
28 | }
29 |
30 | res := leftLen - rightLen
31 | if res > 1 || res < -1 {
32 | return 0, false
33 | }
34 |
35 | if leftLen >= rightLen {
36 | return leftLen + 1, true
37 | }
38 |
39 | return rightLen + 1, true
40 | }
41 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_5/tasks/C/README.md:
--------------------------------------------------------------------------------
1 | # C. Дерево - анаграмма
2 |
3 | Гоша и Алла играют в игру «Удивительные деревья». Помогите ребятам определить, является ли дерево, которое им встретилось, деревом-анаграммой?
4 |
5 | Дерево называется анаграммой, если оно симметрично относительно своего центра.
6 |
7 | 
8 |
9 | ## Формат ввода
10 |
11 | Напишите функцию, которая определяет, является ли дерево анаграммой.
12 | На вход подаётся корень дерева.
13 |
14 | Шаблон GO:
15 |
16 | ```go
17 | package main
18 |
19 | /**
20 | Comment it before submitting
21 | type Node struct {
22 | value int
23 | left *Node
24 | right *Node
25 | }
26 | **/
27 |
28 | func Solution(root *Node) bool {
29 | // Your code
30 | // “ヽ(´▽`)ノ”
31 | }
32 | ```
33 |
34 | ## Формат вывода
35 |
36 | Функция должна вернуть True если дерево является анаграммой. Иначе - False.
--------------------------------------------------------------------------------
/yandex_practicum/sprint_5/tasks/C/for tests.txt:
--------------------------------------------------------------------------------
1 | 7
2 | 0 1 1 2
3 | 1 2 3 4
4 | 2 2 5 6
5 | 3 3 None None
6 | 4 4 None None
7 | 5 4 None None
8 | 6 3 None None
9 | -
10 | True
11 |
12 | --------
13 |
14 | 1
15 | 0 1 None None
16 | -
17 | True
18 |
19 | ---------
20 |
21 | 4
22 | 0 1 1 2
23 | 1 1 3 None
24 | 2 1 None None
25 | 3 1 None None
26 | -
27 | False
28 |
29 | ----------
30 |
31 | 10
32 | 0 0 1 2
33 | 1 2 3 None
34 | 2 2 None 4
35 | 3 3 5 6
36 | 4 3 7 8
37 | 5 0 None None
38 | 6 1 None None
39 | 7 1 None None
40 | 8 0 None 9
41 | 9 0 None None
42 | -
43 | False
--------------------------------------------------------------------------------
/yandex_practicum/sprint_5/tasks/C/image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dmitryburov/algorithm-practice/1501896081a17ead0f3e5571f9f13cabaf889142/yandex_practicum/sprint_5/tasks/C/image.png
--------------------------------------------------------------------------------
/yandex_practicum/sprint_5/tasks/C/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | )
6 |
7 | // Node
8 | // TODO Comment it before submitting
9 | type Node struct {
10 | value int
11 | left *Node
12 | right *Node
13 | }
14 |
15 | func Solution(root *Node) bool {
16 | if root.left == nil && root.right == nil {
17 | return true
18 | } else if root.left == nil || root.right == nil {
19 | return false
20 | }
21 |
22 | return valueLR(root.left) == valueRL(root.right)
23 | }
24 |
25 | func valueLR(root *Node) string {
26 | if root == nil {
27 | return ""
28 | }
29 | return valueLR(root.left) + fmt.Sprint(root.value) + valueLR(root.right)
30 | }
31 |
32 | func valueRL(root *Node) string {
33 | if root == nil {
34 | return ""
35 | }
36 | return valueRL(root.right) + fmt.Sprint(root.value) + valueRL(root.left)
37 | }
38 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_5/tasks/D/README.md:
--------------------------------------------------------------------------------
1 | # D. Деревья - близнецы
2 |
3 | Гоше на день рождения подарили два дерева. Тимофей сказал, что они совершенно одинаковые. Но, по мнению Гоши, они отличаются.
4 |
5 | Помогите разрешить этот философский спор!
6 |
7 | 
8 |
9 | ## Формат ввода
10 |
11 | На вход подаются корни двух деревьев.
12 |
13 | **Замечания про отправку решений**
14 |
15 | По умолчанию выбран компилятор make.
16 | Решение нужно отправлять в виде файла с расширением, которое соответствует вашему языку программирования.
17 |
18 | Go:
19 |
20 | ```go
21 | package main
22 |
23 | /**
24 | Comment it before submitting
25 | type Node struct {
26 | value int
27 | left *Node
28 | right *Node
29 | }
30 | **/
31 |
32 | func Solution(root1 *Node, root2 *Node) bool {
33 | // Your code
34 | // “ヽ(´▽`)ノ”
35 | }
36 | ```
37 |
38 | ## Формат вывода
39 |
40 | Функция должна вернуть True если деревья являются близнецами. Иначе - False.
--------------------------------------------------------------------------------
/yandex_practicum/sprint_5/tasks/D/image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dmitryburov/algorithm-practice/1501896081a17ead0f3e5571f9f13cabaf889142/yandex_practicum/sprint_5/tasks/D/image.png
--------------------------------------------------------------------------------
/yandex_practicum/sprint_5/tasks/E/README.md:
--------------------------------------------------------------------------------
1 | # E. Дерево поиска
2 |
3 | Гоша понял, что такое дерево поиска, и захотел написать функцию, которая определяет, является ли заданное дерево деревом поиска. Значения в левом поддереве должны быть строго меньше, в правом —- строго больше значения в узле.
4 |
5 | Помогите Гоше с реализацией этого алгоритма.
6 |
7 | 
8 |
9 | ## Формат ввода
10 |
11 | На вход функции подается корень бинарного дерева.
12 |
13 | **Замечания про отправку решений**
14 |
15 | По умолчанию выбран компилятор make.
16 | Решение нужно отправлять в виде файла с расширением, которое соответствует вашему языку программирования.
17 |
18 | Go:
19 |
20 | ```go
21 | package main
22 |
23 | /**
24 | Comment it before submitting
25 | type Node struct {
26 | value int
27 | left *Node
28 | right *Node
29 | }
30 | **/
31 |
32 | func Solution(root *Node) bool {
33 | // Your code
34 | // “ヽ(´▽`)ノ”
35 | }
36 | ```
37 |
38 | ## Формат вывода
39 |
40 | Функция должна вернуть True, если дерево является деревом поиска, иначе - False.
41 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_5/tasks/E/image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dmitryburov/algorithm-practice/1501896081a17ead0f3e5571f9f13cabaf889142/yandex_practicum/sprint_5/tasks/E/image.png
--------------------------------------------------------------------------------
/yandex_practicum/sprint_5/tasks/F/README.md:
--------------------------------------------------------------------------------
1 | # F. Максимальная глубина
2 |
3 | Алла хочет побывать на разных островах архипелага Алгосы. Она составила карту. Карта представлена в виде дерева: корень обозначает центр архипелага, узлы –— другие острова. А листья —– это дальние острова, на которые Алла хочет попасть.
4 |
5 | Помогите Алле определить максимальное число островов, через которые ей нужно пройти для совершения одной поездки от стартового острова до места назначения, включая начальный и конечный пункты.
6 |
7 | 
8 |
9 | ## Формат ввода
10 |
11 | На вход подается корень дерева.
12 |
13 | **Замечания про отправку решений**
14 |
15 | По умолчанию выбран компилятор make. Шаблон для Go:
16 |
17 | ```go
18 | package main
19 |
20 | /**
21 | Comment it before submitting
22 | type Node struct {
23 | value int
24 | left *Node
25 | right *Node
26 | }
27 | **/
28 |
29 | func Solution(root *Node) int {
30 | // Your code
31 | // “ヽ(´▽`)ノ”
32 | }
33 | ```
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_5/tasks/F/for tests.txt:
--------------------------------------------------------------------------------
1 | 12
2 | 0 5 1 2
3 | 1 3 3 4
4 | 2 8 5 6
5 | 3 1 None None
6 | 4 4 None None
7 | 5 6 None None
8 | 6 9 None 7
9 | 7 19 None 8
10 | 8 138 9 10
11 | 9 130 None None
12 | 10 140 11 None
13 | 11 139 None None
14 | -
15 | 7
16 |
17 | --------
18 |
19 | 11
20 | 0 5 1 2
21 | 1 3 3 4
22 | 2 8 5 6
23 | 3 1 None None
24 | 4 4 None None
25 | 5 6 None None
26 | 6 9 None 7
27 | 7 19 None 8
28 | 8 138 9 10
29 | 9 130 None None
30 | 10 140 None None
31 | -
32 | 6
33 |
34 | ---------
35 |
36 | 1
37 | 0 1 None None
38 | -
39 | 1
40 |
41 | ----------
42 |
43 | 8
44 | 0 1 None 1
45 | 1 1 None 2
46 | 2 2 None 3
47 | 3 2 None 4
48 | 4 2 None 5
49 | 5 2 6 None
50 | 6 2 7 None
51 | 7 2 None None
52 | -
53 | 8
--------------------------------------------------------------------------------
/yandex_practicum/sprint_5/tasks/F/image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dmitryburov/algorithm-practice/1501896081a17ead0f3e5571f9f13cabaf889142/yandex_practicum/sprint_5/tasks/F/image.png
--------------------------------------------------------------------------------
/yandex_practicum/sprint_5/tasks/F/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | // Node
4 | // TODO Comment it before submitting
5 | type Node struct {
6 | value int
7 | left *Node
8 | right *Node
9 | }
10 |
11 | func Solution(root *Node) int {
12 | if root == nil {
13 | return 0
14 | }
15 |
16 | l := Solution(root.left)
17 | r := Solution(root.right)
18 |
19 | if l > r {
20 | return l + 1
21 | }
22 |
23 | return r + 1
24 | }
25 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_5/tasks/G/img.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dmitryburov/algorithm-practice/1501896081a17ead0f3e5571f9f13cabaf889142/yandex_practicum/sprint_5/tasks/G/img.png
--------------------------------------------------------------------------------
/yandex_practicum/sprint_5/tasks/H/README.md:
--------------------------------------------------------------------------------
1 | # H. Числовые пути
2 |
3 | Вася и его друзья решили поиграть в игру. Дано дерево, в узлах которого записаны цифры от 0 до 9. Таким образом, каждый путь от корня до листа содержит число, получившееся конкатенацией цифр пути (склеиванием цифр пути в одно число). Нужно найти сумму всех таких чисел в дереве.
4 |
5 | Гарантируется, что ответ не превосходит 20 000.
6 |
7 | 
8 |
9 | ## Формат ввода
10 |
11 | На вход подается корень дерева.
12 |
13 |
14 | **Замечания про отправку решений**
15 |
16 | По умолчанию выбран компилятор make.
17 | Решение нужно отправлять в виде файла с расширением, которое соответствует вашему языку программирования.
18 |
19 | Go:
20 |
21 | ```go
22 | package main
23 |
24 | /**
25 | Comment it before submitting
26 | type Node struct {
27 | value int
28 | left *Node
29 | right *Node
30 | }
31 | **/
32 |
33 | func Solution(root *Node) int {
34 | // Your code
35 | // “ヽ(´▽`)ノ”
36 | }
37 | ```
38 |
39 | ## Формат вывода
40 |
41 | Функция должна вернуть число, равное сумме чисел всех путей в дереве.
--------------------------------------------------------------------------------
/yandex_practicum/sprint_5/tasks/H/image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dmitryburov/algorithm-practice/1501896081a17ead0f3e5571f9f13cabaf889142/yandex_practicum/sprint_5/tasks/H/image.png
--------------------------------------------------------------------------------
/yandex_practicum/sprint_5/tasks/I/README.md:
--------------------------------------------------------------------------------
1 | # I. Разные деревья поиска
2 |
3 | Ребятам стало интересно, сколько может быть различных деревьев поиска, содержащих в своих узлах все уникальные числа от 1 до n. Помогите им найти ответ на этот вопрос.
4 |
5 | ## Формат ввода
6 |
7 | В единственной строке задано число n. Оно не превосходит 20.
8 |
9 | ## Формат вывода
10 |
11 | Нужно вывести число, равное количеству различных деревьев поиска, в узлах которых могут быть размещены числа от 1 до n включительно.
12 |
13 | ### Пример 1
14 |
15 |
19 |
20 | ### Пример 2
21 |
22 |
26 |
27 | ### Пример 3
28 |
29 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_5/tasks/J/README.md:
--------------------------------------------------------------------------------
1 | # J. Добавь узел
2 |
3 | Дано BST. Надо вставить узел с заданным ключом. Ключи в дереве могут повторяться.
4 |
5 | На вход функции подаётся корень корректного бинарного дерева поиска и ключ, который надо вставить в дерево. Осуществите вставку этого ключа. Если ключ уже есть в дереве, то его дубликаты уходят в правого сына. Таким образом вид дерева после вставки определяется однозначно. Функция должна вернуть корень дерева после вставки вершины.
6 |
7 | Ваше решение должно работать за O(h), где h –— высота дерева. На рисунках ниже даны два примера вставки вершин в дерево.
8 |
9 | 
10 |
11 | ## Формат ввода
12 |
13 | Ключи дерева – натуральные числа, не превосходящие 109. Число вершин в дереве не превосходит 105.
14 |
15 | **Замечания про отправку решений **
16 |
17 | По умолчанию выбран компилятор make.
18 |
19 | Шаблон для Go:
20 |
21 | ```go
22 | package main
23 |
24 | /**
25 | Comment it before submitting
26 | type Node struct {
27 | value int
28 | left *Node
29 | right *Node
30 | }
31 | **/
32 |
33 | func insert(root *Node, key int) *Node {
34 | // Your code
35 | // “ヽ(´▽`)ノ”
36 | }
37 | ```
38 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_5/tasks/J/image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dmitryburov/algorithm-practice/1501896081a17ead0f3e5571f9f13cabaf889142/yandex_practicum/sprint_5/tasks/J/image.png
--------------------------------------------------------------------------------
/yandex_practicum/sprint_5/tasks/J/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | // Node
4 | // TODO Comment it before submitting
5 | type Node struct {
6 | value int
7 | left *Node
8 | right *Node
9 | }
10 |
11 | func insert(root *Node, key int) *Node {
12 | if root.value <= key {
13 | if root.right == nil {
14 | root.right = &Node{value: key}
15 | } else {
16 | insert(root.right, key)
17 | }
18 | return root
19 | } else {
20 | if root.left == nil {
21 | root.left = &Node{value: key}
22 | } else {
23 | insert(root.left, key)
24 | }
25 | return root
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_5/tasks/K/for tests.txt:
--------------------------------------------------------------------------------
1 | correctness
2 | 5
3 | 1 7 2 4
4 | 2 3 3 -1
5 | 3 1 -1 -1
6 | 4 11 -1 5
7 | 5 15 -1 -1
8 | 6
9 | 14
10 | -
11 | 7
12 | 11
13 |
14 | ----------
15 |
16 | correctness
17 | 8
18 | 1 4 2 5
19 | 2 3 3 4
20 | 3 1 -1 -1
21 | 4 4 -1 -1
22 | 5 5 6 7
23 | 6 4 -1 8
24 | 7 6 -1 -1
25 | 8 4 -1 -1
26 | 3
27 | 5
28 | -
29 | 3
30 | 4
31 | 4
32 | 4
33 | 4
34 | 5
35 |
36 | --------
37 |
38 | correctness
39 | 10
40 | 1 31 -1 2
41 | 2 624 3 7
42 | 3 220 4 5
43 | 4 130 -1 -1
44 | 5 302 -1 6
45 | 6 442 -1 -1
46 | 7 858 8 10
47 | 8 763 9 -1
48 | 9 701 -1 -1
49 | 10 867 -1 -1
50 | 448
51 | 763
52 | -
53 | 624
54 | 701
55 | 763
56 |
57 | ----------
58 |
59 | correctness
60 | 10
61 | 1 460 2 4
62 | 2 355 3 -1
63 | 3 270 -1 -1
64 | 4 818 5 10
65 | 5 649 6 9
66 | 6 626 7 -1
67 | 7 568 -1 8
68 | 8 609 -1 -1
69 | 9 708 -1 -1
70 | 10 840 -1 -1
71 | 208
72 | 301
73 | -
74 | 270
75 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_5/tasks/K/image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dmitryburov/algorithm-practice/1501896081a17ead0f3e5571f9f13cabaf889142/yandex_practicum/sprint_5/tasks/K/image.png
--------------------------------------------------------------------------------
/yandex_practicum/sprint_5/tasks/K/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | )
6 |
7 | // Node
8 | // TODO Comment it before submitting
9 | type Node struct {
10 | value int
11 | left *Node
12 | right *Node
13 | }
14 |
15 | func printRange(root *Node, left int, right int) {
16 | if root == nil {
17 | return
18 | }
19 |
20 | if left <= root.value {
21 | printRange(root.left, left, right)
22 | }
23 |
24 | if left <= root.value && right >= root.value {
25 | fmt.Println(root.value)
26 | }
27 |
28 | if right >= root.value {
29 | printRange(root.right, left, right)
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_5/tasks/L/image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dmitryburov/algorithm-practice/1501896081a17ead0f3e5571f9f13cabaf889142/yandex_practicum/sprint_5/tasks/L/image.png
--------------------------------------------------------------------------------
/yandex_practicum/sprint_5/tasks/L/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | func siftDown(heap []int, idx int) int {
4 | for {
5 | left := idx * 2
6 | right := idx*2 + 1
7 |
8 | if left >= len(heap) {
9 | break
10 | }
11 |
12 | max := 0
13 |
14 | if right < len(heap) && heap[right] > heap[left] {
15 | max = right
16 | } else {
17 | max = left
18 | }
19 |
20 | if heap[max] > heap[idx] {
21 | heap[max], heap[idx] = heap[idx], heap[max]
22 | idx = max
23 | } else {
24 | break
25 | }
26 | }
27 |
28 | return idx
29 | }
30 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_5/tasks/M/image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dmitryburov/algorithm-practice/1501896081a17ead0f3e5571f9f13cabaf889142/yandex_practicum/sprint_5/tasks/M/image.png
--------------------------------------------------------------------------------
/yandex_practicum/sprint_5/tasks/M/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | func siftUp(heap []int, idx int) int {
4 |
5 | for heap[idx] > heap[idx/2] {
6 | if idx == 1 {
7 | break
8 | }
9 |
10 | heap[idx], heap[idx/2] = heap[idx/2], heap[idx]
11 | idx /= 2
12 | }
13 |
14 | return idx
15 | }
16 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_5/tasks/N/README.md:
--------------------------------------------------------------------------------
1 | # N. Разбиение дерева
2 |
3 | Дано бинарное дерево поиска, в котором хранятся целые числа. От этого дерева надо отделить k самых маленьких элементов.
4 |
5 | Реализуйте функцию, которая принимает корень дерева и число k , а возвращает два BST — в первом k наименьших элементов из исходного дерева, а во втором — оставшиеся вершины BST.
6 |
7 | В вершинах дерева уже записаны корректные размеры поддеревьев (точное название поля смотрите в заготовках кода). После разбиения размеры должны остаться корректными — вам придётся пересчитывать их на ходу.
8 |
9 | Ваше решение должно иметь асимптотику O(h), где h — высота исходного дерева.
10 |
11 | По умолчанию выбран компилятор make.
12 |
13 | Шаблон для Go:
14 |
15 | ```go
16 | package main
17 |
18 | /**
19 | Comment it before submitting
20 | type Node struct {
21 | value int
22 | left *Node
23 | right *Node
24 | size int
25 | }
26 | **/
27 |
28 | func split(node *Node, k int) (*Node, *Node) {
29 | // Your code
30 | // “ヽ(´▽`)ノ”
31 | }
32 | ```
33 |
34 | ## Формат ввода
35 |
36 | Числа, записанные в вершинах дерева, лежат в диапазоне от 0 до 109.
37 | Дерево не содержит одинаковых ключей. Число вершин в дереве не превосходит 105.
38 |
39 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_5/tasks/N/for tests.txt:
--------------------------------------------------------------------------------
1 | correctness
2 | 10
3 | 1 668 2 5
4 | 2 298 3 -1
5 | 3 191 -1 4
6 | 4 266 -1 -1
7 | 5 702 6 7
8 | 6 701 -1 -1
9 | 7 870 8 9
10 | 8 822 -1 -1
11 | 9 912 -1 10
12 | 10 932 -1 -1
13 | 1
14 |
15 | --------
16 |
17 |
18 | correctness
19 | 10
20 | 1 708 2 9
21 | 2 609 3 7
22 | 3 270 4 5
23 | 4 121 -1 -1
24 | 5 355 6 -1
25 | 6 322 -1 -1
26 | 7 671 8 -1
27 | 8 649 -1 -1
28 | 9 818 -1 10
29 | 10 840 -1 -1
30 | 4
31 |
32 | --------
33 |
34 | correctness
35 | 10
36 | 1 867 2 -1
37 | 2 31 -1 3
38 | 3 545 4 8
39 | 4 220 5 6
40 | 5 130 -1 -1
41 | 6 302 -1 7
42 | 7 442 -1 -1
43 | 8 763 9 10
44 | 9 701 -1 -1
45 | 10 858 -1 -1
46 | 7
47 |
48 | ---------
49 |
50 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_5/tasks/N/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | // Node
4 | // TODO закомментить перед отправкой
5 | type Node struct {
6 | value int
7 | left *Node
8 | right *Node
9 | size int
10 | }
11 |
12 | func split(node *Node, k int) (*Node, *Node) {
13 | if node == nil {
14 | return nil, nil
15 | }
16 |
17 | ls, rs := TreeSizes(node.left, node.right)
18 |
19 | if ls+1 > k {
20 | ln, rn := split(node.left, k)
21 | _, rnSize := TreeSizes(ln, rn)
22 |
23 | node.size = node.size - ls + rnSize
24 | node.left = rn
25 |
26 | return ln, node
27 | }
28 |
29 | ln, rn := split(node.right, k-(ls+1))
30 | lnSize, _ := TreeSizes(ln, rn)
31 |
32 | node.size = node.size - rs + lnSize
33 | node.right = ln
34 |
35 | return node, rn
36 | }
37 |
38 | func TreeSizes(l, r *Node) (ls, rs int) {
39 | if l != nil {
40 | ls = l.size
41 | }
42 | if r != nil {
43 | rs = r.size
44 | }
45 |
46 | return
47 | }
48 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_6/final/A/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "io"
6 | "strings"
7 | "testing"
8 | )
9 |
10 | type TestItem struct {
11 | input io.Reader
12 | output string
13 | }
14 |
15 | func TestTask(t *testing.T) {
16 | tasks := generateTasks()
17 |
18 | for i, v := range tasks {
19 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
20 | buf := strings.Builder{}
21 | Solution(v.input, &buf)
22 | if buf.String() != v.output {
23 | t.Errorf("Неверный ответ решения!\nОтвет: \n%v \nВерно: \n%v", buf.String(), v.output)
24 | }
25 | })
26 | }
27 | }
28 |
29 | func generateTasks() []TestItem {
30 | return []TestItem{
31 | {strings.NewReader(`4 4
32 | 1 2 5
33 | 1 3 6
34 | 2 4 8
35 | 3 4 3
36 | `), "19"},
37 | {strings.NewReader(`3 3
38 | 1 2 1
39 | 1 2 2
40 | 2 3 1
41 | `), "3"},
42 | {strings.NewReader(`2 0
43 | `), "Oops! I did it again"},
44 | {strings.NewReader(`1 0
45 | `), "0"},
46 | {strings.NewReader(`10 20
47 | 9 10 4
48 | 2 2 4
49 | 4 2 8
50 | 10 5 3
51 | 1 10 6
52 | 7 4 2
53 | 10 10 6
54 | 3 7 4
55 | 8 9 4
56 | 8 10 7
57 | 6 10 10
58 | 2 8 8
59 | 3 8 1
60 | 3 10 3
61 | 9 5 8
62 | 10 10 2
63 | 1 8 1
64 | 10 1 5
65 | 3 6 10
66 | 9 10 8
67 | `), "69"}}
68 | }
69 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_6/final/B/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "io"
6 | "strings"
7 | "testing"
8 | )
9 |
10 | type TestItem struct {
11 | input io.Reader
12 | output string
13 | }
14 |
15 | func TestTask(t *testing.T) {
16 | tasks := generateTasks()
17 |
18 | for i, v := range tasks {
19 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
20 | buf := strings.Builder{}
21 | Solution(v.input, &buf)
22 | if buf.String() != v.output {
23 | t.Errorf("Неверный ответ решения!\nОтвет: \n%v \nВерно: \n%v", buf.String(), v.output)
24 | }
25 | })
26 | }
27 | }
28 |
29 | func generateTasks() []TestItem {
30 | return []TestItem{{strings.NewReader(`3
31 | RB
32 | R
33 | `), "NO"}, {strings.NewReader(`4
34 | BBB
35 | RB
36 | B
37 | `), "YES"}, {strings.NewReader(`5
38 | RRRB
39 | BRR
40 | BR
41 | R
42 | `), "NO"}, {strings.NewReader(`10
43 | RRBBRRBRR
44 | RRBBBBRR
45 | RRBRRRB
46 | RRRRBR
47 | BBBBB
48 | RRBB
49 | BBR
50 | RB
51 | B
52 | `), "NO"}}
53 | }
54 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_6/tasks/A/README.md:
--------------------------------------------------------------------------------
1 | # A. Построить список смежности
2 |
3 | Алла пошла на стажировку в студию графического дизайна, где ей дали такое задание: для очень большого числа ориентированных графов преобразовать их список рёбер в список смежности. Чтобы побыстрее решить эту задачу, она решила автоматизировать процесс.
4 |
5 | Помогите Алле написать программу, которая по списку рёбер графа будет строить его список смежности.
6 |
7 | ## Формат ввода
8 |
9 | В первой строке дано число вершин n (1 ≤ n ≤ 100) и число ребер m (1 ≤ m ≤ n(n-1)).
10 | В следующих m строках заданы ребра в виде пар вершин (u,v), если ребро ведет от u к v.
11 |
12 | ## Формат вывода
13 |
14 | Выведите информацию о рёбрах, исходящих из каждой вершины.
15 | В строке i надо написать число рёбер, исходящих из вершины i, а затем перечислить вершины, в которые ведут эти рёбра –— в порядке возрастания их номеров.
16 |
17 | ### Пример
18 |
19 |
20 |
21 | 5 3
22 | 1 3
23 | 2 3
24 | 5 2
25 |
26 | |
27 |
28 | 1 3
29 | 1 3
30 | 0
31 | 0
32 | 1 2
33 | |
34 |
35 |
36 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_6/tasks/B/README.md:
--------------------------------------------------------------------------------
1 | # B. Перевести список ребер в матрицу смежности
2 |
3 | Алла успешно справилась с предыдущим заданием, и теперь ей дали новое. На этот раз список рёбер ориентированного графа надо переводить в матрицу смежности. Конечно же, Алла попросила вас помочь написать программу для этого.
4 |
5 | ## Формат ввода
6 |
7 | В первой строке дано число вершин n (1 ≤ n ≤ 100) и число рёбер m (1 ≤ m ≤ n(n-1)). В следующих m строках заданы ребра в виде пар вершин (u,v), если ребро ведет от u к v.
8 |
9 | ## Формат вывода
10 |
11 | Выведите матрицу смежности n на n. На пересечении i-й строки и j-го столбца стоит единица, если есть ребро, ведущее из i в j.
12 |
13 | ### Пример
14 |
15 |
16 |
17 | 5 3
18 | 1 3
19 | 2 3
20 | 5 2
21 |
22 | |
23 |
24 | 0 0 1 0 0
25 | 0 0 1 0 0
26 | 0 0 0 0 0
27 | 0 0 0 0 0
28 | 0 1 0 0 0
29 | |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_6/tasks/B/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "bufio"
5 | "fmt"
6 | "io"
7 | "os"
8 | "strconv"
9 | "strings"
10 | )
11 |
12 | type Matrix [][]int
13 |
14 | func main() {
15 | s := strings.Builder{}
16 | Solution(os.Stdin, &s)
17 |
18 | fmt.Println(s.String())
19 | }
20 |
21 | func Solution(r io.Reader, s *strings.Builder) {
22 | scanner := bufio.NewScanner(r)
23 | scanner.Scan()
24 |
25 | nValues := strings.Fields(scanner.Text())
26 | n, _ := strconv.Atoi(nValues[0])
27 | m, _ := strconv.Atoi(nValues[1])
28 |
29 | matrix := make(Matrix, n)
30 | for i := 0; i < m; i++ {
31 | scanner.Scan()
32 | edge := strings.Fields(scanner.Text())
33 | edgeA, _ := strconv.Atoi(edge[0])
34 | edgeB, _ := strconv.Atoi(edge[1])
35 | edgeA--
36 | edgeB--
37 | if matrix[edgeA] == nil {
38 | matrix[edgeA] = make([]int, n)
39 | }
40 | matrix[edgeA][edgeB] = 1
41 | }
42 | for _, v := range matrix {
43 | if v == nil {
44 | v = make([]int, n)
45 | }
46 | for _, vV := range v {
47 | s.WriteString(fmt.Sprint(vV) + " ")
48 | }
49 | s.WriteString("\n")
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_6/tasks/C/README.md:
--------------------------------------------------------------------------------
1 | # C. DFS
2 |
3 | Задан неориентированный граф. Обойдите с помощью DFS все вершины, достижимые из заданной вершины s, и выведите их в порядке обхода, если начинать обход из s.
4 |
5 | ## Формат ввода
6 |
7 | В первой строке дано количество вершин n (1 ≤ n ≤ 105) и рёбер m (0 ≤ m ≤ 105). Далее в m строках описаны рёбра графа. Каждое ребро описывается номерами двух вершин u и v (1 ≤ u, v ≤ n). В последней строке дан номер стартовой вершины s (1 ≤ s ≤ n).
8 | В графе нет петель и кратных рёбер.
9 |
10 | ## Формат вывода
11 |
12 | Выведите вершины в порядке обхода, считая что при запуске от каждой конкретной вершины её соседи будут рассматриваться в порядке возрастания (то есть если вершина 2 соединена с 1 и 3, то сначала обход пойдёт в 1, а уже потом в 3).
13 |
14 | ### Пример 1
15 |
16 |
17 |
18 | 4 4
19 | 3 2
20 | 4 3
21 | 1 4
22 | 1 2
23 | 3
24 | |
25 |
26 | 3 2 1 4
27 |
28 |
29 |
30 |
31 |
32 | |
33 |
34 |
35 | ### Пример 2
36 |
37 |
38 |
39 | 2 1
40 | 1 2
41 | 1
42 | |
43 |
44 | 1 2
45 |
46 |
47 | |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_6/tasks/C/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "io"
6 | "strings"
7 | "testing"
8 | )
9 |
10 | type TestItem struct {
11 | input io.Reader
12 | output string
13 | }
14 |
15 | func TestTask(t *testing.T) {
16 | tasks := generateTasks()
17 |
18 | for i, v := range tasks {
19 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
20 | buf := strings.Builder{}
21 | Solution(v.input, &buf)
22 | if strings.TrimSpace(buf.String()) != v.output {
23 | t.Errorf("Неверный ответ решения!\nОтвет: \n%v \nВерно: \n%v", buf.String(), v.output)
24 | }
25 | })
26 | }
27 | }
28 |
29 | func generateTasks() []TestItem {
30 | return []TestItem{
31 | {strings.NewReader(`4 4
32 | 3 2
33 | 4 3
34 | 1 4
35 | 1 2
36 | 3
37 | `), "3 2 1 4"},
38 | {strings.NewReader(`2 1
39 | 1 2
40 | 1
41 | `), "1 2"},
42 | {strings.NewReader(`1 0
43 | 1
44 | `), "1"},
45 | {strings.NewReader(`6 7
46 | 3 2
47 | 5 4
48 | 3 1
49 | 1 4
50 | 1 6
51 | 1 2
52 | 1 5
53 | 1
54 | `), "1 2 3 4 5 6"},
55 | {strings.NewReader(`10 13
56 | 9 2
57 | 1 3
58 | 6 10
59 | 5 10
60 | 9 10
61 | 5 9
62 | 3 5
63 | 5 2
64 | 6 7
65 | 5 6
66 | 8 3
67 | 6 1
68 | 4 2
69 | 7
70 | `), "7 6 1 3 5 2 4 9 10 8"},
71 | }
72 | }
73 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_6/tasks/D/README.md:
--------------------------------------------------------------------------------
1 | # D. BFS
2 |
3 | Задан неориентированный граф. Обойдите поиском в ширину все вершины, достижимые из заданной вершины s, и выведите их в порядке обхода, если начинать обход из s.
4 |
5 | ## Формат ввода
6 |
7 | В первой строке дано количество вершин n (1 ≤ n ≤ 105) и рёбер m (0 ≤ m ≤ 105). Далее в m строках описаны рёбра графа. Каждое ребро описывается номерами двух вершин u и v (1 ≤ u, v ≤ n).
8 | В последней строке дан номер стартовой вершины s (1 ≤ s ≤ n).
9 |
10 | Гарантируется, что в графе нет петель и кратных рёбер.
11 |
12 | ## Формат вывода
13 |
14 | Выведите вершины в порядке обхода, считая что при запуске от каждой конкретной вершины её соседи будут рассматриваться в порядке возрастания (то есть если вершина 2 соединена с 1 и 3, то сначала обход пойдёт в 1, а уже потом в 3).
15 |
16 | ### Пример 1
17 |
18 |
19 |
20 | 4 4
21 | 1 2
22 | 2 3
23 | 3 4
24 | 1 4
25 | 3
26 | |
27 |
28 | 3 2 4 1
29 |
30 |
31 |
32 |
33 |
34 | |
35 |
36 |
37 |
38 | ### Пример 2
39 |
40 |
41 |
42 | 2 1
43 | 2 1
44 | 1
45 | |
46 |
47 | 1 2
48 |
49 |
50 | |
51 |
52 |
53 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_6/tasks/D/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "io"
6 | "strings"
7 | "testing"
8 | )
9 |
10 | type TestItem struct {
11 | input io.Reader
12 | output string
13 | }
14 |
15 | func TestTask(t *testing.T) {
16 | tasks := generateTasks()
17 |
18 | for i, v := range tasks {
19 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
20 | buf := strings.Builder{}
21 | Solution(v.input, &buf)
22 | if strings.TrimSpace(buf.String()) != v.output {
23 | t.Errorf("Неверный ответ решения!\nОтвет: \n%v \nВерно: \n%v", buf.String(), v.output)
24 | }
25 | })
26 | }
27 | }
28 |
29 | func generateTasks() []TestItem {
30 | return []TestItem{
31 | {strings.NewReader(`4 4
32 | 1 2
33 | 2 3
34 | 3 4
35 | 1 4
36 | 3
37 | `), "3 2 4 1"},
38 | {strings.NewReader(`2 1
39 | 1 2
40 | 1
41 | `), "1 2"},
42 | {strings.NewReader(`1 0
43 | 1
44 | `), "1"},
45 | {strings.NewReader(`6 7
46 | 3 2
47 | 5 4
48 | 3 1
49 | 1 4
50 | 1 6
51 | 1 2
52 | 1 5
53 | 1
54 | `), "1 2 3 4 5 6"},
55 | {strings.NewReader(`6 8
56 | 5 6
57 | 1 4
58 | 2 5
59 | 2 4
60 | 6 4
61 | 5 4
62 | 1 5
63 | 3 1
64 | 1
65 | `), "1 3 4 5 2 6"},
66 | }
67 | }
68 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_6/tasks/E/README.md:
--------------------------------------------------------------------------------
1 | # E. Компоненты связности
2 |
3 | Вам дан неориентированный граф. Найдите его компоненты связности.
4 |
5 | ## Формат ввода
6 |
7 | В первой строке дано количество вершин n (1≤ n ≤ 105) и рёбер m (0 ≤ m ≤ 2 ⋅ 105). В каждой из следующих m строк записано по ребру в виде пары вершин 1 ≤ u, v ≤ n.
8 |
9 | Гарантируется, что в графе нет петель и кратных рёбер.
10 |
11 | ## Формат вывода
12 |
13 | Выведите все компоненты связности в следующем формате: в первой строке выведите общее количество компонент.
14 |
15 | Затем на отдельных строках выведите вершины каждой компоненты, отсортированные по возрастанию номеров. Компоненты между собой упорядочивайте по номеру первой вершины.
16 |
17 | ### Пример 1
18 |
19 |
20 |
21 | 6 3
22 | 1 2
23 | 6 5
24 | 2 3
25 | |
26 |
27 | 3
28 | 1 2 3
29 | 4
30 | 5 6
31 | |
32 |
33 |
34 | ### Пример 2
35 |
36 |
37 |
38 | 2 0
39 |
40 |
41 | |
42 |
43 | 2
44 | 1
45 | 2
46 | |
47 |
48 |
49 | ### Пример 3
50 |
51 |
52 |
53 | 4 3
54 | 2 3
55 | 2 1
56 | 4 3
57 | |
58 |
59 | 1
60 | 1 2 3 4
61 |
62 |
63 | |
64 |
65 |
66 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_6/tasks/E/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_6/tasks/E/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_6/tasks/F/README.md:
--------------------------------------------------------------------------------
1 | # F. Расстояние между вершинами
2 |
3 | Найдите кратчайшее расстояние между парой вершин в неориентированном графе. Граф может быть несвязным.
4 |
5 | ## Формат ввода
6 |
7 | В первой строке дано количество вершин n (1 ≤ n ≤ 105) и рёбер m (1 ≤ m ≤ 105).
8 | Далее в m строках описаны рёбра графа. Каждое ребро описывается номерами двух вершин u и v (1 ≤ u, v ≤ n). В последней строке дан номер стартовой вершины s (1 ≤ s ≤ n) и конечной t (1 ≤ t ≤ n).
9 |
10 | Гарантируется, что в графе нет петель и кратных рёбер.
11 |
12 | ## Формат вывода
13 |
14 | Выведите длину кратчайшего пути (в рёбрах) между заданной парой вершин. Если пути не существует, то выведите -1.
15 |
16 | ### Пример 1
17 |
18 |
19 |
20 | 5 5
21 | 2 4
22 | 3 5
23 | 2 1
24 | 2 3
25 | 4 5
26 | 1 5
27 | |
28 |
29 | 3
30 |
31 |
32 |
33 |
34 |
35 |
36 | |
37 |
38 |
39 | ### Пример 2
40 |
41 |
42 |
43 | 4 3
44 | 2 3
45 | 4 3
46 | 2 4
47 | 1 3
48 | |
49 |
50 | -1
51 |
52 |
53 |
54 |
55 | |
56 |
57 |
58 | ### Пример 3
59 |
60 |
61 |
62 | 2 1
63 | 2 1
64 | 1 1
65 | |
66 |
67 | 0
68 |
69 |
70 | |
71 |
72 |
73 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_6/tasks/F/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_6/tasks/F/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_6/tasks/G/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_6/tasks/G/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_6/tasks/H/README.md:
--------------------------------------------------------------------------------
1 | # H. Время выходить
2 |
3 | Вам дан ориентированный граф. Известно, что все его вершины достижимы из вершины s=1. Найдите время входа и выхода при обходе в глубину, производя первый запуск из вершины s. Считайте, что время входа в стартовую вершину равно 0. Соседей каждой вершины обходите в порядке увеличения номеров.
4 |
5 | ## Формат ввода
6 |
7 | В первой строке дано число вершин n (1 ≤ n ≤ 2⋅ 105) и рёбер (0 ≤ m ≤ 2 ⋅ 105).
8 | В каждой из следующих m строк записаны рёбра графа в виде пар (from, to), 1 ≤ from ≤ n — начало ребра, 1 ≤ to ≤ n — его конец. Гарантируется, что в графе нет петель и кратных рёбер.
9 |
10 | ## Формат вывода
11 |
12 | Выведите n строк, в каждой из которых записана пара чисел tini, touti — время входа и выхода для вершины i.
13 |
14 | ### Пример 1
15 |
16 |
17 |
18 | 6 8
19 | 2 6
20 | 1 6
21 | 3 1
22 | 2 5
23 | 4 3
24 | 3 2
25 | 1 2
26 | 1 4
27 | |
28 |
29 | 0 11
30 | 1 6
31 | 8 9
32 | 7 10
33 | 2 3
34 | 4 5
35 | |
36 |
37 |
38 | ### Пример 2
39 |
40 |
41 |
42 | 3 2
43 | 1 2
44 | 2 3
45 | |
46 |
47 | 0 5
48 | 1 4
49 | 2 3
50 | |
51 |
52 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_6/tasks/H/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_6/tasks/H/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_6/tasks/J/README.md:
--------------------------------------------------------------------------------
1 | # J. Топологическая сортировка
2 |
3 | Дан ациклический ориентированный граф (так называемый DAG, directed acyclic graph). Найдите его топологическую сортировку, то есть выведите его вершины в таком порядке, что все рёбра графа идут слева направо. У графа может быть несколько подходящих перестановок вершин. Вам надо найти любую топологическую сортировку.
4 |
5 | ## Формат ввода
6 |
7 | В первой строке даны два числа – количество вершин n (1 ≤ n ≤ 105) и количество рёбер m (0 ≤ m ≤ 105). В каждой из следующих m строк описаны рёбра по одному на строке.
8 | Каждое ребро представлено парой вершин (from, to), 1≤ from, to ≤ n, соответственно номерами вершин начала и конца.
9 |
10 | ## Формат вывода
11 |
12 | Выведите номера вершин в требуемом порядке.
13 |
14 | ### Пример 1
15 |
16 |
17 |
18 | 5 3
19 | 3 2
20 | 3 4
21 | 2 5
22 | |
23 |
24 | 1 3 2 4 5
25 |
26 |
27 |
28 | |
29 |
30 |
31 | ### Пример 2
32 |
33 |
34 |
35 | 6 3
36 | 6 4
37 | 4 1
38 | 5 1
39 | |
40 |
41 | 2 3 5 6 4 1
42 |
43 |
44 |
45 | |
46 |
47 |
48 | ### Пример 3
49 |
50 |
51 |
52 | 4 0
53 | |
54 |
55 | 1 2 3 4
56 | |
57 |
58 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_6/tasks/J/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "io"
6 | "strings"
7 | "testing"
8 | )
9 |
10 | type TestItem struct {
11 | input io.Reader
12 | output string
13 | }
14 |
15 | func TestTask(t *testing.T) {
16 | tasks := generateTasks()
17 |
18 | for i, v := range tasks {
19 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
20 | buf := strings.Builder{}
21 | Solution(v.input, &buf)
22 | if buf.String() != v.output {
23 | t.Errorf("Неверный ответ решения!\nОтвет: \n%v \nВерно: \n%v", buf.String(), v.output)
24 | }
25 | })
26 | }
27 | }
28 |
29 | func generateTasks() []TestItem {
30 | return []TestItem{
31 | {strings.NewReader(`5 3
32 | 3 2
33 | 3 4
34 | 2 5
35 | `), "1 3 2 4 5"},
36 | {strings.NewReader(`6 3
37 | 6 4
38 | 4 1
39 | 5 1
40 | `), "2 3 5 6 4 1"},
41 | {strings.NewReader(`4 0
42 | `), "1 2 3 4"},
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_6/tasks/K/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_6/tasks/K/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_6/tasks/L/README.md:
--------------------------------------------------------------------------------
1 | # L. Полный граф
2 |
3 | Неориентированный граф называется полным, если в нём каждая пара вершин соединена ребром.
4 |
5 | Вам дан неориентированный граф из n вершин и m рёбер. Выясните, является ли этот граф полным.
6 |
7 | ## Формат ввода
8 |
9 | В первой строке дано число вершин n (1 ≤ n ≤ 105) и число рёбер m (0 ≤ m ≤ 5 ⋅ 105). В следующих m строках записаны рёбра в виде пар вершин u и v (1 ≤ u, v ≤ n).
10 |
11 | ## Формат вывода
12 |
13 | Если граф является полным, выведите «YES», иначе выведите «NO».
14 |
15 | ### Пример 1
16 |
17 |
18 |
19 | 4 6
20 | 1 2
21 | 2 2
22 | 2 3
23 | 2 4
24 | 3 4
25 | 4 3
26 | |
27 |
28 | NO
29 |
30 |
31 |
32 |
33 |
34 |
35 | |
36 |
37 |
38 | ### Пример 2
39 |
40 |
41 |
42 | 3 5
43 | 1 2
44 | 2 1
45 | 3 1
46 | 2 3
47 | 3 3
48 | |
49 |
50 | YES
51 |
52 |
53 |
54 |
55 |
56 | |
57 |
58 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_6/tasks/L/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "io"
6 | "strings"
7 | "testing"
8 | )
9 |
10 | type TestItem struct {
11 | input io.Reader
12 | output string
13 | }
14 |
15 | func TestTask(t *testing.T) {
16 | tasks := generateTasks()
17 |
18 | for i, v := range tasks {
19 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
20 | buf := strings.Builder{}
21 | Solution(v.input, &buf)
22 | if buf.String() != v.output {
23 | t.Errorf("Неверный ответ решения!\nОтвет: \n%v \nВерно: \n%v", buf.String(), v.output)
24 | }
25 | })
26 | }
27 | }
28 |
29 | func generateTasks() []TestItem {
30 | return []TestItem{
31 | {strings.NewReader(`4 6
32 | 1 2
33 | 2 2
34 | 2 3
35 | 2 4
36 | 3 4
37 | 4 3
38 | `), "NO"},
39 | {strings.NewReader(`3 5
40 | 1 2
41 | 2 1
42 | 3 1
43 | 2 3
44 | 3 3
45 | `), "YES"},
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_6/tasks/M/img.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dmitryburov/algorithm-practice/1501896081a17ead0f3e5571f9f13cabaf889142/yandex_practicum/sprint_6/tasks/M/img.png
--------------------------------------------------------------------------------
/yandex_practicum/sprint_6/tasks/M/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "io"
6 | "strings"
7 | "testing"
8 | )
9 |
10 | type TestItem struct {
11 | input io.Reader
12 | output string
13 | }
14 |
15 | func TestTask(t *testing.T) {
16 | tasks := generateTasks()
17 |
18 | for i, v := range tasks {
19 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
20 | buf := strings.Builder{}
21 | Solution(v.input, &buf)
22 | if strings.TrimSpace(buf.String()) != v.output {
23 | t.Errorf("Неверный ответ решения!\nОтвет: \n%v \nВерно: \n%v", buf.String(), v.output)
24 | }
25 | })
26 | }
27 | }
28 |
29 | func generateTasks() []TestItem {
30 | return []TestItem{
31 | {strings.NewReader(`3 2
32 | 1 2
33 | 2 3
34 | `), SUCCESS},
35 | {strings.NewReader(`3 3
36 | 1 2
37 | 2 3
38 | 1 3
39 | `), FAIL},
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_7/final/A/README.md:
--------------------------------------------------------------------------------
1 | # A. Расстояние по Левенштейну
2 |
3 | Расстоянием Левенштейна между двумя строками s и t называется количество атомарных изменений, с помощью которых можно одну строку превратить в другую. Под атомарными изменениями подразумеваются: удаление одного символа, вставка одного символа, замена одного символа на другой.
4 |
5 | Найдите расстояние Левенштейна для предложенной пары строк.
6 |
7 | ## Формат ввода
8 |
9 | В первой строке дана строка s, во второй — строка t. Длины обеих строк не превосходят 1000. Строки состоят из маленьких латинских букв.
10 |
11 | ## Формат вывода
12 |
13 | Выведите единственное число — расстояние между строками.
14 |
15 | ### Пример 1
16 |
17 |
18 |
19 | abacaba
20 | abaabc
21 | |
22 |
23 | 2
24 |
25 | |
26 |
27 |
28 | ### Пример 2
29 |
30 |
31 |
32 | innokentiy
33 | innnokkentia
34 | |
35 |
36 | 3
37 |
38 | |
39 |
40 |
41 | ### Пример 3
42 |
43 |
44 |
45 | r
46 | x
47 | |
48 |
49 | 1
50 |
51 | |
52 |
53 |
54 |
55 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_7/final/A/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "bufio"
5 | "bytes"
6 | "fmt"
7 | "io"
8 | "os"
9 | "strings"
10 | )
11 |
12 | func main() {
13 | s := strings.Builder{}
14 | Solution(os.Stdin, &s)
15 |
16 | fmt.Println(s.String())
17 | }
18 |
19 | // Solution решение задачи
20 | func Solution(r io.Reader, w *strings.Builder) {
21 | scanner := bufio.NewScanner(r)
22 |
23 | // считаем строки в байты (!)
24 | scanner.Scan()
25 | s := scanner.Bytes()
26 | scanner.Scan()
27 | t := scanner.Bytes()
28 |
29 | lenS, lenT := len(s), len(t)
30 |
31 | // fix базовый случай
32 | if bytes.Equal(s, t) {
33 | w.WriteString("0")
34 | return
35 | }
36 |
37 | matrix := make([]int, lenS+1)
38 | for i := 1; i < len(matrix); i++ {
39 | matrix[i] = i
40 | }
41 |
42 | for i := 1; i <= lenT; i++ {
43 | prev := i
44 | for j := 1; j <= lenS; j++ {
45 | if t[i-1] != s[j-1] {
46 | matrix[j-1] = getMinimum(matrix[j]+1, getMinimum(matrix[j-1]+1, prev+1))
47 | }
48 | matrix[j-1], prev = prev, matrix[j-1]
49 | }
50 | matrix[lenS] = prev
51 | }
52 |
53 | // результат
54 | w.WriteString(fmt.Sprint(matrix[lenS]))
55 | }
56 |
57 | // getMinimum сравнение минимального числа
58 | func getMinimum(a, b int) int {
59 | if a < b {
60 | return a
61 | }
62 | return b
63 | }
64 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_7/final/A/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "io"
6 | "strings"
7 | "testing"
8 | )
9 |
10 | type TestItem struct {
11 | input io.Reader
12 | output string
13 | }
14 |
15 | func TestTask(t *testing.T) {
16 | tasks := generateTasks()
17 |
18 | for i, v := range tasks {
19 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
20 | buf := strings.Builder{}
21 | Solution(v.input, &buf)
22 | if buf.String() != v.output {
23 | t.Errorf("Неверный ответ решения!\nОтвет: \n%v \nВерно: \n%v", buf.String(), v.output)
24 | }
25 | })
26 | }
27 | }
28 |
29 | func generateTasks() []TestItem {
30 | return []TestItem{
31 | {strings.NewReader(`abacaba
32 | abaabc
33 | `), "2"},
34 | {strings.NewReader(`innokentiy
35 | innnokkentia
36 | `), "3"},
37 | {strings.NewReader(`r
38 | x
39 | `), "1"},
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_7/final/B/README.md:
--------------------------------------------------------------------------------
1 | # B. Одинаковые суммы
2 |
3 | На Алгосах устроили турнир по настольному теннису. Гоша выиграл n партий, получив при этом некоторое количество очков за каждую из них.
4 |
5 | Гоше стало интересно, можно ли разбить все заработанные им во время турнира очки на две части так, чтобы сумма в них была одинаковой.
6 |
7 | ## Формат ввода
8 |
9 | В первой строке записано целое число n (0 ≤ n ≤ 300) –— количество выигранных партий.
10 |
11 | Во второй строке через пробел записано n целых неотрицательных чисел, каждое из которых не превосходит 300 –— заработанные в партиях очки.
12 |
13 | ## Формат вывода
14 |
15 | Нужно вывести True, если произвести такое разбиение возможно, иначе —– False
16 |
17 | ### Пример 1
18 |
19 |
20 |
21 | 4
22 | 1 5 7 1
23 | |
24 |
25 | True
26 |
27 | |
28 |
29 |
30 | ### Пример 2
31 |
32 |
33 |
34 | 3
35 | 2 10 9
36 | |
37 |
38 | False
39 |
40 | |
41 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_7/final/B/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "io"
6 | "strings"
7 | "testing"
8 | )
9 |
10 | type TestItem struct {
11 | input io.Reader
12 | output string
13 | }
14 |
15 | func TestTask(t *testing.T) {
16 | tasks := generateTasks()
17 |
18 | for i, v := range tasks {
19 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
20 | buf := strings.Builder{}
21 | Solution(v.input, &buf)
22 | if buf.String() != v.output {
23 | t.Errorf("Неверный ответ решения!\nОтвет: \n%v \nВерно: \n%v", buf.String(), v.output)
24 | }
25 | })
26 | }
27 | }
28 |
29 | func generateTasks() []TestItem {
30 | return []TestItem{
31 | {strings.NewReader(`4
32 | 1 5 7 1
33 | `), "True"},
34 | {strings.NewReader(`3
35 | 2 10 9
36 | `), "False"},
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_7/tasks/A/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "io"
6 | "strings"
7 | "testing"
8 | )
9 |
10 | type TestItem struct {
11 | input io.Reader
12 | output string
13 | }
14 |
15 | func TestTask(t *testing.T) {
16 | tasks := generateTasks()
17 |
18 | for i, v := range tasks {
19 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
20 | buf := strings.Builder{}
21 | Solution(v.input, &buf)
22 | if buf.String() != v.output {
23 | t.Errorf("Неверный ответ решения!\nОтвет: \n%v \nВерно: \n%v", buf.String(), v.output)
24 | }
25 | })
26 | }
27 | }
28 |
29 | func generateTasks() []TestItem {
30 | return []TestItem{
31 | {strings.NewReader(`6
32 | 7 1 5 3 6 4
33 | `), "7"},
34 | {strings.NewReader(`5
35 | 1 2 3 4 5
36 | `), "4"},
37 | {strings.NewReader(`6
38 | 1 12 12 16 1 8
39 | `), "22"},
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_7/tasks/C/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "io"
6 | "strings"
7 | "testing"
8 | )
9 |
10 | type TestItem struct {
11 | input io.Reader
12 | output string
13 | }
14 |
15 | func TestTask(t *testing.T) {
16 | tasks := generateTasks()
17 |
18 | for i, v := range tasks {
19 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
20 | buf := strings.Builder{}
21 | Solution(v.input, &buf)
22 | if buf.String() != v.output {
23 | t.Errorf("Неверный ответ решения!\nОтвет: \n%v \nВерно: \n%v", buf.String(), v.output)
24 | }
25 | })
26 | }
27 | }
28 |
29 | func generateTasks() []TestItem {
30 | return []TestItem{
31 | {strings.NewReader(`10
32 | 3
33 | 8 1
34 | 2 10
35 | 4 5
36 | `), "36"},
37 | {strings.NewReader(`10000
38 | 1
39 | 4 20
40 | `), "80"},
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_7/tasks/D/README.md:
--------------------------------------------------------------------------------
1 | # D. Числа Фибоначчи для взрослых
2 |
3 | Гоша практикуется в динамическом программировании — он хочет быстро считать числа Фибоначчи.
4 |
5 | Напомним, что числа Фибоначчи определены как последовательность Fn, n = 0,1. F0 = F1 = 1, Fn = Fn-1 + Fn-2, n ≥ 2.
6 |
7 | Помогите Гоше решить эту задачу
8 |
9 | ## Формат ввода
10 |
11 | В единственной строке дано целое число n (0 ≤ n ≤ 106).
12 |
13 | ## Формат вывода
14 |
15 | Вычислите значение Fn по модулю 109 + 7 и выведите его.
16 |
17 | ### Пример 1
18 |
19 |
20 |
21 | 5
22 | |
23 |
24 | 8
25 | |
26 |
27 |
28 | ### Пример 2
29 |
30 |
31 |
32 | 2
33 | |
34 |
35 | 2
36 | |
37 |
38 |
39 | ### Пример 3
40 |
41 |
42 |
43 | 10
44 | |
45 |
46 | 89
47 | |
48 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_7/tasks/D/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "bufio"
5 | "fmt"
6 | "io"
7 | "log"
8 | "os"
9 | "strconv"
10 | "strings"
11 | )
12 |
13 | const MOD = 1000000007
14 |
15 | func main() {
16 | s := strings.Builder{}
17 | Solution(os.Stdin, &s)
18 | fmt.Println(s.String())
19 | }
20 |
21 | func Solution(r io.Reader, s *strings.Builder) {
22 | scanner := bufio.NewScanner(r)
23 | scanner.Scan()
24 |
25 | n, err := strconv.Atoi(scanner.Text())
26 | if err != nil {
27 | log.Fatal(err)
28 | }
29 |
30 | dp := make([]int, n+1)
31 | dp[0], dp[1] = 1, 1
32 | for i := 2; i < n+1; i++ {
33 | dp[i] = (dp[i-1] + dp[i-2]) % MOD
34 | }
35 |
36 | s.WriteString(fmt.Sprint(dp[n]))
37 | }
38 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_7/tasks/D/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "io"
6 | "strings"
7 | "testing"
8 | )
9 |
10 | type TestItem struct {
11 | input io.Reader
12 | output string
13 | }
14 |
15 | func TestTask(t *testing.T) {
16 | tasks := generateTasks()
17 |
18 | for i, v := range tasks {
19 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
20 | buf := strings.Builder{}
21 | Solution(v.input, &buf)
22 | if buf.String() != v.output {
23 | t.Errorf("Неверный ответ решения!\nОтвет: \n%v \nВерно: \n%v", buf.String(), v.output)
24 | }
25 | })
26 | }
27 | }
28 |
29 | func generateTasks() []TestItem {
30 | return []TestItem{
31 | {strings.NewReader(`5`), "8"},
32 | {strings.NewReader(`2`), "2"},
33 | {strings.NewReader(`10`), "89"},
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_7/tasks/E/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "io"
6 | "strings"
7 | "testing"
8 | )
9 |
10 | type TestItem struct {
11 | input io.Reader
12 | output string
13 | }
14 |
15 | func TestTask(t *testing.T) {
16 | tasks := generateTasks()
17 |
18 | for i, v := range tasks {
19 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
20 | buf := strings.Builder{}
21 | Solution(v.input, &buf)
22 | if buf.String() != v.output {
23 | t.Errorf("Неверный ответ решения!\nОтвет: \n%v \nВерно: \n%v", buf.String(), v.output)
24 | }
25 | })
26 | }
27 | }
28 |
29 | func generateTasks() []TestItem {
30 | return []TestItem{
31 | {strings.NewReader(`130
32 | 4
33 | 10 3 40 1
34 | `), "4"},
35 | {strings.NewReader(`100
36 | 2
37 | 7 5
38 | `), "16"},
39 | {strings.NewReader(`1
40 | 1
41 | 1
42 | `), "1"},
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_7/tasks/F/README.md:
--------------------------------------------------------------------------------
1 | # F. Прыжки по лестнице
2 |
3 | Алла хочет доказать, что она умеет прыгать вверх по лестнице быстрее всех. На этот раз соревнования будут проходить на специальной прыгательной лестнице. С каждой её ступеньки можно прыгнуть вверх на любое расстояние от 1 до k. Число k придумывает Алла.
4 |
5 | Гоша не хочет проиграть, поэтому просит вас посчитать количество способов допрыгать от первой ступеньки до n-й. Изначально все стоят на первой ступеньке.
6 |
7 | ## Формат ввода
8 |
9 | В единственной строке даны два числа — n и k (1 ≤ n ≤ 1000, 1 ≤ k ≤ n).
10 |
11 | ## Формат вывода
12 |
13 | Выведите количество способов по модулю 109 + 7.
14 |
15 | ### Пример 1
16 |
17 |
18 |
19 | 6 3
20 | |
21 |
22 | 13
23 | |
24 |
25 |
26 | ### Пример 2
27 |
28 |
29 |
30 | 7 7
31 | |
32 |
33 | 32
34 | |
35 |
36 |
37 | ### Пример 3
38 |
39 |
40 |
41 | 2 2
42 | |
43 |
44 | 1
45 | |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_7/tasks/F/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "bufio"
5 | "fmt"
6 | "io"
7 | "log"
8 | "os"
9 | "strconv"
10 | "strings"
11 | )
12 |
13 | const MOD = 1000000007
14 |
15 | func main() {
16 | s := strings.Builder{}
17 | Solution(os.Stdin, &s)
18 |
19 | fmt.Println(s.String())
20 | }
21 |
22 | func Solution(r io.Reader, s *strings.Builder) {
23 | scanner := bufio.NewScanner(r)
24 |
25 | var err error
26 | var n, k int
27 |
28 | scanner.Scan()
29 | arrStr := strings.Fields(scanner.Text())
30 |
31 | n, err = strconv.Atoi(arrStr[0])
32 | if err != nil {
33 | log.Fatal(err)
34 | }
35 |
36 | k, err = strconv.Atoi(arrStr[1])
37 | if err != nil {
38 | log.Fatal(err)
39 | }
40 |
41 | ladder := make([]int, n+1)
42 | ladder[0] = 0
43 | ladder[1] = 1
44 |
45 | for i := 2; i < len(ladder); i++ {
46 | if k >= i {
47 | for j := 1; j < i; j++ {
48 | ladder[i] += ladder[j]
49 | }
50 | } else {
51 | for j := i - k; j < i; j++ {
52 | ladder[i] += ladder[j]
53 | }
54 | }
55 |
56 | ladder[i] = ladder[i] % MOD
57 | }
58 |
59 | s.WriteString(fmt.Sprint(ladder[n]))
60 | }
61 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_7/tasks/F/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "io"
6 | "strings"
7 | "testing"
8 | )
9 |
10 | type TestItem struct {
11 | input io.Reader
12 | output string
13 | }
14 |
15 | func TestTask(t *testing.T) {
16 | tasks := generateTasks()
17 |
18 | for i, v := range tasks {
19 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
20 | buf := strings.Builder{}
21 | Solution(v.input, &buf)
22 | if buf.String() != v.output {
23 | t.Errorf("Неверный ответ решения!\nОтвет: \n%v \nВерно: \n%v", buf.String(), v.output)
24 | }
25 | })
26 | }
27 | }
28 |
29 | func generateTasks() []TestItem {
30 | return []TestItem{
31 | {strings.NewReader(`6 3`), "13"},
32 | {strings.NewReader(`7 7`), "32"},
33 | {strings.NewReader(`2 2`), "1"},
34 | {strings.NewReader(`62 44`), "535806680"},
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_7/tasks/H/README.md:
--------------------------------------------------------------------------------
1 | # H. Поле с цветочками
2 |
3 | Черепаха Кондратина путешествует по клетчатому полю из n строк и m столбцов. В каждой клетке либо растёт цветочек, либо не растёт. Кондратине надо добраться из левого нижнего в правый верхний угол и собрать как можно больше цветочков.
4 |
5 | Помогите ей с этой сложной задачей и определите, какое наибольшее число цветочков она сможет собрать при условии, что Кондратина умеет передвигаться только на одну клетку вверх или на одну клетку вправо за ход.
6 |
7 | ## Формат ввода
8 |
9 | В первой строке даны размеры поля n и m (через пробел). Оба числа лежат в диапазоне от 1 до 1000. В следующих n строках задано поле. Каждая строка состоит из m символов 0 или 1, записанных подряд без пробелов, и завершается переводом строки. Если в клетке записана единица, то в ней растёт цветочек.
10 |
11 | ## Формат вывода
12 |
13 | Выведите единственное число — максимальное количество цветочков, которое сможет собрать Кондратина.
14 |
15 | ### Пример 1
16 |
17 |
18 |
19 | 2 3
20 | 101
21 | 110
22 | |
23 |
24 | 3
25 |
26 |
27 | |
28 |
29 |
30 | ### Пример 2
31 |
32 |
33 |
34 | 3 3
35 | 100
36 | 110
37 | 001
38 | |
39 |
40 | 2
41 |
42 |
43 |
44 | |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_7/tasks/H/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "io"
6 | "strings"
7 | "testing"
8 | )
9 |
10 | type TestItem struct {
11 | input io.Reader
12 | output string
13 | }
14 |
15 | func TestTask(t *testing.T) {
16 | tasks := generateTasks()
17 |
18 | for i, v := range tasks {
19 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
20 | buf := strings.Builder{}
21 | Solution(v.input, &buf)
22 | if buf.String() != v.output {
23 | t.Errorf("Неверный ответ решения!\nОтвет: \n%v \nВерно: \n%v", buf.String(), v.output)
24 | }
25 | })
26 | }
27 | }
28 |
29 | func generateTasks() []TestItem {
30 | return []TestItem{
31 | {strings.NewReader(`2 3
32 | 101
33 | 110
34 | `), "3"},
35 | {strings.NewReader(`3 3
36 | 100
37 | 110
38 | 001
39 | `), "2"},
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_7/tasks/I/README.md:
--------------------------------------------------------------------------------
1 | # I. Сложное поле с цветочками
2 |
3 | Теперь черепашке Кондратине надо узнать не только, сколько цветочков она может собрать, но и как ей построить свой маршрут для этого. Помогите ей!
4 |
5 | Напомним, что Кондратине надо дойти от левого нижнего до правого верхнего угла, а передвигаться она умеет только вверх и вправо.
6 |
7 | ## Формат ввода
8 |
9 | В первой строке даны размеры поля n и m (через пробел). Оба числа лежат в диапазоне от 1 до 1000. В следующих n строках задано поле. Каждая строка состоит из m символов 0 или 1 и завершается переводом строки. Если в клетке записана единица, то в ней растет цветочек.
10 |
11 | ## Формат вывода
12 |
13 | Выведите в первой строке максимальное количество цветочков, которое сможет собрать Кондратина. Во второй строке выведите маршрут в виде последовательности символов «U» и «R», где «U» означает передвижение вверх, а «R» – передвижение вправо.
14 |
15 | Если возможных оптимальных путей несколько, то выведите любой.
16 |
17 | ### Пример 1
18 |
19 |
20 |
21 | 2 3
22 | 101
23 | 110
24 | |
25 |
26 | 3
27 | URR
28 |
29 | |
30 |
31 |
32 | ### Пример 2
33 |
34 |
35 |
36 | 3 3
37 | 100
38 | 110
39 | 001
40 | |
41 |
42 | 2
43 | URR
44 |
45 |
46 | |
47 |
48 |
49 |
50 |
51 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_7/tasks/L/README.md:
--------------------------------------------------------------------------------
1 | # L. Золото лепреконов
2 |
3 | Лепреконы в данной задаче появились по соображениям общей морали, так как грабить банки — нехорошо.
4 |
5 | Вам удалось заключить неплохую сделку с лепреконами, поэтому они пустили вас в своё хранилище золотых слитков. Все слитки имеют единую пробу, то есть стоимость 1 грамма золота в двух разных слитках одинакова. В хранилище есть n слитков, вес i-го слитка равен wi кг. У вас есть рюкзак, вместимость которого M килограмм.
6 |
7 | Выясните максимальную суммарную массу золотых слитков, которую вы сможете унести.
8 |
9 | ## Формат ввода
10 |
11 | В первой строке дано число слитков —– натуральное число n (1 ≤ n ≤ 1000) и вместимость рюкзака –— целое число M (0 ≤ M ≤ 104). Во второй строке записано n натуральных чисел wi (1 ≤ wi ≤ 104) -— массы слитков.
12 |
13 | ## Формат вывода
14 |
15 | Выведите единственное число — максимальную массу, которую можно забрать с собой.
16 |
17 | ### Пример 1
18 |
19 |
20 |
21 | 5 15
22 | 3 8 1 2 5
23 | |
24 |
25 | 15
26 |
27 | |
28 |
29 |
30 | ### Пример 2
31 |
32 |
33 |
34 | 5 19
35 | 10 10 7 7 4
36 | |
37 |
38 | 18
39 |
40 | |
41 |
42 |
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_7/tasks/L/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "io"
6 | "strings"
7 | "testing"
8 | )
9 |
10 | type TestItem struct {
11 | input io.Reader
12 | output string
13 | }
14 |
15 | func TestTask(t *testing.T) {
16 | tasks := generateTasks()
17 |
18 | for i, v := range tasks {
19 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
20 | buf := strings.Builder{}
21 | Solution(v.input, &buf)
22 | if buf.String() != v.output {
23 | t.Errorf("Неверный ответ решения!\nОтвет: \n%v \nВерно: \n%v", buf.String(), v.output)
24 | }
25 | })
26 | }
27 | }
28 |
29 | func generateTasks() []TestItem {
30 | return []TestItem{
31 | {strings.NewReader(`5 15
32 | 3 8 1 2 5
33 | `), "15"},
34 | {strings.NewReader(`5 19
35 | 10 10 7 7 4
36 | `), "18"},
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_7/tasks/M/README.md:
--------------------------------------------------------------------------------
1 | # M. Рюкзак
2 |
3 | Тимофей решил отправиться в поход. Ему надо собрать рюкзак. Так как поход долгий и трудный, необходимо подбирать вещи вдумчиво.
4 |
5 | Каждому предмету Тимофей присвоил условную значимость: она равна ci для предмета с номером i. Также каждый предмет весит mi килограммов. А грузоподъёмность рюкзака равна M килограмм.
6 |
7 | Найдите максимальную суммарную значимость предметов, которые Тимофей может взять с собой, не порвав рюкзак, и укажите, как набрать эту значимость.
8 |
9 | ## Формат ввода
10 |
11 | В первой строке вводится число предметов n, не превышающее 100 и грузоподъемность M, не превышающая 104.
12 |
13 | Далее следуют описания предметов по одному в строке. Каждый предмет описывается парой mi, ci, оба числа не превосходят 100 по модулю.
14 |
15 | ## Формат вывода
16 |
17 | Выведите в первой строке единственное число — сколько предметов надо взять. Во второй строке перечислите их номера (нумерация с единицы). Если ответов несколько, то выведите любой.
18 |
19 | ### Пример
20 |
21 |
22 |
23 | 4 6
24 | 2 7
25 | 4 2
26 | 1 5
27 | 2 1
28 | |
29 |
30 | 3
31 | 4 3 1
32 |
33 |
34 |
35 | |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_7/tasks/M/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "io"
6 | "strings"
7 | "testing"
8 | )
9 |
10 | type TestItem struct {
11 | input io.Reader
12 | output string
13 | }
14 |
15 | func TestTask(t *testing.T) {
16 | tasks := generateTasks()
17 |
18 | for i, v := range tasks {
19 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
20 | buf := strings.Builder{}
21 | Solution(v.input, &buf)
22 | if buf.String() != v.output {
23 | t.Errorf("Неверный ответ решения!\nОтвет: \n%v \nВерно: \n%v", buf.String(), v.output)
24 | }
25 | })
26 | }
27 | }
28 |
29 | func generateTasks() []TestItem {
30 | return []TestItem{
31 | {strings.NewReader(`4 6
32 | 2 7
33 | 4 2
34 | 1 5
35 | 2 1
36 | `), `3
37 | 4 3 1`},
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_7/tasks/O/README.md:
--------------------------------------------------------------------------------
1 | # O. Количество путей
2 |
3 | Вам дан ациклический ориентированный граф. Найдите в нем количество путей от вершины A до вершины B. Так как потенциально различных путей может быть очень много, то выведите остаток этого числа по модулю 109 + 7.
4 |
5 | ## Формат ввода
6 |
7 | В первой строке дано количество вершин в графе n и ребер m (1 ≤ n ≤ 105, 0 ≤ m ≤ 5 ⋅ 105). В каждой из следующих m строк описаны ребра. Каждое ребро задается своим началом и концом. В последней строке даны вершины A и B (1 ≤ A, B ≤ n).
8 |
9 | ## Формат вывода
10 |
11 | Выведите единственное число – количество путей от A до B по модулю 109 + 7.
12 |
13 | ### Пример 1
14 |
15 |
16 |
17 | 3 3
18 | 1 2
19 | 1 2
20 | 2 3
21 | 1 3
22 | |
23 |
24 | 2
25 |
26 |
27 |
28 |
29 | |
30 |
31 |
32 | ### Пример 2
33 |
34 |
35 |
36 | 5 3
37 | 1 2
38 | 3 4
39 | 4 5
40 | 1 5
41 | |
42 |
43 | 0
44 |
45 |
46 |
47 |
48 | |
49 |
50 |
51 | ### Пример 3
52 |
53 |
54 |
55 | 3 3
56 | 1 2
57 | 2 3
58 | 1 3
59 | 1 1
60 | |
61 |
62 | 1
63 |
64 |
65 |
66 |
67 | |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_7/tasks/O/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "io"
6 | "strings"
7 | "testing"
8 | )
9 |
10 | type TestItem struct {
11 | input io.Reader
12 | output string
13 | }
14 |
15 | func TestTask(t *testing.T) {
16 | tasks := generateTasks()
17 |
18 | for i, v := range tasks {
19 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
20 | buf := strings.Builder{}
21 | Solution(v.input, &buf)
22 | if buf.String() != v.output {
23 | t.Errorf("Неверный ответ решения!\nОтвет: \n%v \nВерно: \n%v", buf.String(), v.output)
24 | }
25 | })
26 | }
27 | }
28 |
29 | func generateTasks() []TestItem {
30 | return []TestItem{
31 | {strings.NewReader(`3 3
32 | 1 2
33 | 1 2
34 | 2 3
35 | 1 3
36 | `), "2"},
37 | {strings.NewReader(`5 3
38 | 1 2
39 | 3 4
40 | 4 5
41 | 1 5
42 | `), "0"},
43 | {strings.NewReader(`3 3
44 | 1 2
45 | 2 3
46 | 1 3
47 | 1 1
48 | `), "1"},
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_8/final/B/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "bufio"
5 | "fmt"
6 | "io"
7 | "strings"
8 | "testing"
9 | )
10 |
11 | type TestItem struct {
12 | input io.Reader
13 | output string
14 | }
15 |
16 | func TestTask(t *testing.T) {
17 | tasks := generateTasks()
18 |
19 | for i, v := range tasks {
20 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
21 | buf := strings.Builder{}
22 | s, n := initInput(bufio.NewScanner(v.input))
23 | Solution(s, n, &buf)
24 | if buf.String() != v.output {
25 | t.Errorf("Неверный ответ решения!\nОтвет: \n%v \nВерно: \n%v", buf.String(), v.output)
26 | }
27 | })
28 | }
29 | }
30 |
31 | func generateTasks() []TestItem {
32 | return []TestItem{
33 | {strings.NewReader(`examiwillpasstheexam
34 | 5
35 | will
36 | pass
37 | the
38 | exam
39 | i
40 | `), "YES"},
41 | {strings.NewReader(`abacaba
42 | 2
43 | abac
44 | caba
45 | `), "NO"},
46 | {strings.NewReader(`abacaba
47 | 3
48 | abac
49 | caba
50 | aba
51 | `), "YES"},
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_8/tasks/A/README.md:
--------------------------------------------------------------------------------
1 | # A. Разворот строки
2 |
3 | В некоторых языках предложения пишутся и читаются не слева направо, а справа налево.
4 |
5 | Вам под руку попался странный текст –— в нём обычный (слева направо) порядок букв в словах. А вот сами слова идут в противоположном направлении. Вам надо преобразовать текст так, чтобы слова в нём были написаны слева направо.
6 |
7 | ## Формат ввода
8 |
9 | На ввод подаётся строка, состоящая из слов, разделённых пробелами (один пробел между соседними словами). Всего слов не более 1000, длина каждого из них —– от 1 до 100 символов. Слова состоят из строчных букв английского алфавита.
10 |
11 | ## Формат вывода
12 |
13 | Выведите строку с обратным порядком слов в ней.
14 |
15 | ### Пример 1
16 |
17 |
18 |
19 | one two three
20 | |
21 |
22 | three two one
23 | |
24 |
25 |
26 | ### Пример 2
27 |
28 |
29 |
30 | hello
31 | |
32 |
33 | hello
34 | |
35 |
36 |
37 | ### Пример 3
38 |
39 |
40 |
41 | may the force be with you
42 | |
43 |
44 | you with be force the may
45 | |
46 |
47 |
48 |
49 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_8/tasks/A/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "bufio"
5 | "fmt"
6 | "io"
7 | "os"
8 | "strings"
9 | )
10 |
11 | func main() {
12 | s := strings.Builder{}
13 | Solution(os.Stdin, &s)
14 |
15 | fmt.Println(s.String())
16 | }
17 |
18 | func Solution(r io.Reader, s *strings.Builder) {
19 | scanner := bufio.NewScanner(r)
20 | scanner.Scan()
21 |
22 | fields := strings.Fields(scanner.Text())
23 | for i, g := 0, len(fields)-1; i < g; i, g = i+1, g-1 {
24 | fields[i], fields[g] = fields[g], fields[i]
25 | }
26 |
27 | s.WriteString(strings.Join(fields, " "))
28 | }
29 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_8/tasks/A/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "io"
6 | "strings"
7 | "testing"
8 | )
9 |
10 | type TestItem struct {
11 | input io.Reader
12 | output string
13 | }
14 |
15 | func TestTask(t *testing.T) {
16 | tasks := generateTasks()
17 |
18 | for i, v := range tasks {
19 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
20 | buf := strings.Builder{}
21 | Solution(v.input, &buf)
22 | if buf.String() != v.output {
23 | t.Errorf("Неверный ответ решения!\nОтвет: \n%v \nВерно: \n%v", buf.String(), v.output)
24 | }
25 | })
26 | }
27 | }
28 |
29 | func generateTasks() []TestItem {
30 | return []TestItem{
31 | {strings.NewReader(`one two three`), "three two one"},
32 | {strings.NewReader(`hello`), "hello"},
33 | {strings.NewReader(`may the force be with you`), "you with be force the may"},
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_8/tasks/C/README.md:
--------------------------------------------------------------------------------
1 | # C. Самый длинный палиндром 2
2 |
3 | Палиндром —– это строка, которая одинаково читается как слева направо, так и справа налево.
4 |
5 | Из данной строки s путём удаления и перестановки букв надо получить палиндром максимальной длины. Среди всех таких палиндромов надо получить лексикографически минимальный. Количество удалений и перестановок символов может быть любым.
6 |
7 | ## Формат ввода
8 |
9 | В единственной строке дана строка s. Длина строки |s| ≤ 105. Строка состоит из строчных букв английского алфавита.
10 |
11 | ## Формат вывода
12 |
13 | Выведите полученный палиндром. Заметьте, что ответ определяется однозначно.
14 |
15 | ### Пример 1
16 |
17 |
18 |
19 | aaaabb
20 | |
21 |
22 | aabbaa
23 | |
24 |
25 |
26 | ### Пример 2
27 |
28 |
29 |
30 | pabcd
31 | |
32 |
33 | a
34 | |
35 |
36 |
37 | ### Пример 3
38 |
39 |
40 |
41 | aaabbb
42 | |
43 |
44 | ababa
45 | |
46 |
47 |
48 |
49 |
50 |
51 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_8/tasks/D/README.md:
--------------------------------------------------------------------------------
1 | # D. Общий префикс
2 |
3 | Найдите наибольший по длине общий префикс нескольких строк.
4 |
5 | ## Формат ввода
6 |
7 | В первой строке дано число n (1 ≤ n ≤ 105). Затем по одной на строке даны n строк, каждая не превышает 105 в длину. Суммарная длина всех строк не превосходит 107.
8 |
9 | ## Формат вывода
10 |
11 | Выведите единственное число — длину наибольшего префикса всех данных строк.
12 |
13 | ### Пример 1
14 |
15 |
16 |
17 | 3
18 | abacaba
19 | abudabi
20 | abcdefg
21 | |
22 |
23 | 2
24 |
25 |
26 |
27 | |
28 |
29 |
30 | ### Пример 2
31 |
32 |
33 |
34 | 2
35 | tutu
36 | kukuku
37 | |
38 |
39 | 0
40 |
41 |
42 | |
43 |
44 |
45 | ### Пример 3
46 |
47 |
48 |
49 | 3
50 | qwe
51 | qwerty
52 | qwerpy
53 | |
54 |
55 | 3
56 |
57 |
58 |
59 | |
60 |
61 |
62 |
63 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_8/tasks/D/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "bufio"
5 | "fmt"
6 | "io"
7 | "log"
8 | "os"
9 | "strconv"
10 | "strings"
11 | )
12 |
13 | func main() {
14 | s := strings.Builder{}
15 | Solution(os.Stdin, &s)
16 |
17 | fmt.Println(s.String())
18 | }
19 |
20 | func Solution(r io.Reader, s *strings.Builder) {
21 | scanner := bufio.NewScanner(r)
22 |
23 | const bufCapacity = 10000000 // fix long string
24 | buf := make([]byte, bufCapacity)
25 | scanner.Buffer(buf, bufCapacity)
26 |
27 | var err error
28 | var n int
29 |
30 | scanner.Scan()
31 | n, err = strconv.Atoi(scanner.Text())
32 | if err != nil {
33 | log.Fatal(err)
34 | }
35 |
36 | var last, str string
37 | for i := 0; i < n; i++ {
38 | scanner.Scan()
39 | str = scanner.Text()
40 |
41 | if i == 0 {
42 | last = str
43 | continue
44 | }
45 |
46 | var j, g int
47 | for j < len(last) && g < len(str) && last[j] == str[g] {
48 | j++
49 | g++
50 | }
51 | last = str[:g]
52 | }
53 |
54 | s.WriteString(fmt.Sprint(len(last)))
55 | }
56 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_8/tasks/D/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "io"
6 | "strings"
7 | "testing"
8 | )
9 |
10 | type TestItem struct {
11 | input io.Reader
12 | output string
13 | }
14 |
15 | func TestTask(t *testing.T) {
16 | tasks := generateTasks()
17 |
18 | for i, v := range tasks {
19 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
20 | buf := strings.Builder{}
21 | Solution(v.input, &buf)
22 | if buf.String() != v.output {
23 | t.Errorf("Неверный ответ решения!\nОтвет: \n%v \nВерно: \n%v", buf.String(), v.output)
24 | }
25 | })
26 | }
27 | }
28 |
29 | func generateTasks() []TestItem {
30 | return []TestItem{
31 | {strings.NewReader(`3
32 | abacaba
33 | abudabi
34 | abcdefg
35 | `), "2"},
36 | {strings.NewReader(`2
37 | tutu
38 | kukuku
39 | `), "0"},
40 | {strings.NewReader(`3
41 | qwe
42 | qwerty
43 | qwerpy
44 | `), "3"},
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_8/tasks/F/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "bufio"
5 | "fmt"
6 | "io"
7 | "log"
8 | "os"
9 | "sort"
10 | "strconv"
11 | "strings"
12 | "unicode"
13 | )
14 |
15 | func main() {
16 | s := strings.Builder{}
17 | Solution(os.Stdin, &s)
18 |
19 | fmt.Println(s.String())
20 | }
21 |
22 | func Solution(r io.Reader, s *strings.Builder) {
23 | scanner := bufio.NewScanner(r)
24 |
25 | const bufCapacity = 10000000 // fix long string
26 | buf := make([]byte, bufCapacity)
27 | scanner.Buffer(buf, bufCapacity)
28 |
29 | var err error
30 | var n int
31 |
32 | scanner.Scan()
33 | n, err = strconv.Atoi(scanner.Text())
34 | if err != nil {
35 | log.Fatal(err)
36 | }
37 |
38 | countMap := map[string]int{}
39 | for i := 0; i < n; i++ {
40 | scanner.Scan()
41 | str := scanner.Text()
42 |
43 | if unicode.IsSpace(rune(str[len(str)-1])) {
44 | str = str[:len(str)-1]
45 | }
46 | countMap[str]++
47 | }
48 |
49 | max := -1
50 | var maxWords []string = nil
51 | for k, v := range countMap {
52 | if max == -1 || v > max {
53 | max = v
54 | maxWords = []string{k}
55 | continue
56 | } else if v == max {
57 | maxWords = append(maxWords, k)
58 | }
59 | }
60 |
61 | sort.Strings(maxWords)
62 | s.WriteString(fmt.Sprint(maxWords[0]))
63 | }
64 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_8/tasks/F/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "io"
6 | "strings"
7 | "testing"
8 | )
9 |
10 | type TestItem struct {
11 | input io.Reader
12 | output string
13 | }
14 |
15 | func TestTask(t *testing.T) {
16 | tasks := generateTasks()
17 |
18 | for i, v := range tasks {
19 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
20 | buf := strings.Builder{}
21 | Solution(v.input, &buf)
22 | if buf.String() != v.output {
23 | t.Errorf("Неверный ответ решения!\nОтвет: \n%v \nВерно: \n%v", buf.String(), v.output)
24 | }
25 | })
26 | }
27 | }
28 |
29 | func generateTasks() []TestItem {
30 | return []TestItem{
31 | {strings.NewReader(`5
32 | caba
33 | aba
34 | caba
35 | abac
36 | aba
37 | `), "aba"},
38 | {strings.NewReader(`3
39 | b
40 | bc
41 | bcd
42 | `), "b"},
43 | {strings.NewReader(`10
44 | ciwlaxtnhhrnenw
45 | ciwnvsuni
46 | ciwaxeujmsmvpojqjkxk
47 | ciwnvsuni
48 | ciwnvsuni
49 | ciwuxlkecnofovq
50 | ciwuxlkecnofovq
51 | ciwodramivid
52 | ciwlaxtnhhrnenw
53 | ciwnvsuni
54 | `), "ciwnvsuni"},
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_8/tasks/G/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "io"
6 | "strings"
7 | "testing"
8 | )
9 |
10 | type TestItem struct {
11 | input io.Reader
12 | output string
13 | }
14 |
15 | func TestTask(t *testing.T) {
16 | tasks := generateTasks()
17 |
18 | for i, v := range tasks {
19 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
20 | buf := strings.Builder{}
21 | Solution(v.input, &buf)
22 | if strings.TrimSpace(buf.String()) != v.output {
23 | t.Errorf("Неверный ответ решения!\nОтвет: \n%v \nВерно: \n%v", buf.String(), v.output)
24 | }
25 | })
26 | }
27 | }
28 |
29 | func generateTasks() []TestItem {
30 | return []TestItem{
31 | {strings.NewReader(`9
32 | 3 9 1 2 5 10 9 1 7
33 | 2
34 | 4 10
35 | `), "1 8"},
36 | {strings.NewReader(`5
37 | 1 2 3 4 5
38 | 3
39 | 10 11 12
40 | `), "1 2 3"},
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_8/tasks/H/README.md:
--------------------------------------------------------------------------------
1 | # H. Глобальная замена
2 |
3 | Напишите программу, которая будет заменять в тексте все вхождения строки s на строку t. Гарантируется, что никакие два вхождения шаблона s не пересекаются друг с другом.
4 |
5 | ## Формат ввода
6 |
7 | В первой строке дан текст —– это строка из строчных букв английского алфавита, длина которой не превышает 106.
8 |
9 | Во второй строке записан шаблон s, вхождения которого будут заменены.
10 | В третьей строке дана строка t, которая будет заменять вхождения.
11 |
12 | Обе строки s и t состоят из строчных букв английского алфавита, длина каждой строки не превосходит 105. Размер итоговой строки не превосходит 2⋅ 106.
13 |
14 | ## Формат вывода
15 |
16 | В единственной строке выведите результат всех замен — текст, в котором все вхождения s заменены на t.
17 |
18 | ### Пример 1
19 |
20 |
21 |
22 | pingpong
23 | ng
24 | mpi
25 | |
26 |
27 | pimpipompi
28 |
29 |
30 |
31 | |
32 |
33 |
34 | ### Пример 2
35 |
36 |
37 |
38 | aaa
39 | a
40 | ab
41 | |
42 |
43 | ababab
44 |
45 |
46 | |
47 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_8/tasks/H/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "bufio"
5 | "fmt"
6 | "io"
7 | "os"
8 | "strings"
9 | )
10 |
11 | func main() {
12 | s := strings.Builder{}
13 | Solution(os.Stdin, &s)
14 |
15 | fmt.Println(s.String())
16 | }
17 |
18 | func Solution(r io.Reader, w *strings.Builder) {
19 | scanner := bufio.NewScanner(r)
20 |
21 | const bufCapacity = 10000000 // fix long string
22 | buf := make([]byte, bufCapacity)
23 | scanner.Buffer(buf, bufCapacity)
24 |
25 | var text, s, t string
26 |
27 | scanner.Scan()
28 | text = scanner.Text()
29 | scanner.Scan()
30 | s = scanner.Text()
31 | scanner.Scan()
32 | t = scanner.Text()
33 |
34 | sentinel := s + "#" + text
35 | patternLen := len(s)
36 | prefixLen := patternLen + 1
37 |
38 | dp := make([]int, len(sentinel))
39 | result := make([]bool, len(text))
40 | for i := prefixLen; i < len(sentinel); i++ {
41 | k := dp[i-1]
42 | for sentinel[i] != sentinel[k] && k > 0 {
43 | k = dp[k-1]
44 | }
45 | if sentinel[k] != sentinel[i] {
46 | dp[i] = k
47 | } else {
48 | dp[i] = k + 1
49 | if dp[i] == patternLen {
50 | result[i-patternLen*2] = true
51 | }
52 | }
53 |
54 | }
55 |
56 | for i := 0; i < len(text); i++ {
57 | if result[i] {
58 | w.WriteString(t)
59 | i += patternLen - 1
60 | } else {
61 | w.WriteByte(text[i])
62 | }
63 | }
64 | }
65 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_8/tasks/H/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "io"
6 | "strings"
7 | "testing"
8 | )
9 |
10 | type TestItem struct {
11 | input io.Reader
12 | output string
13 | }
14 |
15 | func TestTask(t *testing.T) {
16 | tasks := generateTasks()
17 |
18 | for i, v := range tasks {
19 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
20 | buf := strings.Builder{}
21 | Solution(v.input, &buf)
22 | if buf.String() != v.output {
23 | t.Errorf("Неверный ответ решения!\nОтвет: \n%v \nВерно: \n%v", buf.String(), v.output)
24 | }
25 | })
26 | }
27 | }
28 |
29 | func generateTasks() []TestItem {
30 | return []TestItem{
31 | {strings.NewReader(`pingpong
32 | ng
33 | mpi
34 | `), "pimpipompi"},
35 | {strings.NewReader(`aaa
36 | a
37 | ab
38 | `), "ababab"},
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_8/tasks/I/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "bufio"
5 | "fmt"
6 | "io"
7 | "os"
8 | "strings"
9 | )
10 |
11 | func main() {
12 | s := strings.Builder{}
13 | Solution(os.Stdin, &s)
14 |
15 | fmt.Println(strings.TrimSpace(s.String()))
16 | }
17 |
18 | func Solution(r io.Reader, s *strings.Builder) {
19 | scanner := bufio.NewScanner(r)
20 |
21 | const bufCapacity = 100000000 // fix long string
22 | buf := make([]byte, bufCapacity)
23 | scanner.Buffer(buf, bufCapacity)
24 |
25 | scanner.Scan()
26 | str := scanner.Text()
27 |
28 | prefix := string(str[0])
29 | prefixLength := len(prefix)
30 | i := 1
31 |
32 | for i+prefixLength <= len(str) {
33 | if prefix == str[i:i+prefixLength] {
34 | i += prefixLength
35 | } else {
36 | i++
37 | prefix = str[:i]
38 | prefixLength = len(prefix)
39 | }
40 | }
41 | if len(prefix) > len(str)/2 {
42 | prefix = str
43 | prefixLength = len(prefix)
44 | }
45 |
46 | s.WriteString(fmt.Sprint(len(str) / prefixLength))
47 | }
48 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_8/tasks/I/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "io"
6 | "strings"
7 | "testing"
8 | )
9 |
10 | type TestItem struct {
11 | input io.Reader
12 | output string
13 | }
14 |
15 | func TestTask(t *testing.T) {
16 | tasks := generateTasks()
17 |
18 | for i, v := range tasks {
19 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
20 | buf := strings.Builder{}
21 | Solution(v.input, &buf)
22 | if strings.TrimSpace(buf.String()) != v.output {
23 | t.Errorf("Неверный ответ решения!\nОтвет: \n%v \nВерно: \n%v", buf.String(), v.output)
24 | }
25 | })
26 | }
27 | }
28 |
29 | func generateTasks() []TestItem {
30 | return []TestItem{
31 | {strings.NewReader(`zzzzzz`), "6"},
32 | {strings.NewReader(`abacaba`), "1"},
33 | {strings.NewReader(`abababab`), "4"},
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_8/tasks/K/README.md:
--------------------------------------------------------------------------------
1 | # K. Сравнить две строки
2 |
3 | Алла придумала новый способ сравнивать две строки: чтобы сравнить строки a и b, в них надо оставить только те буквы, которые в английском алфавите стоят на четных позициях. Затем полученные строки сравниваются по обычным правилам. Помогите Алле реализовать новое сравнение строк.
4 |
5 | ## Формат ввода
6 |
7 | На вход подаются строки a и b по одной в строке. Обе строки состоят из маленьких латинских букв, не бывают пустыми и не превосходят 105 символов в длину.
8 |
9 | ## Формат вывода
10 |
11 | Выведите -1, если a < b, 0, если a = b, и 1, если a > b.
12 |
13 | ### Пример 1
14 |
15 |
16 |
17 | gggggbbb
18 | bbef
19 | |
20 |
21 | -1
22 |
23 | |
24 |
25 |
26 | ### Пример 2
27 |
28 |
29 |
30 | z
31 | aaaaaaa
32 | |
33 |
34 | 1
35 |
36 | |
37 |
38 |
39 | ### Пример 3
40 |
41 |
42 |
43 | ccccz
44 | aaaaaz
45 | |
46 |
47 | 0
48 |
49 | |
50 |
51 |
52 |
53 |
54 |
55 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_8/tasks/K/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "io"
6 | "strings"
7 | "testing"
8 | )
9 |
10 | type TestItem struct {
11 | input io.Reader
12 | output string
13 | }
14 |
15 | func TestTask(t *testing.T) {
16 | tasks := generateTasks()
17 |
18 | for i, v := range tasks {
19 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
20 | buf := strings.Builder{}
21 | Solution(v.input, &buf)
22 | if strings.TrimSpace(buf.String()) != v.output {
23 | t.Errorf("Неверный ответ решения!\nОтвет: \n%v \nВерно: \n%v", buf.String(), v.output)
24 | }
25 | })
26 | }
27 | }
28 |
29 | func generateTasks() []TestItem {
30 | return []TestItem{
31 | {strings.NewReader(`gggggbbb
32 | bbef
33 | `), "-1"},
34 | {strings.NewReader(`z
35 | aaaaaaa
36 | `), "1"},
37 | {strings.NewReader(`ccccz
38 | aaaaaz
39 | `), "0"},
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_8/tasks/L/README.md:
--------------------------------------------------------------------------------
1 | # L. Подсчёт префикс-функции
2 |
3 | В этой задаче вам необходимо посчитать префикс-функцию для заданной строки.
4 |
5 | ## Формат ввода
6 |
7 | На вход подаётся строка, состоящая из строчных латинских букв. Длина строки не превосходит 106.
8 |
9 | ## Формат вывода
10 |
11 | Если длина входной строки L, то выведите через пробел L целых неотрицательных чисел —– массив значений префикс-функции исходной строки.
12 |
13 | ### Пример 1
14 |
15 |
16 |
17 | abracadabra
18 | |
19 |
20 | 0 0 0 1 0 1 0 1 2 3 4
21 | |
22 |
23 |
24 | ### Пример 2
25 |
26 |
27 |
28 | xxzzxxz
29 | |
30 |
31 | 0 1 0 0 1 2 3
32 | |
33 |
34 |
35 | ### Пример 3
36 |
37 |
38 |
39 | aaaaa
40 | |
41 |
42 | 0 1 2 3 4
43 | |
44 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_8/tasks/L/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "bufio"
5 | "fmt"
6 | "io"
7 | "os"
8 | "strconv"
9 | "strings"
10 | )
11 |
12 | func main() {
13 | s := strings.Builder{}
14 | Solution(os.Stdin, &s)
15 |
16 | fmt.Println(strings.TrimSpace(s.String()))
17 | }
18 |
19 | func Solution(r io.Reader, s *strings.Builder) {
20 | scanner := bufio.NewScanner(r)
21 |
22 | const bufCapacity = 100000000 // fix long string
23 | buf := make([]byte, bufCapacity)
24 | scanner.Buffer(buf, bufCapacity)
25 |
26 | scanner.Scan()
27 | str := scanner.Text()
28 |
29 | dp := make([]int, len(str))
30 | s.WriteString("0 ")
31 | for i := 1; i < len(str); i++ {
32 | k := dp[i-1]
33 | for k > 0 && str[i] != str[k] {
34 | k = dp[k-1]
35 | }
36 | if str[i] == str[k] {
37 | dp[i] = k + 1
38 | s.WriteString(strconv.Itoa(dp[i]) + " ")
39 | } else {
40 | dp[i] = 0
41 | s.WriteString("0 ")
42 | }
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_8/tasks/L/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "io"
6 | "strings"
7 | "testing"
8 | )
9 |
10 | type TestItem struct {
11 | input io.Reader
12 | output string
13 | }
14 |
15 | func TestTask(t *testing.T) {
16 | tasks := generateTasks()
17 |
18 | for i, v := range tasks {
19 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
20 | buf := strings.Builder{}
21 | Solution(v.input, &buf)
22 | if strings.TrimSpace(buf.String()) != v.output {
23 | t.Errorf("Неверный ответ решения!\nОтвет: \n%v \nВерно: \n%v", buf.String(), v.output)
24 | }
25 | })
26 | }
27 | }
28 |
29 | func generateTasks() []TestItem {
30 | return []TestItem{
31 | {strings.NewReader(`abracadabra`), "0 0 0 1 0 1 0 1 2 3 4"},
32 | {strings.NewReader(`xxzzxxz`), "0 1 0 0 1 2 3"},
33 | {strings.NewReader(`aaaaa`), "0 1 2 3 4"},
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/A/README.md:
--------------------------------------------------------------------------------
1 | # A+B
2 |
3 | Это ваша первая задача. В ней вам придётся прочитать два числа и сложить их. Результат необходимо вывести на стандартный поток вывода или в файл, указанный в условии задачи.
4 |
5 | ## Формат ввода
6 |
7 | В первой строке задано первое число, во второй – второе. Оба числа лежат в диапазоне от − 109 до 109.
8 |
9 | ## Формат вывода
10 |
11 | Выведите единственное число – результат сложения двух чисел.
12 |
13 | ### Пример 1
14 |
15 |
16 |
17 | 12
18 | 90
19 | |
20 | 102
|
21 |
22 |
23 | ### Пример 2
24 |
25 |
26 |
27 | 200
28 | -200
29 | |
30 | 0
|
31 |
32 |
33 | ### Пример 3
34 |
35 |
36 |
37 | 1000000000
38 | 1000000000
39 | |
40 | 2000000000
|
41 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/A/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "bufio"
5 | "fmt"
6 | "log"
7 | "os"
8 | "strconv"
9 | )
10 |
11 | func main() {
12 | a, b := getInputData(bufio.NewScanner(os.Stdin))
13 | fmt.Println(solution(a, b))
14 | }
15 |
16 | func solution(a, b int) int {
17 | return a + b
18 | }
19 |
20 | func getInputData(scanner *bufio.Scanner) (a, b int) {
21 | const bufCapacity = 10000000 // fix long
22 | buf := make([]byte, bufCapacity)
23 | scanner.Buffer(buf, bufCapacity)
24 |
25 | var err error
26 |
27 | scanner.Scan()
28 | a, err = strconv.Atoi(scanner.Text())
29 | if err != nil {
30 | log.Fatal(err)
31 | }
32 |
33 | b, err = strconv.Atoi(scanner.Text())
34 | if err != nil {
35 | log.Fatal(err)
36 | }
37 |
38 | return
39 | }
40 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/A/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "testing"
6 | )
7 |
8 | type TestItemInput struct {
9 | a, b int
10 | }
11 | type TestItem struct {
12 | input struct{ a, b int }
13 | output int
14 | }
15 |
16 | func TestTask(t *testing.T) {
17 | tasks := generateTasks()
18 |
19 | for i, v := range tasks {
20 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
21 | res := solution(v.input.a, v.input.b)
22 | if res != v.output {
23 | t.Errorf("Неверный ответ решения!\nОтвет: \n%v \nВерно: \n%v", res, v.output)
24 | }
25 | })
26 | }
27 | }
28 |
29 | func generateTasks() []TestItem {
30 | return []TestItem{
31 | {
32 | input: TestItemInput{a: 12, b: 90},
33 | output: 102,
34 | },
35 | {
36 | input: TestItemInput{a: 200, b: -200},
37 | output: 0,
38 | },
39 | {
40 | input: TestItemInput{a: 1000000000, b: 1000000000},
41 | output: 2000000000,
42 | },
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/B/README.md:
--------------------------------------------------------------------------------
1 | # A. Card Counter
2 |
3 | На стол в ряд выложены карточки, на каждой карточке написано натуральное число. За один ход разрешается взять карточку либо с левого, либо с правого конца ряда. Всего можно сделать
4 | k ходов. Итоговый счет равен сумме чисел на выбранных карточках. Определите, какой максимальный счет можно получить по итогам игры.
5 |
6 | ## Формат ввода
7 |
8 | В первой строке записано число карточек n (1≤n≤105).
9 | Во второй строке записано число ходов k (1≤k≤n).
10 | В третьей строке через пробел даны числа, записанные на карточках. i-е по счету число записано на i-й слева карточке. Все числа натуральные и не превосходят 104.
11 |
12 | ## Формат вывода
13 |
14 | Выведите единственное число —- максимальную сумму очков, которую можно набрать, сделав
15 | k ходов.
16 |
17 | ### Пример 1
18 |
19 |
20 |
21 | 7
22 | 3
23 | 5 8 2 1 3 4 11
24 | |
25 |
26 | 24
27 |
28 |
29 | |
30 |
31 |
32 | ### Пример 2
33 |
34 |
35 |
36 | 5
37 | 5
38 | 1 2 3 4 5
39 | |
40 |
41 | 15
42 |
43 |
44 | |
45 |
46 |
47 | ### Пример 3
48 |
49 |
50 |
51 | 7
52 | 4
53 | 1 1 9 2 2 2 6
54 | |
55 |
56 | 17
57 |
58 |
59 | |
60 |
61 |
62 |
63 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/B/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/B/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/C/README.md:
--------------------------------------------------------------------------------
1 | # B. Статус 200
2 |
3 | Вам дан массив натуральных чисел ai. Найдите число таких пар элементов
4 | (ai,aj), где |ai−aj|%200 == 0 и i
9 | Во второй строке через пробел записаны элементы массива ai(1 ≤ ai ≤ 109).
10 |
11 | ## Формат вывода
12 |
13 | Выведите единственное число — количество пар, подходящих под указанное выше условие.
14 |
15 | ### Пример 1
16 |
17 |
18 |
19 | 5
20 | 203 404 204 200 403
21 | |
22 |
23 | 2
24 |
25 | |
26 |
27 |
28 | ### Пример 2
29 |
30 |
31 |
32 | 1
33 | 1000000
34 | |
35 |
36 | 0
37 |
38 | |
39 |
40 |
41 | ### Пример 3
42 |
43 |
44 |
45 | 3
46 | 2022 2020 2021
47 | |
48 |
49 | 0
50 |
51 | |
52 |
53 |
54 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/C/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/C/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/D/README.md:
--------------------------------------------------------------------------------
1 | # C. Matrix. Resurrection
2 |
3 | Вам дана матрица из n строк и m столбцов, заполненная натуральными числами. По матрице можно перемещаться, из клетки можно уходить только в соседнюю по стороне клетку, переходы по диагонали, а также выход за границу матрицы запрещены.
4 |
5 | Ваша задача — найти наиболее длинный возрастающий путь в матрице. Путь возрастающий, если значения в посещаемых клетках строго возрастают от начала пути к его концу.
6 |
7 | ## Формат ввода
8 |
9 | В первой строке даны два числа, описывающие размер матрицы — n,m (1 ≤ n,m ≤ 103).
10 | В следующих n строках записана сама матрица. i-я строка матрицы содержит m чисел, записанных через пробел.
11 | Все элементы матрицы — натуральные числа, не превосходящие 109.
12 |
13 | ## Формат вывода
14 |
15 | Выведите единственное число — длину наибольшего возрастающего пути.
16 |
17 | ### Пример 1
18 |
19 |
20 |
21 | 2 3
22 | 10 8 5
23 | 10 5 4
24 | |
25 |
26 | 4
27 |
28 |
29 | |
30 |
31 |
32 | ### Пример 2
33 |
34 |
35 |
36 | 2 2
37 | 1 1
38 | 1 1
39 | |
40 |
41 | 1
42 |
43 |
44 | |
45 |
46 |
47 | ### Пример 3
48 |
49 |
50 |
51 | 2 2
52 | 10 9
53 | 9 11
54 | |
55 |
56 | 2
57 |
58 |
59 | |
60 |
61 |
62 |
63 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/D/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/D/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/E/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/E/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/F/README.md:
--------------------------------------------------------------------------------
1 | # E. Хорошие строки
2 |
3 | Назовем строку хорошей, если в ней нет двух соседних букв, которые различаются только регистром. Например, строка «abba» хорошая, а строка «aBba» нет.
4 | Со строкой можно делать преобразование: если два соседних символа обозначают одну и ту же букву, но записаны в разных регистрах, то их можно удалить. При этом строка «схлопнется», то есть пробелов при удалении не образуется.
5 |
6 | Цепочкой таких преобразований можно превратить любую строку в хорошую.
7 |
8 | По заданной строке найдите хорошую строку, в которую ее можно превратить.
9 |
10 | ## Формат ввода
11 |
12 | На вход подаётся строка, состоящая из больших и маленьких латинских букв. Длина строки не превосходит 105.
13 |
14 | ## Формат вывода
15 |
16 | Выведите хорошую строку, в которую можно превратить данную.
17 |
18 | ### Пример 1
19 |
20 |
21 |
22 | vxOoOoVvx
23 | |
24 |
25 | vxx
26 | |
27 |
28 |
29 | ### Пример 2
30 |
31 |
32 |
33 | abBa
34 | |
35 |
36 | aa
37 | |
38 |
39 |
40 | ### Пример 3
41 |
42 |
43 |
44 | AbBa
45 | |
46 |
47 |
48 | |
49 |
50 |
51 |
52 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/F/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/F/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/G/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/G/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/H/README.md:
--------------------------------------------------------------------------------
1 | # G. Сизиф
2 |
3 | В этой задаче вы будете перекладывать камни. Изначально есть n кучек камней. Кучка i весит aiкилограммов. Кучки можно объединять.
4 | При объединении кучек i и j затрачивается ai + aj единиц энергии, при этом две исходные кучки пропадают
5 | и появляется кучка весом ai + aj.
6 |
7 | Определите наименьшее количество энергии, которое надо затратить для объединения всех кучек в одну.
8 |
9 | ## Формат ввода
10 |
11 | В первой строке дано число n (1 ≤ n ≤ 105)
12 | В следующей строке записаны массы кучек через пробел — ai (1 ≤ ai ≤ 106)
13 |
14 | ## Формат вывода
15 |
16 | Выведите единственное число — минимальную энергию, которую надо затратить на объединение всех кучек.
17 |
18 | ### Пример 1
19 |
20 |
21 |
22 | 2
23 | 2 6
24 | |
25 |
26 | 8
27 |
28 | |
29 |
30 |
31 | ### Пример 2
32 |
33 |
34 |
35 | 3
36 | 6 2 4
37 | |
38 |
39 | 18
40 |
41 | |
42 |
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/H/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/H/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/I/README.md:
--------------------------------------------------------------------------------
1 | # H. Частичный разворот
2 |
3 | **В этой задаче по умолчанию выбран компилятор Make. Решение отправляется в виде файла с расширением, соответствующим используемому языку.**
4 |
5 | В этой задаче требуется сделать разворот части односвязного списка. Каждая вершина списка описывается структурой Node, каждый экземпляр хранит указатель на следующую вершину или null (nullptr, None, nil), если вершина последняя. По заданным индексам from и to разверните все вершины на отрезке с from до to включительно.
6 |
7 | Заметьте, что нумерация в индексах from и to с единицы.
8 |
9 | Пример для списка из пяти вершин с разворотом от второй до четвертой вершины представлен на рисунке ниже.
10 |
11 | 
12 |
13 | ## Формат ввода
14 |
15 | Реализуйте функцию Reverse, которая принимает голову списка и два целочисленных индекса.
16 |
17 | Используйте шаблон:
18 |
19 | ```go
20 | package main
21 |
22 | // Comment it before submitting
23 | type Node struct {
24 | data string
25 | Next *Node
26 | }
27 |
28 |
29 | func Reverse(head *Node, left int, right int) *Node {
30 | // Your code
31 | // “ヽ(´▽`)ノ”
32 | }
33 |
34 | ```
35 |
36 | Гарантируется, что в списке есть хотя бы одна вершина.
37 | Суммарное число вершин не превосходит 105.
38 |
39 |
40 | ## Формат вывода
41 |
42 | Функция Reverse должна возвращать голову изменённого списка. Создавать вершины заново нельзя.
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/I/image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dmitryburov/algorithm-practice/1501896081a17ead0f3e5571f9f13cabaf889142/yandex_practicum/sprint_interview/I/image.png
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/I/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/I/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/J/README.md:
--------------------------------------------------------------------------------
1 | # I. Ферзи
2 |
3 | Определите все расстановки из n ферзей на шахматной доске n×n, где ферзи не могут бить друг друга.
4 |
5 | В качестве ответа на задачу выведите в первой строке число расстановок, а далее все расстановки в следующем формате: одна расстановка описывается n числами. i-е число описывает i-ую строку доски, а именно оно равно номеру клетки, в которой стоит ферзь на текущей строке.
6 | Строки нумеруются сверху вниз от 1 до n. Клетки внутри строки нумеруются от 1 до n слева направо.
7 |
8 | ## Формат ввода
9 |
10 | На вход подаётся единственное число n (1 ≤ n ≤ 13).
11 |
12 | ## Формат вывода
13 |
14 | Выведите единственное число — количество возможных расстановок. Далее по одной в строке выведите расстановки в произвольном порядке.
15 |
16 | ### Пример 1
17 |
18 |
19 |
20 | 4
21 |
22 |
23 | |
24 |
25 | 2
26 | 2 4 1 3
27 | 3 1 4 2
28 | |
29 |
30 |
31 | ### Пример 2
32 |
33 |
34 |
35 | 3
36 | |
37 |
38 | 0
39 | |
40 |
41 |
42 |
43 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/J/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/J/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/K/README.md:
--------------------------------------------------------------------------------
1 | # J. Разрыв шаблона
2 |
3 | В этой задаче вам надо определить, подходит ли строка под конкретный шаблон. Шаблон задаётся в следующем формате:
4 |
5 | - Символ «?» соответствует одному вхождению любого символа;
6 | - Символ «*» соответствует произвольному числу любых символов, в том числе нулю символов;
7 | - Остальные символы шаблона должны совпадать с символами строки;
8 |
9 |
10 | ## Формат ввода
11 |
12 | В первой строке дан шаблон.
13 | Во второй — проверяемая строка.
14 |
15 | Шаблон и строка не превосходят в длину 2000 символов и не могут быть пустыми.
16 |
17 | Строка состоит только из строчных латинских букв. Шаблон состоит из строчных латинских букв и знаков «?» и «*».
18 |
19 | ## Формат вывода
20 |
21 | Выведите «YES», если строка подходит под шаблон, и «NO», если не подходит.
22 |
23 | ### Пример 1
24 |
25 |
26 |
27 | *a*
28 | adce
29 | |
30 |
31 | YES
32 |
33 | |
34 |
35 |
36 | ### Пример 2
37 |
38 |
39 |
40 | *
41 | xyz
42 | |
43 |
44 | YES
45 |
46 | |
47 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/K/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/K/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/L/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/L/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/M/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/M/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/N/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/N/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/O/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/O/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/P/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/P/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/Q/README.md:
--------------------------------------------------------------------------------
1 | # P. Прямота
2 |
3 | Вам даны n точек, расположенных на плоскости. Определите, лежат ли все эти точки на одной прямой.
4 |
5 | ## Формат ввода
6 |
7 | В первой строке дано число точек n (2 ≤ n ≤ 105). В следующих n строках по одной в строке заданы сами точки. Каждая точка задаётся двумя координатами —
8 | xiyi, записанными через пробел. Координаты — целые числа, не превосходящие 1012 по модулю. Точки могут совпадать друг с другом.
9 |
10 | ## Формат вывода
11 |
12 | Выведите «YES», если все n точек лежат на одной прямой, и «NO», если нет.
13 |
14 | ### Пример 1
15 |
16 |
17 |
18 | 5
19 | 32 6
20 | 29 2
21 | 32 6
22 | 29 2
23 | 35 10
24 | |
25 |
26 | YES
27 |
28 |
29 |
30 |
31 |
32 | |
33 |
34 |
35 | ### Пример 2
36 |
37 |
38 |
39 | 2
40 | -22 -75
41 | -30 -70
42 | |
43 |
44 | YES
45 |
46 |
47 | |
48 |
49 |
50 | ### Пример 3
51 |
52 |
53 |
54 | 4
55 | 86 -93
56 | 88 -91
57 | 70 -81
58 | 86 -93
59 | |
60 |
61 | NO
62 |
63 |
64 |
65 |
66 | |
67 |
68 |
69 |
70 |
71 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/Q/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/Q/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/R/README.md:
--------------------------------------------------------------------------------
1 | # Q. Паша и Марк
2 |
3 | ## Формат ввода
4 |
5 | На вход подаётся единственное число n (1 ≤ n ≤ 10000).
6 |
7 | ## Формат вывода
8 |
9 | Выведите «Pasha», если выиграет Паша, или «Mark», если победа за Марком.
10 |
11 | ### Пример 1
12 |
13 |
14 |
15 | 8
16 | |
17 |
18 | Pasha
19 | |
20 |
21 |
22 | ### Пример 2
23 |
24 |
25 |
26 | 3
27 | |
28 |
29 | Mark
30 | |
31 |
32 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/R/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/R/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/S/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/S/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/T/README.md:
--------------------------------------------------------------------------------
1 | # S. XORошая задача
2 |
3 | В этой задаче требуется по заданному массиву длины n найти два его элемента
4 | xi и xj
5 | (1 ≤ i ≤ j ≤ n), которые давали бы максимальное значение функции
6 | xi ⊕ xj, где под ⊕ подразумевается операция побитового исключающего «или», то есть xor.
7 |
8 |
9 | ## Формат ввода
10 |
11 | В первой строке дан размер массива n (1 ≤ n ≤ 105).
12 | Во второй строке через пробел записаны n целых чисел xi (1 ≤ xi ≤ 231 − 1).
13 |
14 | ## Формат вывода
15 |
16 | Выведите единственное число — максимальное значение xor-а, которое можно получить.
17 |
18 | ### Пример 1
19 |
20 |
21 |
22 | 5
23 | 1 8 3 1 4
24 | |
25 |
26 | 12
27 |
28 | |
29 |
30 |
31 | ### Пример 2
32 |
33 |
34 |
35 | 3
36 | 4 8 1024
37 | |
38 |
39 | 1032
40 |
41 | |
42 |
43 |
44 |
45 | ### Пример 3
46 |
47 |
48 |
49 | 2
50 | 10 10
51 | |
52 |
53 | 0
54 |
55 | |
56 |
57 |
58 |
59 |
60 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/T/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/T/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/U/README.md:
--------------------------------------------------------------------------------
1 | # T. Опять скобочные последовательности
2 |
3 | В этой задаче под правильной скобочной последовательностью (ПСП) понимается правильная скобочная последовательность из круглых и квадратных скобок, где ни одна пара квадратных скобок не может содержать пару круглых скобок.
4 |
5 | По данному числу n выведите все ПСП из n скобок в лексикографическом порядке. Упорядоченность символов следующая: ’(’ < ’[’ < ’)’ < ’]’
6 |
7 | ## Формат ввода
8 |
9 | В единственной строке дано число скобок n, 0 ≤ n ≤16.
10 |
11 | ## Формат вывода
12 |
13 | Выведите правильные скобочные последовательности в лексикографическом порядке по одной в строке. Скобки внутри одной строки идут подряд и не разделяются пробелами
14 |
15 | ### Пример 1
16 |
17 |
18 |
19 | 2
20 |
21 | |
22 |
23 | ()
24 | []
25 | |
26 |
27 |
28 | ### Пример 2
29 |
30 |
31 |
32 | 3
33 | |
34 |
35 |
36 | |
37 |
38 |
39 | ### Пример 3
40 |
41 |
42 |
43 | 4
44 |
45 |
46 |
47 |
48 |
49 |
50 | |
51 |
52 | (())
53 | ([])
54 | ()()
55 | ()[]
56 | [[]]
57 | []()
58 | [][]
59 | |
60 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/U/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_practicum/sprint_interview/U/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
--------------------------------------------------------------------------------
/yandex_training_1/study_1/A/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "bufio"
5 | "fmt"
6 | "os"
7 | "strconv"
8 | "strings"
9 | )
10 |
11 | const (
12 | isAuto = "auto"
13 | isFreeze = "freeze"
14 | isHeat = "heat"
15 | )
16 |
17 | func main() {
18 | scanner := bufio.NewScanner(os.Stdin)
19 | scanner.Scan()
20 |
21 | temperatures := strings.Fields(scanner.Text())
22 | t1, _ := strconv.Atoi(temperatures[0])
23 | t2, _ := strconv.Atoi(temperatures[1])
24 |
25 | scanner.Scan()
26 | action := scanner.Text()
27 |
28 | fmt.Println(solution(t1, t2, action))
29 | }
30 |
31 | func solution(t1, t2 int, action string) int {
32 | switch {
33 | case action == isAuto,
34 | action == isFreeze && t1 > t2,
35 | action == isHeat && t1 < t2:
36 | return t2
37 | }
38 |
39 | return t1
40 | }
41 |
--------------------------------------------------------------------------------
/yandex_training_1/study_1/A/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "testing"
6 | )
7 |
8 | type TestItemInput struct {
9 | t1,
10 | t2 int
11 | action string
12 | }
13 |
14 | type TestItemOutput int
15 |
16 | type TestItem struct {
17 | input TestItemInput
18 | output TestItemOutput
19 | }
20 |
21 | func TestTask(t *testing.T) {
22 | for i, v := range generateTasks() {
23 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
24 | val := solution(v.input.t1, v.input.t2, v.input.action)
25 | if val != int(v.output) {
26 | t.Errorf("Неверный ответ решения!\nОтвет: \n%d \nВерно: \n%d", val, v.output)
27 | }
28 | })
29 | }
30 | }
31 |
32 | func generateTasks() []TestItem {
33 | return []TestItem{
34 | {TestItemInput{10, 20, "heat"}, 20},
35 | {TestItemInput{10, 20, "freeze"}, 10},
36 | {TestItemInput{10, 20, "auto"}, 20},
37 | {TestItemInput{-3, -11, "freeze"}, -11},
38 | {TestItemInput{1, 2, "fan"}, 1},
39 | {TestItemInput{0, 10, "heat"}, 10},
40 | {TestItemInput{20, 15, "heat"}, 20},
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/yandex_training_1/study_1/B/README.md:
--------------------------------------------------------------------------------
1 | # B. Треугольник
2 |
3 | Даны три натуральных числа. Возможно ли построить треугольник с такими сторонами. Если это возможно, выведите строку YES, иначе выведите строку NO.
4 |
5 | Треугольник — это три точки, не лежащие на одной прямой.
6 |
7 | ## Формат ввода
8 |
9 | Вводятся три натуральных числа.
10 |
11 | ## Формат вывода
12 |
13 | Выведите ответ на задачу. YES или NO
14 |
15 | ### Пример 1
16 |
17 |
18 |
19 | 3
20 | 4
21 | 5
22 | |
23 |
24 | YES
25 |
26 |
27 | |
28 |
29 |
30 | ### Пример 2
31 |
32 |
33 |
34 | 3
35 | 5
36 | 4
37 | |
38 |
39 | YES
40 |
41 |
42 | |
43 |
44 |
45 | ### Пример 3
46 |
47 |
48 |
49 | 4
50 | 5
51 | 3
52 | |
53 |
54 | YES
55 |
56 |
57 | |
58 |
59 |
--------------------------------------------------------------------------------
/yandex_training_1/study_1/B/task.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "bufio"
5 | "fmt"
6 | "os"
7 | "strconv"
8 | )
9 |
10 | func main() {
11 | scanner := bufio.NewScanner(os.Stdin)
12 |
13 | scanner.Scan()
14 | a, _ := strconv.Atoi(scanner.Text())
15 |
16 | scanner.Scan()
17 | b, _ := strconv.Atoi(scanner.Text())
18 |
19 | scanner.Scan()
20 | c, _ := strconv.Atoi(scanner.Text())
21 |
22 | fmt.Println(solution(a, b, c))
23 | }
24 |
25 | func solution(a, b, c int) string {
26 | if a+b <= c || b+c <= a || a+c <= b {
27 | return "NO"
28 | }
29 |
30 | return "YES"
31 | }
32 |
--------------------------------------------------------------------------------
/yandex_training_1/study_1/B/task_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "testing"
6 | )
7 |
8 | type TestItemInput struct {
9 | a,
10 | b,
11 | c int
12 | }
13 |
14 | type TestItemOutput string
15 |
16 | type TestItem struct {
17 | input TestItemInput
18 | output TestItemOutput
19 | }
20 |
21 | func TestTask(t *testing.T) {
22 | for i, v := range generateTasks() {
23 | t.Run(fmt.Sprintf("Test %d", i+1), func(t *testing.T) {
24 | val := solution(v.input.a, v.input.b, v.input.c)
25 | if val != string(v.output) {
26 | t.Errorf("Неверный ответ решения!\nОтвет: \n%s \nВерно: \n%s", val, v.output)
27 | }
28 | })
29 | }
30 | }
31 |
32 | func generateTasks() []TestItem {
33 | return []TestItem{
34 | {TestItemInput{3, 4, 5}, "YES"},
35 | {TestItemInput{3, 5, 4}, "YES"},
36 | {TestItemInput{4, 5, 3}, "YES"},
37 | {TestItemInput{1, 2, 3}, "NO"},
38 | }
39 | }
40 |
--------------------------------------------------------------------------------