├── S1. Простые задачи (SQL, 15 баллов) ├── img.png ├── s1.sql └── README.md ├── S3. Таблица результатов (SQL, 30 баллов) ├── img.png ├── s3.sql └── README.md ├── S2. Статистика пользователей (SQL, 15 баллов) ├── img.png ├── s2.sql └── README.md ├── H. Block Jigsaw Puzzle (30 баллов) open issue ├── img4readme │ ├── img.png │ ├── img_1.png │ ├── img_2.png │ ├── img_3.png │ └── img_4.png └── README.md ├── C. Автомобильные номера (15 баллов) ├── c-avtomobilnie-nomera.go └── README.md ├── B. Морской бой (10 баллов) ├── b-morskoi-boi.go └── README.md ├── E. Товарные знаки (20 баллов) ├── e-tovarnie-znaki.go └── README.md ├── D. Результаты соревнования (20 баллов) ├── d-resultati-sorevnovaniya.go └── README.md ├── G. Записи к врачу (25 баллов) open issue └── README.md ├── F. Печать документа (20 баллов) open issue └── README.md └── I. Отображение страниц (40 баллов) open issue └── README.md /S1. Простые задачи (SQL, 15 баллов)/img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rtuty/route-256-go-junior-solutions-2023/HEAD/S1. Простые задачи (SQL, 15 баллов)/img.png -------------------------------------------------------------------------------- /S3. Таблица результатов (SQL, 30 баллов)/img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rtuty/route-256-go-junior-solutions-2023/HEAD/S3. Таблица результатов (SQL, 30 баллов)/img.png -------------------------------------------------------------------------------- /S2. Статистика пользователей (SQL, 15 баллов)/img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rtuty/route-256-go-junior-solutions-2023/HEAD/S2. Статистика пользователей (SQL, 15 баллов)/img.png -------------------------------------------------------------------------------- /H. Block Jigsaw Puzzle (30 баллов) open issue/img4readme/img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rtuty/route-256-go-junior-solutions-2023/HEAD/H. Block Jigsaw Puzzle (30 баллов) open issue/img4readme/img.png -------------------------------------------------------------------------------- /H. Block Jigsaw Puzzle (30 баллов) open issue/img4readme/img_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rtuty/route-256-go-junior-solutions-2023/HEAD/H. Block Jigsaw Puzzle (30 баллов) open issue/img4readme/img_1.png -------------------------------------------------------------------------------- /H. Block Jigsaw Puzzle (30 баллов) open issue/img4readme/img_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rtuty/route-256-go-junior-solutions-2023/HEAD/H. Block Jigsaw Puzzle (30 баллов) open issue/img4readme/img_2.png -------------------------------------------------------------------------------- /H. Block Jigsaw Puzzle (30 баллов) open issue/img4readme/img_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rtuty/route-256-go-junior-solutions-2023/HEAD/H. Block Jigsaw Puzzle (30 баллов) open issue/img4readme/img_3.png -------------------------------------------------------------------------------- /H. Block Jigsaw Puzzle (30 баллов) open issue/img4readme/img_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rtuty/route-256-go-junior-solutions-2023/HEAD/H. Block Jigsaw Puzzle (30 баллов) open issue/img4readme/img_4.png -------------------------------------------------------------------------------- /S1. Простые задачи (SQL, 15 баллов)/s1.sql: -------------------------------------------------------------------------------- 1 | select * from problems p 2 | where exists (select 1 from (select distinct s.user_id from submissions s 3 | inner join users u on (u.id = s.user_id) 4 | where s.problem_id = p.id and s.success) q 5 | having count(q.user_id) >= 2) 6 | order by p.id -------------------------------------------------------------------------------- /C. Автомобильные номера (15 баллов)/c-avtomobilnie-nomera.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "bufio" 5 | "fmt" 6 | "os" 7 | "regexp" 8 | "strings" 9 | ) 10 | 11 | func main() { 12 | var k int 13 | reader := bufio.NewReader(os.Stdin) 14 | fmt.Scanln(&k) 15 | numbers := make([]string, k) 16 | for i := 0; i < k; i++ { 17 | fmt.Fscanln(reader, &(numbers[i])) 18 | 19 | } 20 | for i := 0; i < k; i++ { 21 | rule := regexp.MustCompile("([a-zA-Z]\\d\\d[a-zA-Z][a-zA-Z])|([a-zA-Z]\\d[a-zA-Z][a-zA-Z])") 22 | 23 | res := rule.FindAllString(numbers[i], 999) 24 | 25 | if pass := rule.ReplaceAllString(numbers[i], ""); len(pass) == 0 && len(res) != 0 { 26 | fmt.Println(strings.Join(res, " ")) 27 | } else { 28 | fmt.Println("-") 29 | } 30 | 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /S2. Статистика пользователей (SQL, 15 баллов)/s2.sql: -------------------------------------------------------------------------------- 1 | select u.id, u.name, 2 | (select count(distinct c.id) from submissions s 3 | inner join problems p on (p.id = s.problem_id) 4 | inner join contests c on (c.id = p.contest_id) 5 | where s.user_id = u.id and s.success 6 | ) as solved_at_least_one_contest_count, 7 | (select count(distinct c.id) from submissions s 8 | inner join problems p on (p.id = s.problem_id) 9 | inner join contests c on (c.id = p.contest_id) 10 | where s.user_id = u.id 11 | ) as take_part_contest_count 12 | from users u 13 | order by solved_at_least_one_contest_count desc, take_part_contest_count desc, u.id 14 | -------------------------------------------------------------------------------- /S3. Таблица результатов (SQL, 30 баллов)/s3.sql: -------------------------------------------------------------------------------- 1 | select rank() over(order by inf.pcnt desc, inf.sbm asc) as rank, 2 | u.id as user_id, 3 | u.name as user_name, 4 | inf.pcnt as problem_count, 5 | inf.sbm as latest_successful_submitted_at 6 | from users u, (select id from contests c order by id desc limit 1) cmax 7 | inner join lateral ( --start lateral 8 | select count(distinct q.pcnt) pcnt, max(q.sbm) sbm from 9 | (select s.problem_id pcnt, min(s.submitted_at) over (partition by s.problem_id) sbm from submissions s 10 | inner join problems p on (p.id = s.problem_id and p.contest_id = cmax.id) where s.user_id = u.id and s.success 11 | ) q having exists ( 12 | select * from submissions s2 13 | inner join problems p2 on (p2.id=s2.problem_id and p2.contest_id = cmax.id) 14 | where s2.user_id = u.id ) 15 | ) inf on true --end lateral 16 | order by inf.pcnt desc, inf.sbm asc, u.id asc -------------------------------------------------------------------------------- /B. Морской бой (10 баллов)/b-morskoi-boi.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "bufio" 5 | "fmt" 6 | "os" 7 | "strconv" 8 | "strings" 9 | ) 10 | 11 | func main() { 12 | var k int 13 | fmt.Scanln(&k) 14 | 15 | scanner := bufio.NewScanner(os.Stdin) 16 | 17 | var testCounter = make([]string, k) 18 | for i := 0; i < k; i++ { 19 | scanner.Scan() 20 | testCounter[i] = scanner.Text() 21 | } 22 | 23 | for i := range testCounter { 24 | mass := strings.Split(testCounter[i], " ") 25 | 26 | massInt := make([]int, len(mass)) 27 | for i := range mass { 28 | v, _ := strconv.Atoi(mass[i]) 29 | massInt[i] = v 30 | } 31 | 32 | var ship = make(map[int]int) 33 | 34 | ship[1] = 0 35 | ship[2] = 0 36 | ship[3] = 0 37 | ship[4] = 0 38 | 39 | for _, v := range massInt { 40 | switch v { 41 | case 1: 42 | ship[1] += 1 43 | case 2: 44 | ship[2] += 1 45 | case 3: 46 | ship[3] += 1 47 | case 4: 48 | ship[4] += 1 49 | } 50 | } 51 | 52 | if ship[1] == 4 && ship[2] == 3 && ship[3] == 2 && ship[4] == 1 { 53 | fmt.Println("YES") 54 | } else { 55 | fmt.Println("NO") 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /E. Товарные знаки (20 баллов)/e-tovarnie-znaki.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "bufio" 5 | "fmt" 6 | "os" 7 | ) 8 | 9 | func main() { 10 | var k int 11 | reader := bufio.NewReader(os.Stdin) 12 | fmt.Fscanln(reader, &k) 13 | 14 | builds := make([][]string, k) 15 | for i := 0; i < k; i++ { 16 | var l int 17 | fmt.Fscanln(reader, &l) 18 | var build = make([]string, l) 19 | for j := 0; j < l; j++ { 20 | fmt.Fscanln(reader, &(build[j])) 21 | } 22 | builds[i] = build 23 | } 24 | for i := range builds { 25 | for j := range builds[i] { 26 | bytestr := []byte(builds[i][j]) 27 | newstr := `` 28 | var oldlrt byte 29 | for s := range bytestr { 30 | if s != 0 { 31 | if bytestr[s] == bytestr[s-1] { 32 | if oldlrt != bytestr[s] { 33 | oldlrt = bytestr[s] 34 | } else { 35 | continue 36 | } 37 | } else { 38 | oldlrt = 0 39 | } 40 | } 41 | newstr += string(bytestr[s]) 42 | } 43 | builds[i][j] = newstr 44 | } 45 | fmt.Println(Unique(builds[i])) 46 | } 47 | } 48 | 49 | func Unique(arr []string) int { 50 | var uniq []string 51 | for _, s := range arr { 52 | if !Contains(uniq, s) { 53 | uniq = append(uniq, s) 54 | } 55 | } 56 | return len(uniq) 57 | } 58 | 59 | func Contains[T comparable](s []T, e T) bool { 60 | for _, v := range s { 61 | if v == e { 62 | return true 63 | } 64 | } 65 | return false 66 | } 67 | -------------------------------------------------------------------------------- /D. Результаты соревнования (20 баллов)/d-resultati-sorevnovaniya.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "bufio" 5 | "fmt" 6 | "os" 7 | "sort" 8 | ) 9 | 10 | func main() { 11 | in := bufio.NewReader(os.Stdin) 12 | out := bufio.NewWriter(os.Stdout) 13 | defer out.Flush() 14 | 15 | var testCounter int 16 | fmt.Fscan(in, &testCounter) 17 | 18 | for i := 0; i < testCounter; i++ { 19 | var k int 20 | fmt.Fscan(in, &k) 21 | 22 | input := []int{} 23 | ans := []int{} 24 | times := map[int]int{} 25 | used := map[int]int{} 26 | 27 | for j := 0; j < k; j++ { 28 | var n int 29 | fmt.Fscan(in, &n) 30 | input = append(input, n) 31 | ans = append(ans, n) 32 | times[n]++ 33 | used[n] = -1 34 | } 35 | 36 | input = unique(input) 37 | place := 1 38 | sort.Ints(input) 39 | 40 | for _, n := range input { 41 | if used[n] != -1 { 42 | continue 43 | } 44 | place += checkNearest(n, used, times, place) 45 | } 46 | 47 | for _, n := range ans { 48 | fmt.Fprint(out, used[n], " ") 49 | } 50 | fmt.Fprintln(out) 51 | } 52 | } 53 | 54 | func checkNearest(n int, used map[int]int, times map[int]int, place int) int { 55 | used[n] = place 56 | if val, ok := used[n+1]; ok && val == -1 { 57 | return checkNearest(n+1, used, times, place) + times[n] 58 | } 59 | return times[n] 60 | } 61 | 62 | func unique(intSlice []int) []int { 63 | keys := make(map[int]bool) 64 | list := []int{} 65 | for _, entry := range intSlice { 66 | if _, value := keys[entry]; !value { 67 | keys[entry] = true 68 | list = append(list, entry) 69 | } 70 | } 71 | return list 72 | } 73 | -------------------------------------------------------------------------------- /C. Автомобильные номера (15 баллов)/README.md: -------------------------------------------------------------------------------- 1 | # Автомобильные номера 2 | 3 | В Берляндии автомобильные номера состоят из цифр и прописных букв латинского алфавита. Они бывают двух видов: 4 | 5 | * либо автомобильный номер имеет вид буква-цифра-цифра-буква-буква (примеры корректных номеров первого вида: R48FA, O00OO, A99OK); 6 | * либо автомобильный номер имеет вид буква-цифра-буква-буква (примеры корректных номеров второго вида: T7RR, A9PQ, O0OO). 7 | Таким образом, каждый автомобильный номер является строкой либо первого, либо второго вида. 8 | 9 | Вам задана строка из цифр и прописных букв латинского алфавита. Можно ли разделить её пробелами на последовательность корректных автомобильных номеров? Иными словами, проверьте, что заданная строка может быть образована как последовательность корректных автомобильных номеров, которые записаны подряд без пробелов. В случае положительного ответа выведите любое такое разбиение. 10 | 11 | #### Входные данные 12 | В первой строке записано целое число t (1≤t≤1000) — количество наборов входных данных в тесте. 13 | 14 | Наборы входных данных в тесте независимы. Друг на друга они никак не влияют. 15 | 16 | Каждый набор входных данных — непустая строка s, которая состоит из цифр и прописных букв латинского алфавита. Длина строки — от 1 до 50 символов. 17 | 18 | #### Выходные данные 19 | Выведите n строк: очередная строка должна содержать ответ для соответствующего набора входных данных. 20 | 21 | Если ответ отрицательный — то есть заданную строку s невозможно представить как последовательность номеров автомобилей — строка в выводе должна содержать единственный символ '-' (минус, ASCII-код 45). 22 | 23 | В случае положительного ответа выведите любое разбиение заданной строки s на последовательность корректных номеров. Каждый номер должен соответствовать одному из двух видов (см. условие). Номера разделяйте пробелами. Вы можете выводить произвольное количество пробелов и даже лишние пробелы после последнего номера. 24 | 25 | ### Пример 26 | #### Входные данные: 27 | ```azure 28 | 6 29 | R48FAO00OOO0OOA99OKA99OK 30 | R48FAO00OOO0OOA99OKA99O 31 | A9PQ 32 | A9PQA 33 | A99AAA99AAA99AAA99AA 34 | AP9QA 35 | ``` 36 | 37 | #### Выходные данные: 38 | ```azure 39 | R48FA O00OO O0OO A99OK A99OK 40 | - 41 | A9PQ 42 | - 43 | A99AA A99AA A99AA A99AA 44 | - 45 | ``` -------------------------------------------------------------------------------- /D. Результаты соревнования (20 баллов)/README.md: -------------------------------------------------------------------------------- 1 | # Результаты соревнований 2 | 3 | В соревновании по бегу приняли участие n спортсменов: i-й из них пробежал дистанцию за ti секунд. Жюри хочет назначить места участникам по следующим правилам: 4 | 5 | * места пронумерованы от 1 и далее (лучшее место — первое); 6 | * если у двух спортсменов результаты одинаковые или отличаются на одну секунду, то они делят место (в этом случае считаем, что они делят лучшее из поделенных мест); 7 | * участники делят место только в результате применения предыдущего правила (возможно, несколько раз); 8 | * если k участников делят место p, то места следующих за ними участников нумеруются начиная с k+p. 9 | Рассмотрите следующие примеры, чтобы понять принцип назначения мест: 10 | 11 | * допустим, n=4 и t=[20,10,20,30], тогда места имеют вид [2,1,2,4] (второй спортсмен прибежал первым — у него первое место, первый и третий поделили второе место, четвёртый занял последнее четвёртое место); 12 | * допустим, n=3 и t=[5,7,6], тогда места имеют вид [1,1,1] (так как t1=5 и t3=6 отличаются на 1, то первый и третий спортсмены должны занять одинаковое место, аналогично со вторым и третьим спортсменами, следовательно, все трое делят первое место); 13 | * допустим, n=5 и t=[6,3,4,3,1], тогда места имеют вид [5,2,2,2,1]; 14 | * допустим, n=5 и t=[200,10,100,11,200], тогда места имеют вид [4,1,3,1,4]. 15 | По заданным значениям n и t1,t2,…,tn выведите последовательность мест, занятых спортсменами. 16 | 17 | Неполные решения этой задачи (например, недостаточно эффективные) могут быть оценены частичным баллом. 18 | 19 | #### Входные данные 20 | В первой строке записано целое число t (1≤t≤1000) — количество наборов входных данных в тесте. 21 | 22 | Наборы входных данных в тесте независимы. Друг на друга они никак не влияют. 23 | 24 | Первая строка каждого набора входных данных содержит целое число n (1≤n≤2⋅105) — количество спортсменов. 25 | 26 | Вторая строка набора содержит последовательность целых чисел t1,t2,…,tn (1≤ti≤109), где ti — время в секундах, за которое i-й спортсмен пробежал дистанцию. 27 | 28 | Сумма значений n по всем наборам входных данных теста не превосходит 2⋅105. 29 | 30 | #### Выходные данные 31 | Для каждого набора входных данных выведите n положительных чисел r1,r2,…,rn, где ri — место i-го спортсмена.* 32 | 33 | ### Пример 34 | #### Входные данные: 35 | ```azure 36 | 6 37 | 4 38 | 20 10 20 30 39 | 3 40 | 5 7 6 41 | 5 42 | 6 3 4 3 1 43 | 5 44 | 200 10 100 11 200 45 | 1 46 | 1000000000 47 | 11 48 | 13 8 12 1 7 10 1 8 10 2 17 49 | ``` 50 | 51 | #### Выходные данные: 52 | ```azure 53 | 2 1 2 4 54 | 1 1 1 55 | 5 2 2 2 1 56 | 4 1 3 1 4 57 | 1 58 | 9 4 9 1 4 7 1 4 7 1 11 59 | ``` -------------------------------------------------------------------------------- /G. Записи к врачу (25 баллов) open issue/README.md: -------------------------------------------------------------------------------- 1 | # Записи к врачу 2 | Врач за день может принять до n пациентов. Окна времени для приёма пронумерованы от 1 до n в хронологическом порядке. 3 | 4 | Ассистент записал m человек, i-го человека на окно wi (1≤wi≤n). Выяснилось, что некоторые пациенты могут быть записаны на одно окно. Может ли ассистент попросить подвинуться некоторых пациентов на одно окно вперёд или назад так, чтобы у врача была возможность принять всех? 5 | 6 | Обратите внимание, что для каждого пациента возможны три сценария: 7 | 8 | * оставить его запись как есть, 9 | * изменить его запись на одно окно назад (то есть заменить значение wi на wi−1), 10 | * изменить его запись на одно окно вперёд (то есть заменить значение wi на wi+1). 11 | Конечно, в двух последних случаях запись должна остаться в окне от 1 до n. 12 | 13 | Определите, можно ли исправить записи требуемым образом так, чтобы врач смог принять всех пациентов. В случае положительного ответа выведите любой из способов это сделать. 14 | 15 | Обратите внимание, что вам не требуется минимизировать количество перенесённых записей. Достаточно найти любой способ перенести произвольное количество записей требуемым образом, чтобы врач смог принять всех пациентов. 16 | 17 | Неполные решения этой задачи (например, недостаточно эффективные) могут быть оценены частичным баллом. 18 | 19 | #### Входные данные 20 | В первой строке входных данных записано целое число t (1≤t≤1000) — количество наборов входных данных. 21 | 22 | Наборы входных данных в тесте независимы. Друг на друга они никак не влияют. 23 | 24 | В первой строке каждого набора записаны два целых числа n и m (1≤m≤n≤3⋅105), где n — количество окон приёма у врача, а m — количество записанных пациентов. 25 | 26 | Во второй строке записано m целых чисел w1,w2,…,wm (1≤wi≤n), где wi — номер окна, на которое записан i-й пациент. 27 | 28 | Гарантируется, что сумма значений n по всем наборам входных данных теста не превосходит 3⋅105. 29 | 30 | #### Выходные данные 31 | Выведите m строк, j-я строка должна содержать ответ на j-й набор входных данных. 32 | 33 | Если перенести записи требуемым образом невозможно, выведите x (строчную латинскую букву «икс»). 34 | 35 | Иначе выведите строку без пробелов из m символов, где каждый символ — это: 36 | 37 | * 0 (ноль), если запись соответствующего пациента менять не надо, 38 | - (минус), если запись соответствующего пациента надо изменить на одно окно назад, 39 | + (плюс), если запись соответствующего пациента надо изменить на одно окно вперёд. 40 | Если существует несколько способов изменить записи требуемым образом, то выведите любой из них. Количество изменений записей минимизировать не требуется. 41 | 42 | #### Пример 43 | #### Входные данные 44 | ```azure 45 | 4 46 | 5 5 47 | 2 1 3 5 2 48 | 5 4 49 | 1 1 1 1 50 | 200000 4 51 | 100000 100001 100001 100000 52 | 2 2 53 | 2 1 54 | ``` 55 | #### Выходные данные 56 | ```azure 57 | 00+0+ 58 | x 59 | -0+0 60 | 00 61 | ``` -------------------------------------------------------------------------------- /E. Товарные знаки (20 баллов)/README.md: -------------------------------------------------------------------------------- 1 | # Товарные знаки 2 | В Торгово-промышленную палату (ТПП) Берляндии были поданы n заявок на регистрацию товарных знаков. Каждая заявка — это непустая строка из букв латинского алфавита. 3 | 4 | ТПП отклоняет очередную заявку, если ранее был зарегистрирован похожий товарный знак. Если такого не было, то товарный знак регистрируется палатой. 5 | 6 | Два товарных знака похожи, если их можно сделать равными с помощью нуля или более таких операций: 7 | 8 | * возьмём любой из двух знаков, 9 | * найдём в знаке две или более одинаковые идущие подряд буквы, 10 | * добавим в этот блок одинаковых букв ещё одну такую же букву. 11 | Например: 12 | 13 | * товарные знаки Booble и Boooble похожи — берём в первом товарном знаке две подряд идущие буквы o и добавляем к ним ещё одну букву o, так получим второй товарный знак Boooble; 14 | * товарные знаки yyyess и yyessss похожи — сначала изменим второй товарный знак: yyessss → yyyessss, потом два раза изменим первый товарный знак: yyyess → yyyesss → yyyessss. Так с помощью последовательности операций получилось сделать оба знака равными yyyessss; 15 | * товарные знаки oooops и oooops похожи — операций производить не надо, знаки уже равны; 16 | * товарные знаки oooooopppss и ooooppssss похожи — например, сначала изменим второй товарный знак ooooppssss → oooooppssss → ooooooppssss → oooooopppssss, затем изменим первый: oooooopppss → oooooopppsss → oooooopppssss. 17 | Обратите внимание, что добавлять букву можно только в блок идущих подряд двух или более одинаковых букв. Строчные и прописные буквы следует различать. 18 | 19 | Примеры пар непохожих товарных знаков: a и aa, MMM и mmm, yess и yyes. 20 | 21 | Считая, что до обработки n заявок в ТПП не было зарегистрировано других товарных знаков, выведите количество знаков, которые будут в итоге зарегистрированы. 22 | 23 | Неполные решения этой задачи (например, недостаточно эффективные) могут быть оценены частичным баллом. 24 | 25 | #### Входные данные 26 | В первой строке входных данных записано целое число t (1≤t≤1000) — количество наборов входных данных. 27 | 28 | Наборы входных данных в тесте независимы. Друг на друга они никак не влияют. 29 | 30 | В первой строке каждого набора записано целое число n (1≤n≤105) — количество заявок. Далее следуют сами заявки, по одной заявке в строке. Каждая заявка является непустой строкой из букв латинского алфавита. 31 | 32 | Гарантируется, что сумма длин заявок по всем наборам входных данных теста не превосходит 106. 33 | 34 | #### Выходные данные 35 | Выведите t чисел — для каждого набора входных данных выведите суммарное количество товарных знаков, которые будут зарегистрированы палатой. Обратите внимание, что наборы входных данных следует обрабатывать независимо (они не влияют друг на друга). 36 | 37 | 38 | 39 | ### Пример 40 | #### Входные данные: 41 | ```azure 42 | 3 43 | 8 44 | Booble 45 | yyyess 46 | oooops 47 | oooooopppss 48 | Boooble 49 | yyessss 50 | oooops 51 | ooooppssss 52 | 6 53 | a 54 | aa 55 | MMM 56 | mmm 57 | yess 58 | yyes 59 | 5 60 | rrrrrrrr 61 | rrrrrr 62 | rrr 63 | rr 64 | r 65 | ``` 66 | 67 | #### Выходные данные: 68 | ```azure 69 | 4 70 | 6 71 | 2 72 | ``` -------------------------------------------------------------------------------- /F. Печать документа (20 баллов) open issue/README.md: -------------------------------------------------------------------------------- 1 | # Печать документа 2 | 3 | Необходимо напечатать документ из k страниц. Его страницы пронумерованы от 1 до k. 4 | 5 | Некоторые его страницы были уже предварительно напечатаны. Известно, что на принтер было отослано одно задание, которое содержало список страниц для печати. 6 | 7 | Этот список содержит хотя бы одну страницу, и хотя бы одна страница от 1 до k не попадает в этот список. Список страниц состоит из перечисленных через единичную запятую элементов списка, где каждый элемент — это: 8 | 9 | * либо конкретный номер одной страницы (целое число от 1 до k), 10 | * либо диапазон страниц, записанный в формате «l-r», где l — начало диапазона печати, а r — конец диапазона печати (и l и r целые числа, удовлетворяющие неравенству 1≤l≤r≤k). 11 | Страница может многократно присутствовать в списке на печать, но будет напечатана лишь единожды. 12 | 13 | Иными словами, список страниц имеет формат, аналогичный тому, что используется в «Microsoft Word» или других подобных программах. 14 | 15 | Например, если k=8, то допустимые списки страниц: 16 | 17 | * 7 (была напечатана лишь страница 7), 18 | * 1,7,1 (были напечатаны страницы 1 и 7), 19 | * 1-5,1,7-7 (были напечатаны страницы 1,2,3,4,5,7). 20 | Примеры неправильных диапазонов для k=8 (такие входные данные недопустимы): 21 | 22 | * 1-8 (хотя бы одна страница документа должна быть еще не напечатана), 23 | * 1,,3 (две запятые не могут идти подряд), 24 | * 7-9 (девятую страницу нельзя послать на печать), 25 | * 1-5, (каждая запятая должна разделять два элемента, заканчивать список она не может), 26 | * ,1,2,3-5 (каждая запятая должна разделять два элемента, начинать список она не может), 27 | * 3-4-7 (нарушен формат элемента, так нельзя). 28 | Выведите кратчайший список страниц в аналогичном формате, который надо дополнительно послать на печать, чтобы в итоге напечатать все страницы от 1 до k, не напечатанные ранее. 29 | 30 | Иными словами, найдите такую наиболее короткую строку, которая является корректным списком страниц и содержит те и только те страницы, которые еще не были напечатаны. 31 | 32 | Если ответов несколько, то выведите любой из них. 33 | 34 | #### Входные данные 35 | В первой строке входных данных записано целое число t (1≤t≤100) — количество наборов входных данных. 36 | 37 | Наборы входных данных в тесте независимы. Друг на друга они никак не влияют. 38 | 39 | В первой строке каждого набора записано целое число k (2≤k≤100) — количество страниц в документе. 40 | 41 | Вторая строка каждого набора содержит список страниц, которые уже были посланы на печать. Этот список корректен и отформатирован строго по правилам, написанным выше. Он содержит только страницы от 1 до k, содержит хотя бы одну страницу, и хотя бы одна страница от 1 до k в него не входит. Строка не содержит пробелы или какие-либо другие дополнительные символы. Длина этой строки — от 1 до 400, включительно. 42 | 43 | #### Выходные данные 44 | Выведите t строк — для каждого набора входных данных выведите кратчайшую строку, содержащую корректный список страниц, которые надо допечатать и только их. Если оптимальных ответов несколько, то выведите любой из них. 45 | 46 | #### Пример 47 | #### Входные данные 48 | ```azure 49 | 7 50 | 8 51 | 7 52 | 8 53 | 1,7,1 54 | 8 55 | 1-5,1,7-7 56 | 10 57 | 1-5 58 | 10 59 | 1,2,3,4,5,6,8,9,10 60 | 3 61 | 1-2 62 | 100 63 | 1-2,3-7,10-20,100 64 | ``` 65 | #### Выходные данные 66 | ```azure 67 | 8,1-6 68 | 2-6,8 69 | 6,8 70 | 6-10 71 | 7 72 | 3 73 | 9,21-99,8 74 | 75 | ``` -------------------------------------------------------------------------------- /B. Морской бой (10 баллов)/README.md: -------------------------------------------------------------------------------- 1 | # B. Морской бой (10 баллов) 2 | Это наиболее простая задача Контеста. Надеемся, что вы познакомились с тестирующей системой Codeforces, приняв участие в Песочнице. В любом случае напоминаем вам несколько моментов. 3 | 4 | Правильные решения задач должны проходить все заранее заготовленные тесты жюри и укладываться в ограничения по времени/памяти на каждом тесте. В некоторых задачах допустимы частичные решения (это написано в условии). 5 | 6 | Ниже перечислены технические требования к решениям: 7 | 8 | * решение располагается в одном файле исходного кода; 9 | * решение читает входные данные со стандартного ввода (экрана); 10 | * решение пишет выходные данные на стандартный вывод (экран); 11 | * решение не взаимодействует как-либо с другими ресурсами компьютера (сеть, жесткий диск, процессы и прочее); 12 | * решение использует только стандартную библиотеку языка; 13 | * решение располагается в пакете по-умолчанию (или его аналоге для вашего языка), имеют стандартную точку входа для консольных программ; 14 | * гарантируется, что во всех тестах выполняются все ограничения, что содержатся в условии задачи — как-либо проверять входные данные на корректность не надо, все тесты строго соответствуют описанному в задаче формату; 15 | * выводи ответ в точности в том формате, как написано в условии задачи (не надо выводить «поясняющих» комментариев типа введите число или ответ равен); 16 | * решения можно отправлять сколько угодно раз (пожалуйста, только без абьюза системы). 17 | 18 | Для вашего удобства большинство тестов, на которых будут тестироваться ваши решения, являются открытыми. В каждой задаче можно скачать архив тестов (смотрите сайдбар справа, раздел «Материалы соревнования»). 19 | 20 | Обратите внимание на SQL-задачу. Не забудьте попробовать свои силы в её решении. 21 | 22 | Перейдём к задаче. 23 | 24 | Вы участвуете в разработке подсистемы проверки поля для игры «Морской бой». Вам требуется написать проверку корректности количества кораблей на поле, учитывая их размеры. Напомним, что на поле должны быть: 25 | 26 | четыре однопалубных корабля, 27 | три двухпалубных корабля, 28 | два трёхпалубных корабля, 29 | один четырёхпалубный корабль. 30 | Вам заданы 10 целых чисел от 1 до 4. Проверьте, что заданные размеры соответствуют требованиям выше. 31 | 32 | #### Входные данные 33 | В первой строке записано целое число t (1≤t≤1000) — количество наборов входных данных в тесте. 34 | 35 | Наборы входных данных в тесте независимы. Друг на друга они никак не влияют. 36 | 37 | Каждый набор входных данных состоит из одной строки, которая содержит 10 целых чисел a1,a2,…,a10 (1≤ai≤4) — размеры кораблей на поле в произвольном порядке. 38 | 39 | Обратите внимание, что уже гарантируется, что кораблей на поле ровно 10 и их размеры от 1 до 4, включительно. Вам необходимо проверить, что количество кораблей каждого типа соответствует правилам игры. 40 | 41 | #### Выходные данные 42 | Для каждого набора входных данных в отдельной строке выведите: 43 | 44 | YES, если заданные размеры кораблей на поле соответствуют правилам игры; 45 | NO в противном случае. 46 | Вы можете выводить YES и NO в любом регистре (например, строки yEs, yes, Yes и YES будут распознаны как положительный ответ). 47 | 48 | ### Пример 49 | #### Входные данные: 50 | ```azure 51 | 5 52 | 2 1 3 1 2 3 1 1 4 2 53 | 1 1 1 2 2 2 3 3 3 4 54 | 1 1 1 1 2 2 2 3 3 4 55 | 4 3 3 2 2 2 1 1 1 1 56 | 4 4 4 4 4 4 4 4 4 4 57 | ``` 58 | 59 | #### Выходные данные: 60 | ```azure 61 | YES 62 | NO 63 | YES 64 | YES 65 | NO 66 | ``` -------------------------------------------------------------------------------- /S1. Простые задачи (SQL, 15 баллов)/README.md: -------------------------------------------------------------------------------- 1 | # Простые задачи 2 | 3 | Напишите запрос к базе данных, который возвращает все задачи, которые были решены не менее чем двумя пользователями. Найденные задачи следует отсортировать по id. 4 | 5 | Внимательно ознакомьтесь с примерами вывода. Ваш запрос должен иметь в точности такой же вывод на примерах. 6 | 7 | Схема базы данных содержит четыре таблицы: 8 | 9 | * users — пользователи системы (описываются двумя полями: id и name), 10 | * contests — контесты в системе (описываются двумя полями: id и name), 11 | * problems — задачи в системе, каждая задача принадлежит одному контесту (описываются тремя полями: id, contest_id и code, где code — это кодовое короткое название задачи), 12 | * submissions — отосланные попытки решения задач, каждая попытка принадлежит одной задаче и одному пользователю (описываются 5 полями: id, user_id, problem_id, success и submitted_at, где success — это булевское значение была ли попытка успешной и submitted_at — дата-время, когда попытка была совершена). 13 | Таким образом, contests и problems находятся в отношении «один ко многим», submissions и users находятся в отношении «многие к одному», submissions и problems находятся в отношении «многие к одному». 14 | 15 | Изучите входные данные примера, чтобы подробно ознакомиться со схемой базы данных. Диаграмма ниже иллюстрирует схему базы данных. 16 | 17 | ![img.png](img.png) 18 | 19 | #### Входные данные 20 | Входными данными в этой задаче является дамп базы данных. Вам он может быть полезен для ознакомления с состоянием базы данных для конкретного теста. В качестве решения вы должны отправить один SQL-запрос. 21 | 22 | #### Выходные данные 23 | Ваш SQL-запрос должен вывести все подходящие задачи в порядке возрастания их id. 24 | 25 | Внимательно ознакомьтесь с примерами вывода. Ваш запрос должен иметь в точности такой же вывод на примерах. 26 | 27 | #### Примеры 28 | 29 | #### Входные данные 30 | ```sql 31 | create table users ( 32 | id bigint primary key, 33 | name varchar not null 34 | ); 35 | 36 | create table contests ( 37 | id bigint primary key, 38 | name varchar not null 39 | ); 40 | 41 | create table problems ( 42 | id bigint primary key, 43 | contest_id bigint, 44 | code varchar not null, 45 | constraint fk_problems_contest_id foreign key (contest_id) references contests (id) 46 | ); 47 | 48 | create unique index on problems (contest_id, code); 49 | 50 | create table submissions ( 51 | id bigint primary key, 52 | user_id bigint, 53 | problem_id bigint, 54 | success boolean not null, 55 | submitted_at timestamp not null, 56 | constraint fk_submissions_user_id foreign key (user_id) references users (id), 57 | constraint fk_submissions_problem_id foreign key (problem_id) references problems (id) 58 | ); 59 | 60 | insert into users 61 | values (1, 'Marie Curie'), 62 | (2, 'Stephen Hawking'), 63 | (3, 'Ada Lovelace'), 64 | (4, 'Albert Einstein'), 65 | (5, 'Archimedes'); 66 | 67 | insert into contests 68 | values (1, 'Sandbox-Juniors'), 69 | (2, 'Sandbox-Seniors'), 70 | (3, 'Contest-Juniors'), 71 | (4, 'Contest-Seniors'); 72 | 73 | insert into problems 74 | values (1, 1, 'A'), 75 | (2, 2, 'A'), 76 | (3, 3, 'A'), 77 | (4, 3, 'B'), 78 | (5, 4, 'A'), 79 | (6, 4, 'B'); 80 | 81 | insert into submissions 82 | values (1, 2, 2, false, '2023-02-05 11:01:00'), 83 | (2, 2, 2, true, '2023-02-05 11:02:00'), 84 | (3, 2, 6, true, '2023-02-05 11:03:01'), 85 | (4, 2, 1, true, '2023-02-05 11:04:00'), 86 | (5, 2, 1, true, '2023-02-05 11:05:00'), 87 | (6, 3, 6, true, '2023-02-05 11:06:00'), 88 | (17, 1, 6, true, '2023-02-05 11:03:00'), 89 | (8, 1, 2, true, '2023-02-05 11:08:00'), 90 | (9, 1, 1, false, '2023-02-05 11:09:00'), 91 | (10, 3, 1, false, '2023-02-05 11:10:00'), 92 | (11, 5, 5, false, '2023-02-05 11:11:00'), 93 | (13, 2, 6, true, '2023-02-05 11:03:00'), 94 | (14, 3, 6, false, '2023-02-05 11:05:59'), 95 | (15, 1, 6, true, '2023-02-05 11:04:00'); 96 | ``` 97 | 98 | #### Выходные данные 99 | ```sql 100 | id | contest_id | code 101 | ----+------------+------ 102 | 2 | 2 | A 103 | 6 | 4 | B 104 | (2 rows) 105 | ``` -------------------------------------------------------------------------------- /H. Block Jigsaw Puzzle (30 баллов) open issue/README.md: -------------------------------------------------------------------------------- 1 | # Block Jigsaw Puzzle 2 | Слышали о Block Jigsaw Puzzle? Сейчас расскажем! 3 | 4 | Игра происходит на поле 8×8. Каждая клетка поля либо свободна, либо занята блоком. Например, ниже на картинке изображено одно из возможных текущих состояний поля. 5 | 6 | ![img4readme/img.png](img4readme/img.png) 7 | 8 | Вам поступают фигуры, которые вы должны укладывать на поле. Вращать фигуры вы не можете. Когда вы кладёте фигуру на поле, все клетки, соответствующие этой фигуре, должны быть свободны. Вы можете выбрать любой из корректных способов положить фигуру. 9 | 10 | Например, допустим, вы хотите положить следующую фигуру на поле: 11 | 12 | ![img4readme/img_1.png](img4readme/img_1.png) 13 | 14 | Есть всего один корректный способ положить её: 15 | 16 | ![img4readme/img_2.png](img4readme/img_2.png) 17 | 18 | Как только фигура оказалась на поле, все полностью заполненные блоками строки и столбцы поля очищаются. Это действие происходит мгновенно, оставшиеся заполненные блоки остаются неподвижными. 19 | 20 | В рассматриваемом примере очистятся одна строка и один столбец. После этого поле примет следующий вид: 21 | 22 | ![img4readme/img_3.png](img4readme/img_3.png) 23 | 24 | Возможные фигуры для укладывания могут выглядеть следующим образом: 25 | 26 | ![img4readme/img_4.png](img4readme/img_4.png) 27 | 28 | Могут быть даны любые повороты и зеркальные отражения фигур с картинки выше. В процессе укладывания фигуры вращать её нельзя. 29 | 30 | Вам задано текущее состояние поля и набор фигур для укладывания. Ваша цель — уложить фигуры так, чтобы минимизировать количество блоков на поле в конце игры. Фигуры можно укладывать в любом порядке. Обратите внимание, что каждый раз после размещения очередной фигуры на поле происходит очищение полностью заполненных блоками строк и столбцов. 31 | 32 | Требуется последовательно уложить все фигуры и вывести минимальное количество блоков, которое останется на поле после укладывания всех фигур. Выведите -1, если уложить все фигуры невозможно. 33 | 34 | Неполные решения этой задачи (например, недостаточно эффективные) могут быть оценены частичным баллом. Для набора 15 баллов достаточно решить частный случай задачи с k=1. 35 | 36 | #### Входные данные 37 | Первые 8 строк содержат по 8 символов каждая — текущее состояние поля. Символ '.' (точка) соответствует пустой клетке, а символ '*' (звёздочка) — клетке с блоком. Гарантируется, что текущее состояние поля таково, что в нём нет сплошных строк и/или столбцов из блоков. 38 | 39 | Следующая строка содержит целое число k (1≤k≤3) — количество заданных фигур. Обратите внимание, что первые тесты содержат только k=1, и для набора 15 баллов достаточно решить частный случай задачи с k=1. 40 | 41 | Затем заданы фигуры. Описание каждой фигуры начинается со строки, которая содержит целое число li (1≤li≤5) — количество строк в описании фигуры. Затем заданы li строк с описанием фигуры в виде прямоугольника минимального размера, который её содержит. Формат задания аналогичен тому, как задано поле. Каждая фигура является одной из 12 допустимых (перечислены на картинке выше), возможно, повёрнутая и/или отражённая. 42 | 43 | #### Выходные данные 44 | Выведите одно целое число — минимальное количество блоков на поле после укладывания k заданных фигур в произвольном порядке оптимальным способом. 45 | 46 | Выведите -1, если не существует способа уложить все фигуры на поле. 47 | 48 | Заметим, что последний пример иллюстрирует случай k>1. Этот пример не обязательно должен проходить, чтобы вы набрали 15 баллов. 49 | #### Пример 50 | #### Входные данные 51 | ```azure 52 | *****.** 53 | ***.*.** 54 | **..**** 55 | **..*... 56 | ........ 57 | ****.*** 58 | ...*.*** 59 | ******.. 60 | 1 61 | 3 62 | *** 63 | ..* 64 | ..* 65 | ``` 66 | #### Выходные данные 67 | ```azure 68 | 29 69 | ``` 70 | 71 | #### Входные данные 72 | ```azure 73 | .******* 74 | ******.* 75 | *****.** 76 | *.....** 77 | *****.** 78 | *.***.** 79 | **.***** 80 | *******. 81 | 1 82 | 3 83 | .* 84 | ** 85 | .* 86 | ``` 87 | #### Выходные данные 88 | ```azure 89 | 33 90 | ``` 91 | #### Входные данные 92 | ```azure 93 | *.****** 94 | ..****** 95 | *..**.** 96 | *.*.**** 97 | *.***.** 98 | *.**..** 99 | *.*.**.* 100 | *.*****. 101 | 1 102 | 2 103 | **. 104 | .** 105 | ``` 106 | #### Выходные данные 107 | ```azure 108 | 28 109 | ``` 110 | 111 | #### Входные данные 112 | ```azure 113 | ***.**** 114 | *.****** 115 | .***.... 116 | *.*....* 117 | *.***..* 118 | *.....*. 119 | *...*.** 120 | .******. 121 | 3 122 | 2 123 | ** 124 | ** 125 | 5 126 | * 127 | * 128 | * 129 | * 130 | * 131 | 2 132 | .** 133 | **. 134 | ``` 135 | #### Выходные данные 136 | ```azure 137 | 18 138 | ``` 139 | -------------------------------------------------------------------------------- /I. Отображение страниц (40 баллов) open issue/README.md: -------------------------------------------------------------------------------- 1 | # Отображение страниц 2 | В этой задаче вам предстоит написать отображение в текстовом виде простейших HTML-таблиц. 3 | 4 | В задаче используется очень ограниченное подмножество HTML-разметки. Внимательно прочтите условие задачи. 5 | 6 | В этой задаче все таблицы имеют строго прямоугольный вид, то есть содержат не менее одной строки, каждая строка содержит не менее одной ячейки, и во всех строках каждой отдельной таблицы одинаковое количество ячеек. 7 | 8 | Таблица описывается следующей грамматикой: 9 | 10 | * ⟨TABLE⟩ := ⟨ROWS⟩
11 | * ⟨ROWS⟩ := ⟨ROW⟩|⟨ROW⟩⟨ROWS⟩ 12 | * ⟨ROW⟩ := ⟨CELLS⟩ 13 | * ⟨CELLS⟩ := ⟨CELL⟩|⟨CELL⟩⟨CELLS⟩ 14 | * ⟨CELL⟩ := |⟨TABLE⟩ 15 | Таким образом, каждая ячейка таблицы либо пуста, либо содержит ровно одну другую таблицу. 16 | 17 | Вот пример минимальной корректной таблицы:
18 | 19 | Вот пример минимальной корректной таблицы размера 2×3:
20 | 21 | Вот пример таблицы 2×1, в нижнюю клетку которой вложена минимальная таблица:
22 | 23 | Ваша задача — отобразить заданную таблицу в текстовом виде. Каждая из таблиц (как внешняя, так и любая внутренняя) должна занимать минимальную площадь. Содержимое любой ячейки прижимается к её левому верхнему углу. 24 | 25 | Изучите примеры и точно следуйте всем особенностям форматирования, которые продемонстрированы в них. В этой задаче вам нужно вывести в точности ожидаемое представление таблицы — не выводите лишние незначащие пробелы или какие-либо другие символы. 26 | 27 | #### Входные данные 28 | В первой строке теста записано целое число t (1≤t≤100) — количество наборов входных данных в тесте. 29 | 30 | Далее следуют описания наборов. Наборы входных данных в тесте независимы. Друг на друга они никак не влияют. 31 | 32 | Каждый набор начинается строкой, которая содержит целое число k (1≤k≤1000) — количество строк, в которых записан очередной набор. 33 | 34 | Далее следуют k строк, в которых записано описание ровно одной таблицы. Описание произвольным образом разбито на k строк и отформатировано пробелами, которые следует полностью игнорировать. Пробелы могут даже разрывать ключевые слова в HTML-разметке. 35 | 36 | Каждая таблица (и внешняя, и все вложенные) соответствует грамматике выше и имеет строго прямоугольную форму: количества ячеек в каждой строке равны в рамках каждой отдельной таблицы. 37 | 38 | Размер файла каждого теста не превосходит 1 мегабайта. Глубина вложенности таблиц не превосходит 10. Гарантируется, что размер вывода для любого теста не превосходит 1 мегабайта. 39 | 40 | #### Выходные данные 41 | Выведите t заданных таблиц, следуя примерам. Каждая таблица должна занимать минимальную возможную площадь. Содержимое любой ячейки прижимается к её левому верхнему углу. 42 | 43 | Точно следуйте примерам, они демонстрируют все особенности и требования форматирования вывода. 44 | 45 | Гарантируется, что размер вывода для любого теста не превосходит 1 мегабайта. 46 | 47 | #### Пример 48 | #### Входные данные 49 | ```azure 50 | 4 51 | 5 52 | 53 | 54 | 55 | 56 |
57 | 4 58 | 59 | 60 | 61 |
62 | 5 63 | 66 |
68 | 35 69 | 70 | 71 | 73 | 80 | 82 | 83 | 84 | 92 | 95 | 102 | 103 |
72 | 74 | 75 | 78 |
76 |
77 |
79 |
81 |
85 | 86 | 87 | 88 | 89 | 90 |
91 |
93 |
94 |
96 | 97 | 98 | 99 | 100 |
101 |
104 | ``` 105 | #### Выходные данные 106 | ```azure 107 | +-+ 108 | |.| 109 | +-+ 110 | +-+-+-+ 111 | |.|.|.| 112 | +-+-+-+ 113 | |.|.|.| 114 | +-+-+-+ 115 | +---+ 116 | |...| 117 | +---+ 118 | |+-+| 119 | ||.|| 120 | |+-+| 121 | +---+ 122 | +---------+-----+---+ 123 | |.........|+---+|...| 124 | |.........||+-+||...| 125 | |.........|||.|||...| 126 | |.........||+-+||...| 127 | |.........|+---+|...| 128 | +---------+-----+---+ 129 | |+-+-+-+-+|+-+..|+-+| 130 | ||.|.|.|.|||.|..||.|| 131 | |+-+-+-+-+|+-+..|+-+| 132 | |.........|.....||.|| 133 | |.........|.....|+-+| 134 | |.........|.....||.|| 135 | |.........|.....|+-+| 136 | +---------+-----+---+ 137 | ``` -------------------------------------------------------------------------------- /S2. Статистика пользователей (SQL, 15 баллов)/README.md: -------------------------------------------------------------------------------- 1 | # Статистика пользователей 2 | 3 | Это необычная задача — вам надо написать SQL-запрос. В качестве решения вы должны отослать один запрос к базе данных, который возвращает требуемые данные. Запрос может содержать произвольное количество подзапросов, других конструкций, быть сколь угодно навороченным, но это должен быть один запрос (в нём не должна встречаться точка с запятой для разделения разных запросов). 4 | 5 | При проверке вашего решения используется PostgreSQL 15.1. В качестве входных данных вам предоставляется дамп состояния базы данных. Обратите внимание, что время работы вашего решения на тесте включает восстановление состояния базы данных из дампа, но это время значительно меньше ограничения по времени. Вы можете использовать сервис http://sqlfiddle.com/ как инструмент для запуска запросов. 6 | 7 | В этой задаче вам предстоит написать запрос к базе данных простейшей системы проведения соревнований по программированию. Вы прямо сейчас участвуете в подобном соревновании. Время почувствовать себя в роли разработчика системы для проведения таких соревнований! 8 | 9 | Напишите запрос к базе данных, который возвращает всех пользователей вместе с некоторой дополнительной информацией: 10 | 11 | * количеством соревнований, в которых он принял участие и решил там хотя бы одну задачу, соответствующую колонку в выводе следует назвать solved_at_least_one_contest_count, 12 | * количеством соревнований, в которых он принял участие (то есть сделал хотя бы одну попытку решения), соответствующую колонку в выводе следует назвать take_part_contest_count. 13 | Строки в выводе сортируйте в первую очередь по невозрастанию solved_at_least_one_contest_count, затем по невозрастанию take_part_contest_count, затем по возрастанию id. 14 | 15 | Внимательно ознакомьтесь с примерами вывода. Ваш запрос должен иметь в точности такой же вывод на примерах. 16 | 17 | Схема базы данных содержит четыре таблицы: 18 | 19 | * users — пользователи системы (описываются двумя полями: id и name), 20 | * contests — контесты в системе (описываются двумя полями: id и name), 21 | * problems — задачи в системе, каждая задача принадлежит одному контесту (описываются тремя полями: id, contest_id и code, где code — это кодовое короткое название задачи), 22 | * submissions — отосланные попытки решения задач, каждая попытка принадлежит одной задаче и одному пользователю (описываются 5 полями: id, user_id, problem_id, success и submitted_at, где success — это булевское значение была ли попытка успешной и submitted_at — дата-время, когда попытка была совершена). 23 | Таким образом, contests и problems находятся в отношении «один ко многим», submissions и users находятся в отношении «многие к одному», submissions и problems находятся в отношении «многие к одному». 24 | 25 | Изучите входные данные примера, чтобы подробно ознакомиться со схемой базы данных. Диаграмма ниже иллюстрирует схему базы данных. 26 | 27 | ![img.png](img.png) 28 | 29 | #### Входные данные 30 | Входными данными в этой задаче является дамп базы данных. Вам он может быть полезен для ознакомления с состоянием базы данных для конкретного теста. В качестве решения вы должны отправить один SQL-запрос. 31 | 32 | #### Выходные данные 33 | Ваш SQL-запрос должен вывести всех пользователей вместе с дополнительными колонками, как написано выше. В точности следуйте требованиям к именованию дополнительных колонок и порядку сортировки. 34 | 35 | Внимательно ознакомьтесь с примерами вывода. Ваш запрос должен иметь в точности такой же вывод на примерах. 36 | 37 | ### Пример 38 | #### Входные данные: 39 | ```sql 40 | create table users ( 41 | id bigint primary key, 42 | name varchar not null 43 | ); 44 | 45 | create table contests ( 46 | id bigint primary key, 47 | name varchar not null 48 | ); 49 | 50 | create table problems ( 51 | id bigint primary key, 52 | contest_id bigint, 53 | code varchar not null, 54 | constraint fk_problems_contest_id foreign key (contest_id) references contests (id) 55 | ); 56 | 57 | create unique index on problems (contest_id, code); 58 | 59 | create table submissions ( 60 | id bigint primary key, 61 | user_id bigint, 62 | problem_id bigint, 63 | success boolean not null, 64 | submitted_at timestamp not null, 65 | constraint fk_submissions_user_id foreign key (user_id) references users (id), 66 | constraint fk_submissions_problem_id foreign key (problem_id) references problems (id) 67 | ); 68 | 69 | insert into users 70 | values (1, 'Marie Curie'), 71 | (2, 'Stephen Hawking'), 72 | (3, 'Ada Lovelace'), 73 | (4, 'Albert Einstein'), 74 | (5, 'Archimedes'); 75 | 76 | insert into contests 77 | values (1, 'Sandbox-Juniors'), 78 | (2, 'Sandbox-Seniors'), 79 | (3, 'Contest-Juniors'), 80 | (4, 'Contest-Seniors'); 81 | 82 | insert into problems 83 | values (1, 1, 'A'), 84 | (2, 2, 'A'), 85 | (3, 3, 'A'), 86 | (4, 3, 'B'), 87 | (5, 4, 'A'), 88 | (6, 4, 'B'); 89 | 90 | insert into submissions 91 | values (1, 2, 2, false, '2023-02-05 11:01:00'), 92 | (2, 2, 2, true, '2023-02-05 11:02:00'), 93 | (3, 2, 6, true, '2023-02-05 11:03:01'), 94 | (4, 2, 1, true, '2023-02-05 11:04:00'), 95 | (5, 2, 1, true, '2023-02-05 11:05:00'), 96 | (6, 3, 6, true, '2023-02-05 11:06:00'), 97 | (17, 1, 6, true, '2023-02-05 11:03:00'), 98 | (8, 1, 2, true, '2023-02-05 11:08:00'), 99 | (9, 1, 1, false, '2023-02-05 11:09:00'), 100 | (10, 3, 1, false, '2023-02-05 11:10:00'), 101 | (11, 5, 5, false, '2023-02-05 11:11:00'), 102 | (13, 2, 6, true, '2023-02-05 11:03:00'), 103 | (14, 3, 6, false, '2023-02-05 11:05:59'), 104 | (15, 1, 6, true, '2023-02-05 11:04:00'); 105 | ``` 106 | 107 | #### Выходные данные: 108 | ```sql 109 | id | name | solved_at_least_one_contest_count | take_part_contest_count 110 | ----+-----------------+-----------------------------------+------------------------- 111 | 2 | Stephen Hawking | 3 | 3 112 | 1 | Marie Curie | 2 | 3 113 | 3 | Ada Lovelace | 1 | 2 114 | 5 | Archimedes | 0 | 1 115 | 4 | Albert Einstein | 0 | 0 116 | (5 rows) 117 | ``` -------------------------------------------------------------------------------- /S3. Таблица результатов (SQL, 30 баллов)/README.md: -------------------------------------------------------------------------------- 1 | # Таблица результатов 2 | 3 | Это необычная задача — вам надо написать SQL-запрос. В качестве решения вы должны отослать один запрос к базе данных, который возвращает требуемые данные. Запрос может содержать произвольное количество подзапросов, других конструкций, быть сколь угодно навороченным, но это должен быть один запрос (в нём не должна встречаться точка с запятой для разделения разных запросов). 4 | 5 | При проверке вашего решения используется PostgreSQL 15.1. В качестве входных данных вам предоставляется дамп состояния базы данных. Обратите внимание, что время работы вашего решения на тесте включает восстановление состояния базы данных из дампа, но это время значительно меньше ограничения по времени. Вы можете использовать сервис http://sqlfiddle.com/ как инструмент для запуска запросов. 6 | 7 | В этой задаче вам предстоит написать запрос к базе данных простейшей системы проведения соревнований по программированию. Вы прямо сейчас участвуете в подобном соревновании. Время почувствовать себя в роли разработчика системы для проведения таких соревнований! 8 | 9 | Напишите запрос к базе данных, который построит таблицу результатов для соревнования с максимальным id. 10 | 11 | Вывод должен включать всех пользователей, кто сделал хотя бы одну попытку в этом соревновании. Вывод должен включать 5 колонок: 12 | 13 | * rank — место пользователя в контесте (пользователи с одинаковыми результатами делят место); 14 | * user_id — id пользователя; 15 | * user_name — name пользователя; 16 | * problem_count — количество решённых в контесте задач (если одна задача решена многократно, то всё-равно учитывается как одна задача); 17 | * latest_successful_submitted_at — время, когда была решена последняя из решённых задач у этого пользователя (если одна задача решена многократно, то задача считается решённой в момент первого решения), иными словами, последний момент времени, когда у пользователя увеличилось количество решённых задач. 18 | Строки следует сортировать по невозрастанию problem_count, затем по неубыванию latest_successful_submitted_at, затем по возрастанию user_id. 19 | 20 | Пользователи, которые решили одинаковое количество задач (имеют равные problem_count) и имеют равные значения latest_successful_submitted_at, должны поделить одно место. Обратите внимание, что если несколько пользователей делят места, то в нумерации мест образуется разрыв. Например, если первое место делят два пользователя, то следующий пользователь должен получить место 3 (то есть последовательность мест имеет вид: 1,1,3). 21 | 22 | Внимательно ознакомьтесь с примерами вывода. Ваш запрос должен иметь в точности такой же вывод на примерах. 23 | 24 | * users — пользователи системы (описываются двумя полями: id и name), 25 | * contests — контесты в системе (описываются двумя полями: id и name), 26 | * problems — задачи в системе, каждая задача принадлежит одному контесту (описываются тремя полями: id, contest_id и code, где code — это кодовое короткое название задачи), 27 | * submissions — отосланные попытки решения задач, каждая попытка принадлежит одной задаче и одному пользователю (описываются 5 полями: id, user_id, problem_id, success и submitted_at, где success — это булевское значение была ли попытка успешной и submitted_at — дата-время, когда попытка была совершена). 28 | 29 | Таким образом, contests и problems находятся в отношении «один ко многим», submissions и users находятся в отношении «многие к одному», submissions и problems находятся в отношении «многие к одному». 30 | 31 | Изучите входные данные примера, чтобы подробно ознакомиться со схемой базы данных. Диаграмма ниже иллюстрирует схему базы данных. 32 | 33 | ![img.png](img.png) 34 | 35 | #### Входные данные 36 | Входными данными в этой задаче является дамп базы данных. Вам он может быть полезен для ознакомления с состоянием базы данных для конкретного теста. В качестве решения вы должны отправить один SQL-запрос. 37 | 38 | #### Выходные данные 39 | Ваш SQL-запрос должен вывести результаты соревнования с максимальным id в требуемом формате. 40 | 41 | Внимательно ознакомьтесь с примерами вывода. Ваш запрос должен иметь в точности такой же вывод на примерах. 42 | 43 | ### Пример 44 | #### Входные данные: 45 | ```sql 46 | create table users ( 47 | id bigint primary key, 48 | name varchar not null 49 | ); 50 | 51 | create table contests ( 52 | id bigint primary key, 53 | name varchar not null 54 | ); 55 | 56 | create table problems ( 57 | id bigint primary key, 58 | contest_id bigint, 59 | code varchar not null, 60 | constraint fk_problems_contest_id foreign key (contest_id) references contests (id) 61 | ); 62 | 63 | create unique index on problems (contest_id, code); 64 | 65 | create table submissions ( 66 | id bigint primary key, 67 | user_id bigint, 68 | problem_id bigint, 69 | success boolean not null, 70 | submitted_at timestamp not null, 71 | constraint fk_submissions_user_id foreign key (user_id) references users (id), 72 | constraint fk_submissions_problem_id foreign key (problem_id) references problems (id) 73 | ); 74 | 75 | insert into users 76 | values (1, 'Marie Curie'), 77 | (2, 'Stephen Hawking'), 78 | (3, 'Ada Lovelace'), 79 | (4, 'Albert Einstein'), 80 | (5, 'Archimedes'); 81 | 82 | insert into contests 83 | values (1, 'Sandbox-Juniors'), 84 | (2, 'Sandbox-Seniors'), 85 | (3, 'Contest-Juniors'), 86 | (4, 'Contest-Seniors'); 87 | 88 | insert into problems 89 | values (1, 1, 'A'), 90 | (2, 2, 'A'), 91 | (3, 3, 'A'), 92 | (4, 3, 'B'), 93 | (5, 4, 'A'), 94 | (6, 4, 'B'); 95 | 96 | insert into submissions 97 | values (1, 2, 2, false, '2023-02-05 11:01:00'), 98 | (2, 2, 2, true, '2023-02-05 11:02:00'), 99 | (3, 2, 6, true, '2023-02-05 11:03:01'), 100 | (4, 2, 1, true, '2023-02-05 11:04:00'), 101 | (5, 2, 1, true, '2023-02-05 11:05:00'), 102 | (6, 3, 6, true, '2023-02-05 11:06:00'), 103 | (17, 1, 6, true, '2023-02-05 11:03:00'), 104 | (8, 1, 2, true, '2023-02-05 11:08:00'), 105 | (9, 1, 1, false, '2023-02-05 11:09:00'), 106 | (10, 3, 1, false, '2023-02-05 11:10:00'), 107 | (11, 5, 5, false, '2023-02-05 11:11:00'), 108 | (13, 2, 6, true, '2023-02-05 11:03:00'), 109 | (14, 3, 6, false, '2023-02-05 11:05:59'), 110 | (15, 1, 6, true, '2023-02-05 11:04:00'); 111 | ``` 112 | 113 | #### Выходные данные: 114 | ```sql 115 | rank | user_id | user_name | problem_count | latest_successful_submitted_at 116 | ------+---------+-----------------+---------------+-------------------------------- 117 | 1 | 1 | Marie Curie | 1 | 2023-02-05 11:03:00 118 | 1 | 2 | Stephen Hawking | 1 | 2023-02-05 11:03:00 119 | 3 | 3 | Ada Lovelace | 1 | 2023-02-05 11:06:00 120 | 4 | 5 | Archimedes | 0 | 121 | (4 rows) 122 | ``` --------------------------------------------------------------------------------