Skip to content

Commit 4213569

Browse files
committed
docs: 📚 add README
1 parent d4427ba commit 4213569

File tree

1 file changed

+166
-0
lines changed

1 file changed

+166
-0
lines changed

README.md

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
# Лабораторная работа 3
2+
3+
[![Elixir](https://github.com/maxbarsukov-itmo/functional-programming-3/actions/workflows/elixir.yml/badge.svg?branch=master)](https://github.com/maxbarsukov-itmo/functional-programming-3/actions/workflows/elixir.yml)
4+
[![Markdown](https://github.com/maxbarsukov-itmo/functional-programming-3/actions/workflows/markdown.yml/badge.svg?branch=master)](https://github.com/maxbarsukov-itmo/functional-programming-3/actions/workflows/markdown.yml)
5+
[![Coverage Status](https://coveralls.io/repos/github/maxbarsukov-itmo/functional-programming-3/badge.svg?branch=master)](https://coveralls.io/github/maxbarsukov-itmo/functional-programming-3?branch=master)
6+
7+
<img alt="bumps" src="./.resources/anime.gif" height="240">
8+
9+
> [!TIP]
10+
> Ah shit, here we go again...
11+
12+
---
13+
14+
* Студент: `Барсуков Максим Андреевич`
15+
* Группа: `P3315`
16+
* ИСУ: `367081`
17+
* Функциональный язык: `Elixir`
18+
19+
---
20+
21+
## Описание работы
22+
23+
**Цель**: получить навыки работы с *вводом/выводом*, *потоковой обработкой данных*, *командной строкой*.
24+
25+
В рамках лабораторной работы вам предлагается повторно реализовать лабораторную работу по предмету *«Вычислительная математика»*,посвящённую **интерполяции** (в разные годы это лабораторная работа 3 или 4) со следующими дополнениями:
26+
27+
* обязательно должна быть реализована **линейная интерполяция** ([отрезками](https://en.wikipedia.org/wiki/Linear_interpolation));
28+
* настройки алгоритма интерполяции и выводимых данных должны задаваться через **аргументы командной строки**:
29+
* какие **алгоритмы** использовать (в том числе два сразу);
30+
* **частота дискретизации** результирующих данных;
31+
* и т.п.;
32+
* входные данные должны задаваться в **текстовом формате** на подобии `.csv` (к примеру `x;y\n` или `x\ty\n`) и подаваться на **стандартный ввод**, входные данные должны быть отсортированы по возрастанию `x`;
33+
* выходные данные должны подаваться на **стандартный вывод**;
34+
* программа должна работать в **потоковом режиме** (пример -- `cat | grep 11`), это значит, что при запуске программы она должна ожидать получения данных на стандартный ввод, и, по мере получения достаточного количества данных, должна выводить рассчитанные точки в стандартный вывод;
35+
36+
#### Архитектура
37+
38+
Приложение должно быть организовано следующим образом:
39+
40+
```txt
41+
+---------------------------+
42+
| обработка входного потока |
43+
+---------------------------+
44+
|
45+
| поток / список / последовательность точек
46+
v
47+
+-----------------------+ +------------------------------+
48+
| алгоритм интерполяции |<-----| генератор точек, для которых |
49+
+-----------------------+ | необходимо вычислить |
50+
| | промежуточные значения |
51+
| +------------------------------+
52+
|
53+
| поток / список / последовательность рассчитанных точек
54+
v
55+
+------------------------+
56+
| печать выходных данных |
57+
+------------------------+
58+
```
59+
60+
#### Потоковый режим
61+
62+
Потоковый режим для алгоритмов, работающих с группой точек должен работать следующим образом:
63+
64+
```txt
65+
o o o o o o . . x x x
66+
x x x . . o . . x x x
67+
x x x . . o . . x x x
68+
x x x . . o . . x x x
69+
x x x . . o . . x x x
70+
x x x . . o . . x x x
71+
x x x . . o o o o o o EOF
72+
```
73+
74+
где:
75+
76+
* **каждая строка -- окно данных**, на основании которых производится расчёт алгоритма;
77+
* строки сменяются по мере поступления в систему новых данных (старые данные удаляются из окна, новые -- добавляются);
78+
* `o` -- рассчитанные данные, можно видеть:
79+
* большинство окон используется для расчёта всего одной точки, так как именно в "центре" результат наиболее точен;
80+
* первое и последнее окно используются для расчёта большого количества точек, так лучших данных для расчёта у нас не будет.
81+
* `.` -- точки, задействованные в рассчете значения o.
82+
* `x` -- точки, расчёт которых для "окон" не требуется.
83+
84+
#### Пример
85+
86+
Пример вычислений для шага `1.0` и функции `sin(x)`:
87+
88+
```txt
89+
Ввод первых двух точек (в данном примере X Y через пробел):
90+
0 0.00
91+
1.571 1
92+
93+
Вывод:
94+
Линейная (идем от первой точки из введенных (0.00) с шагом 1, покрывая все введенные X (1.571 < 2)):
95+
0.00 1.00 2.00
96+
0.00 0.64 1.27
97+
98+
Ввод третьей точки:
99+
3.142 0
100+
101+
Следующий вывод:
102+
Линейная (идем от второй точки из введенных (1.571) с шагом 1, покрывая все введенные X (3.142 < 3.57)):
103+
1.57 2.57 3.57
104+
1.00 0.36 -0.27
105+
106+
Ввод четвертой точки:
107+
4.712 -1
108+
109+
Следующий вывод:
110+
Линейная (идем от третьей точки из введенных (3.142) с шагом 1, покрывая все введенные X (4.712 < 5.14)):
111+
3.14 4.14 5.14
112+
0.00 -0.64 -1.27
113+
114+
Лагранж (теперь количество введенных точек повзоляет его рассчитать, идем от первой точки (0.00) из введенных с шагом 1, покрывая все введенные X (4.712 < 5)):
115+
0.00 1.00 2.00 3.00 4.00 5.00
116+
0.00 0.97 0.84 0.12 -0.67 -1.03
117+
118+
И т.д.
119+
```
120+
121+
Как видно из примера выше, **окна для каждого метода двигаются по-разному**.
122+
123+
Для *линейной* окно начало сдвигаться уже при вводе третьей точки (т.к. для вычисления нужно всего две), в то время как для *Лагранжа* окно начало двигаться только когда была введена пятая точка (т.к. здесь для вычислений нужно больше точек).
124+
125+
## Требования
126+
127+
**Общие требования**:
128+
129+
* программа должна быть реализована в функциональном стиле;
130+
* ввод/вывод должен быть отделён от алгоритмов интерполяции;
131+
* требуется использовать идиоматичный для технологии стиль программирования.
132+
133+
**Содержание отчёта**:
134+
135+
* титульный лист;
136+
* требования к разработанному ПО, включая описание алгоритма;
137+
* ключевые элементы реализации с минимальными комментариями;
138+
* ввод/вывод программы;
139+
* выводы (отзыв об использованных приёмах программирования).
140+
141+
**Общие рекомендации по реализации**. Не стоит писать большие и страшные автоматы, управляющие поведением приложения в целом. Если у вас:
142+
143+
* Язык с ленью -- используйте лень.
144+
* Языки с параллельным программированием и акторами -- используйте их.
145+
* Язык без всей этой прелести -- используйте генераторы/итераторы/и т.п.
146+
147+
## Выполнение
148+
149+
### Архитектура приложения
150+
151+
### Ключевые элементы реализации
152+
153+
### Пример работы программы
154+
155+
### Форматирование, линтинг и тестирование
156+
157+
В рамках данной работы были применены инструменты:
158+
159+
* [ExUnit](https://hexdocs.pm/ex_unit/ExUnit.html) - для модульного тестирования;
160+
* [Quixir](https://github.com/pragdave/quixir) - для тестирования свойств (property-based).
161+
* [Credo](https://github.com/rrrene/credo) - инструмент статического анализа кода для языка Elixir;
162+
* [Dialyxir](https://github.com/jeremyjh/dialyxir) - Dialyz~~er~~xir is a **DI**screpancy **A**na**LY**zer for ~~**ER**lang~~ Eli**XIR** programs.
163+
164+
## Выводы
165+
166+
В данной лабораторной работе ...

0 commit comments

Comments
 (0)