diff --git a/students/23K0505/23K0505-p21/pom.xml b/students/23K0505/23K0505-p21/pom.xml
new file mode 100644
index 000000000..ff9484dc8
--- /dev/null
+++ b/students/23K0505/23K0505-p21/pom.xml
@@ -0,0 +1,13 @@
+
+
+ 4.0.0
+
+ 23K0505
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0505-p21
+ Лабораторная 21
+
diff --git a/students/23K0505/23K0505-p21/src/main/java/ru/mirea/practice/s23k0505/Main.java b/students/23K0505/23K0505-p21/src/main/java/ru/mirea/practice/s23k0505/Main.java
new file mode 100644
index 000000000..c5f90e375
--- /dev/null
+++ b/students/23K0505/23K0505-p21/src/main/java/ru/mirea/practice/s23k0505/Main.java
@@ -0,0 +1,12 @@
+package ru.mirea.practice.s23k0505;
+
+public final class Main {
+
+ private Main() {
+
+ }
+
+ public static void main(String[] args) {
+ System.out.println("Двадцать первая практическая работа!");
+ }
+}
diff --git a/students/23K0505/23K0505-p21/src/main/java/ru/mirea/practice/s23k0505/task1/Main.java b/students/23K0505/23K0505-p21/src/main/java/ru/mirea/practice/s23k0505/task1/Main.java
new file mode 100644
index 000000000..fd9e4d7df
--- /dev/null
+++ b/students/23K0505/23K0505-p21/src/main/java/ru/mirea/practice/s23k0505/task1/Main.java
@@ -0,0 +1,22 @@
+package ru.mirea.practice.s23k0505.task1;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public abstract class Main {
+ public static List arrToList(T[] array) {
+ List list = new ArrayList<>(array.length);
+ for (T e : array) {
+ list.add(e);
+ }
+ return list;
+ }
+
+ public static void main(String[] args) {
+ Integer[] arr = {1, 2, 3, 4, 5};
+ List list = arrToList(arr);
+ System.out.println(list);
+
+ Integer[] arr1 = new Integer[10];
+ }
+}
diff --git a/students/23K0505/23K0505-p21/src/main/java/ru/mirea/practice/s23k0505/task2/Array.java b/students/23K0505/23K0505-p21/src/main/java/ru/mirea/practice/s23k0505/task2/Array.java
new file mode 100644
index 000000000..1b91bd415
--- /dev/null
+++ b/students/23K0505/23K0505-p21/src/main/java/ru/mirea/practice/s23k0505/task2/Array.java
@@ -0,0 +1,26 @@
+package ru.mirea.practice.s23k0505.task2;
+
+import java.util.Arrays;
+
+public class Array {
+ private final T[] array;
+ private final int length;
+
+ Array(T[] array) {
+ this.array = array;
+ this.length = array.length;
+ }
+
+ public T get(int index) {
+ return array[index];
+ }
+
+ public int getLength() {
+ return length;
+ }
+
+ @Override
+ public String toString() {
+ return Arrays.toString(array);
+ }
+}
diff --git a/students/23K0505/23K0505-p21/src/main/java/ru/mirea/practice/s23k0505/task2/Main.java b/students/23K0505/23K0505-p21/src/main/java/ru/mirea/practice/s23k0505/task2/Main.java
new file mode 100644
index 000000000..86e38ebbf
--- /dev/null
+++ b/students/23K0505/23K0505-p21/src/main/java/ru/mirea/practice/s23k0505/task2/Main.java
@@ -0,0 +1,9 @@
+package ru.mirea.practice.s23k0505.task2;
+
+public abstract class Main {
+ public static void main(String[] args) {
+ Integer[] arr = {5, 4, 3, 2, 1};
+ Array array = new Array<>(arr);
+ System.out.println(array);
+ }
+}
diff --git a/students/23K0505/23K0505-p22/pom.xml b/students/23K0505/23K0505-p22/pom.xml
new file mode 100644
index 000000000..8d427e434
--- /dev/null
+++ b/students/23K0505/23K0505-p22/pom.xml
@@ -0,0 +1,13 @@
+
+
+ 4.0.0
+
+ 23K0505
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0505-p22
+ Лабораторная 22
+
diff --git a/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/Main.java b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/Main.java
new file mode 100644
index 000000000..c5f90e375
--- /dev/null
+++ b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/Main.java
@@ -0,0 +1,12 @@
+package ru.mirea.practice.s23k0505;
+
+public final class Main {
+
+ private Main() {
+
+ }
+
+ public static void main(String[] args) {
+ System.out.println("Двадцать первая практическая работа!");
+ }
+}
diff --git a/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/Calculator.java b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/Calculator.java
new file mode 100644
index 000000000..0953b67a4
--- /dev/null
+++ b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/Calculator.java
@@ -0,0 +1,51 @@
+package ru.mirea.practice.s23k0505.task1;
+
+import ru.mirea.practice.s23k0505.task1.utilclasses.Number;
+import ru.mirea.practice.s23k0505.task1.utilclasses.Operation;
+
+import java.util.Stack;
+
+public class Calculator {
+ private final Stack stack;
+
+ public Calculator() {
+ this.stack = new Stack<>();
+ }
+
+ public void clear() {
+ stack.clear();
+ }
+
+ public void addNumber(Number number) {
+ stack.push(number);
+ }
+
+ public void addOperation(Operation operation) {
+ stack.push(operation);
+ }
+
+ public Stack getStack() {
+ return stack;
+ }
+
+ public Number compute() {
+ Number result = new Number();
+ Number b;
+ Number a;
+ ComputingElement popped = stack.pop();
+ if (popped instanceof Operation) {
+ b = compute();
+ a = compute();
+ result = ((Operation) popped).compute(a, b);
+ } else if (popped instanceof Number) {
+ result = (Number) popped;
+ }
+
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return stack.toString();
+ }
+}
diff --git a/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/CalculatorController.java b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/CalculatorController.java
new file mode 100644
index 000000000..4a39f0324
--- /dev/null
+++ b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/CalculatorController.java
@@ -0,0 +1,90 @@
+package ru.mirea.practice.s23k0505.task1;
+
+import ru.mirea.practice.s23k0505.task1.utilclasses.Number;
+import ru.mirea.practice.s23k0505.task1.utilclasses.Operation;
+import ru.mirea.practice.s23k0505.task1.utilclasses.OperationType;
+
+import java.util.LinkedList;
+import java.util.List;
+
+public class CalculatorController {
+ private final Calculator calculator;
+ private final List fakeStack;
+ private int numbersCount;
+ private int operationCount;
+
+ public CalculatorController() {
+ this.calculator = new Calculator();
+ fakeStack = new LinkedList<>();
+ numbersCount = 0;
+ operationCount = 0;
+ }
+
+ public void addNumber(double number) {
+ fakeStack.add(new Number(number));
+ numbersCount += 1;
+ }
+
+ public void addOperation(OperationType operationType) {
+ if (operationCount < numbersCount - 1) {
+ fakeStack.add(new Operation(operationType));
+ operationCount += 1;
+ }
+ }
+
+ public void clear() {
+ fakeStack.clear();
+ }
+
+ public ComputingElement delete() {
+ ComputingElement element = null;
+ if (!fakeStack.isEmpty()) {
+ element = fakeStack.remove(fakeStack.size() - 1);
+ if (element instanceof Number) {
+ numbersCount -= 1;
+ } else {
+ operationCount -= 1;
+ }
+ }
+ return element;
+ }
+
+ public double compute() {
+ toRealStack();
+ fakeStack.clear();
+ final Number result = calculator.compute();
+ fakeStack.addAll(calculator.getStack());
+ calculator.clear();
+ numbersCount -= operationCount + 1;
+ operationCount = 0;
+ return result.getValue();
+ }
+
+ public int getStackSize() {
+ return fakeStack.size();
+ }
+
+ private void toRealStack() {
+ for (ComputingElement element : fakeStack) {
+ if (element instanceof Number) {
+ calculator.addNumber((Number) element);
+ } else if (element instanceof Operation) {
+ calculator.addOperation((Operation) element);
+ }
+ }
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder fakeStackStr = new StringBuilder();
+ for (ComputingElement element : fakeStack) {
+ fakeStackStr.append(element.toString());
+ fakeStackStr.append(" ");
+ }
+ return fakeStackStr.toString();
+ }
+
+ public String printStack() {
+ return String.format("Numbers: %d, Operations: %d", numbersCount, operationCount);
+ }
+}
diff --git a/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/ComputingElement.java b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/ComputingElement.java
new file mode 100644
index 000000000..a2918cc4e
--- /dev/null
+++ b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/ComputingElement.java
@@ -0,0 +1,4 @@
+package ru.mirea.practice.s23k0505.task1;
+
+public interface ComputingElement {
+}
diff --git a/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/Main.java b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/Main.java
new file mode 100644
index 000000000..ea9674d0b
--- /dev/null
+++ b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/Main.java
@@ -0,0 +1,34 @@
+package ru.mirea.practice.s23k0505.task1;
+
+import ru.mirea.practice.s23k0505.task1.utilclasses.OperationType;
+
+public abstract class Main {
+ public static void main(String[] args) {
+ CalculatorController calculator = new CalculatorController();
+ calculator.addNumber(100);
+ calculator.addNumber(2);
+ calculator.addNumber(3);
+ calculator.addNumber(4);
+ calculator.addNumber(5);
+ calculator.addNumber(6);
+ calculator.addOperation(OperationType.MULTIPLY);
+ calculator.addOperation(OperationType.ADD);
+ calculator.addOperation(OperationType.SUBTRACT);
+ calculator.addOperation(OperationType.DIVIDE);
+ System.out.println(calculator);
+ System.out.println(calculator.compute());
+ System.out.println(calculator);
+ calculator.addOperation(OperationType.DIVIDE);
+ System.out.println(calculator);
+ System.out.println(calculator.compute());
+ System.out.println(calculator);
+ System.out.println(calculator.compute());
+ System.out.println(calculator);
+ System.out.println(calculator.compute());
+ System.out.println(calculator);
+ System.out.println(calculator.compute());
+ System.out.println(calculator);
+ System.out.println(calculator.compute());
+ System.out.println(calculator);
+ }
+}
diff --git a/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/utilclasses/Number.java b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/utilclasses/Number.java
new file mode 100644
index 000000000..00bf43109
--- /dev/null
+++ b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/utilclasses/Number.java
@@ -0,0 +1,28 @@
+package ru.mirea.practice.s23k0505.task1.utilclasses;
+
+import ru.mirea.practice.s23k0505.task1.ComputingElement;
+
+public class Number implements ComputingElement {
+ private double value;
+
+ public Number() {
+ // Default constructor
+ }
+
+ public Number(double value) {
+ this.value = value;
+ }
+
+ public double getValue() {
+ return value;
+ }
+
+ public void setValue(double value) {
+ this.value = value;
+ }
+
+ @Override
+ public String toString() {
+ return Double.toString(value);
+ }
+}
diff --git a/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/utilclasses/Operation.java b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/utilclasses/Operation.java
new file mode 100644
index 000000000..ea6d80973
--- /dev/null
+++ b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/utilclasses/Operation.java
@@ -0,0 +1,61 @@
+package ru.mirea.practice.s23k0505.task1.utilclasses;
+
+import ru.mirea.practice.s23k0505.task1.ComputingElement;
+
+public class Operation implements ComputingElement {
+
+ private final OperationType operation;
+
+ public Operation(OperationType operation) {
+ this.operation = operation;
+ }
+
+ public OperationType getOperation() {
+ return operation;
+ }
+
+ public Number compute(Number numA, Number numB) {
+ double result = 0;
+ double a = numA.getValue();
+ double b = numB.getValue();
+ switch (operation) {
+ case ADD:
+ result = a + b;
+ break;
+ case SUBTRACT:
+ result = a - b;
+ break;
+ case MULTIPLY:
+ result = a * b;
+ break;
+ case DIVIDE:
+ result = a / b;
+ break;
+ default:
+ break;
+ }
+ return new Number(result);
+ }
+
+ @Override
+ public String toString() {
+ String strOp = "";
+ switch (operation) {
+ case ADD:
+ strOp = "+";
+ break;
+ case SUBTRACT:
+ strOp = "-";
+ break;
+ case MULTIPLY:
+ strOp = "*";
+ break;
+ case DIVIDE:
+ strOp = "/";
+ break;
+ default:
+ break;
+ }
+ return strOp;
+ }
+}
diff --git a/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/utilclasses/OperationType.java b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/utilclasses/OperationType.java
new file mode 100644
index 000000000..55d01111a
--- /dev/null
+++ b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/utilclasses/OperationType.java
@@ -0,0 +1,8 @@
+package ru.mirea.practice.s23k0505.task1.utilclasses;
+
+public enum OperationType {
+ ADD,
+ SUBTRACT,
+ MULTIPLY,
+ DIVIDE
+}
diff --git a/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task2/CalculatorFrame.java b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task2/CalculatorFrame.java
new file mode 100644
index 000000000..2af94e64a
--- /dev/null
+++ b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task2/CalculatorFrame.java
@@ -0,0 +1,153 @@
+package ru.mirea.practice.s23k0505.task2;
+
+import ru.mirea.practice.s23k0505.task1.CalculatorController;
+import ru.mirea.practice.s23k0505.task1.ComputingElement;
+import ru.mirea.practice.s23k0505.task1.utilclasses.Number;
+import ru.mirea.practice.s23k0505.task1.utilclasses.OperationType;
+
+import javax.swing.JFrame;
+import javax.swing.JButton;
+import javax.swing.JTextField;
+import javax.swing.JPanel;
+import javax.swing.JLabel;
+import java.awt.Font;
+import java.awt.GridLayout;
+import java.awt.event.ActionEvent;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+
+public class CalculatorFrame extends JFrame {
+ private final Map buttons = new HashMap<>(12);
+ private final CalculatorController controller;
+ private String cachedNumber;
+ private JTextField inputTextField;
+
+ CalculatorFrame() {
+ controller = new CalculatorController();
+ cachedNumber = "";
+ initComponents();
+ pack();
+ setDefaultCloseOperation(EXIT_ON_CLOSE);
+ }
+
+ private void initComponents() {
+ String[] buttonNames = {"*", "/", "Backspace", "+", "-", "Clear", "7", "8", "9", "4", "5", "6",
+ "1", "2", "3", "0", ".", "Enter"};
+
+ for (String name : buttonNames) {
+ buttons.put(name, new JButton(name));
+ buttons.get(name).addActionListener(new ButtonActionListener());
+
+ }
+
+ setLayout(new GridLayout(2, 1, 1, 20));
+ inputTextField = new JTextField(20);
+ inputTextField.setText("");
+ inputTextField.setFont(new Font("Calibri", Font.PLAIN, 30));
+ inputTextField.setEditable(false);
+ add(inputTextField);
+
+ JPanel buttonsPanel = new JPanel();
+ buttonsPanel.setLayout(new GridLayout(7, 3, 2, 2));
+ for (String name : buttonNames) {
+ buttonsPanel.add(buttons.get(name));
+ }
+
+ buttons.put("=", new JButton("="));
+ buttons.get("=").addActionListener(new ButtonActionListener());
+
+ buttonsPanel.add(new JLabel());
+ buttonsPanel.add(buttons.get("="));
+ buttonsPanel.add(new JLabel());
+
+ add(buttonsPanel);
+ }
+
+ private void performButtonAction(String actionName) {
+ switch (actionName) {
+ case "backspace":
+ delete();
+ break;
+ case "clear":
+ clear();
+ clearCache();
+ break;
+ case "+":
+ addCached();
+ controller.addOperation(OperationType.ADD);
+ break;
+ case "*":
+ addCached();
+ controller.addOperation(OperationType.MULTIPLY);
+ break;
+ case "-":
+ addCached();
+ controller.addOperation(OperationType.SUBTRACT);
+ break;
+ case "/":
+ addCached();
+ controller.addOperation(OperationType.DIVIDE);
+ break;
+ case "=":
+ if (controller.getStackSize() > 0) {
+ controller.addNumber(controller.compute());
+ }
+ break;
+ case ".":
+ if (!cachedNumber.contains(".")) {
+ cachedNumber = cachedNumber.concat(actionName);
+ }
+ break;
+ case "enter":
+ if (!cachedNumber.isEmpty()) {
+ addCached();
+ }
+ break;
+ default:
+ cachedNumber = cachedNumber.concat(actionName);
+ break;
+ }
+ inputTextField.setText(controller.toString() + cachedNumber);
+ }
+
+ private void addCached() {
+ double cachedNumberDouble;
+ try {
+ cachedNumberDouble = Double.parseDouble(String.valueOf(cachedNumber));
+ controller.addNumber(cachedNumberDouble);
+ clearCache();
+ } catch (NumberFormatException ignored) {
+ System.out.println();
+ }
+ }
+
+ private void clearCache() {
+ cachedNumber = "";
+ }
+
+ private void delete() {
+ if (!String.valueOf(cachedNumber).isEmpty()) {
+ cachedNumber = cachedNumber.substring(0, cachedNumber.length() - 1);
+ } else {
+ ComputingElement element = controller.delete();
+ if (element instanceof Number) {
+ cachedNumber = Double.toString(((Number) element).getValue());
+ cachedNumber = cachedNumber.substring(0, cachedNumber.length() - 1);
+ }
+ }
+ }
+
+ private void clear() {
+ controller.clear();
+ }
+
+ class ButtonActionListener implements java.awt.event.ActionListener {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ JButton button = (JButton) e.getSource();
+ String name = button.getText();
+ performButtonAction(name.toLowerCase(Locale.US));
+ }
+ }
+}
diff --git a/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task2/Main.java b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task2/Main.java
new file mode 100644
index 000000000..48fadaae1
--- /dev/null
+++ b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task2/Main.java
@@ -0,0 +1,8 @@
+package ru.mirea.practice.s23k0505.task2;
+
+public abstract class Main {
+ public static void main(String[] args) {
+ CalculatorFrame frame = new CalculatorFrame();
+ frame.setVisible(true);
+ }
+}
diff --git a/students/23K0505/23K0505-p23/pom.xml b/students/23K0505/23K0505-p23/pom.xml
new file mode 100644
index 000000000..76f875c86
--- /dev/null
+++ b/students/23K0505/23K0505-p23/pom.xml
@@ -0,0 +1,13 @@
+
+
+ 4.0.0
+
+ 23K0505
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0505-p23
+ Лабораторная 23
+
diff --git a/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/Main.java b/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/Main.java
new file mode 100644
index 000000000..e3a7bcbcc
--- /dev/null
+++ b/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/Main.java
@@ -0,0 +1,12 @@
+package ru.mirea.practice.s23k0505;
+
+public final class Main {
+
+ private Main() {
+
+ }
+
+ public static void main(String[] args) {
+ System.out.println("Двадцать третья практическая работа!");
+ }
+}
diff --git a/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/task1/ArrayQueue.java b/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/task1/ArrayQueue.java
new file mode 100644
index 000000000..1461e822c
--- /dev/null
+++ b/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/task1/ArrayQueue.java
@@ -0,0 +1,107 @@
+package ru.mirea.practice.s23k0505.task1;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+public class ArrayQueue implements ArrayQueueAdt {
+ private final int size;
+ private final List array;
+ private int indexFront;
+ private int indexRear;
+
+ ArrayQueue(Collection collection) {
+ array = new ArrayList<>(collection);
+ this.size = collection.size();
+ indexFront = 0;
+ indexRear = this.size - 1;
+ }
+
+ ArrayQueue(int size) {
+ array = new ArrayList<>();
+ for (int i = 0; i < size; i++) {
+ array.add(i, null);
+ }
+ indexFront = 0;
+ indexRear = -1;
+ this.size = size;
+ }
+
+ @Override
+ public void enqueue(T element) {
+ indexRear += 1;
+ if (indexRear == size) {
+ indexRear = 0;
+ }
+ array.set(indexRear, element);
+ }
+
+ @Override
+ public T dequeue() {
+ T element;
+ if (isEmpty()) {
+ element = null;
+ } else {
+ element = array.get(indexFront);
+ if (indexRear == indexFront) {
+ indexRear -= 1;
+ }
+ if (indexRear == -1) {
+ indexRear = size - 1;
+ }
+ indexFront += 1;
+ if (indexFront == size) {
+ indexFront = 0;
+ }
+ }
+ return element;
+ }
+
+ @Override
+ public int size() {
+ return size;
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return indexRear == -1;
+ }
+
+ @Override
+ public void clear() {
+ array.clear();
+ }
+
+ @Override
+ public T front() {
+ return array.get(0);
+ }
+
+ @Override
+ public T rear() {
+ return array.get(indexRear);
+ }
+
+ @Override
+ public String toString() {
+ ArrayList tempList = new ArrayList<>(size);
+ if (indexRear == -1) {
+ return "[]";
+ } else if (indexFront < indexRear) {
+ for (int i = indexFront; i < indexRear + 1; i++) {
+ tempList.add(array.get(i));
+ }
+ } else {
+ for (int i = indexFront; i < size; i++) {
+ tempList.add(array.get(i));
+ }
+ for (int i = 0; i < indexRear + 1; i++) {
+ if (i == indexFront) {
+ break;
+ }
+ tempList.add(array.get(i));
+ }
+ }
+ return tempList.toString();
+ }
+}
diff --git a/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/task1/ArrayQueueAdt.java b/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/task1/ArrayQueueAdt.java
new file mode 100644
index 000000000..bb72727b5
--- /dev/null
+++ b/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/task1/ArrayQueueAdt.java
@@ -0,0 +1,17 @@
+package ru.mirea.practice.s23k0505.task1;
+
+public interface ArrayQueueAdt {
+ void enqueue(T element);
+
+ T dequeue();
+
+ int size();
+
+ boolean isEmpty();
+
+ void clear();
+
+ T front();
+
+ T rear();
+}
diff --git a/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/task1/ArrayQueueTest.java b/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/task1/ArrayQueueTest.java
new file mode 100644
index 000000000..fcd7ae203
--- /dev/null
+++ b/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/task1/ArrayQueueTest.java
@@ -0,0 +1,27 @@
+package ru.mirea.practice.s23k0505.task1;
+
+public abstract class ArrayQueueTest {
+ public static void main(String[] args) {
+ ArrayQueue queue = new ArrayQueue<>(5);
+ queue.enqueue(1);
+ queue.enqueue(2);
+ queue.enqueue(3);
+ queue.enqueue(4);
+ queue.enqueue(5);
+ System.out.println(queue);
+ queue.enqueue(8);
+ System.out.println(queue);
+ queue.dequeue();
+ queue.dequeue();
+ queue.dequeue();
+ System.out.println(queue);
+ queue.enqueue(3);
+ System.out.println(queue);
+ queue.enqueue(2);
+ System.out.println(queue);
+ queue.enqueue(1);
+ System.out.println(queue);
+ queue.dequeue();
+ System.out.println(queue);
+ }
+}
diff --git a/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/task2/AbstractQueue.java b/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/task2/AbstractQueue.java
new file mode 100644
index 000000000..d6dbdce41
--- /dev/null
+++ b/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/task2/AbstractQueue.java
@@ -0,0 +1,29 @@
+package ru.mirea.practice.s23k0505.task2;
+
+import java.util.AbstractList;
+
+public abstract class AbstractQueue implements Queue {
+ private int size;
+ private AbstractList list;
+
+ @Override
+ public abstract void enqueue(T element);
+
+ @Override
+ public abstract T dequeue();
+
+ @Override
+ public int size() {
+ return size;
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return list.isEmpty();
+ }
+
+ @Override
+ public void clear() {
+ list.clear();
+ }
+}
diff --git a/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/task2/LinkedQueue.java b/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/task2/LinkedQueue.java
new file mode 100644
index 000000000..760cb878d
--- /dev/null
+++ b/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/task2/LinkedQueue.java
@@ -0,0 +1,49 @@
+package ru.mirea.practice.s23k0505.task2;
+
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+
+public class LinkedQueue implements Queue {
+ private final List linkedList;
+ private int size;
+
+ LinkedQueue(Collection collection) {
+ linkedList = new LinkedList<>(collection);
+ this.size = collection.size();
+ }
+
+ LinkedQueue() {
+ linkedList = new LinkedList<>();
+ this.size = 0;
+ }
+
+ @Override
+ public void enqueue(T element) {
+ linkedList.add(size - 1, element);
+ size += 1;
+ }
+
+ @Override
+ public T dequeue() {
+ T element = linkedList.get(0);
+ linkedList.remove(0);
+ size -= 1;
+ return element;
+ }
+
+ @Override
+ public int size() {
+ return size;
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return linkedList.isEmpty();
+ }
+
+ @Override
+ public void clear() {
+ linkedList.clear();
+ }
+}
diff --git a/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/task2/Queue.java b/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/task2/Queue.java
new file mode 100644
index 000000000..3c234101e
--- /dev/null
+++ b/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/task2/Queue.java
@@ -0,0 +1,13 @@
+package ru.mirea.practice.s23k0505.task2;
+
+public interface Queue {
+ void enqueue(T element);
+
+ T dequeue();
+
+ int size();
+
+ boolean isEmpty();
+
+ void clear();
+}
diff --git a/students/23K0505/23K0505-p24/pom.xml b/students/23K0505/23K0505-p24/pom.xml
new file mode 100644
index 000000000..9bc6c89e6
--- /dev/null
+++ b/students/23K0505/23K0505-p24/pom.xml
@@ -0,0 +1,13 @@
+
+
+ 4.0.0
+
+ 23K0505
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0505-p24
+ Лабораторная 24
+
diff --git a/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/Main.java b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/Main.java
new file mode 100644
index 000000000..f8a451311
--- /dev/null
+++ b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/Main.java
@@ -0,0 +1,12 @@
+package ru.mirea.practice.s23k0505;
+
+public final class Main {
+
+ private Main() {
+
+ }
+
+ public static void main(String[] args) {
+ System.out.println("Двадцать четвёртая практическая работа!");
+ }
+}
diff --git a/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task1/Complex.java b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task1/Complex.java
new file mode 100644
index 000000000..092ecdadc
--- /dev/null
+++ b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task1/Complex.java
@@ -0,0 +1,44 @@
+package ru.mirea.practice.s23k0505.task1;
+
+
+public class Complex {
+ private double real;
+ private double imag;
+
+ public Complex(double real, double imag) {
+ this.real = real;
+ this.imag = imag;
+ }
+
+ public Complex() {
+ this.real = 0;
+ this.imag = 0;
+ }
+
+ public double getReal() {
+ return real;
+ }
+
+ public void setReal(double real) {
+ this.real = real;
+ }
+
+ public double getImag() {
+ return imag;
+ }
+
+ public void setImag(double imag) {
+ this.imag = imag;
+ }
+
+ @Override
+ public String toString() {
+ String complexString;
+ if (imag >= 0) {
+ complexString = String.format("%f + %fi", real, imag);
+ } else {
+ complexString = String.format("%f - %fi", real, Math.abs(imag));
+ }
+ return complexString;
+ }
+}
diff --git a/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task1/ComplexAbstractFactory.java b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task1/ComplexAbstractFactory.java
new file mode 100644
index 000000000..2fb45f985
--- /dev/null
+++ b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task1/ComplexAbstractFactory.java
@@ -0,0 +1,7 @@
+package ru.mirea.practice.s23k0505.task1;
+
+public interface ComplexAbstractFactory {
+ Complex createComplex();
+
+ Complex createComplex(int real, int imag);
+}
diff --git a/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task1/ComplexFactory.java b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task1/ComplexFactory.java
new file mode 100644
index 000000000..0a3b23cf2
--- /dev/null
+++ b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task1/ComplexFactory.java
@@ -0,0 +1,13 @@
+package ru.mirea.practice.s23k0505.task1;
+
+public class ComplexFactory implements ComplexAbstractFactory {
+ @Override
+ public Complex createComplex() {
+ return new Complex();
+ }
+
+ @Override
+ public Complex createComplex(int real, int imag) {
+ return new Complex(real, imag);
+ }
+}
diff --git a/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/AbstractChairFactory.java b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/AbstractChairFactory.java
new file mode 100644
index 000000000..2df111616
--- /dev/null
+++ b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/AbstractChairFactory.java
@@ -0,0 +1,9 @@
+package ru.mirea.practice.s23k0505.task2;
+
+public abstract class AbstractChairFactory {
+ abstract VictorianChair createVictorianChair(int age);
+
+ abstract MagicChair createMagicChair();
+
+ abstract FunctionalChair createFunctionalChair();
+}
diff --git a/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/Chair.java b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/Chair.java
new file mode 100644
index 000000000..eeb4f7072
--- /dev/null
+++ b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/Chair.java
@@ -0,0 +1,5 @@
+package ru.mirea.practice.s23k0505.task2;
+
+public interface Chair {
+
+}
diff --git a/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/ChairFactory.java b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/ChairFactory.java
new file mode 100644
index 000000000..56f253c74
--- /dev/null
+++ b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/ChairFactory.java
@@ -0,0 +1,19 @@
+package ru.mirea.practice.s23k0505.task2;
+
+public class ChairFactory extends AbstractChairFactory {
+
+ @Override
+ VictorianChair createVictorianChair(int age) {
+ return new VictorianChair(age);
+ }
+
+ @Override
+ MagicChair createMagicChair() {
+ return new MagicChair();
+ }
+
+ @Override
+ FunctionalChair createFunctionalChair() {
+ return new FunctionalChair();
+ }
+}
diff --git a/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/Client.java b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/Client.java
new file mode 100644
index 000000000..dc00e990b
--- /dev/null
+++ b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/Client.java
@@ -0,0 +1,13 @@
+package ru.mirea.practice.s23k0505.task2;
+
+public class Client {
+ private Chair chair;
+
+ public void sit() {
+ System.out.printf("The client sat on a %s", chair);
+ }
+
+ public void setChair(Chair chair) {
+ this.chair = chair;
+ }
+}
diff --git a/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/FunctionalChair.java b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/FunctionalChair.java
new file mode 100644
index 000000000..0900c533a
--- /dev/null
+++ b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/FunctionalChair.java
@@ -0,0 +1,8 @@
+package ru.mirea.practice.s23k0505.task2;
+
+public class FunctionalChair {
+
+ public int sum(int a, int b) {
+ return a + b;
+ }
+}
diff --git a/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/MagicChair.java b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/MagicChair.java
new file mode 100644
index 000000000..d96d2b2af
--- /dev/null
+++ b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/MagicChair.java
@@ -0,0 +1,8 @@
+package ru.mirea.practice.s23k0505.task2;
+
+public class MagicChair {
+
+ void doMagic() {
+ System.out.println("Abracadabra!");
+ }
+}
diff --git a/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/VictorianChair.java b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/VictorianChair.java
new file mode 100644
index 000000000..2eb4e17da
--- /dev/null
+++ b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/VictorianChair.java
@@ -0,0 +1,13 @@
+package ru.mirea.practice.s23k0505.task2;
+
+public class VictorianChair implements Chair {
+ private final int age;
+
+ public VictorianChair(int age) {
+ this.age = age;
+ }
+
+ public int getAge() {
+ return age;
+ }
+}
diff --git a/students/23K0505/23K0505-p25/pom.xml b/students/23K0505/23K0505-p25/pom.xml
new file mode 100644
index 000000000..e7aa0c92d
--- /dev/null
+++ b/students/23K0505/23K0505-p25/pom.xml
@@ -0,0 +1,13 @@
+
+
+ 4.0.0
+
+ 23K0505
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0505-p25
+ Лабораторная 25
+
diff --git a/students/23K0505/23K0505-p25/src/main/java/ru/mirea/practice/s23k0505/Main.java b/students/23K0505/23K0505-p25/src/main/java/ru/mirea/practice/s23k0505/Main.java
new file mode 100644
index 000000000..8ec19ca3d
--- /dev/null
+++ b/students/23K0505/23K0505-p25/src/main/java/ru/mirea/practice/s23k0505/Main.java
@@ -0,0 +1,12 @@
+package ru.mirea.practice.s23k0505;
+
+public final class Main {
+
+ private Main() {
+
+ }
+
+ public static void main(String[] args) {
+ System.out.println("Двадцать пятая практическая работа!");
+ }
+}
diff --git a/students/23K0505/23K0505-p25/src/main/java/ru/mirea/practice/s23k0505/task4/Main.java b/students/23K0505/23K0505-p25/src/main/java/ru/mirea/practice/s23k0505/task4/Main.java
new file mode 100644
index 000000000..043e2e4d0
--- /dev/null
+++ b/students/23K0505/23K0505-p25/src/main/java/ru/mirea/practice/s23k0505/task4/Main.java
@@ -0,0 +1,17 @@
+package ru.mirea.practice.s23k0505.task4;
+
+import java.util.Scanner;
+import java.util.regex.Pattern;
+
+public abstract class Main {
+ public static void main(String[] args) {
+ Pattern pattern = Pattern.compile("([a-zA-Z.\\d])+@(([a-z]+\\.[a-z]+)|[a-z]+)");
+ String input;
+ try (Scanner scanner = new Scanner(System.in)) {
+ input = scanner.nextLine();
+ }
+ if (pattern.matcher(input).matches()) {
+ System.out.println("Input string is a valid email address");
+ }
+ }
+}
diff --git a/students/23K0505/23K0505-p25/src/main/java/ru/mirea/practice/s23k0505/task5/Main.java b/students/23K0505/23K0505-p25/src/main/java/ru/mirea/practice/s23k0505/task5/Main.java
new file mode 100644
index 000000000..43d3878f5
--- /dev/null
+++ b/students/23K0505/23K0505-p25/src/main/java/ru/mirea/practice/s23k0505/task5/Main.java
@@ -0,0 +1,17 @@
+package ru.mirea.practice.s23k0505.task5;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public abstract class Main {
+ public static void main(String[] args) {
+ String text = "Цены: 25.98 USD, 44 ERR, 0.004 EU, 10.00 RUB, 99.95 EUR";
+ Pattern pattern = Pattern.compile("\\b\\d{1,3}(\\.\\d{1,2})? (USD|RUB|EUR)\\b");
+ Matcher matcher = pattern.matcher(text);
+
+ System.out.println("Цены в USD, RUB, EUR:");
+ while (matcher.find()) {
+ System.out.println(matcher.group());
+ }
+ }
+}
diff --git a/students/23K0505/23K0505-p26/pom.xml b/students/23K0505/23K0505-p26/pom.xml
new file mode 100644
index 000000000..efdade08b
--- /dev/null
+++ b/students/23K0505/23K0505-p26/pom.xml
@@ -0,0 +1,13 @@
+
+
+ 4.0.0
+
+ 23K0505
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0505-p26
+ Лабораторная 26
+
diff --git a/students/23K0505/23K0505-p26/src/main/java/ru/mirea/practice/s23k0505/Main.java b/students/23K0505/23K0505-p26/src/main/java/ru/mirea/practice/s23k0505/Main.java
new file mode 100644
index 000000000..4069cf458
--- /dev/null
+++ b/students/23K0505/23K0505-p26/src/main/java/ru/mirea/practice/s23k0505/Main.java
@@ -0,0 +1,12 @@
+package ru.mirea.practice.s23k0505;
+
+public final class Main {
+
+ private Main() {
+
+ }
+
+ public static void main(String[] args) {
+ System.out.println("Двадцать шестая практическая работа!");
+ }
+}
diff --git a/students/23K0505/23K0505-p26/src/main/java/ru/mirea/practice/s23k0505/task1/Main.java b/students/23K0505/23K0505-p26/src/main/java/ru/mirea/practice/s23k0505/task1/Main.java
new file mode 100644
index 000000000..d38dda83f
--- /dev/null
+++ b/students/23K0505/23K0505-p26/src/main/java/ru/mirea/practice/s23k0505/task1/Main.java
@@ -0,0 +1,27 @@
+package ru.mirea.practice.s23k0505.task1;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Stack;
+
+public abstract class Main {
+ public static List reverse(List list) {
+ Stack stack = new Stack<>();
+ int i = 0;
+ while (i < list.size() / 2) {
+ stack.push(list.get(i));
+ stack.push(list.get(list.size() - i - 1));
+ list.set(i, stack.pop());
+ list.set(list.size() - i - 1, stack.pop());
+ i++;
+ }
+ return list;
+ }
+
+ public static void main(String[] args) {
+ ArrayList integers = new ArrayList<>(List.of(new Integer[]{1, 2, 3, 4, 5, 6}));
+ System.out.println(integers);
+ reverse(integers);
+ System.out.println(integers);
+ }
+}
diff --git a/students/23K0505/23K0505-p26/src/main/java/ru/mirea/practice/s23k0505/task2/CustomIterator.java b/students/23K0505/23K0505-p26/src/main/java/ru/mirea/practice/s23k0505/task2/CustomIterator.java
new file mode 100644
index 000000000..9c8274aa6
--- /dev/null
+++ b/students/23K0505/23K0505-p26/src/main/java/ru/mirea/practice/s23k0505/task2/CustomIterator.java
@@ -0,0 +1,20 @@
+package ru.mirea.practice.s23k0505.task2;
+
+import java.util.Iterator;
+
+public class CustomIterator implements Iterator {
+ Node cursor;
+
+ CustomIterator(CustomList list) {
+ cursor = list.getFirst();
+ }
+
+ public boolean hasNext() {
+ return cursor.getNext() != null;
+ }
+
+ public T next() {
+ cursor = cursor.getNext();
+ return cursor.getData();
+ }
+}
diff --git a/students/23K0505/23K0505-p26/src/main/java/ru/mirea/practice/s23k0505/task2/CustomList.java b/students/23K0505/23K0505-p26/src/main/java/ru/mirea/practice/s23k0505/task2/CustomList.java
new file mode 100644
index 000000000..04667df3f
--- /dev/null
+++ b/students/23K0505/23K0505-p26/src/main/java/ru/mirea/practice/s23k0505/task2/CustomList.java
@@ -0,0 +1,39 @@
+package ru.mirea.practice.s23k0505.task2;
+
+import java.util.Iterator;
+
+public class CustomList implements Iterable {
+ private Node first;
+ private final int size;
+
+ public CustomList() {
+ first = null;
+ size = 0;
+ }
+
+ public int getSize() {
+ return size;
+ }
+
+ public Node getFirst() {
+ return first;
+ }
+
+ public void add(T elem) {
+ Node node = new Node<>(elem);
+ if (first == null) {
+ first = node;
+ } else {
+ Node curr = first;
+ while (curr.getNext() != null) {
+ curr = curr.getNext();
+ }
+ curr.setNext(node);
+ }
+ }
+
+ @Override
+ public Iterator iterator() {
+ return new CustomIterator<>(this);
+ }
+}
diff --git a/students/23K0505/23K0505-p26/src/main/java/ru/mirea/practice/s23k0505/task2/Node.java b/students/23K0505/23K0505-p26/src/main/java/ru/mirea/practice/s23k0505/task2/Node.java
new file mode 100644
index 000000000..712e4962c
--- /dev/null
+++ b/students/23K0505/23K0505-p26/src/main/java/ru/mirea/practice/s23k0505/task2/Node.java
@@ -0,0 +1,32 @@
+package ru.mirea.practice.s23k0505.task2;
+
+public class Node {
+ private T data;
+ private Node next;
+
+ public Node(T data) {
+ this.data = data;
+ next = null;
+ }
+
+ public T getData() {
+ return data;
+ }
+
+ public void setData(T data) {
+ this.data = data;
+ }
+
+ public Node getNext() {
+ return next;
+ }
+
+ public void setNext(Node next) {
+ this.next = next;
+ }
+
+ @Override
+ public String toString() {
+ return data.toString();
+ }
+}
diff --git a/students/23K0505/23K0505-p27/pom.xml b/students/23K0505/23K0505-p27/pom.xml
new file mode 100644
index 000000000..0904ff5be
--- /dev/null
+++ b/students/23K0505/23K0505-p27/pom.xml
@@ -0,0 +1,13 @@
+
+
+ 4.0.0
+
+ 23K0505
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0505-p27
+ Лабораторная 27
+
diff --git a/students/23K0505/23K0505-p27/src/main/java/ru/mirea/practice/s23k0505/Main.java b/students/23K0505/23K0505-p27/src/main/java/ru/mirea/practice/s23k0505/Main.java
new file mode 100644
index 000000000..81c676d63
--- /dev/null
+++ b/students/23K0505/23K0505-p27/src/main/java/ru/mirea/practice/s23k0505/Main.java
@@ -0,0 +1,12 @@
+package ru.mirea.practice.s23k0505;
+
+public final class Main {
+
+ private Main() {
+
+ }
+
+ public static void main(String[] args) {
+ System.out.println("Двадцать седьмая практическая работа!");
+ }
+}
diff --git a/students/23K0505/23K0505-p27/src/main/java/ru/mirea/practice/s23k0505/task1/Hashtable.java b/students/23K0505/23K0505-p27/src/main/java/ru/mirea/practice/s23k0505/task1/Hashtable.java
new file mode 100644
index 000000000..6d9a9406c
--- /dev/null
+++ b/students/23K0505/23K0505-p27/src/main/java/ru/mirea/practice/s23k0505/task1/Hashtable.java
@@ -0,0 +1,70 @@
+package ru.mirea.practice.s23k0505.task1;
+
+import java.util.LinkedList;
+
+class Hashtable {
+ private static class KeyValue {
+ String key;
+ String value;
+
+ KeyValue(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+ }
+
+ private LinkedList[] table;
+ private int size;
+
+ @SuppressWarnings("unchecked")
+ public Hashtable(int size) {
+ this.size = size;
+ table = new LinkedList[size];
+ for (int i = 0; i < size; i++) {
+ table[i] = new LinkedList<>();
+ }
+ }
+
+ private int hash(String key) {
+ return Math.abs(key.hashCode() % size);
+ }
+
+ public void add(String key, String value) {
+ int index = hash(key);
+ for (KeyValue kv : table[index]) {
+ if (kv.key.equals(key)) {
+ kv.value = value;
+ return;
+ }
+ }
+ table[index].add(new KeyValue(key, value));
+ }
+
+ public String lookup(String key) {
+ int index = hash(key);
+ for (KeyValue kv : table[index]) {
+ if (kv.key.equals(key)) {
+ return kv.value;
+ }
+ }
+ return null;
+ }
+
+ public void delete(String key) {
+ int index = hash(key);
+ table[index].removeIf(kv -> kv.key.equals(key));
+ }
+
+ public void printTable() {
+ for (int i = 0; i < size; i++) {
+ if (!table[i].isEmpty()) {
+ System.out.print("Bucket " + i + ": ");
+ for (KeyValue kv : table[i]) {
+ System.out.print("[" + kv.key + ": " + kv.value + "] ");
+ }
+ System.out.println();
+ }
+ }
+ }
+}
+
diff --git a/students/23K0505/23K0505-p27/src/main/java/ru/mirea/practice/s23k0505/task1/Test.java b/students/23K0505/23K0505-p27/src/main/java/ru/mirea/practice/s23k0505/task1/Test.java
new file mode 100644
index 000000000..2c290f015
--- /dev/null
+++ b/students/23K0505/23K0505-p27/src/main/java/ru/mirea/practice/s23k0505/task1/Test.java
@@ -0,0 +1,31 @@
+package ru.mirea.practice.s23k0505.task1;
+
+public abstract class Test {
+ public static void main(String[] args) {
+ Hashtable hashTable = new Hashtable(10);
+
+ hashTable.add("key1", "value1");
+ hashTable.add("key2", "value2");
+ hashTable.add("key3", "value3");
+ hashTable.add("key4", "value4");
+ hashTable.add("key5", "value5");
+ hashTable.add("key6", "value6");
+ hashTable.add("key7", "value7");
+ hashTable.add("key8", "value8");
+ hashTable.add("key9", "value9");
+ hashTable.add("key10", "value10");
+
+ System.out.println("Содержимое хеш-таблицы:");
+ hashTable.printTable();
+
+ String value = hashTable.lookup("key5");
+ System.out.println("Поиск key5: " + (value != null ? value : "not found"));
+
+ hashTable.delete("key5");
+ System.out.println("После удаления key5:");
+ hashTable.printTable();
+
+ value = hashTable.lookup("key5");
+ System.out.println("Поиск key5 после удаления: " + (value != null ? value : "not found"));
+ }
+}
diff --git a/students/23K0505/23K0505-p28/pom.xml b/students/23K0505/23K0505-p28/pom.xml
new file mode 100644
index 000000000..d6be8943e
--- /dev/null
+++ b/students/23K0505/23K0505-p28/pom.xml
@@ -0,0 +1,13 @@
+
+
+ 4.0.0
+
+ 23K0505
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0505-p28
+ Лабораторная 28
+
diff --git a/students/23K0505/23K0505-p28/src/main/java/ru/mirea/practice/s23k0505/Main.java b/students/23K0505/23K0505-p28/src/main/java/ru/mirea/practice/s23k0505/Main.java
new file mode 100644
index 000000000..81c676d63
--- /dev/null
+++ b/students/23K0505/23K0505-p28/src/main/java/ru/mirea/practice/s23k0505/Main.java
@@ -0,0 +1,12 @@
+package ru.mirea.practice.s23k0505;
+
+public final class Main {
+
+ private Main() {
+
+ }
+
+ public static void main(String[] args) {
+ System.out.println("Двадцать седьмая практическая работа!");
+ }
+}
diff --git a/students/23K0505/23K0505-p28/src/main/java/ru/mirea/practice/s23k0505/task1/Main.java b/students/23K0505/23K0505-p28/src/main/java/ru/mirea/practice/s23k0505/task1/Main.java
new file mode 100644
index 000000000..5742d1af7
--- /dev/null
+++ b/students/23K0505/23K0505-p28/src/main/java/ru/mirea/practice/s23k0505/task1/Main.java
@@ -0,0 +1,18 @@
+package ru.mirea.practice.s23k0505.task1;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.TreeMap;
+
+public abstract class Main {
+ public static void main(String[] args) {
+ Map hashmap = new HashMap<>();
+ hashmap.put(1, 2005);
+ hashmap.put(2, 2012);
+ hashmap.put(3, 2023);
+ hashmap.put(4, 2027);
+ Map treemap = new TreeMap<>(hashmap);
+ System.out.println(hashmap);
+ System.out.println(treemap);
+ }
+}
diff --git a/students/23K0505/23K0505-p28/src/main/java/ru/mirea/practice/s23k0505/task2/Main.java b/students/23K0505/23K0505-p28/src/main/java/ru/mirea/practice/s23k0505/task2/Main.java
new file mode 100644
index 000000000..45c842f5f
--- /dev/null
+++ b/students/23K0505/23K0505-p28/src/main/java/ru/mirea/practice/s23k0505/task2/Main.java
@@ -0,0 +1,57 @@
+package ru.mirea.practice.s23k0505.task2;
+
+
+import java.util.HashMap;
+import java.util.Map;
+
+public abstract class Main {
+
+ public static Map createMap() {
+ Map map = new HashMap<>();
+ map.put("Кузнецов", "Алексей");
+ map.put("Сидорова", "Мария");
+ map.put("Петров", "Иван");
+ map.put("Кузнецова", "Анна");
+ map.put("Иванов", "Дмитрий");
+ map.put("Петрова", "Мария");
+ map.put("Смирнов", "Алексей");
+ map.put("Иванова", "Елена");
+ map.put("Смирнов", "Иван");
+ map.put("Иванова", "Мария");
+ return map;
+ }
+
+ public static int getSameFirstNameCount(Map map) {
+ Map nameMap = new HashMap<>();
+ for (String value : map.values()) {
+ if (nameMap.containsKey(value)) {
+ nameMap.put(value, nameMap.get(value) + 1);
+ } else {
+ nameMap.put(value, 1);
+ }
+ }
+
+ int count = 0;
+ int nameCount;
+ for (String name : nameMap.keySet()) {
+ nameCount = nameMap.get(name);
+ if (nameCount > 1) {
+ count += nameCount;
+ }
+ }
+
+ return count;
+ }
+
+ public static int getSameLastNameCount(Map map) {
+ return 0;
+ // Данный по условию тип данных Map не позволяет
+ // содержать ключи с одинаковыми значениями
+ }
+
+ public static void main(String[] args) {
+ Map map = createMap();
+ System.out.println(getSameFirstNameCount(map));
+ System.out.println(getSameLastNameCount(map));
+ }
+}
diff --git a/students/23K0505/23K0505-p29/pom.xml b/students/23K0505/23K0505-p29/pom.xml
new file mode 100644
index 000000000..7b7342977
--- /dev/null
+++ b/students/23K0505/23K0505-p29/pom.xml
@@ -0,0 +1,13 @@
+
+
+ 4.0.0
+
+ 23K0505
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0505-p29
+ Лабораторная 29
+
diff --git a/students/23K0505/23K0505-p29/src/main/java/ru/mirea/practice/s23k0505/Main.java b/students/23K0505/23K0505-p29/src/main/java/ru/mirea/practice/s23k0505/Main.java
new file mode 100644
index 000000000..e0ee11bc9
--- /dev/null
+++ b/students/23K0505/23K0505-p29/src/main/java/ru/mirea/practice/s23k0505/Main.java
@@ -0,0 +1,12 @@
+package ru.mirea.practice.s23k0505;
+
+public final class Main {
+
+ private Main() {
+
+ }
+
+ public static void main(String[] args) {
+ System.out.println("Двадцать девятая практическая работа!");
+ }
+}
diff --git a/students/23K0505/23K0505-p29/src/main/java/ru/mirea/practice/s23k0505/task1/Main.java b/students/23K0505/23K0505-p29/src/main/java/ru/mirea/practice/s23k0505/task1/Main.java
new file mode 100644
index 000000000..f68f69a11
--- /dev/null
+++ b/students/23K0505/23K0505-p29/src/main/java/ru/mirea/practice/s23k0505/task1/Main.java
@@ -0,0 +1,35 @@
+package ru.mirea.practice.s23k0505.task1;
+
+
+import java.util.Scanner;
+
+public abstract class Main {
+ public static void main(String[] args) {
+ try (Scanner scanner = new Scanner(System.in)) {
+ int n = scanner.nextInt();
+ if (n == 0) {
+ System.out.println(0);
+ return;
+ }
+
+ int[][] adjacencyMatrix = new int[n][n];
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < n; j++) {
+ adjacencyMatrix[i][j] = scanner.nextInt();
+ }
+ }
+
+ int roadCount = 0;
+ for (int i = 0; i < n; i++) {
+ for (int j = i + 1; j < n; j++) {
+ roadCount += adjacencyMatrix[i][j];
+ }
+ }
+
+ System.out.println(roadCount);
+
+ } catch (RuntimeException e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/students/23K0505/23K0505-p29/src/main/java/ru/mirea/practice/s23k0505/task2/Main.java b/students/23K0505/23K0505-p29/src/main/java/ru/mirea/practice/s23k0505/task2/Main.java
new file mode 100644
index 000000000..a495809ac
--- /dev/null
+++ b/students/23K0505/23K0505-p29/src/main/java/ru/mirea/practice/s23k0505/task2/Main.java
@@ -0,0 +1,48 @@
+package ru.mirea.practice.s23k0505.task2;
+
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.PrintWriter;
+import java.util.Scanner;
+
+public abstract class Main {
+ public static void main(String[] args) throws FileNotFoundException {
+ int[][] graph;
+ int n;
+ try (Scanner scanner = new Scanner(new File("students/23K0120/23K0120-p29/src/main/java/ru/mirea/practice/s23k0120/task2/graph.txt"))) {
+ n = scanner.nextInt();
+ graph = new int[n][n];
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < n; j++) {
+ graph[i][j] = scanner.nextInt();
+ if (graph[i][j] == 0 && i != j) {
+ graph[i][j] = Integer.MAX_VALUE / 2;
+ }
+ }
+ }
+ }
+
+ for (int k = 0; k < n; k++) {
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < n; j++) {
+ graph[i][j] = Math.min(graph[i][j], graph[i][k] + graph[k][j]);
+ }
+ }
+ }
+
+ try (PrintWriter writer = new PrintWriter(new File("students/23K0120/23K0120-p29/src/"
+ + "main/java/ru/mirea/practice/s23k0120/task2/graphShortest.txt"))) {
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < n; j++) {
+ if (graph[i][j] == Integer.MAX_VALUE / 2) {
+ writer.print(0 + " ");
+ } else {
+ writer.print(graph[i][j] + " ");
+ }
+ }
+ writer.println();
+ }
+ }
+ }
+}
diff --git a/students/23K0505/23K0505-p29/src/main/java/ru/mirea/practice/s23k0505/task2/graph.txt b/students/23K0505/23K0505-p29/src/main/java/ru/mirea/practice/s23k0505/task2/graph.txt
new file mode 100644
index 000000000..1795f843e
--- /dev/null
+++ b/students/23K0505/23K0505-p29/src/main/java/ru/mirea/practice/s23k0505/task2/graph.txt
@@ -0,0 +1,7 @@
+6
+0 7 9 0 0 14
+7 0 10 15 0 0
+9 10 0 11 0 2
+0 15 11 0 6 0
+0 0 0 6 0 9
+14 0 2 0 9 0
diff --git a/students/23K0505/23K0505-p29/src/main/java/ru/mirea/practice/s23k0505/task2/graphShortest.txt b/students/23K0505/23K0505-p29/src/main/java/ru/mirea/practice/s23k0505/task2/graphShortest.txt
new file mode 100644
index 000000000..59372392a
--- /dev/null
+++ b/students/23K0505/23K0505-p29/src/main/java/ru/mirea/practice/s23k0505/task2/graphShortest.txt
@@ -0,0 +1,6 @@
+0 7 9 20 20 11
+7 0 10 15 21 12
+9 10 0 11 11 2
+20 15 11 0 6 13
+20 21 11 6 0 9
+11 12 2 13 9 0
diff --git a/students/23K0505/23K0505-p30/pom.xml b/students/23K0505/23K0505-p30/pom.xml
new file mode 100644
index 000000000..11d3b5c30
--- /dev/null
+++ b/students/23K0505/23K0505-p30/pom.xml
@@ -0,0 +1,13 @@
+
+
+ 4.0.0
+
+ 23K0505
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0505-p30
+ Лабораторная 30
+
diff --git a/students/23K0505/23K0505-p30/src/main/java/ru/mirea/practice/s23k0505/Main.java b/students/23K0505/23K0505-p30/src/main/java/ru/mirea/practice/s23k0505/Main.java
new file mode 100644
index 000000000..6024cb79f
--- /dev/null
+++ b/students/23K0505/23K0505-p30/src/main/java/ru/mirea/practice/s23k0505/Main.java
@@ -0,0 +1,12 @@
+package ru.mirea.practice.s23k0505;
+
+public final class Main {
+
+ private Main() {
+
+ }
+
+ public static void main(String[] args) {
+ System.out.println("Тридцатая практическая работа!");
+ }
+}
diff --git a/students/23K0505/23K0505-p30/src/main/java/ru/mirea/practice/s23k0505/task1/BinaryTree.java b/students/23K0505/23K0505-p30/src/main/java/ru/mirea/practice/s23k0505/task1/BinaryTree.java
new file mode 100644
index 000000000..f3f9fafe8
--- /dev/null
+++ b/students/23K0505/23K0505-p30/src/main/java/ru/mirea/practice/s23k0505/task1/BinaryTree.java
@@ -0,0 +1,173 @@
+package ru.mirea.practice.s23k0505.task1;
+
+public class BinaryTree {
+ private E data;
+ private BinaryTree left;
+ private BinaryTree right;
+
+ public BinaryTree() {
+ left = null;
+ right = null;
+ data = null;
+ }
+
+ public BinaryTree(E data) {
+ left = null;
+ right = null;
+ this.data = data;
+ }
+
+ public static int height(BinaryTree tree) {
+ int h1 = 0;
+ int h2 = 0;
+ if (tree == null) {
+ return 0;
+ }
+ if (tree.getLeft() != null) {
+ h1 = height(tree.getLeft());
+ }
+ if (tree.getRight() != null) {
+ h2 = height(tree.getRight());
+ }
+ return Math.max(h1, h2) + 1;
+ }
+
+ public int height() {
+ return height(this);
+ }
+
+ public static void reverse(BinaryTree tree) {
+ BinaryTree treeTemp;
+ if (tree != null) {
+ if (tree.getRight() != null && tree.getLeft() != null) {
+ treeTemp = tree.getLeft();
+ tree.setLeft(tree.getRight());
+ tree.setRight(treeTemp);
+ reverse(tree.getRight());
+ reverse(tree.getLeft());
+ } else if (tree.getRight() == null && tree.getLeft() != null) {
+ reverse(tree.getLeft());
+ } else if (tree.getRight() != null && tree.getLeft() == null) {
+ reverse(tree.getRight());
+ }
+ }
+ }
+
+ public void reverse() {
+ reverse(this);
+ }
+
+ public static boolean lookup(BinaryTree tree, Comparable data) {
+ if (tree == null) {
+ return false;
+ } else {
+ if (data.compareTo(tree.getData()) == 0) {
+ return true;
+ } else {
+ if (data.compareTo(tree.getData()) < 0) {
+ return lookup(tree.getLeft(), data);
+ } else {
+ return lookup(tree.getLeft(), data);
+ }
+ }
+ }
+ }
+
+ public boolean lookup(Comparable data) {
+ return lookup(this, data);
+ }
+
+ public static int getMaxWidth(BinaryTree tree) {
+ int maxWidth = 0;
+ int width = 0;
+ int height = height(tree);
+ for (int i = 0; i < height; i++) {
+ width = getWidth(tree, i);
+ if (width > maxWidth) {
+ maxWidth = width;
+ }
+ }
+ return maxWidth;
+ }
+
+ public static int getWidth(BinaryTree tree, int level) {
+ if (tree == null) {
+ return 0;
+ }
+ if (level == 1) {
+ return 1;
+ }
+ return getWidth(tree.getLeft(), level - 1) + getWidth(tree.getRight(), level - 1);
+ }
+
+ public static int size(BinaryTree tree) {
+ if (tree == null) {
+ return 0;
+ }
+ return size(tree.getLeft()) + 1 + size(tree.getRight());
+ }
+
+ public int size() {
+ return size(this);
+ }
+
+ public static boolean isEqual(BinaryTree treeA, BinaryTree treeB) {
+ if (treeA == null && treeB == null) {
+ return true;
+ } else if (treeA != null && treeB != null) {
+ return treeA.getData().equals(treeB.getData())
+ && isEqual(treeA.getLeft(), treeB.getLeft())
+ && isEqual(treeA.getRight(), treeB.getRight());
+ }
+ return false;
+ }
+
+ public E getData() {
+ return data;
+ }
+
+ public void setData(E data) {
+ this.data = data;
+ }
+
+ public BinaryTree getLeft() {
+ return left;
+ }
+
+ public void setLeft(BinaryTree left) {
+ this.left = left;
+ }
+
+ public BinaryTree getRight() {
+ return right;
+ }
+
+ public void setRight(BinaryTree right) {
+ this.right = right;
+ }
+
+ public void addRight(E data) {
+ this.right = new BinaryTree<>(data);
+ }
+
+ public void addLeft(E data) {
+ this.left = new BinaryTree<>(data);
+ }
+
+ @Override
+ public String toString() {
+ String string = "";
+ string += "Tree: {";
+ if (this.getData() != null) {
+ string += this.getData().toString();
+ }
+ if (this.left != null) {
+ string += this.left.toString();
+ }
+ if (this.right != null) {
+ string += this.right.toString();
+ }
+ string += "} ";
+ return string;
+ }
+}
diff --git a/students/23K0505/23K0505-p30/src/main/java/ru/mirea/practice/s23k0505/task2/DataFreq.java b/students/23K0505/23K0505-p30/src/main/java/ru/mirea/practice/s23k0505/task2/DataFreq.java
new file mode 100644
index 000000000..5a31d245b
--- /dev/null
+++ b/students/23K0505/23K0505-p30/src/main/java/ru/mirea/practice/s23k0505/task2/DataFreq.java
@@ -0,0 +1,29 @@
+package ru.mirea.practice.s23k0505.task2;
+
+public class DataFreq implements Comparable {
+ private final E data;
+ private final double frequency;
+
+ public DataFreq(E data, double frequency) {
+ this.data = data;
+ this.frequency = frequency;
+ }
+
+ public E getData() {
+ return data;
+ }
+
+ public double getFrequency() {
+ return frequency;
+ }
+
+ @Override
+ public int compareTo(Object o) {
+ return Double.compare(frequency, ((DataFreq>) o).getFrequency());
+ }
+
+ @Override
+ public String toString() {
+ return "Data:{" + data + "; Frequency: " + frequency + "}";
+ }
+}
diff --git a/students/23K0505/23K0505-p30/src/main/java/ru/mirea/practice/s23k0505/task2/Huffman.java b/students/23K0505/23K0505-p30/src/main/java/ru/mirea/practice/s23k0505/task2/Huffman.java
new file mode 100644
index 000000000..06ea69650
--- /dev/null
+++ b/students/23K0505/23K0505-p30/src/main/java/ru/mirea/practice/s23k0505/task2/Huffman.java
@@ -0,0 +1,68 @@
+package ru.mirea.practice.s23k0505.task2;
+
+import ru.mirea.practice.s23k0505.task1.BinaryTree;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.PriorityQueue;
+
+public abstract class Huffman {
+ // This is the worst code I've ever written
+ // but I don't have time to rewrite it
+
+ public static BinaryTree> huffman(List> elements) {
+ PriorityQueue> queue = new PriorityQueue<>();
+ for (DataFreq element : elements) {
+ queue.add(new DataFreq<>(new BinaryTree(element.getData()), element.getFrequency()));
+ }
+ while (queue.size() != 1) {
+ DataFreq> el1 = queue.poll();
+ DataFreq> el2 = queue.poll();
+ BinaryTree> tempTree = new BinaryTree<>();
+ if (el1.compareTo(el2) <= 0) {
+ tempTree.addLeft(el1);
+ tempTree.addRight(el2);
+ } else {
+ tempTree.addLeft(el2);
+ tempTree.addRight(el1);
+ }
+ queue.add(new DataFreq<>(tempTree, el1.getFrequency() + el2.getFrequency()));
+ }
+ return new BinaryTree<>(queue.poll());
+ }
+
+ public static void makeHuffmanCodesMap(String code, Map map, BinaryTree> tree) {
+ if (tree.getData() instanceof DataFreq) {
+ tree = (BinaryTree>) ((DataFreq) tree.getData()).getData();
+ }
+ if (tree.getLeft() != null) {
+ makeHuffmanCodesMap(code + "0", map, tree.getLeft());
+ }
+ if (tree.getLeft() != null) {
+ makeHuffmanCodesMap(code + "1", map, tree.getRight());
+ }
+ if (tree.getLeft() == null && tree.getRight() == null) {
+ map.put((E) tree.getData(), code);
+ }
+ }
+
+ public static void makeHuffmanCodesMap(Map map, BinaryTree> tree) {
+ makeHuffmanCodesMap("", map, tree);
+ }
+
+ public static void main(String[] args) {
+ List> charFreq = new ArrayList<>();
+ charFreq.add(new DataFreq<>('a', 5));
+ charFreq.add(new DataFreq<>('b', 9));
+ charFreq.add(new DataFreq<>('c', 12));
+ charFreq.add(new DataFreq<>('d', 13));
+ charFreq.add(new DataFreq<>('e', 16));
+ charFreq.add(new DataFreq<>('f', 45));
+ BinaryTree> tree = huffman(charFreq);
+ HashMap map = new HashMap<>();
+ makeHuffmanCodesMap(map, tree);
+ System.out.println(map);
+ }
+}
diff --git a/students/23K0505/23K0505-p30_2/pom.xml b/students/23K0505/23K0505-p30_2/pom.xml
new file mode 100644
index 000000000..27df89d88
--- /dev/null
+++ b/students/23K0505/23K0505-p30_2/pom.xml
@@ -0,0 +1,13 @@
+
+
+ 4.0.0
+
+ 23K0505
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0505-p30_2
+ Лабораторная 30_2
+
diff --git a/students/23K0505/23K0505-p30_2/src/main/java/ru/mirea/practice/s23k0505/Main.java b/students/23K0505/23K0505-p30_2/src/main/java/ru/mirea/practice/s23k0505/Main.java
new file mode 100644
index 000000000..d8a5b42ab
--- /dev/null
+++ b/students/23K0505/23K0505-p30_2/src/main/java/ru/mirea/practice/s23k0505/Main.java
@@ -0,0 +1,12 @@
+package ru.mirea.practice.s23k0505;
+
+public final class Main {
+
+ private Main() {
+
+ }
+
+ public static void main(String[] args) {
+ System.out.println("Тридцатая_2 практическая работа!");
+ }
+}
diff --git a/students/23K0505/23K0505-p30_2/src/main/java/ru/mirea/practice/s23k0505/task1/BinaryTree2.java b/students/23K0505/23K0505-p30_2/src/main/java/ru/mirea/practice/s23k0505/task1/BinaryTree2.java
new file mode 100644
index 000000000..d4b8f6dbe
--- /dev/null
+++ b/students/23K0505/23K0505-p30_2/src/main/java/ru/mirea/practice/s23k0505/task1/BinaryTree2.java
@@ -0,0 +1,117 @@
+package ru.mirea.practice.s23k0505.task1;
+
+class BinaryTree2 {
+ Node root;
+ int count;
+
+ public BinaryTree2() {
+ root = null;
+ count = 0;
+ }
+
+ public void insert(int item) {
+ Node newNode = new Node(item);
+ if (root == null) {
+ root = newNode;
+ count++;
+ return;
+ }
+
+ Node current = root;
+ Node parent = null;
+
+ while (true) {
+ parent = current;
+ if (item < current.data) {
+ current = current.left;
+ if (current == null) {
+ parent.left = newNode;
+ count++;
+ return;
+ }
+ } else if (item > current.data) {
+ current = current.right;
+ if (current == null) {
+ parent.right = newNode;
+ count++;
+ return;
+ } else {
+ return;
+ }
+ } else {
+ return;
+ }
+ }
+ }
+
+ public void inorder() {
+ inorderRec(root);
+ System.out.println();
+ }
+
+ private void inorderRec(Node node) {
+ if (node != null) {
+ inorderRec(node.left);
+ System.out.print(node.data + " ");
+ inorderRec(node.right);
+ }
+ }
+
+ public boolean delete(int key) {
+ Node current = root;
+ Node parent = null;
+
+ while (current != null && current.data != key) {
+ parent = current;
+ if (key < current.data) {
+ current = current.left;
+ } else {
+ current = current.right;
+ }
+ }
+
+ if (current == null) {
+ return false;
+ }
+
+ if (current.left == null && current.right == null) {
+ if (current == root) {
+ root = null;
+ } else if (parent.left == current) {
+ parent.left = null;
+ } else {
+ parent.right = null;
+ }
+ } else if (current.left == null || current.right == null) {
+ Node child = (current.left != null) ? current.left : current.right;
+ if (current == root) {
+ root = child;
+ } else if (parent.left == current) {
+ parent.left = child;
+ } else {
+ parent.right = child;
+ }
+ } else {
+ Node successor = findMin(current.right);
+ int val = successor.data;
+ delete(successor.data);
+ current.data = val;
+ }
+
+ count--;
+ return true;
+ }
+
+ private Node findMin(Node node) {
+ while (node.left != null) {
+ node = node.left;
+ }
+ return node;
+ }
+
+ public void destroyTree() {
+ root = null;
+ count = 0;
+ }
+}
+
diff --git a/students/23K0505/23K0505-p30_2/src/main/java/ru/mirea/practice/s23k0505/task1/Node.java b/students/23K0505/23K0505-p30_2/src/main/java/ru/mirea/practice/s23k0505/task1/Node.java
new file mode 100644
index 000000000..8b7c914fd
--- /dev/null
+++ b/students/23K0505/23K0505-p30_2/src/main/java/ru/mirea/practice/s23k0505/task1/Node.java
@@ -0,0 +1,12 @@
+package ru.mirea.practice.s23k0505.task1;
+
+public class Node {
+ int data;
+ Node left;
+ Node right;
+
+ public Node(int item) {
+ data = item;
+ left = right = null;
+ }
+}
diff --git a/students/23K0505/23K0505-p30_2/src/main/java/ru/mirea/practice/s23k0505/task1/TestBinaryTree2.java b/students/23K0505/23K0505-p30_2/src/main/java/ru/mirea/practice/s23k0505/task1/TestBinaryTree2.java
new file mode 100644
index 000000000..d86d5b320
--- /dev/null
+++ b/students/23K0505/23K0505-p30_2/src/main/java/ru/mirea/practice/s23k0505/task1/TestBinaryTree2.java
@@ -0,0 +1,30 @@
+package ru.mirea.practice.s23k0505.task1;
+
+public abstract class TestBinaryTree2 {
+ public static void main(String[] args) {
+ BinaryTree2 tree = new BinaryTree2();
+
+ int[] nodes = {50, 30, 20, 40, 70, 60, 80, 10, 90, 5};
+ for (int node : nodes) {
+ tree.insert(node);
+ }
+
+ // Печать содержимого дерева
+ System.out.println("Содержимое дерева в сортированном порядке:");
+ tree.inorder();
+
+ // Удаление одного узла
+ int keyToDelete = 70;
+ System.out.println("Удаление узла с ключом: " + keyToDelete);
+ tree.delete(keyToDelete);
+
+ // Печать после удаления узла
+ System.out.println("Содержимое дерева после удаления узла:");
+ tree.inorder();
+
+ // Полное удаление дерева
+ tree.destroyTree();
+ System.out.println("Дерево было успешно удалено.");
+ }
+}
+
diff --git a/students/23K0505/23K0505-p31/pom.xml b/students/23K0505/23K0505-p31/pom.xml
new file mode 100644
index 000000000..84f8c4254
--- /dev/null
+++ b/students/23K0505/23K0505-p31/pom.xml
@@ -0,0 +1,13 @@
+
+
+ 4.0.0
+
+ 23K0505
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0505-p31
+ Лабораторная 31
+
diff --git a/students/23K0505/23K0505-p31/src/main/java/ru/mirea/practice/s23k0505/Main.java b/students/23K0505/23K0505-p31/src/main/java/ru/mirea/practice/s23k0505/Main.java
new file mode 100644
index 000000000..5ef8a66fd
--- /dev/null
+++ b/students/23K0505/23K0505-p31/src/main/java/ru/mirea/practice/s23k0505/Main.java
@@ -0,0 +1,12 @@
+package ru.mirea.practice.s23k0505;
+
+public final class Main {
+
+ private Main() {
+
+ }
+
+ public static void main(String[] args) {
+ System.out.println("Тридцать первая практическая работа!");
+ }
+}
diff --git a/students/23K0505/23K0505-p31/src/main/java/ru/mirea/practice/s23k0505/task1/Node.java b/students/23K0505/23K0505-p31/src/main/java/ru/mirea/practice/s23k0505/task1/Node.java
new file mode 100644
index 000000000..b3ee93841
--- /dev/null
+++ b/students/23K0505/23K0505-p31/src/main/java/ru/mirea/practice/s23k0505/task1/Node.java
@@ -0,0 +1,119 @@
+package ru.mirea.practice.s23k0505.task1;
+
+public class Node {
+ int numberOfKeys; // количество занятых ключей
+ int[] key = new int[3];
+ Node first;
+ Node second;
+ Node third;
+ Node fourth;
+ Node parents; // указатель на родителей
+
+ boolean find(int k) { // ключ находится в вершине или нет
+ for (int i = 0; i < numberOfKeys; i++) {
+ if (key[i] == k) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ void swap(int x, int y) {
+ int tempInt = x;
+ x = y;
+ y = tempInt;
+ }
+
+ void sort2(int x, int y) {
+ if (x > y) {
+ swap(x, y);
+ }
+ }
+
+ void sort3(int x, int y, int z) {
+ if (x > y) {
+ swap(x, y);
+ }
+
+ if (x > z) {
+ swap(x, y);
+ }
+
+ if (y > z) {
+ swap(y, z);
+ }
+ }
+
+ void sort() {
+ if (numberOfKeys == 2) {
+ sort2(key[0], key[1]);
+ } else if (numberOfKeys == 3) {
+ sort3(key[0], key[1], key[2]);
+ }
+ }
+
+ void addKeyInNode(int k) {
+ key[numberOfKeys] = k;
+ numberOfKeys++;
+ sort();
+ }
+
+ void deleteKeyFromNode(int k) {
+ if (numberOfKeys >= 1 && key[0] == k) {
+ key[0] = key[1];
+ key[1] = key[2];
+ numberOfKeys--;
+ } else if (numberOfKeys == 2 && key[1] == k) {
+ key[1] = key[2];
+ numberOfKeys--;
+ }
+ }
+
+ void becomeNode2(int k, Node first, Node second) {
+ key[0] = k;
+ this.first = first;
+ this.second = second;
+ this.third = null;
+ this.fourth = null;
+ this.parents = null;
+ numberOfKeys = 1;
+ }
+
+ boolean isLeaf() {
+ return first == null && second == null && third == null;
+ }
+
+ public Node(int key) {
+ numberOfKeys = 1;
+ this.key[0] = key;
+ first = null;
+ second = null;
+ third = null;
+ fourth = null;
+ parents = null;
+ }
+
+ public Node(int key, Node first, Node second, Node third, Node fourth, Node parents) {
+ numberOfKeys = 1;
+ this.key[0] = key;
+ this.first = first;
+ this.second = second;
+ this.third = third;
+ this.fourth = fourth;
+ this.parents = parents;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("[");
+ for (int i = 0; i < numberOfKeys; i++) {
+ sb.append(key[i]);
+ if (i < numberOfKeys - 1) {
+ sb.append(", ");
+ }
+ }
+ sb.append("]");
+ return sb.toString();
+ }
+}
diff --git a/students/23K0505/23K0505-p31/src/main/java/ru/mirea/practice/s23k0505/task1/Test.java b/students/23K0505/23K0505-p31/src/main/java/ru/mirea/practice/s23k0505/task1/Test.java
new file mode 100644
index 000000000..54a3504bd
--- /dev/null
+++ b/students/23K0505/23K0505-p31/src/main/java/ru/mirea/practice/s23k0505/task1/Test.java
@@ -0,0 +1,16 @@
+package ru.mirea.practice.s23k0505.task1;
+
+public abstract class Test {
+ public static void main(String[] args) {
+
+ TwoThreeTree tree = new TwoThreeTree();
+ tree.root = tree.insert(tree.root, 50);
+ tree.root = tree.insert(tree.root, 30);
+ tree.root = tree.insert(tree.root, 70);
+ tree.root = tree.insert(tree.root, 20);
+ tree.root = tree.insert(tree.root, 40);
+ tree.printTree();
+
+ }
+}
+
diff --git a/students/23K0505/23K0505-p31/src/main/java/ru/mirea/practice/s23k0505/task1/TwoThreeTree.java b/students/23K0505/23K0505-p31/src/main/java/ru/mirea/practice/s23k0505/task1/TwoThreeTree.java
new file mode 100644
index 000000000..acbdd1e3b
--- /dev/null
+++ b/students/23K0505/23K0505-p31/src/main/java/ru/mirea/practice/s23k0505/task1/TwoThreeTree.java
@@ -0,0 +1,464 @@
+package ru.mirea.practice.s23k0505.task1;
+
+import java.util.LinkedList;
+import java.util.Queue;
+
+
+public class TwoThreeTree {
+ Node root;
+
+ public Node insert(Node root, int key) {
+ if (root == null) {
+ return new Node(key);
+ }
+ if (root.isLeaf()) {
+ root.addKeyInNode(key);
+ } else if (key <= root.key[0]) {
+ root.first = insert(root.first, key);
+ } else if (root.numberOfKeys == 1 || root.numberOfKeys == 2 && key <= root.key[1]) {
+ root.second = insert(root.second, key);
+ } else {
+ root.third = insert(root.third, key);
+ }
+ return split(root);
+ }
+
+ Node split(Node node) {
+ if (node.numberOfKeys < 3) {
+ return node;
+ }
+ Node x = new Node(node.key[0], node.first, node.second, null, null, node.parents);
+ Node y = new Node(node.key[2], node.third, node.fourth, null, null, node.parents);
+
+ // Устанавливаем правильных родителей
+ if (x.first != null) {
+ x.first.parents = x;
+ }
+
+ if (x.second != null) {
+ x.second.parents = x;
+ }
+
+ if (y.first != null) {
+ x.first.parents = y;
+ }
+
+ if (y.second != null) {
+ y.second.parents = y;
+ }
+
+ if (node.parents != null) {
+ node.parents.addKeyInNode(node.key[1]);
+ // Убираем ссылку на разделяемый узел из родительского узла
+ if (node.parents.first == node) {
+ node.parents.first = null;
+ } else if (node.parents.second == node) {
+ node.parents.second = null;
+ } else if (node.parents.third == node) {
+ node.parents.third = null;
+ }
+
+ // Обновляем ссылки на дочерные узлы в родительском узле
+ if (node.parents.first == null) {
+ node.parents.fourth = node.parents.third;
+ node.parents.third = node.parents.second;
+ node.parents.second = y;
+ node.parents.first = x;
+ } else if (node.parents.second == null) {
+ node.parents.fourth = node.parents.third;
+ node.parents.third = y;
+ node.parents.second = x;
+ } else {
+ node.parents.fourth = y;
+ node.parents.third = x;
+ }
+
+ Node temp = node.parents;
+ node = null;
+ return temp;
+ } else {
+ x.parents = node;
+ y.parents = node;
+ node.becomeNode2(node.key[1], x, y);
+ return node;
+ }
+ }
+
+ // Поиск ключа
+ Node search(Node node, int key) {
+ if (node == null) {
+ return null;
+ }
+
+ if (node.find(key)) {
+ return node;
+ } else if (key < node.key[0]) {
+ return search(node.first, key);
+ } else if (node.numberOfKeys == 2 && key < node.key[1] || node.numberOfKeys == 1) {
+ return search(node.second, key);
+ } else if (node.numberOfKeys == 2) {
+ return search(node.third, key);
+ }
+ return null;
+ }
+
+ // Поиск минимального ключа
+ Node searchMin(Node node) {
+ if (node == null) {
+ return node;
+ }
+
+ if (node.first == null) {
+ return node;
+ } else {
+ return searchMin(node.first);
+ }
+ }
+
+ // Удаление ключа
+ Node remove(Node node, int key) {
+ Node item = search(node, key);
+
+ if (item == null) {
+ return node;
+ }
+
+ Node min = null;
+ if (item.key[0] == key) {
+ min = searchMin(item.second);
+ } else {
+ min = searchMin(item.third);
+ }
+
+ if (min != null) {
+ int z = key == item.key[0] ? item.key[0] : item.key[1];
+ item.swap(z, min.key[0]);
+ item = min;
+ }
+
+ item.deleteKeyFromNode(key);
+ return fix(item);
+ }
+
+ // Исправление дерева после удаления ключа
+ Node fix(Node node) {
+ if (node.numberOfKeys == 0 && node.parents == null) {
+ return null;
+ }
+
+ if (node.numberOfKeys != 0) {
+ if (node.parents != null) {
+ return fix(node.parents);
+ } else {
+ return node;
+ }
+ }
+
+ Node parent = node.parents;
+ if (parent.first.numberOfKeys == 2 || parent.second.numberOfKeys == 2 || parent.numberOfKeys == 2) {
+ node = redistribute(node);
+ } else if (parent.numberOfKeys == 2 && parent.third.numberOfKeys == 2) {
+ node = redistribute(node);
+ } else {
+ node = merge(node);
+ }
+ return fix(node);
+ }
+
+ // Перераспределение
+ Node redistribute(Node leaf) {
+ Node parent = leaf.parents;
+ Node first = parent.first;
+ Node second = parent.second;
+ Node third = parent.third;
+
+ if (parent.numberOfKeys == 2 && first.numberOfKeys < 2 && second.numberOfKeys < 2
+ && third.numberOfKeys < 2) {
+
+ if (first == leaf) {
+ parent.first = parent.second;
+ parent.second = parent.third;
+ parent.third = null;
+ parent.first.addKeyInNode(parent.key[0]);
+ parent.first.third = parent.first.second;
+ parent.first.second = parent.first.first;
+
+
+ if (leaf.first != null) {
+ parent.first.first = leaf.first;
+ } else if (leaf.second != null) {
+ parent.first.first = leaf.second;
+ }
+
+ if (parent.first.parents == null) {
+ parent.first.first.parents = parent.first;
+ }
+
+ parent.deleteKeyFromNode(parent.key[0]);
+ first = null;
+
+ } else if (second == leaf) {
+ first.addKeyInNode(parent.key[0]);
+ parent.deleteKeyFromNode(parent.key[0]);
+ if (leaf.first != null) {
+ first.third = leaf.first;
+ } else if (leaf.second != null) {
+ first.third = leaf.second;
+ }
+
+ if (first.third != null) {
+ first.third.parents = first;
+ }
+ parent.second = parent.third;
+ parent.third = null;
+ second = null;
+
+ } else if (third == leaf) {
+ second.addKeyInNode(parent.key[1]);
+ parent.third = null;
+ parent.deleteKeyFromNode(parent.key[1]);
+
+ if (leaf.first != null) {
+ second.third = leaf.first;
+ } else if (leaf.second != null) {
+ second.third = leaf.second;
+ }
+
+ if (second.third != null) {
+ second.third.parents = second;
+ }
+ third = null;
+ }
+ } else if (parent.numberOfKeys == 2 && (first.numberOfKeys == 2
+ || second.numberOfKeys == 2 || third.numberOfKeys == 2)) {
+
+ if (third == leaf) {
+
+ if (leaf.first != null) {
+ leaf.second = leaf.first;
+ leaf.first = null;
+ }
+
+ leaf.addKeyInNode(parent.key[1]);
+
+ if (second.numberOfKeys == 2) {
+ parent.key[1] = second.key[1];
+ leaf.first = second.third;
+ second.third = null;
+
+ if (leaf.first != null) {
+ leaf.first.parents = leaf;
+ }
+ } else if (first.numberOfKeys == 2) {
+ parent.key[1] = second.key[0];
+ leaf.first = second.second;
+ second.second = second.first;
+
+ if (leaf.first != null) {
+ leaf.first.parents = leaf;
+ }
+
+ second.key[0] = parent.key[0];
+ parent.key[0] = first.key[1];
+ first.deleteKeyFromNode(first.key[1]);
+ second.first = first.third;
+
+ if (second.first != null) {
+ second.first.parents = second;
+ }
+ first.third = null;
+ }
+
+
+ } else if (second == leaf) {
+
+ if (third.numberOfKeys == 2) {
+
+ if (leaf.first == null) {
+ leaf.first = leaf.second;
+ leaf.second = null;
+ }
+
+ second.addKeyInNode(parent.key[1]);
+ parent.key[1] = third.key[0];
+ third.deleteKeyFromNode(third.key[0]);
+ second.second = third.first;
+
+ if (second.second != null) {
+ second.second.parents = second;
+ }
+ third.first = third.second;
+ third.second = third.third;
+ third.third = null;
+ } else if (first.numberOfKeys == 2) {
+ if (leaf.second == null) {
+ leaf.second = leaf.first;
+ leaf.first = null;
+ }
+ second.addKeyInNode(parent.key[0]);
+ parent.key[0] = first.key[1];
+ first.deleteKeyFromNode(first.key[1]);
+ second.first = first.third;
+ if (second.first != null) {
+ second.first.parents = second;
+ }
+ first.third = null;
+ }
+
+
+ } else if (first == leaf) {
+
+ if (leaf.first == null) {
+ leaf.first = leaf.second;
+ leaf.second = null;
+ }
+ first.addKeyInNode(parent.key[0]);
+
+ if (second.numberOfKeys == 2) {
+ parent.key[0] = second.key[0];
+ second.deleteKeyFromNode(second.key[0]);
+ first.second = second.first;
+
+ if (first.second != null) {
+ first.second.parents = first;
+ }
+ second.first = second.second;
+ second.second = second.third;
+ second.third = null;
+ } else if (third.numberOfKeys == 2) {
+ parent.key[0] = second.key[0];
+ second.key[0] = parent.key[1];
+ parent.key[1] = third.key[0];
+ third.deleteKeyFromNode(third.key[0]);
+ first.second = second.first;
+
+ if (first.second != null) {
+ first.second.parents = first;
+ }
+ second.first = second.second;
+ second.second = third.first;
+
+ if (second.second != null) {
+ second.second.parents = second;
+ }
+ third.first = third.second;
+ third.second = third.third;
+ third.third = null;
+ }
+ }
+ } else if (parent.numberOfKeys == 1) {
+ leaf.addKeyInNode(parent.key[0]);
+
+ if (first == leaf && second.numberOfKeys == 2) {
+ parent.key[0] = second.key[0];
+ second.deleteKeyFromNode(second.key[0]);
+
+ if (leaf.first == null) {
+ leaf.first = leaf.second;
+ }
+ leaf.second = second.first;
+ second.first = second.second;
+ second.second = second.third;
+ second.third = null;
+
+ if (leaf.second != null) {
+ leaf.second.parents = leaf;
+ }
+ } else if (second == leaf && first.numberOfKeys == 2) {
+ parent.key[0] = first.key[1];
+ first.deleteKeyFromNode(first.key[1]);
+
+ if (leaf.second == null) {
+ leaf.second = leaf.first;
+ }
+ leaf.first = first.third;
+ first.third = null;
+
+ if (leaf.first != null) {
+ leaf.first.parents = leaf;
+ }
+ }
+ }
+ return parent;
+ }
+
+ // Склеивание
+ Node merge(Node leaf) {
+ Node parent = leaf.parents;
+
+ if (parent.first == leaf) {
+ parent.second.addKeyInNode(parent.key[0]);
+ parent.second.third = parent.second.second;
+ parent.second.second = parent.second.first;
+
+ if (leaf.first != null) {
+ parent.second.first = leaf.first;
+ } else if (leaf.second != null) {
+ parent.second.first = leaf.second;
+ }
+
+ if (parent.second.first != null) {
+ parent.second.first.parents = parent.second;
+ }
+ parent.deleteKeyFromNode(parent.key[0]);
+ parent.first = null;
+ } else if (parent.second == leaf) {
+ parent.first.addKeyInNode(parent.key[0]);
+
+ if (leaf.first != null) {
+ parent.first.third = leaf.first;
+ } else if (leaf.second != null) {
+ parent.first.third = leaf.second;
+ }
+
+ if (parent.first.third != null) {
+ parent.first.third.parents = parent.first;
+ }
+ parent.deleteKeyFromNode(parent.key[0]);
+ parent.second = null;
+ }
+
+ if (parent.parents == null) {
+ Node temp = null;
+ if (parent.first != null) {
+ temp = parent.first;
+ } else {
+ temp = parent.second;
+ }
+ temp.parents = null;
+ parent = null;
+ return temp;
+ }
+
+ return parent;
+ }
+
+ public void printTree() {
+ if (root == null) {
+ System.out.println("Tree is empty.");
+ return;
+ }
+
+ Queue queue = new LinkedList<>();
+ queue.add(root);
+
+ while (!queue.isEmpty()) {
+ int levelSize = queue.size(); // Количество узлов на текущем уровне
+ for (int i = 0; i < levelSize; i++) {
+ Node current = queue.poll();
+ System.out.print(current + " "); // Печатаем текущий узел
+
+ if (current.first != null) {
+ queue.add(current.first);
+ }
+ if (current.second != null) {
+ queue.add(current.second);
+ }
+ if (current.third != null) {
+ queue.add(current.third);
+ }
+ }
+ System.out.println();
+ }
+ }
+}
diff --git a/students/23K0505/23K0505-p32/pom.xml b/students/23K0505/23K0505-p32/pom.xml
new file mode 100644
index 000000000..453b2be25
--- /dev/null
+++ b/students/23K0505/23K0505-p32/pom.xml
@@ -0,0 +1,13 @@
+
+
+ 4.0.0
+
+ 23K0505
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0505-p32
+ Лабораторная 32
+
diff --git a/students/23K0505/23K0505-p32/src/main/java/ru/mirea/practice/s23k0505/Main.java b/students/23K0505/23K0505-p32/src/main/java/ru/mirea/practice/s23k0505/Main.java
new file mode 100644
index 000000000..dfcb009cb
--- /dev/null
+++ b/students/23K0505/23K0505-p32/src/main/java/ru/mirea/practice/s23k0505/Main.java
@@ -0,0 +1,12 @@
+package ru.mirea.practice.s23k0505;
+
+public final class Main {
+
+ private Main() {
+
+ }
+
+ public static void main(String[] args) {
+ System.out.println("Тридцать вторая практическая работа!");
+ }
+}
diff --git a/students/23K0505/23K0505-p32/src/main/java/ru/mirea/practice/s23k0505/task1/Permutations.java b/students/23K0505/23K0505-p32/src/main/java/ru/mirea/practice/s23k0505/task1/Permutations.java
new file mode 100644
index 000000000..8e5ba9501
--- /dev/null
+++ b/students/23K0505/23K0505-p32/src/main/java/ru/mirea/practice/s23k0505/task1/Permutations.java
@@ -0,0 +1,78 @@
+package ru.mirea.practice.s23k0505.task1;
+
+public abstract class Permutations {
+
+ static class Element {
+ int value;
+ int direction;
+
+ Element(int value) {
+ this.value = value;
+ this.direction = -1;
+ }
+ }
+
+ public static void generatePermutations(int n) {
+ Element[] elements = new Element[n];
+
+ for (int i = 0; i < n; i++) {
+ elements[i] = new Element(i + 1);
+ }
+
+ while (true) {
+ printCurrentPermutation(elements);
+ int mobileIndex = getMobileIndex(elements);
+ if (mobileIndex == -1) {
+ break;
+ }
+
+ int newIndex = mobileIndex + elements[mobileIndex].direction;
+ swap(elements, mobileIndex, newIndex);
+ updateDirections(elements, elements[newIndex].value);
+ }
+ }
+
+ private static void printCurrentPermutation(Element[] elements) {
+ for (Element element : elements) {
+ System.out.print(element.value + " ");
+ }
+ System.out.println();
+ }
+
+ private static int getMobileIndex(Element[] elements) {
+ int mobileIndex = -1;
+ for (int i = 0; i < elements.length; i++) {
+ if (isMobile(elements, i) && (mobileIndex == -1 || elements[i].value > elements[mobileIndex].value)) {
+ mobileIndex = i;
+ }
+ }
+ return mobileIndex;
+ }
+
+ private static boolean isMobile(Element[] elements, int index) {
+ if (elements[index].direction == -1) {
+ return index > 0 && elements[index].value > elements[index - 1].value;
+ } else {
+ return index < elements.length - 1 && elements[index].value > elements[index + 1].value;
+ }
+ }
+
+ private static void swap(Element[] elements, int i, int j) {
+ Element temp = elements[i];
+ elements[i] = elements[j];
+ elements[j] = temp;
+ }
+
+ private static void updateDirections(Element[] elements, int mobileValue) {
+ for (Element el : elements) {
+ if (el.value > mobileValue) {
+ el.direction = -el.direction;
+ }
+ }
+ }
+
+ public static void main(String[] args) {
+ int n = 3;
+ generatePermutations(n);
+ }
+}
diff --git a/students/23K0505/pom.xml b/students/23K0505/pom.xml
index 0b34b738c..0201e2cb7 100644
--- a/students/23K0505/pom.xml
+++ b/students/23K0505/pom.xml
@@ -34,5 +34,18 @@
23K0505-p18
23K0505-p19
23K0505-p20
+ 23K0505-p21
+ 23K0505-p22
+ 23K0505-p23
+ 23K0505-p24
+ 23K0505-p25
+ 23K0505-p26
+ 23K0505-p27
+ 23K0505-p28
+ 23K0505-p29
+ 23K0505-p30
+ 23K0505-p30_2
+ 23K0505-p31
+ 23K0505-p32