Compare commits

...

51 Commits

Author SHA1 Message Date
me
238f8048e0 add notes for lecture 2
Some checks failed
Fast Reverse Tests / test (push) Successful in 23s
Reverse Tests / test (push) Successful in 8s
Sum Tests / test (push) Successful in 9s
Word Stat Tests / test (push) Successful in 7s
Word Stat++ Tests / test (push) Failing after 12s
2026-02-02 21:51:52 +05:00
me
231a37be9e add notes for lecture 2
Some checks failed
Fast Reverse Tests / test (push) Successful in 47s
Reverse Tests / test (push) Successful in 9s
Sum Tests / test (push) Successful in 9s
Word Stat Tests / test (push) Has been cancelled
Word Stat++ Tests / test (push) Has been cancelled
2026-02-02 21:50:41 +05:00
me
3678af68c0 add solutions for hw6:3233
Some checks failed
Fast Reverse Tests / test (push) Successful in 24s
Reverse Tests / test (push) Successful in 8s
Sum Tests / test (push) Successful in 8s
Word Stat Tests / test (push) Successful in 7s
Word Stat++ Tests / test (push) Failing after 10s
2026-02-02 14:31:39 +03:00
me
d8154da7a9 add solution for hw6:3233
Some checks failed
Fast Reverse Tests / test (push) Failing after 4s
Reverse Tests / test (push) Failing after 4s
Sum Tests / test (push) Failing after 4s
Word Stat Tests / test (push) Failing after 4s
Word Stat++ Tests / test (push) Failing after 4s
2026-02-02 14:27:24 +03:00
me
ddba0fc8b5 add solutions for hw6:Base
Some checks failed
Fast Reverse Tests / test (push) Successful in 24s
Reverse Tests / test (push) Successful in 7s
Sum Tests / test (push) Successful in 7s
Word Stat Tests / test (push) Successful in 7s
Word Stat++ Tests / test (push) Failing after 11s
2026-02-02 14:32:45 +05:00
me
dec9762ba2 add tests for hw6:Base
All checks were successful
Fast Reverse Tests / test (push) Successful in 21s
Reverse Tests / test (push) Successful in 7s
Sum Tests / test (push) Successful in 7s
Word Stat Tests / test (push) Successful in 7s
Word Stat++ Tests / test (push) Successful in 12s
2026-02-02 13:27:07 +05:00
me
380611c4df add solutions for hw6:Base
All checks were successful
Fast Reverse Tests / test (push) Successful in 24s
Reverse Tests / test (push) Successful in 8s
Sum Tests / test (push) Successful in 9s
Word Stat Tests / test (push) Successful in 8s
2026-02-02 13:25:10 +05:00
me
1e5c8fab61 add solutions for hw5
All checks were successful
Fast Reverse Tests / test (push) Successful in 24s
Reverse Tests / test (push) Successful in 9s
Sum Tests / test (push) Successful in 10s
Word Stat Tests / test (push) Successful in 9s
2026-02-02 13:03:16 +05:00
me
ab6616b619 add solutions for hw5
All checks were successful
Fast Reverse Tests / test (push) Successful in 26s
Reverse Tests / test (push) Successful in 7s
Sum Tests / test (push) Successful in 7s
Word Stat Tests / test (push) Successful in 7s
2026-02-02 13:02:15 +05:00
me
6f5907b244 add solutions for hw5
Some checks failed
Fast Reverse Tests / test (push) Has been cancelled
Reverse Tests / test (push) Successful in 11s
Sum Tests / test (push) Successful in 10s
Word Stat Tests / test (push) Successful in 9s
2026-02-02 12:21:38 +05:00
me
304f238a8a add tests for hw5
Some checks failed
Fast Reverse Tests / test (push) Failing after 35s
Reverse Tests / test (push) Successful in 9s
Sum Tests / test (push) Successful in 7s
Word Stat Tests / test (push) Successful in 8s
2026-02-02 12:06:48 +05:00
me
b3dd5ae4c7 add solution for hw4:4749
All checks were successful
Fast Reverse Tests / test (push) Successful in 14s
Reverse Tests / test (push) Successful in 9s
Sum Tests / test (push) Successful in 8s
Word Stat Tests / test (push) Successful in 8s
2026-02-02 12:02:40 +05:00
me
29c361725e add solution for hw4:3839
Some checks failed
Fast Reverse Tests / test (push) Successful in 15s
Reverse Tests / test (push) Successful in 9s
Sum Tests / test (push) Successful in 9s
Word Stat Tests / test (push) Failing after 8s
2026-02-02 11:59:24 +05:00
me
868a206eb1 add solution for hw4:3637
Some checks failed
Fast Reverse Tests / test (push) Successful in 15s
Reverse Tests / test (push) Successful in 9s
Sum Tests / test (push) Successful in 10s
Word Stat Tests / test (push) Failing after 7s
2026-02-02 11:50:52 +05:00
me
21d9d2c105 add solution for hw4:3637
Some checks failed
Fast Reverse Tests / test (push) Successful in 16s
Reverse Tests / test (push) Successful in 7s
Sum Tests / test (push) Successful in 9s
Word Stat Tests / test (push) Failing after 7s
2026-02-02 11:47:58 +05:00
me
5ef52d793b add notes for lecture 1
Some checks failed
Fast Reverse Tests / test (push) Successful in 37s
Reverse Tests / test (push) Successful in 9s
Sum Tests / test (push) Successful in 10s
Word Stat Tests / test (push) Failing after 7s
2026-02-02 10:40:50 +05:00
me
5945b021f2 add solution for hw4:3435
Some checks failed
Fast Reverse Tests / test (push) Successful in 11s
Reverse Tests / test (push) Successful in 8s
Sum Tests / test (push) Successful in 7s
Word Stat Tests / test (push) Failing after 5s
2026-01-31 15:54:01 +05:00
me
e197eb2690 add solution for hw4:3435
Some checks failed
Fast Reverse Tests / test (push) Successful in 13s
Reverse Tests / test (push) Successful in 8s
Sum Tests / test (push) Successful in 7s
Word Stat Tests / test (push) Failing after 4s
2026-01-31 15:49:07 +05:00
me
7b3f22216f add solution for hw4:3435
Some checks failed
Fast Reverse Tests / test (push) Successful in 12s
Reverse Tests / test (push) Successful in 7s
Sum Tests / test (push) Successful in 7s
Word Stat Tests / test (push) Failing after 5s
2026-01-31 15:47:25 +05:00
me
6c42ebab03 add solution for hw4:3435
Some checks failed
Fast Reverse Tests / test (push) Successful in 12s
Reverse Tests / test (push) Successful in 7s
Sum Tests / test (push) Successful in 7s
Word Stat Tests / test (push) Failing after 5s
2026-01-31 15:43:42 +05:00
me
8173cf4dab add solution for hw4:3435
Some checks failed
Fast Reverse Tests / test (push) Successful in 12s
Reverse Tests / test (push) Successful in 6s
Sum Tests / test (push) Successful in 7s
Word Stat Tests / test (push) Failing after 5s
2026-01-31 15:39:59 +05:00
me
971119da82 add solution for hw4:3435
Some checks failed
Fast Reverse Tests / test (push) Failing after 4s
Reverse Tests / test (push) Failing after 4s
Sum Tests / test (push) Failing after 4s
Word Stat Tests / test (push) Failing after 4s
2026-01-31 15:37:58 +05:00
me
ab51c1a3dc add solution for hw4:3233
Some checks failed
Fast Reverse Tests / test (push) Successful in 13s
Reverse Tests / test (push) Successful in 7s
Sum Tests / test (push) Successful in 8s
Word Stat Tests / test (push) Failing after 5s
2026-01-31 15:06:18 +05:00
me
826ab5a4d9 update README.md
Some checks failed
Fast Reverse Tests / test (push) Successful in 13s
Reverse Tests / test (push) Successful in 7s
Sum Tests / test (push) Successful in 7s
Word Stat Tests / test (push) Failing after 5s
2026-01-31 14:39:57 +05:00
me
03dabc9dee add Base solution for hw4
All checks were successful
Fast Reverse Tests / test (push) Successful in 14s
Reverse Tests / test (push) Successful in 7s
Sum Tests / test (push) Successful in 7s
Word Stat Tests / test (push) Successful in 5s
2026-01-31 14:30:54 +05:00
me
de97058fe9 add tests for hw4
Some checks failed
Fast Reverse Tests / test (push) Failing after 16s
Reverse Tests / test (push) Successful in 8s
Sum Tests / test (push) Successful in 7s
Word Stat Tests / test (push) Failing after 4s
2026-01-31 13:26:06 +05:00
me
4807af64d9 upd 2026-01-31 13:25:49 +05:00
me
4be68698dd add solution for hw3:4142 & tests
Some checks failed
Fast Reverse Tests / test (push) Failing after 15s
Reverse Tests / test (push) Successful in 9s
Sum Tests / test (push) Successful in 10s
2026-01-30 23:58:25 +05:00
me
4488a76813 update runners
Some checks failed
Fast Reverse Tests / test (push) Failing after 15s
Reverse Tests / test (push) Successful in 8s
Sum Tests / test (push) Successful in 9s
2026-01-30 23:19:37 +05:00
me
02aefc2a89 add solution for hw3:3839 & tests
Some checks failed
Fast Reverse Tests / test (push) Failing after 15s
Reverse Tests / test (push) Successful in 8s
Sum Tests / test (push) Successful in 8s
2026-01-30 23:17:36 +05:00
me
8b7b78ee4d add solution for hw3:3637 & tests in runner
Some checks failed
Fast Reverse Tests / test (push) Failing after 16s
Reverse Tests / test (push) Successful in 5s
Sum Tests / test (push) Successful in 8s
2026-01-30 23:04:13 +05:00
me
26ce449302 add Base tests for hw5
Some checks failed
Fast Reverse Tests / test (push) Failing after 26s
Reverse Tests / test (push) Successful in 6s
Sum Tests / test (push) Successful in 8s
2026-01-30 16:39:36 +05:00
me
04af91b4a7 update tests
All checks were successful
Reverse Tests / test (push) Successful in 6s
Sum Tests / test (push) Successful in 7s
2026-01-30 16:36:08 +05:00
me
8414aeb924 update README.md
All checks were successful
Reverse Tests / test (push) Successful in 6s
Sum Tests / test (push) Successful in 10s
2026-01-30 15:52:51 +05:00
me
f655cc480c add fastscanner
All checks were successful
Reverse Tests / test (push) Successful in 5s
Sum Tests / test (push) Successful in 8s
2026-01-30 15:50:09 +05:00
me
d1eac5b8b5 add Base solution for hw3
All checks were successful
Reverse Tests / test (push) Successful in 6s
Sum Tests / test (push) Successful in 9s
2026-01-30 14:32:03 +05:00
me
8a5c2a28c6 add Base tests for hw3
Some checks failed
Reverse Tests / test (push) Failing after 5s
Sum Tests / test (push) Successful in 7s
2026-01-30 13:43:25 +05:00
me
c411372ec7 add Base tests for hw3 2026-01-30 13:42:43 +05:00
me
f211ef6073 add hw3 reverse to README.md
All checks were successful
Sum Tests / test (push) Successful in 7s
2026-01-30 13:40:55 +05:00
me
3bc865b923 add badge for tests
All checks were successful
Sum Tests / test (push) Successful in 9s
2026-01-30 13:36:57 +05:00
me
0622e7e215 add badge for tests
All checks were successful
Sum Tests / test (push) Successful in 8s
2026-01-30 13:34:31 +05:00
me
ade99c8153 testing comments in readme
All checks were successful
Sum Tests / test (push) Successful in 8s
2026-01-30 13:31:26 +05:00
me
46d9e93e13 deletion
All checks were successful
Sum Tests / test (push) Successful in 9s
2026-01-30 13:26:18 +05:00
me
ffb7d736ca Add CI for Sum tests
Some checks failed
Sum Tests / test (push) Failing after 1s
2026-01-30 13:22:08 +05:00
me
8bb1a8ac0a Add CI for Sum tests
Some checks failed
Sum Tests / test (push) Failing after 14s
2026-01-30 13:19:10 +05:00
me
cb731abee6 Add CI for Sum tests
Some checks failed
Sum Tests / test (push) Failing after 43s
2026-01-30 13:11:59 +05:00
me
3b830c7dd6 Add CI for Sum tests 2026-01-30 13:08:57 +05:00
me
5fe95f078f update .gitignore 2026-01-30 12:49:32 +05:00
me
f3c258a2fc add all variants for 'Sum' task (hw2) 2026-01-30 12:41:01 +05:00
me
6e604740a5 upd 2026-01-29 22:10:58 +03:00
me
d407f92497 upd 2026-01-29 22:09:45 +03:00
39 changed files with 3264 additions and 71 deletions

View File

@@ -0,0 +1,22 @@
name: Fast Reverse Tests
on:
push:
pull_request:
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Compile Java
run: |
mkdir -p out
javac -d out $(find java -name "*.java")
- name: Run Fast Reverse tests
run: |
java -ea -cp out reverse.FastReverseTest Base 3233

View File

@@ -0,0 +1,22 @@
name: Reverse Tests
on:
push:
pull_request:
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Compile Java
run: |
mkdir -p out
javac -d out $(find java -name "*.java")
- name: Run Reverse tests
run: |
java -ea -cp out reverse.ReverseTest Base 3233 3435 3637 3839 4142

22
.gitea/workflows/sum.yml Normal file
View File

@@ -0,0 +1,22 @@
name: Sum Tests
on:
push:
pull_request:
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Compile Java
run: |
mkdir -p out
javac -d out $(find java -name "*.java")
- name: Run Sum tests
run: |
java -ea -cp out sum.SumTest Base 3233 3435 3637 3839 4142 4749

View File

@@ -0,0 +1,22 @@
name: Word Stat Tests
on:
push:
pull_request:
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Compile Java
run: |
mkdir -p out
javac -d out $(find java -name "*.java")
- name: Run Word Stat tests
run: |
java -ea -cp out wordStat.WordStatTest Base 3233 3435 3637 3839 4142 4749

22
.gitea/workflows/wspp.yml Normal file
View File

@@ -0,0 +1,22 @@
name: Word Stat++ Tests
on:
push:
pull_request:
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Compile Java
run: |
mkdir -p out
javac -d out $(find java -name "*.java")
- name: Run Word Stat++ tests
run: |
java -ea -cp out wspp.WsppTest Base 3233

4
.gitignore vendored
View File

@@ -1,3 +1,5 @@
*.xml *.xml
java/out/* java/out/
*.iml *.iml
*.idea*
*out*

View File

@@ -7,7 +7,6 @@ include_toc: true
[Условия домашних заданий](https://www.kgeorgiy.info/courses/prog-intro/homeworks.html) [Условия домашних заданий](https://www.kgeorgiy.info/courses/prog-intro/homeworks.html)
## Домашнее задание 14. Обработка ошибок ## Домашнее задание 14. Обработка ошибок
Модификации Модификации
@@ -276,10 +275,11 @@ include_toc: true
* Класс должен иметь имя `WsppPosition` * Класс должен иметь имя `WsppPosition`
## Домашнее задание 5. Свой сканнер ## Домашнее задание 5. Свой сканнер [![Fast Reverse Tests](https://git.fymio.us/me/prog-intro-2025/actions/workflows/fast-reverse.yml/badge.svg)](https://git.fymio.us/me/prog-intro-2025/actions)
Модификации Модификации
* *Base* * *Base*
* Исходный код тестов: [FastReverseTest.java](java/reverse/FastReverseTest.java) * Исходный код тестов: [FastReverseTest.java](java/reverse/FastReverseTest.java)
* Откомпилированные тесты: [FastReverseTest.jar](artifacts/FastReverseTest.jar) * Откомпилированные тесты: [FastReverseTest.jar](artifacts/FastReverseTest.jar)
* Аргументы командной строки: модификации * Аргументы командной строки: модификации
@@ -311,7 +311,7 @@ include_toc: true
и [закрывающими](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Character.html#END_PUNCTUATION) и [закрывающими](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Character.html#END_PUNCTUATION)
скобками скобками
* Класс должен иметь имя `ReverseRotate` * Класс должен иметь имя `ReverseRotate`
* *3233* * *3233*
* Выведите (в реверсивном порядке) только числа, * Выведите (в реверсивном порядке) только числа,
у которых сумма номеров строки и столбца четная у которых сумма номеров строки и столбца четная
* Числа дополнительно могут разделяться * Числа дополнительно могут разделяться
@@ -337,10 +337,11 @@ include_toc: true
* Класс должен иметь имя `ReverseSum` * Класс должен иметь имя `ReverseSum`
## Домашнее задание 4. Подсчет слов ## Домашнее задание 4. Подсчет слов [![Word Stat](https://git.fymio.us/me/prog-intro-2025/actions/workflows/word-stat.yml/badge.svg)](https://git.fymio.us/me/prog-intro-2025/actions)
Модификации Модификации
* *Base* * *Base*
* Класс должен иметь имя `WordStat` * Класс должен иметь имя `WordStat`
* Исходный код тестов: * Исходный код тестов:
[WordStatTest.java](java/wordStat/WordStatTest.java), [WordStatTest.java](java/wordStat/WordStatTest.java),
@@ -348,10 +349,10 @@ include_toc: true
[WordStatChecker.java](java/wordStat/WordStatChecker.java) [WordStatChecker.java](java/wordStat/WordStatChecker.java)
* Откомпилированные тесты: [WordStatTest.jar](artifacts/WordStatTest.jar) * Откомпилированные тесты: [WordStatTest.jar](artifacts/WordStatTest.jar)
* Аргументы командной строки: модификации * Аргументы командной строки: модификации
* *FastSort* * *FastSort*
* Пусть _n_ число слов во входном файле, * Пусть _n_ число слов во входном файле,
тогда программа должна работать за O(_n_ log _n_). тогда программа должна работать за O(_n_ log _n_).
* *3637* * *3637*
* Назовём _серединой слова_ подстроку, полученную удалением * Назовём _серединой слова_ подстроку, полученную удалением
первых и последних 3 символов слова. первых и последних 3 символов слова.
Слова длины меньшей 7 игнорируются. Слова длины меньшей 7 игнорируются.
@@ -359,7 +360,7 @@ include_toc: true
середины слов, встречающихся во входном файле, середины слов, встречающихся во входном файле,
упорядоченные по возрастанию длины (при равенстве по первому вхождению). упорядоченные по возрастанию длины (при равенстве по первому вхождению).
* Класс должен иметь имя `WordStatLengthMiddle` * Класс должен иметь имя `WordStatLengthMiddle`
* *3839* * *3839*
* Назовём _аффиксами слова_ * Назовём _аффиксами слова_
его префикс и суффикс длины `n / 2`, где `n` — длина слова. его префикс и суффикс длины `n / 2`, где `n` — длина слова.
Слова длины один игнорируются. Слова длины один игнорируются.
@@ -367,7 +368,7 @@ include_toc: true
аффиксы слов, встречающихся во входном файле, аффиксы слов, встречающихся во входном файле,
упорядоченные по возрастанию длины (при равенстве по первому вхождению). упорядоченные по возрастанию длины (при равенстве по первому вхождению).
* Класс должен иметь имя `WordStatLengthAffix` * Класс должен иметь имя `WordStatLengthAffix`
* *3435* * *3435*
* Назовём _суффиксом слова_ подстроку, * Назовём _суффиксом слова_ подстроку,
состоящую из `n / 2` последних символов слова, где `n` — длина слова. состоящую из `n / 2` последних символов слова, где `n` — длина слова.
Слова длины один игнорируются. Слова длины один игнорируются.
@@ -375,12 +376,12 @@ include_toc: true
суффиксы слов, встречающихся во входном файле, суффиксы слов, встречающихся во входном файле,
упорядоченные по возрастанию длины (при равенстве по первому вхождению). упорядоченные по возрастанию длины (при равенстве по первому вхождению).
* Класс должен иметь имя `WordStatLengthSuffix` * Класс должен иметь имя `WordStatLengthSuffix`
* *3233* * *3233*
* Выходной файл должен содержать все различные * Выходной файл должен содержать все различные
слова встречающиеся во входном файле, слова встречающиеся во входном файле,
упорядоченные по возрастанию длины (при равенстве по первому вхождению). упорядоченные по возрастанию длины (при равенстве по первому вхождению).
* Класс должен иметь имя `WordStatLength` * Класс должен иметь имя `WordStatLength`
* *4142* * *4142*
* Назовём _серединой слова_ подстроку, полученную удалением * Назовём _серединой слова_ подстроку, полученную удалением
первых и последних 3 символов слова. первых и последних 3 символов слова.
Слова длины меньшей 7 игнорируются. Слова длины меньшей 7 игнорируются.
@@ -388,7 +389,7 @@ include_toc: true
середины слов, встречающихся во входном файле, середины слов, встречающихся во входном файле,
упорядоченные по возрастанию длины (при равенстве по первому вхождению). упорядоченные по возрастанию длины (при равенстве по первому вхождению).
* Класс должен иметь имя `WordStatLengthMiddle` * Класс должен иметь имя `WordStatLengthMiddle`
* *4749* * *4749*
* Назовём _префиксом слова_ подстроку, * Назовём _префиксом слова_ подстроку,
состоящую из `n / 2` первых символов слова, где `n` — длина слова. состоящую из `n / 2` первых символов слова, где `n` — длина слова.
Слова длины один игнорируются. Слова длины один игнорируются.
@@ -397,24 +398,24 @@ include_toc: true
упорядоченные по возрастанию длины (при равенстве по первому вхождению). упорядоченные по возрастанию длины (при равенстве по первому вхождению).
* Класс должен иметь имя `WordStatLengthPrefix` * Класс должен иметь имя `WordStatLengthPrefix`
## Домашнее задание 3. Реверс [![Reverse Tests](https://git.fymio.us/me/prog-intro-2025/actions/workflows/reverse.yml/badge.svg)](https://git.fymio.us/me/prog-intro-2025/actions)
## Домашнее задание 3. Реверс
Модификации Модификации
* *Base* * *Base*
* Исходный код тестов: * Исходный код тестов:
[ReverseTest.java](java/reverse/ReverseTest.java), [ReverseTest.java](java/reverse/ReverseTest.java),
[ReverseTester.java](java/reverse/ReverseTester.java) [ReverseTester.java](java/reverse/ReverseTester.java)
* Откомпилированные тесты: [ReverseTest.jar](artifacts/ReverseTest.jar) * Откомпилированные тесты: [ReverseTest.jar](artifacts/ReverseTest.jar)
* Аргументы командной строки: модификации * Аргументы командной строки: модификации
* *Memory* * *Memory*
* Программа должна сначала считывать все данные в память, * Программа должна сначала считывать все данные в память,
и только потом обрабатывать их. и только потом обрабатывать их.
* Пусть _M_ объём памяти, необходимый для сохранения ввода * Пусть _M_ объём памяти, необходимый для сохранения ввода
в двумерном массиве `int` минимального размера. в двумерном массиве `int` минимального размера.
Ваша программа должна использовать не более 4_M_ + 1024 байт памяти. Ваша программа должна использовать не более 4_M_ + 1024 байт памяти.
* Накладные расходы на запуск вашей программы JVM не учитываются. * Накладные расходы на запуск вашей программы JVM не учитываются.
* *3637* * *3637*
* Рассмотрим входные данные как (не полностью определенную) матрицу, * Рассмотрим входные данные как (не полностью определенную) матрицу,
вместо каждого числа выведите максимум из чисел, вместо каждого числа выведите максимум из чисел,
находящихся в его столбце в последующих строках, и его самого находящихся в его столбце в последующих строках, и его самого
@@ -424,7 +425,7 @@ include_toc: true
вместо каждого числа выведите максимум из чисел вместо каждого числа выведите максимум из чисел
текущее число — правый нижний угол матрицы текущее число — правый нижний угол матрицы
* Класс должен иметь имя `ReverseMax` * Класс должен иметь имя `ReverseMax`
* *3435* * *3435*
* Рассмотрим входные данные как (не полностью определенную) матрицу, * Рассмотрим входные данные как (не полностью определенную) матрицу,
выведите ее поворот по часовой стрелке, например для ввода выведите ее поворот по часовой стрелке, например для ввода
``` ```
@@ -440,38 +441,37 @@ include_toc: true
4 4
``` ```
* Класс должен иметь имя `ReverseRotate` * Класс должен иметь имя `ReverseRotate`
* *3233* * *3233*
* Выведите (в реверсивном порядке) только числа, * Выведите (в реверсивном порядке) только числа,
у которых сумма номеров строки и столбца четная у которых сумма номеров строки и столбца четная
* Класс должен иметь имя `ReverseEven` * Класс должен иметь имя `ReverseEven`
* *4142* * *4142*
* Рассмотрим входные данные как (не полностью определенную) матрицу, * Рассмотрим входные данные как (не полностью определенную) матрицу,
вместо каждого числа выведите среднее из чисел в его столбце и строке вместо каждого числа выведите среднее из чисел в его столбце и строке
* Класс должен иметь имя `ReverseAvg` * Класс должен иметь имя `ReverseAvg`
* *4749* * *4749*
* Рассмотрим входные данные как (не полностью определенную) матрицу, * Рассмотрим входные данные как (не полностью определенную) матрицу,
вместо каждого числа выведите сумму чиселв его столбце и строке вместо каждого числа выведите сумму чиселв его столбце и строке
* Класс должен иметь имя `ReverseSum` * Класс должен иметь имя `ReverseSum`
## Домашнее задание 2. Сумма чисел [![Sum Tests](https://git.fymio.us/me/prog-intro-2025/actions/workflows/sum.yml/badge.svg)](https://git.fymio.us/me/prog-intro-2025/actions)
## Домашнее задание 2. Сумма чисел
Модификации Модификации
* *Base* * *Base*
* Исходный код тестов: * Исходный код тестов:
[SumTest.java](java/sum/SumTest.java), [SumTest.java](java/sum/SumTest.java),
[SumTester.java](java/sum/SumTester.java), [SumTester.java](java/sum/SumTester.java),
[базовые классы](java/base/) [базовые классы](java/base/)
* Откомпилированные тесты: [SumTest.jar](artifacts/SumTest.jar) * Откомпилированные тесты: [SumTest.jar](artifacts/SumTest.jar)
* Аргументы командной строки: модификации * Аргументы командной строки: модификации
* *3637* * *3637*
* Входные данные являются 64-битными числами в формате с плавающей точкой * Входные данные являются 64-битными числами в формате с плавающей точкой
* На вход подаются десятичные и шестнадцатеричные числа * На вход подаются десятичные и шестнадцатеричные числа
* Шестнадцатеричные числа имеют префикс `0x`, * Шестнадцатеричные числа имеют префикс `0x`,
например `0xa.bp2` равно (10+11/16)·4 равно 42.75 например `0xa.bp2` равно (10+11/16)·4 равно 42.75
* Ввод регистронезависим * Ввод регистронезависим
* Класс должен иметь имя `SumDoubleHex` * Класс должен иметь имя `SumDoubleHex`
* *3839* * *3839*
* Входные данные помещаются в тип [BigDecimal](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/math/BigDecimal.html) * Входные данные помещаются в тип [BigDecimal](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/math/BigDecimal.html)
* На вход подаются десятичные и шестнадцатеричные числа * На вход подаются десятичные и шестнадцатеричные числа
* Шестнадцатеричные числа имеют префикс `0x`, * Шестнадцатеричные числа имеют префикс `0x`,
@@ -479,22 +479,23 @@ include_toc: true
(мантисса и порядок являются целыми числами) (мантисса и порядок являются целыми числами)
* Ввод регистронезависим * Ввод регистронезависим
* Класс должен иметь имя `SumBigDecimalHex` * Класс должен иметь имя `SumBigDecimalHex`
* *3435* * *3435*
* На вход подаются десятичные и шестнадцатеричные числа * На вход подаются десятичные и шестнадцатеричные числа
* Шестнадцатеричные числа имеют префикс `0x` * Шестнадцатеричные числа имеют префикс `0x`
* Ввод регистронезависим * Ввод регистронезависим
* Класс должен иметь имя `SumHex` * Класс должен иметь имя `SumHex`
* *3233* * *3233*
* Входные данные являются 64-битными числами в формате с плавающей точкой * Входные данные являются 64-битными числами в формате с плавающей точкой
* Класс должен иметь имя `SumDouble` * Класс должен иметь имя `SumDouble`
* *4142* * *4142*
* Входные данные помещаются в тип [BigInteger](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/math/BigInteger.html) * Входные данные помещаются в тип [BigInteger](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/math/BigInteger.html)
* восьмеричные числа имеют суффикс `o` * восьмеричные числа имеют суффикс `o`
* Класс должен иметь имя `SumBigIntegerOctal` * Класс должен иметь имя `SumBigIntegerOctal`
* *4749* * *4749*
* Входные данные являются 64-битными целыми числами * Входные данные являются 64-битными целыми числами
* восьмеричные числа имеют суффикс `o` * восьмеричные числа имеют суффикс `o`
* Класс должен иметь имя `SumLongOctal` * Класс должен иметь имя `SumLongOctal`
<!--
Для того, чтобы протестировать программу: Для того, чтобы протестировать программу:
@@ -548,3 +549,5 @@ include_toc: true
1. Запустите и проверьте, что вы получили ту же ссылку, что и в предыдущем пункте 1. Запустите и проверьте, что вы получили ту же ссылку, что и в предыдущем пункте
1. Сдайте скрипт преподавателю 1. Сдайте скрипт преподавателю
1. Вы можете получить больше плюсиков, модифицируя код `RunMe.java` 1. Вы можете получить больше плюсиков, модифицируя код `RunMe.java`
-->

10
java/.idea/.gitignore generated vendored
View File

@@ -1,10 +0,0 @@
# Default ignored files
/shelf/
/workspace.xml
# Ignored default folder with query files
/queries/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
# Editor-based HTTP Client requests
/httpRequests/

View File

@@ -0,0 +1,54 @@
package reverse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class FastScanner {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
int pos = 0;
boolean hasNextLine() throws IOException {
if (line != null && pos < line.length()) return true;
line = br.readLine();
pos = 0;
return line != null;
}
boolean hasNextInt() {
if (line == null) return false;
while (pos < line.length() && (Character.isWhitespace(line.charAt(pos)) ||
Character.getType(line.charAt(pos)) == Character.START_PUNCTUATION ||
Character.getType(line.charAt(pos)) == Character.END_PUNCTUATION)) {
pos++;
}
return pos < line.length() && (Character.isDigit(line.charAt(pos)) || line.charAt(pos) == '-');
}
int nextInt() {
while (pos < line.length() && (Character.isWhitespace(line.charAt(pos)) ||
Character.getType(line.charAt(pos)) == Character.START_PUNCTUATION ||
Character.getType(line.charAt(pos)) == Character.END_PUNCTUATION)) {
pos++;
}
int start = pos;
boolean negative = line.charAt(pos) == '-';
if (negative) pos++;
while (pos < line.length() && Character.isDigit(line.charAt(pos))) {
pos++;
}
int result = 0;
for (int i = negative ? start + 1 : start; i < pos; i++) {
result = result * 10 + (line.charAt(i) - '0');
}
return negative ? -result : result;
}
void nextLine() {
pos = line.length();
}
}

43
java/reverse/Reverse.java Normal file
View File

@@ -0,0 +1,43 @@
package reverse;
import java.io.*;
import java.util.Arrays;
public class Reverse {
public static void main(String[] args) throws IOException {
FastScanner sc = new FastScanner();
int[][] lines = new int[8][];
int linesCount = 0;
while (sc.hasNextLine()) {
int[] line = new int[8];
int count = 0;
while (sc.hasNextInt()) {
if (count >= line.length) {
line = Arrays.copyOf(line, line.length * 2);
}
line[count++] = sc.nextInt();
}
sc.nextLine();
line = Arrays.copyOf(line, count);
if (linesCount >= lines.length) {
lines = Arrays.copyOf(lines, lines.length * 2);
}
lines[linesCount++] = line;
}
PrintWriter out = new PrintWriter(System.out);
for (int i = linesCount - 1; i >= 0; i--) {
int[] line = lines[i];
for (int j = line.length - 1; j >= 0; j--) {
if (j < line.length - 1) out.print(" ");
out.print(line[j]);
}
out.println();
}
out.flush();
}
}

View File

@@ -0,0 +1,67 @@
package reverse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
public class ReverseAvg {
public static void main(String[] args) throws IOException {
FastScanner sc = new FastScanner();
int[][] lines = new int[8][];
int linesCount = 0;
while (sc.hasNextLine()) {
int[] line = new int[8];
int count = 0;
while (sc.hasNextInt()) {
if (count >= line.length) {
line = Arrays.copyOf(line, line.length * 2);
}
line[count++] = sc.nextInt();
}
sc.nextLine();
line = Arrays.copyOf(line, count);
if (linesCount >= lines.length) {
lines = Arrays.copyOf(lines, lines.length * 2);
}
lines[linesCount++] = line;
}
printResult(linesCount, lines);
}
private static void printResult(int linesCount, int[][] lines) {
PrintWriter out = new PrintWriter(System.out);
for (int i = 0; i < linesCount; i++) {
int[] line = lines[i];
for (int j = 0; j < line.length; j++) {
if (j > 0) out.print(" ");
long sum = 0;
long count = 0;
for (int m = 0; m < lines[i].length; m++) {
sum += lines[i][m];
count++;
}
for (int k = 0; k < linesCount; k++) {
if (k != i && lines[k].length > j) {
sum += lines[k][j];
count++;
}
}
out.print(sum / count);
}
out.println();
}
out.flush();
}
}

View File

@@ -0,0 +1,46 @@
package reverse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
public class ReverseEven {
public static void main(String[] args) throws IOException {
FastScanner sc = new FastScanner();
int[][] lines = new int[8][];
int linesCount = 0;
while (sc.hasNextLine()) {
int[] line = new int[8];
int count = 0;
while (sc.hasNextInt()) {
if (count >= line.length) {
line = Arrays.copyOf(line, line.length * 2);
}
line[count++] = sc.nextInt();
}
sc.nextLine();
line = Arrays.copyOf(line, count);
if (linesCount >= lines.length) {
lines = Arrays.copyOf(lines, lines.length * 2);
}
lines[linesCount++] = line;
}
PrintWriter out = new PrintWriter(System.out);
for (int i = linesCount - 1; i >= 0; i--) {
int[] line = lines[i];
for (int j = line.length - 1; j >= 0; j--) {
if ((i + j) % 2 == 0) {
if (j < line.length - 1) out.print(" ");
out.print(line[j]);
}
}
out.println();
}
out.flush();
}
}

View File

@@ -0,0 +1,63 @@
package reverse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
public class ReverseMax {
public static void main(String[] args) throws IOException {
FastScanner sc = new FastScanner();
int[][] lines = new int[8][];
int linesCount = 0;
while (sc.hasNextLine()) {
int[] line = new int[8];
int count = 0;
while (sc.hasNextInt()) {
if (count >= line.length) {
line = Arrays.copyOf(line, line.length * 2);
}
line[count++] = sc.nextInt();
}
sc.nextLine();
line = Arrays.copyOf(line, count);
if (linesCount >= lines.length) {
lines = Arrays.copyOf(lines, lines.length * 2);
}
lines[linesCount++] = line;
}
PrintWriter out = getPrintWriter(linesCount, lines);
out.flush();
}
private static PrintWriter getPrintWriter(int linesCount, int[][] lines) {
PrintWriter out = new PrintWriter(System.out);
for (int i = 0; i < linesCount; i++) {
int[] line = lines[i];
for (int j = 0; j < line.length; j++) {
if (j > 0) out.print(" ");
int maxValue = lines[i][j];
for (int k = i; k < linesCount; k++) {
for (int m = j; m < lines[k].length; m++) {
if (lines[k][m] > maxValue) {
maxValue = lines[k][m];
}
}
}
out.print(maxValue);
}
out.println();
}
return out;
}
}

View File

@@ -0,0 +1,61 @@
package reverse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
public class ReverseMaxC {
public static void main(String[] args) throws IOException {
FastScanner sc = new FastScanner();
int[][] lines = new int[8][];
int linesCount = 0;
while (sc.hasNextLine()) {
int[] line = new int[8];
int count = 0;
while (sc.hasNextInt()) {
if (count >= line.length) {
line = Arrays.copyOf(line, line.length * 2);
}
line[count++] = sc.nextInt();
}
sc.nextLine();
line = Arrays.copyOf(line, count);
if (linesCount >= lines.length) {
lines = Arrays.copyOf(lines, lines.length * 2);
}
lines[linesCount++] = line;
}
PrintWriter out = getPrintWriter(linesCount, lines);
out.flush();
}
private static PrintWriter getPrintWriter(int linesCount, int[][] lines) {
PrintWriter out = new PrintWriter(System.out);
for (int i = 0; i < linesCount; i++) {
int[] line = lines[i];
for (int j = 0; j < line.length; j++) {
if (j > 0) out.print(" ");
int maxRow = lines[i][j];
for (int k = i + 1; k < linesCount; k++) {
if (lines[k].length > j && lines[k][j] > maxRow) {
maxRow = lines[k][j];
}
}
out.print(maxRow);
}
out.println();
}
return out;
}
}

View File

@@ -0,0 +1,52 @@
package reverse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
public class ReverseRotate {
public static void main(String[] args) throws IOException {
FastScanner sc = new FastScanner();
int[][] lines = new int[8][];
int linesCount = 0;
int maxCols = 0;
while (sc.hasNextLine()) {
int[] line = new int[8];
int count = 0;
while (sc.hasNextInt()) {
if (count >= line.length) {
line = Arrays.copyOf(line, line.length * 2);
}
line[count++] = sc.nextInt();
}
sc.nextLine();
line = Arrays.copyOf(line, count);
if (linesCount >= lines.length) {
lines = Arrays.copyOf(lines, lines.length * 2);
}
lines[linesCount++] = line;
if (count > maxCols) {
maxCols = count;
}
}
PrintWriter out = new PrintWriter(System.out);
for (int j = 0; j < maxCols; j++) {
for (int i = linesCount - 1; i >= 0; i--) {
if (lines[i].length > j) {
out.print(lines[i][j] + " ");
}
}
out.println();
}
out.flush();
}
}

10
java/sum/.idea/.gitignore generated vendored
View File

@@ -1,10 +0,0 @@
# Default ignored files
/shelf/
/workspace.xml
# Ignored default folder with query files
/queries/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
# Editor-based HTTP Client requests
/httpRequests/

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="25" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/sum.iml" filepath="$PROJECT_DIR$/sum.iml" />
</modules>
</component>
</project>

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
</component>
</project>

View File

@@ -1,5 +1,8 @@
package sum; package sum;
/**
* @author Nikita Doschennikov (me@fymio.us)
*/
public class Sum { public class Sum {
public static void main(String[] args) { public static void main(String[] args) {
int res = 0; int res = 0;

View File

@@ -0,0 +1,57 @@
package sum;
import java.math.BigDecimal;
import java.math.BigInteger;
/**
* @author Nikita Doschennikov (me@fymio.us)
*/
public class SumBigDecimalHex {
public static void main(String[] args) {
BigDecimal res = new BigDecimal("0");
for (String arg : args) {
StringBuilder builder = new StringBuilder();
for (char c : arg.toCharArray()) {
if (!Character.isWhitespace(c)) {
builder.append(c);
} else {
res = res.add(compute(builder.toString()));
builder = new StringBuilder();
}
}
res = res.add(compute(builder.toString()));
}
System.out.println(res);
}
static BigDecimal compute(String num) {
BigDecimal res = BigDecimal.ZERO;
if (num == null || num.isEmpty()) {
return res;
} else if (num.startsWith("0x") || num.startsWith("0X")) {
num = num.toLowerCase();
num = num.substring(2);
if (num.contains("s")) {
int sIndex = num.indexOf('s');
String mantissaHex = num.substring(0, sIndex);
String exponentHex = num.substring(sIndex + 1);
BigInteger mantissa = new BigInteger(mantissaHex, 16);
BigInteger exponent = new BigInteger(exponentHex, 16);
res = res.add(new BigDecimal(mantissa).scaleByPowerOfTen(exponent.negate().intValueExact()));
} else {
res = res.add(new BigDecimal(new BigInteger(num, 16)));
}
} else {
res = new BigDecimal(num);
}
return res;
}
}

View File

@@ -0,0 +1,40 @@
package sum;
import java.math.BigInteger;
/**
* @author Nikita Doschennikov (me@fymio.us)
*/
public class SumBigIntegerOctal {
public static void main(String[] args) {
BigInteger res = new BigInteger("0");
for (String arg : args) {
StringBuilder builder = new StringBuilder();
for (char c : arg.toCharArray()) {
if (!Character.isWhitespace(c)) {
builder.append(c);
} else {
res = res.add(compute(builder.toString()));
builder = new StringBuilder();
}
}
res = res.add(compute(builder.toString()));
}
System.out.println(res);
}
static BigInteger compute(String num) {
BigInteger res = new BigInteger("0");
if (num.isEmpty()) {
res = res.add(BigInteger.ZERO);
} else if (num.endsWith("o") || num.endsWith("O")) {
res = res.add(new BigInteger(num.substring(0, num.length() - 1), 8));
} else {
res = res.add(new BigInteger(num));
}
return res;
}
}

23
java/sum/SumDouble.java Normal file
View File

@@ -0,0 +1,23 @@
package sum;
/**
* @author Nikita Doschennikov (me@fymio.us)
*/
public class SumDouble {
public static void main(String[] args) {
double res = 0.0; // 0_0
for (String arg : args) {
StringBuilder builder = new StringBuilder();
for (char c : arg.toCharArray()) {
if (!Character.isWhitespace(c)) {
builder.append(c);
} else {
res += (!builder.toString().isEmpty()) ? Double.parseDouble(builder.toString()) : 0;
builder = new StringBuilder();
}
}
res += (!builder.toString().isEmpty()) ? Double.parseDouble(builder.toString()) : 0;
}
System.out.println(res);
}
}

View File

@@ -0,0 +1,37 @@
package sum;
/**
* @author Nikita Doschennikov (me@fymio.us)
*/
public class SumDoubleHex {
public static void main(String[] args) {
double res = 0;
for (String arg : args) {
StringBuilder builder = new StringBuilder();
for (char c : arg.toCharArray()) {
if (!Character.isWhitespace(c)) {
builder.append(c);
} else {
res += compute(builder.toString());
builder = new StringBuilder();
}
}
res += compute(builder.toString());
}
System.out.println(res);
}
static double compute(String num) {
double res = 0;
if (num.isEmpty()) {
res += 0;
} else if (num.startsWith("0x") || num.startsWith("0X")) {
res += (num.contains(".")) ? Double.parseDouble(num) : Long.decode(num);
} else {
res += Double.parseDouble(num);
}
return res;
}
}

37
java/sum/SumHex.java Normal file
View File

@@ -0,0 +1,37 @@
package sum;
/**
* @author Nikita Doschennikov (me@fymio.us)
*/
public class SumHex {
public static void main(String[] args) {
int res = 0;
for (String arg : args) {
StringBuilder builder = new StringBuilder();
for (char c : arg.toCharArray()) {
if (!Character.isWhitespace(c)) {
builder.append(c);
} else {
res += compute(builder.toString());
builder = new StringBuilder();
}
}
res += compute(builder.toString());
}
System.out.println(res);
}
static int compute(String num) {
int res = 0;
if (num.isEmpty()) {
res += 0;
} else if (num.startsWith("0x") || num.startsWith("0X")) {
res += Long.decode(num);
} else {
res += Integer.parseInt(num);
}
return res;
}
}

View File

@@ -0,0 +1,41 @@
package sum;
import java.math.BigInteger;
/**
* @author Nikita Doschennikov (me@fymio.us)
*/
public class SumLongOctal {
public static void main(String[] args) {
long res = 0;
for (String arg : args) {
StringBuilder builder = new StringBuilder();
for (char c : arg.toCharArray()) {
if (!Character.isWhitespace(c)) {
builder.append(c);
} else {
res += compute(builder.toString());
builder = new StringBuilder();
}
}
res += compute(builder.toString());
}
System.out.println(res);
}
static long compute(String num) {
if (num.isEmpty()) {
return 0L;
}
if (num.endsWith("o") || num.endsWith("O")) {
String oct = num.substring(0, num.length() - 1);
BigInteger bi = new BigInteger(oct, 8);
return bi.longValue();
} else {
return Long.parseLong(num);
}
}
}

View File

@@ -0,0 +1,11 @@
public class WordInfo {
String word;
int count;
int firstIndex;
WordInfo(String word, int count, int firstIndex) {
this.word = word;
this.count = count;
this.firstIndex = firstIndex;
}
}

View File

@@ -0,0 +1,54 @@
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.*;
public class WordStat {
public static void main(String[] args) {
if (args.length != 2) {
System.err.println("incorrect input!");
System.err.println("usage: java WordStat inputFile outputFile");
}
String inputFileName = args[0];
String outputFileName = args[1];
try {
BufferedReader r = new BufferedReader(new FileReader(inputFileName));
LinkedHashMap<String, Integer> wordCount = new LinkedHashMap<>();
StringBuilder sb = new StringBuilder();
int data = r.read();
while (data != -1) {
char c = (char) data;
if (Character.getType(c) == Character.DASH_PUNCTUATION ||
Character.isLetter(c) || c == '\'') {
sb.append(c);
} else {
if (!sb.isEmpty()) {
String word = sb.toString().toLowerCase();
wordCount.put(word, wordCount.getOrDefault(word, 0) + 1);
sb.setLength(0);
}
}
data = r.read();
}
r.close();
PrintWriter writer = new PrintWriter(outputFileName, StandardCharsets.UTF_8);
for (Map.Entry<String, Integer> entry : wordCount.entrySet()) {
String key = entry.getKey();
int value = entry.getValue();
writer.println(key + " " + value);
}
writer.close();
} catch (Exception ex) {
System.err.println("An error occured: " + ex.getMessage());
}
}
}

View File

@@ -0,0 +1,71 @@
import java.io.*;
import java.util.*;
public class WordStatLength {
public static void main(String[] args) {
if (args.length != 2) {
System.err.println("incorrect input!");
System.err.println("usage: java WordStat inputFile outputFile");
}
String inputFileName = args[0];
String outputFileName = args[1];
try {
BufferedReader r = new BufferedReader(new FileReader(inputFileName));
Map<String, WordInfo> wordMap = new HashMap<>();
StringBuilder sb = new StringBuilder();
int wordIndex = 0;
int data = r.read();
while (data != -1) {
char c = (char) data;
if (Character.getType(c) == Character.DASH_PUNCTUATION ||
Character.isLetter(c) || c == '\'') {
sb.append(c);
} else {
if (sb.length() > 0) {
String word = sb.toString().toLowerCase();
if (wordMap.containsKey(word)) {
wordMap.get(word).count++;
} else {
wordMap.put(word, new WordInfo(word, 1, wordIndex));
wordIndex++;
}
sb.setLength(0);
}
}
data = r.read();
}
if (sb.length() > 0) {
String word = sb.toString().toLowerCase();
if (wordMap.containsKey(word)) {
wordMap.get(word).count++;
} else {
wordMap.put(word, new WordInfo(word, 1, wordIndex));
}
}
r.close();
List<WordInfo> sortedWords = new ArrayList<>(wordMap.values());
sortedWords.sort(Comparator.comparingInt((WordInfo w) -> w.word.length())
.thenComparingInt(w -> w.firstIndex));
PrintWriter writer = new PrintWriter(outputFileName, "UTF-8");
for (WordInfo info : sortedWords) {
writer.println(info.word + " " + info.count);
}
writer.close();
} catch (Exception ex) {
System.err.println("An error occured: " + ex.getMessage());
}
}
}

View File

@@ -0,0 +1,94 @@
import java.io.*;
import java.util.*;
public class WordStatLengthAffix {
public static void main(String[] args) {
if (args.length != 2) {
System.err.println("incorrect input!");
System.err.println("usage: java WordStat inputFile outputFile");
}
String inputFileName = args[0];
String outputFileName = args[1];
try {
BufferedReader r = new BufferedReader(new FileReader(inputFileName));
Map<String, WordInfo> wordMap = new HashMap<>();
StringBuilder sb = new StringBuilder();
int wordIndex = 0;
int data = r.read();
while (data != -1) {
char c = (char) data;
if (Character.getType(c) == Character.DASH_PUNCTUATION ||
Character.isLetter(c) || c == '\'') {
sb.append(c);
} else {
if (sb.length() > 0) {
String word = sb.toString().toLowerCase();
if (word.length() != 1) {
String prefix = word.substring(0, word.length() / 2);
String suffix = word.substring(word.length() - word.length() / 2);
if (wordMap.containsKey(prefix)) {
wordMap.get(prefix).count++;
} else {
wordMap.put(prefix, new WordInfo(prefix, 1, wordIndex));
wordIndex++;
}
if (wordMap.containsKey(suffix)) {
wordMap.get(suffix).count++;
} else {
wordMap.put(suffix, new WordInfo(suffix, 1, wordIndex));
wordIndex++;
}
}
sb.setLength(0);
}
}
data = r.read();
}
if (sb.length() > 0) {
String word = sb.toString().toLowerCase();
if (word.length() != 1) {
String prefix = word.substring(0, word.length() / 2);
String suffix = word.substring(word.length() - word.length() / 2);
if (wordMap.containsKey(prefix)) {
wordMap.get(prefix).count++;
} else {
wordMap.put(prefix, new WordInfo(prefix, 1, wordIndex));
wordIndex++;
}
if (wordMap.containsKey(suffix)) {
wordMap.get(suffix).count++;
} else {
wordMap.put(suffix, new WordInfo(suffix, 1, wordIndex));
wordIndex++;
}
}
}
r.close();
List<WordInfo> sortedWords = new ArrayList<>(wordMap.values());
sortedWords.sort(Comparator.comparingInt((WordInfo w) -> w.word.length())
.thenComparingInt(w -> w.firstIndex));
PrintWriter writer = new PrintWriter(outputFileName, "UTF-8");
for (WordInfo info : sortedWords) {
writer.println(info.word + " " + info.count);
}
writer.close();
} catch (Exception ex) {
System.err.println("An error occured: " + ex.getMessage());
}
}
}

View File

@@ -0,0 +1,79 @@
import java.io.*;
import java.util.*;
public class WordStatLengthMiddle {
public static void main(String[] args) {
if (args.length != 2) {
System.err.println("incorrect input!");
System.err.println("usage: java WordStat inputFile outputFile");
}
String inputFileName = args[0];
String outputFileName = args[1];
try {
BufferedReader r = new BufferedReader(new FileReader(inputFileName));
Map<String, WordInfo> wordMap = new HashMap<>();
StringBuilder sb = new StringBuilder();
int wordIndex = 0;
int data = r.read();
while (data != -1) {
char c = (char) data;
if (Character.getType(c) == Character.DASH_PUNCTUATION ||
Character.isLetter(c) || c == '\'') {
sb.append(c);
} else {
if (sb.length() > 0) {
String word = sb.toString().toLowerCase();
if (word.length() >= 7) {
word = word.substring(3, word.length() - 3);
if (wordMap.containsKey(word)) {
wordMap.get(word).count++;
} else {
wordMap.put(word, new WordInfo(word, 1, wordIndex));
wordIndex++;
}
}
sb.setLength(0);
}
}
data = r.read();
}
if (sb.length() > 0) {
String word = sb.toString().toLowerCase();
if (word.length() >= 7) {
word = word.substring(3, word.length() - 3);
if (wordMap.containsKey(word)) {
wordMap.get(word).count++;
} else {
wordMap.put(word, new WordInfo(word, 1, wordIndex));
wordIndex++;
}
}
}
r.close();
List<WordInfo> sortedWords = new ArrayList<>(wordMap.values());
sortedWords.sort(Comparator.comparingInt((WordInfo w) -> w.word.length())
.thenComparingInt(w -> w.firstIndex));
PrintWriter writer = new PrintWriter(outputFileName, "UTF-8");
for (WordInfo info : sortedWords) {
writer.println(info.word + " " + info.count);
}
writer.close();
} catch (Exception ex) {
System.err.println("An error occured: " + ex.getMessage());
}
}
}

View File

@@ -0,0 +1,79 @@
import java.io.*;
import java.util.*;
public class WordStatLengthPrefix {
public static void main(String[] args) {
if (args.length != 2) {
System.err.println("incorrect input!");
System.err.println("usage: java WordStat inputFile outputFile");
}
String inputFileName = args[0];
String outputFileName = args[1];
try {
BufferedReader r = new BufferedReader(new FileReader(inputFileName));
Map<String, WordInfo> wordMap = new HashMap<>();
StringBuilder sb = new StringBuilder();
int wordIndex = 0;
int data = r.read();
while (data != -1) {
char c = (char) data;
if (Character.getType(c) == Character.DASH_PUNCTUATION ||
Character.isLetter(c) || c == '\'') {
sb.append(c);
} else {
if (sb.length() > 0) {
String word = sb.toString().toLowerCase();
if (word.length() != 1) {
String prefix = word.substring(0, word.length() / 2);
if (wordMap.containsKey(prefix)) {
wordMap.get(prefix).count++;
} else {
wordMap.put(prefix, new WordInfo(prefix, 1, wordIndex));
wordIndex++;
}
}
sb.setLength(0);
}
}
data = r.read();
}
if (sb.length() > 0) {
String word = sb.toString().toLowerCase();
if (word.length() != 1) {
String prefix = word.substring(0, word.length() / 2);
if (wordMap.containsKey(prefix)) {
wordMap.get(prefix).count++;
} else {
wordMap.put(prefix, new WordInfo(prefix, 1, wordIndex));
wordIndex++;
}
}
}
r.close();
List<WordInfo> sortedWords = new ArrayList<>(wordMap.values());
sortedWords.sort(Comparator.comparingInt((WordInfo w) -> w.word.length())
.thenComparingInt(w -> w.firstIndex));
PrintWriter writer = new PrintWriter(outputFileName, "UTF-8");
for (WordInfo info : sortedWords) {
writer.println(info.word + " " + info.count);
}
writer.close();
} catch (Exception ex) {
System.err.println("An error occured: " + ex.getMessage());
}
}
}

View File

@@ -0,0 +1,79 @@
import java.io.*;
import java.util.*;
public class WordStatLengthSuffix {
public static void main(String[] args) {
if (args.length != 2) {
System.err.println("incorrect input!");
System.err.println("usage: java WordStat inputFile outputFile");
}
String inputFileName = args[0];
String outputFileName = args[1];
try {
BufferedReader r = new BufferedReader(new FileReader(inputFileName));
Map<String, WordInfo> wordMap = new HashMap<>();
StringBuilder sb = new StringBuilder();
int wordIndex = 0;
int data = r.read();
while (data != -1) {
char c = (char) data;
if (Character.getType(c) == Character.DASH_PUNCTUATION ||
Character.isLetter(c) || c == '\'') {
sb.append(c);
} else {
if (sb.length() > 0) {
String word = sb.toString().toLowerCase();
if (word.length() != 1) {
word = word.substring(word.length() - word.length() / 2);
if (wordMap.containsKey(word)) {
wordMap.get(word).count++;
} else {
wordMap.put(word, new WordInfo(word, 1, wordIndex));
wordIndex++;
}
}
sb.setLength(0);
}
}
data = r.read();
}
if (sb.length() > 0) {
String word = sb.toString().toLowerCase();
if (word.length() != 1) {
word = word.substring(word.length() - word.length() / 2);
if (wordMap.containsKey(word)) {
wordMap.get(word).count++;
} else {
wordMap.put(word, new WordInfo(word, 1, wordIndex));
wordIndex++;
}
}
}
r.close();
List<WordInfo> sortedWords = new ArrayList<>(wordMap.values());
sortedWords.sort(Comparator.comparingInt((WordInfo w) -> w.word.length())
.thenComparingInt(w -> w.firstIndex));
PrintWriter writer = new PrintWriter(outputFileName, "UTF-8");
for (WordInfo info : sortedWords) {
writer.println(info.word + " " + info.count);
}
writer.close();
} catch (Exception ex) {
System.err.println("An error occured: " + ex.getMessage());
}
}
}

28
java/wspp/IntList.java Normal file
View File

@@ -0,0 +1,28 @@
package wspp;
public class IntList {
private int[] array;
private int size;
public IntList() {
array = new int[10];
size = 0;
}
public void add(int value) {
if (size >= array.length) {
int[] newArray = new int[array.length * 2];
System.arraycopy(array, 0, newArray, 0, size);
array = newArray;
}
array[size++] = value;
}
public int get(int index) {
return array[index];
}
public int size() {
return size;
}
}

6
java/wspp/WordInfo.java Normal file
View File

@@ -0,0 +1,6 @@
package wspp;
public class WordInfo {
int count;
IntList positions;
}

View File

@@ -0,0 +1,74 @@
package wspp;
import java.io.*;
import java.nio.charset.StandardCharsets;
public class WordScanner {
private BufferedReader br;
private String line = null;
private int pos = 0;
private int lineNumber = 0;
public WordScanner(String fileName) throws IOException {
br = new BufferedReader(new InputStreamReader(
new FileInputStream(fileName), StandardCharsets.UTF_8));
}
private boolean hasNextLine() throws IOException {
if (line != null && pos < line.length()) return true;
line = br.readLine();
if (line != null) {
lineNumber++;
}
pos = 0;
return line != null;
}
private boolean isWordChar(char c) {
return Character.isLetter(c) || Character.isDigit(c) ||
c == '\'' || c == '$' || c == '_' ||
Character.getType(c) == Character.DASH_PUNCTUATION;
}
public boolean hasNextWord() throws IOException {
while (hasNextLine()) {
while (pos < line.length() && !isWordChar(line.charAt(pos))) {
pos++;
}
if (pos < line.length()) {
return true;
}
}
return false;
}
public String nextWord() {
while (pos < line.length() && !isWordChar(line.charAt(pos))) {
pos++;
}
int start = pos;
while (pos < line.length() && isWordChar(line.charAt(pos))) {
pos++;
}
return line.substring(start, pos).toLowerCase();
}
public int getLineNumber() {
return lineNumber;
}
public void close() throws IOException {
br.close();
}
public void reset(String fileName) throws IOException {
br.close();
br = new BufferedReader(new InputStreamReader(
new FileInputStream(fileName), StandardCharsets.UTF_8));
line = null;
pos = 0;
lineNumber = 0;
}
}

64
java/wspp/Wspp.java Normal file
View File

@@ -0,0 +1,64 @@
package wspp;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.*;
public class Wspp {
public static void main(String[] args) {
if (args.length != 2) {
System.err.println("Usage: java Wspp inputFile outputFile");
return;
}
String inputFile = args[0];
String outputFile = args[1];
try {
WordScanner scanner = new WordScanner(inputFile);
Map<String, WordInfo> wordMap = new LinkedHashMap<>();
int wordPosition = 1;
while (scanner.hasNextWord()) {
String word = scanner.nextWord();
if (wordMap.containsKey(word)) {
WordInfo info = wordMap.get(word);
info.count++;
info.positions.add(wordPosition);
} else {
WordInfo info = new WordInfo();
info.count = 1;
info.positions = new IntList();
info.positions.add(wordPosition);
wordMap.put(word, info);
}
wordPosition++;
}
scanner.close();
PrintWriter writer = new PrintWriter(
new OutputStreamWriter(
new FileOutputStream(outputFile), StandardCharsets.UTF_8));
for (Map.Entry<String, WordInfo> entry : wordMap.entrySet()) {
String word = entry.getKey();
WordInfo info = entry.getValue();
writer.print(word + " " + info.count);
for (int i = 0; i < info.positions.size(); i++) {
writer.print(" " + info.positions.get(i));
}
writer.println();
}
writer.close();
} catch (IOException e) {
System.err.println("Error: " + e.getMessage());
}
}
}

92
java/wspp/WsppPos.java Normal file
View File

@@ -0,0 +1,92 @@
package wspp;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.*;
public class WsppPos {
public static void main(String[] args) {
if (args.length != 2) {
System.err.println("Usage: java WsppPos inputFile outputFile");
return;
}
String inputFile = args[0];
String outputFile = args[1];
try {
// Первый проход: считаем количество слов в каждой строке
WordScanner scanner = new WordScanner(inputFile);
Map<Integer, Integer> wordsPerLine = new HashMap<>();
while (scanner.hasNextWord()) {
scanner.nextWord();
int line = scanner.getLineNumber();
wordsPerLine.put(line, wordsPerLine.getOrDefault(line, 0) + 1);
}
scanner.close();
// Второй проход: собираем статистику
scanner = new WordScanner(inputFile);
Map<String, WordInfo> wordMap = new LinkedHashMap<>();
Map<Integer, Integer> currentPosInLine = new HashMap<>();
while (scanner.hasNextWord()) {
String word = scanner.nextWord();
int lineNum = scanner.getLineNumber();
// Позиция с начала строки
int posInLine = currentPosInLine.getOrDefault(lineNum, 0) + 1;
currentPosInLine.put(lineNum, posInLine);
// Пересчитываем в позицию с конца строки
int totalWordsInLine = wordsPerLine.get(lineNum);
int posFromEnd = totalWordsInLine - posInLine + 1;
if (wordMap.containsKey(word)) {
WordInfo info = wordMap.get(word);
info.count++;
info.lineNumbers.add(lineNum);
info.positions.add(posFromEnd);
} else {
WordInfo info = new WordInfo();
info.count = 1;
info.lineNumbers = new IntList();
info.positions = new IntList();
info.lineNumbers.add(lineNum);
info.positions.add(posFromEnd);
wordMap.put(word, info);
}
}
scanner.close();
// Запись результата
PrintWriter writer = new PrintWriter(
new OutputStreamWriter(
new FileOutputStream(outputFile), StandardCharsets.UTF_8));
for (Map.Entry<String, WordInfo> entry : wordMap.entrySet()) {
String word = entry.getKey();
WordInfo info = entry.getValue();
writer.print(word + " " + info.count);
for (int i = 0; i < info.lineNumbers.size(); i++) {
writer.print(" " + info.lineNumbers.get(i) + ":" + info.positions.get(i));
}
writer.println();
}
writer.close();
} catch (IOException e) {
System.err.println("Error: " + e.getMessage());
}
}
static class WordInfo {
int count;
IntList lineNumbers;
IntList positions;
}
}

1763
lectures/README.md Normal file

File diff suppressed because it is too large Load Diff