diff --git a/students/23K0087/23K0087-p21/pom.xml b/students/23K0087/23K0087-p21/pom.xml
new file mode 100644
index 000000000..c76e45590
--- /dev/null
+++ b/students/23K0087/23K0087-p21/pom.xml
@@ -0,0 +1,13 @@
+
+
+ 4.0.0
+
+ 23K0087
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0087-p21
+ Двадцать первое задание
+
diff --git a/students/23K0087/23K0087-p21/src/main/java/ru/mirea/practice/s23k0087/task1/ArrayToList.java b/students/23K0087/23K0087-p21/src/main/java/ru/mirea/practice/s23k0087/task1/ArrayToList.java
new file mode 100644
index 000000000..ae9552aef
--- /dev/null
+++ b/students/23K0087/23K0087-p21/src/main/java/ru/mirea/practice/s23k0087/task1/ArrayToList.java
@@ -0,0 +1,21 @@
+package ru.mirea.practice.s23k0087.task1;
+
+import java.util.Arrays;
+import java.util.List;
+
+public abstract class ArrayToList {
+
+ public static List convertArrayToList(E[] array) {
+ return Arrays.asList(array);
+ }
+
+ public static void main(String[] args) {
+ String[] arrayStr = {"Прибыл", "Сатору", "Годжо"};
+ List listStr = convertArrayToList(arrayStr);
+ System.out.println("List String: " + listStr);
+
+ Integer[] arrayInt = {2, 0, 3, 1};
+ List listInt = convertArrayToList(arrayInt);
+ System.out.println("List Integer: " + listInt);
+ }
+}
diff --git a/students/23K0087/23K0087-p21/src/main/java/ru/mirea/practice/s23k0087/tasks2and3/GenericArr.java b/students/23K0087/23K0087-p21/src/main/java/ru/mirea/practice/s23k0087/tasks2and3/GenericArr.java
new file mode 100644
index 000000000..9880ac82c
--- /dev/null
+++ b/students/23K0087/23K0087-p21/src/main/java/ru/mirea/practice/s23k0087/tasks2and3/GenericArr.java
@@ -0,0 +1,50 @@
+package ru.mirea.practice.s23k0087.tasks2and3;
+
+public class GenericArr {
+ private final E[] array;
+
+ public GenericArr(E[] elements) {
+ this.array = elements;
+ }
+
+ public E get(int index) {
+
+ if (index >= 0 && index < array.length) {
+ return array[index];
+ } else {
+ throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + array.length);
+ }
+ }
+
+ public void set(int index, E element) {
+ if (index >= 0 && index < array.length) {
+ array[index] = element;
+ } else {
+ throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + array.length);
+ }
+ }
+
+ public E getElementByIndex(int index) {
+ if (index < 0 || index >= array.length) {
+ throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + array.length);
+ }
+ return array[index];
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder("[");
+ for (int i = 0; i < array.length; i++) {
+ sb.append(array[i]);
+ if (i < array.length - 1) {
+ sb.append(", ");
+ }
+ }
+ sb.append("]");
+ return sb.toString();
+ }
+
+ public int size() {
+ return array.length;
+ }
+}
diff --git a/students/23K0087/23K0087-p21/src/main/java/ru/mirea/practice/s23k0087/tasks2and3/Tester.java b/students/23K0087/23K0087-p21/src/main/java/ru/mirea/practice/s23k0087/tasks2and3/Tester.java
new file mode 100644
index 000000000..0d41b0294
--- /dev/null
+++ b/students/23K0087/23K0087-p21/src/main/java/ru/mirea/practice/s23k0087/tasks2and3/Tester.java
@@ -0,0 +1,17 @@
+package ru.mirea.practice.s23k0087.tasks2and3;
+
+public abstract class Tester {
+ public static void main(String[] args) {
+ String[] arrayStr = {"Volkswagen", "Das", "Auto"};
+ GenericArr stringGenericArr = new GenericArr<>(arrayStr);
+ System.out.println(stringGenericArr);
+
+ Long[] arrayLong = {2031L, 911922L, 1234567890L};
+ GenericArr longGenericArr = new GenericArr<>(arrayLong);
+ System.out.println(longGenericArr);
+
+ Double[] arrayDouble = {20.31, 0.19293912, 0.41413, 0.221};
+ GenericArr doubleGenericArr = new GenericArr<>(arrayDouble);
+ System.out.println(doubleGenericArr);
+ }
+}
diff --git a/students/23K0087/23K0087-p22/pom.xml b/students/23K0087/23K0087-p22/pom.xml
new file mode 100644
index 000000000..ed56747c0
--- /dev/null
+++ b/students/23K0087/23K0087-p22/pom.xml
@@ -0,0 +1,13 @@
+
+
+ 4.0.0
+
+ 23K0087
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0087-p22
+ Двадцать второе задание
+
diff --git a/students/23K0087/23K0087-p22/src/main/java/ru/mirea/practice/s23k0087/task1/Calculator.java b/students/23K0087/23K0087-p22/src/main/java/ru/mirea/practice/s23k0087/task1/Calculator.java
new file mode 100644
index 000000000..470ddc264
--- /dev/null
+++ b/students/23K0087/23K0087-p22/src/main/java/ru/mirea/practice/s23k0087/task1/Calculator.java
@@ -0,0 +1,42 @@
+package ru.mirea.practice.s23k0087.task1;
+
+import java.util.Stack;
+
+public abstract class Calculator {
+ private static double applyOperation(double a, double b, String operator) {
+ switch (operator) {
+ case "+":
+ return a + b;
+ case "-":
+ return a - b;
+ case "*":
+ return a * b;
+ case "/":
+ if (b == 0) {
+ throw new ArithmeticException("Деление на ноль");
+ }
+ return a / b;
+ default:
+ throw new IllegalArgumentException("Недопустимый оператор: " + operator);
+ }
+ }
+
+ private static boolean isOperator(String token) {
+ return "+".equals(token) || "-".equals(token) || "*".equals(token) || "/".equals(token);
+ }
+
+ public static double calculate(String expression) {
+ Stack stack = new Stack<>();
+ String[] tokens = expression.split("\\s+");
+ for (String token : tokens) {
+ if (isOperator(token)) {
+ double b = stack.pop();
+ double a = stack.pop();
+ stack.push(applyOperation(a, b, token));
+ } else {
+ stack.push(Double.parseDouble(token));
+ }
+ }
+ return stack.pop();
+ }
+}
diff --git a/students/23K0087/23K0087-p22/src/main/java/ru/mirea/practice/s23k0087/task1/Tester.java b/students/23K0087/23K0087-p22/src/main/java/ru/mirea/practice/s23k0087/task1/Tester.java
new file mode 100644
index 000000000..ce3732e90
--- /dev/null
+++ b/students/23K0087/23K0087-p22/src/main/java/ru/mirea/practice/s23k0087/task1/Tester.java
@@ -0,0 +1,10 @@
+package ru.mirea.practice.s23k0087.task1;
+
+public abstract class Tester {
+ public static void main(String[] args) {
+ String expression = "4 8 - 2 / 7 *";
+ System.out.println("Calculating ((4 - 8) / 2) * 7");
+ double result = Calculator.calculate(expression);
+ System.out.println("Result: " + result);
+ }
+}
diff --git a/students/23K0087/23K0087-p23/pom.xml b/students/23K0087/23K0087-p23/pom.xml
new file mode 100644
index 000000000..b6b4fe266
--- /dev/null
+++ b/students/23K0087/23K0087-p23/pom.xml
@@ -0,0 +1,13 @@
+
+
+ 4.0.0
+
+ 23K0087
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0087-p23
+ Двадцать третье задание
+
diff --git a/students/23K0087/23K0087-p23/src/main/java/ru/mirea/practice/s23k0087/task1/ArrayQueue.java b/students/23K0087/23K0087-p23/src/main/java/ru/mirea/practice/s23k0087/task1/ArrayQueue.java
new file mode 100644
index 000000000..d94832132
--- /dev/null
+++ b/students/23K0087/23K0087-p23/src/main/java/ru/mirea/practice/s23k0087/task1/ArrayQueue.java
@@ -0,0 +1,58 @@
+package ru.mirea.practice.s23k0087.task1;
+
+public final class ArrayQueue {
+
+ private Object[] queue = new Object[16];
+ private int head = 0;
+ private int tail = 0;
+ private int size = 0;
+
+ public static ArrayQueue createQueue() {
+ return new ArrayQueue();
+ }
+
+ public void enqueue(Object element) {
+ ensureCapacity(size + 1);
+ queue[tail] = element;
+ tail = (tail + 1) % queue.length;
+ size++;
+ }
+
+ public Object getFirstElement() {
+ return queue[head];
+ }
+
+ public Object dequeue() {
+ Object result;
+ result = queue[head];
+ queue[head] = null;
+ head = (head + 1) % queue.length;
+ size--;
+ return result;
+ }
+
+ public int size() {
+ return size;
+ }
+
+ public boolean isEmpty() {
+ return size == 0;
+ }
+
+ public void clear() {
+ queue = new Object[16];
+ head = tail = size = 0;
+ }
+
+ private void ensureCapacity(int capacity) {
+ if (capacity > queue.length) {
+ Object[] newQueue = new Object[queue.length * 2];
+ for (int i = 0; i < size; i++) {
+ newQueue[i] = queue[(head + i) % queue.length];
+ }
+ queue = newQueue;
+ head = 0;
+ tail = size;
+ }
+ }
+}
diff --git a/students/23K0087/23K0087-p23/src/main/java/ru/mirea/practice/s23k0087/task1/ArrayQueueAdt.java b/students/23K0087/23K0087-p23/src/main/java/ru/mirea/practice/s23k0087/task1/ArrayQueueAdt.java
new file mode 100644
index 000000000..ddfbe089e
--- /dev/null
+++ b/students/23K0087/23K0087-p23/src/main/java/ru/mirea/practice/s23k0087/task1/ArrayQueueAdt.java
@@ -0,0 +1,54 @@
+package ru.mirea.practice.s23k0087.task1;
+
+public final class ArrayQueueAdt {
+
+ private Object[] queue = new Object[16];
+ private int head = 0;
+ private int tail = 0;
+ private int size = 0;
+
+ public static void enqueue(ArrayQueueAdt queueAdt, Object element) {
+ ensureCapacity(queueAdt, queueAdt.size + 1);
+ queueAdt.queue[queueAdt.tail] = element;
+ queueAdt.tail = (queueAdt.tail + 1) % queueAdt.queue.length;
+ queueAdt.size++;
+ }
+
+ public static Object getFirstElement(ArrayQueueAdt queueAdt) {
+ return queueAdt.queue[queueAdt.head];
+ }
+
+ public static Object dequeue(ArrayQueueAdt queueAdt) {
+ Object result;
+ result = queueAdt.queue[queueAdt.head];
+ queueAdt.queue[queueAdt.head] = null;
+ queueAdt.head = (queueAdt.head + 1) % queueAdt.queue.length;
+ queueAdt.size--;
+ return result;
+ }
+
+ public static int size(ArrayQueueAdt queueAdt) {
+ return queueAdt.size;
+ }
+
+ public static boolean isEmpty(ArrayQueueAdt queueAdt) {
+ return queueAdt.size == 0;
+ }
+
+ public static void clear(ArrayQueueAdt queueAdt) {
+ queueAdt.queue = new Object[16];
+ queueAdt.head = queueAdt.tail = queueAdt.size = 0;
+ }
+
+ private static void ensureCapacity(ArrayQueueAdt queueAdt, int capacity) {
+ if (capacity > queueAdt.queue.length) {
+ Object[] newQueue = new Object[queueAdt.queue.length * 2];
+ for (int i = 0; i < queueAdt.size; i++) {
+ newQueue[i] = queueAdt.queue[(queueAdt.head + i) % queueAdt.queue.length];
+ }
+ queueAdt.queue = newQueue;
+ queueAdt.head = 0;
+ queueAdt.tail = queueAdt.size;
+ }
+ }
+}
diff --git a/students/23K0087/23K0087-p23/src/main/java/ru/mirea/practice/s23k0087/task1/ArrayQueueModule.java b/students/23K0087/23K0087-p23/src/main/java/ru/mirea/practice/s23k0087/task1/ArrayQueueModule.java
new file mode 100644
index 000000000..01f52f97f
--- /dev/null
+++ b/students/23K0087/23K0087-p23/src/main/java/ru/mirea/practice/s23k0087/task1/ArrayQueueModule.java
@@ -0,0 +1,58 @@
+package ru.mirea.practice.s23k0087.task1;
+
+public final class ArrayQueueModule {
+
+ private ArrayQueueModule() {
+ }
+
+ private static final int INITIAL_CAPACITY = 16;
+ private static Object[] queue = new Object[INITIAL_CAPACITY];
+ private static int head = 0;
+ private static int tail = 0;
+ private static int size = 0;
+
+ public static void enqueue(Object element) {
+ ensureCapacity(size + 1);
+ queue[tail] = element;
+ tail = (tail + 1) % queue.length;
+ size++;
+ }
+
+ public static Object getFirstElement() {
+ return queue[head];
+ }
+
+ public static Object dequeue() {
+ Object result;
+ result = queue[head];
+ queue[head] = null;
+ head = (head + 1) % queue.length;
+ size--;
+ return result;
+ }
+
+ public static int size() {
+ return size;
+ }
+
+ public static boolean isEmpty() {
+ return size == 0;
+ }
+
+ public static void clear() {
+ queue = new Object[INITIAL_CAPACITY];
+ head = tail = size = 0;
+ }
+
+ private static void ensureCapacity(int capacity) {
+ if (capacity > queue.length) {
+ Object[] newQueue = new Object[queue.length * 2];
+ for (int i = 0; i < size; i++) {
+ newQueue[i] = queue[(head + i) % queue.length];
+ }
+ queue = newQueue;
+ head = 0;
+ tail = size;
+ }
+ }
+}
diff --git a/students/23K0087/23K0087-p23/src/main/java/ru/mirea/practice/s23k0087/task1/Tester.java b/students/23K0087/23K0087-p23/src/main/java/ru/mirea/practice/s23k0087/task1/Tester.java
new file mode 100644
index 000000000..d9ce138ae
--- /dev/null
+++ b/students/23K0087/23K0087-p23/src/main/java/ru/mirea/practice/s23k0087/task1/Tester.java
@@ -0,0 +1,39 @@
+package ru.mirea.practice.s23k0087.task1;
+
+public abstract class Tester {
+ public static void main(String[] args) {
+ ArrayQueueModule.enqueue(0);
+ ArrayQueueModule.enqueue(1);
+ ArrayQueueModule.enqueue(2);
+ ArrayQueueModule.enqueue(3);
+ System.out.println("The first element: " + ArrayQueueModule.getFirstElement());
+ ArrayQueueModule.dequeue();
+ System.out.println("Current size: " + ArrayQueueModule.size());
+ System.out.println("Queue is empty = " + ArrayQueueModule.isEmpty());
+ ArrayQueueModule.clear();
+ System.out.println("Queue is empty = " + ArrayQueueModule.isEmpty());
+ System.out.println();
+
+ ArrayQueueAdt queueAdt = new ArrayQueueAdt();
+ ArrayQueueAdt.enqueue(queueAdt, 10);
+ ArrayQueueAdt.enqueue(queueAdt, 13);
+ ArrayQueueAdt.enqueue(queueAdt, 23);
+ System.out.println("The first element: " + ArrayQueueAdt.getFirstElement(queueAdt));
+ ArrayQueueAdt.dequeue(queueAdt);
+ System.out.println("Current size: " + ArrayQueueAdt.size(queueAdt));
+ System.out.println("Queue is empty = " + ArrayQueueAdt.isEmpty(queueAdt));
+ ArrayQueueAdt.clear(queueAdt);
+ System.out.println("Queue is empty = " + ArrayQueueAdt.isEmpty(queueAdt));
+ System.out.println();
+
+ ArrayQueue queue = new ArrayQueue();
+ queue.enqueue(301);
+ queue.enqueue(632);
+ System.out.println("The first element: " + queue.getFirstElement());
+ queue.dequeue();
+ System.out.println("Current size: " + queue.size());
+ System.out.println("Queue is empty = " + queue.isEmpty());
+ queue.clear();
+ System.out.println("Queue is empty = " + queue.isEmpty());
+ }
+}
diff --git a/students/23K0087/23K0087-p23/src/main/java/ru/mirea/practice/s23k0087/task2/AbstractQueue.java b/students/23K0087/23K0087-p23/src/main/java/ru/mirea/practice/s23k0087/task2/AbstractQueue.java
new file mode 100644
index 000000000..a5f6f5ea0
--- /dev/null
+++ b/students/23K0087/23K0087-p23/src/main/java/ru/mirea/practice/s23k0087/task2/AbstractQueue.java
@@ -0,0 +1,29 @@
+package ru.mirea.practice.s23k0087.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/23K0087/23K0087-p23/src/main/java/ru/mirea/practice/s23k0087/task2/LinkedQueue.java b/students/23K0087/23K0087-p23/src/main/java/ru/mirea/practice/s23k0087/task2/LinkedQueue.java
new file mode 100644
index 000000000..f3bf4eb1e
--- /dev/null
+++ b/students/23K0087/23K0087-p23/src/main/java/ru/mirea/practice/s23k0087/task2/LinkedQueue.java
@@ -0,0 +1,49 @@
+package ru.mirea.practice.s23k0087.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/23K0087/23K0087-p23/src/main/java/ru/mirea/practice/s23k0087/task2/Queue.java b/students/23K0087/23K0087-p23/src/main/java/ru/mirea/practice/s23k0087/task2/Queue.java
new file mode 100644
index 000000000..5307035c9
--- /dev/null
+++ b/students/23K0087/23K0087-p23/src/main/java/ru/mirea/practice/s23k0087/task2/Queue.java
@@ -0,0 +1,13 @@
+package ru.mirea.practice.s23k0087.task2;
+
+public interface Queue {
+ void enqueue(T element);
+
+ T dequeue();
+
+ int size();
+
+ boolean isEmpty();
+
+ void clear();
+}
diff --git a/students/23K0087/23K0087-p24/pom.xml b/students/23K0087/23K0087-p24/pom.xml
new file mode 100644
index 000000000..29f0446d9
--- /dev/null
+++ b/students/23K0087/23K0087-p24/pom.xml
@@ -0,0 +1,13 @@
+
+
+ 4.0.0
+
+ 23K0087
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0087-p24
+ Двадцать четвёртое задание
+
diff --git a/students/23K0087/23K0087-p24/src/main/java/ru/mirea/practice/s23k0087/task1/Complex.java b/students/23K0087/23K0087-p24/src/main/java/ru/mirea/practice/s23k0087/task1/Complex.java
new file mode 100644
index 000000000..a3579c4e6
--- /dev/null
+++ b/students/23K0087/23K0087-p24/src/main/java/ru/mirea/practice/s23k0087/task1/Complex.java
@@ -0,0 +1,44 @@
+package ru.mirea.practice.s23k0087.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/23K0087/23K0087-p24/src/main/java/ru/mirea/practice/s23k0087/task1/ComplexAbstractFactory.java b/students/23K0087/23K0087-p24/src/main/java/ru/mirea/practice/s23k0087/task1/ComplexAbstractFactory.java
new file mode 100644
index 000000000..dc77e8d61
--- /dev/null
+++ b/students/23K0087/23K0087-p24/src/main/java/ru/mirea/practice/s23k0087/task1/ComplexAbstractFactory.java
@@ -0,0 +1,7 @@
+package ru.mirea.practice.s23k0087.task1;
+
+public interface ComplexAbstractFactory {
+ Complex createComplex();
+
+ Complex createComplex(int real, int imag);
+}
diff --git a/students/23K0087/23K0087-p24/src/main/java/ru/mirea/practice/s23k0087/task1/ComplexFactory.java b/students/23K0087/23K0087-p24/src/main/java/ru/mirea/practice/s23k0087/task1/ComplexFactory.java
new file mode 100644
index 000000000..28a1b1953
--- /dev/null
+++ b/students/23K0087/23K0087-p24/src/main/java/ru/mirea/practice/s23k0087/task1/ComplexFactory.java
@@ -0,0 +1,13 @@
+package ru.mirea.practice.s23k0087.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/23K0087/23K0087-p24/src/main/java/ru/mirea/practice/s23k0087/task2/AbstractChairFactory.java b/students/23K0087/23K0087-p24/src/main/java/ru/mirea/practice/s23k0087/task2/AbstractChairFactory.java
new file mode 100644
index 000000000..46a1b1d70
--- /dev/null
+++ b/students/23K0087/23K0087-p24/src/main/java/ru/mirea/practice/s23k0087/task2/AbstractChairFactory.java
@@ -0,0 +1,9 @@
+package ru.mirea.practice.s23k0087.task2;
+
+public interface AbstractChairFactory {
+ VictorianChair createVictorianChair();
+
+ MagicChair createMagicChair();
+
+ FunctionalChair createFunctionalChair();
+}
diff --git a/students/23K0087/23K0087-p24/src/main/java/ru/mirea/practice/s23k0087/task2/Chair.java b/students/23K0087/23K0087-p24/src/main/java/ru/mirea/practice/s23k0087/task2/Chair.java
new file mode 100644
index 000000000..ab120ef93
--- /dev/null
+++ b/students/23K0087/23K0087-p24/src/main/java/ru/mirea/practice/s23k0087/task2/Chair.java
@@ -0,0 +1,5 @@
+package ru.mirea.practice.s23k0087.task2;
+
+public interface Chair {
+ void sit();
+}
diff --git a/students/23K0087/23K0087-p24/src/main/java/ru/mirea/practice/s23k0087/task2/ChairFactory.java b/students/23K0087/23K0087-p24/src/main/java/ru/mirea/practice/s23k0087/task2/ChairFactory.java
new file mode 100644
index 000000000..17cebda33
--- /dev/null
+++ b/students/23K0087/23K0087-p24/src/main/java/ru/mirea/practice/s23k0087/task2/ChairFactory.java
@@ -0,0 +1,18 @@
+package ru.mirea.practice.s23k0087.task2;
+
+public class ChairFactory implements AbstractChairFactory {
+ @Override
+ public VictorianChair createVictorianChair() {
+ return new VictorianChair();
+ }
+
+ @Override
+ public MagicChair createMagicChair() {
+ return new MagicChair();
+ }
+
+ @Override
+ public FunctionalChair createFunctionalChair() {
+ return new FunctionalChair();
+ }
+}
diff --git a/students/23K0087/23K0087-p24/src/main/java/ru/mirea/practice/s23k0087/task2/Client.java b/students/23K0087/23K0087-p24/src/main/java/ru/mirea/practice/s23k0087/task2/Client.java
new file mode 100644
index 000000000..0d374d749
--- /dev/null
+++ b/students/23K0087/23K0087-p24/src/main/java/ru/mirea/practice/s23k0087/task2/Client.java
@@ -0,0 +1,17 @@
+package ru.mirea.practice.s23k0087.task2;
+
+public class Client {
+ private Chair chair;
+
+ public void setChair(Chair chair) {
+ this.chair = chair;
+ }
+
+ public void sit() {
+ if (chair != null) {
+ chair.sit();
+ } else {
+ System.out.println("Стул не выбран");
+ }
+ }
+}
diff --git a/students/23K0087/23K0087-p24/src/main/java/ru/mirea/practice/s23k0087/task2/FunctionalChair.java b/students/23K0087/23K0087-p24/src/main/java/ru/mirea/practice/s23k0087/task2/FunctionalChair.java
new file mode 100644
index 000000000..e99e9fa9f
--- /dev/null
+++ b/students/23K0087/23K0087-p24/src/main/java/ru/mirea/practice/s23k0087/task2/FunctionalChair.java
@@ -0,0 +1,8 @@
+package ru.mirea.practice.s23k0087.task2;
+
+public class FunctionalChair implements Chair {
+ @Override
+ public void sit() {
+ System.out.println("Функцию стула выполняет на 5+.");
+ }
+}
diff --git a/students/23K0087/23K0087-p24/src/main/java/ru/mirea/practice/s23k0087/task2/MagicChair.java b/students/23K0087/23K0087-p24/src/main/java/ru/mirea/practice/s23k0087/task2/MagicChair.java
new file mode 100644
index 000000000..987e9a1d9
--- /dev/null
+++ b/students/23K0087/23K0087-p24/src/main/java/ru/mirea/practice/s23k0087/task2/MagicChair.java
@@ -0,0 +1,8 @@
+package ru.mirea.practice.s23k0087.task2;
+
+public class MagicChair implements Chair {
+ @Override
+ public void sit() {
+ System.out.println("Магическое удобство!!!!!!!!!!!");
+ }
+}
diff --git a/students/23K0087/23K0087-p24/src/main/java/ru/mirea/practice/s23k0087/task2/Tester.java b/students/23K0087/23K0087-p24/src/main/java/ru/mirea/practice/s23k0087/task2/Tester.java
new file mode 100644
index 000000000..e61a509bf
--- /dev/null
+++ b/students/23K0087/23K0087-p24/src/main/java/ru/mirea/practice/s23k0087/task2/Tester.java
@@ -0,0 +1,34 @@
+package ru.mirea.practice.s23k0087.task2;
+
+import java.util.Scanner;
+
+public abstract class Tester {
+ public static void main(String[] args) {
+ try (Scanner scanner = new Scanner(System.in)) {
+ ChairFactory chairFactory = new ChairFactory();
+ Client client = new Client();
+
+ System.out.println("Есть три стула: \n1. Викторианский\n2. Магический\n3. Функциональный\n"
+ + "И на каждом можно сидеть!\nВыбирайте: ");
+ int chairChoice = scanner.nextInt();
+
+ switch (chairChoice) {
+ case 1:
+ client.setChair(chairFactory.createVictorianChair());
+ break;
+ case 2:
+ client.setChair(chairFactory.createMagicChair());
+ break;
+ case 3:
+ client.setChair(chairFactory.createFunctionalChair());
+ break;
+ default:
+ System.out.println("Нет такого стула.");
+ break;
+ }
+ client.sit();
+ } catch (RuntimeException e) {
+ throw e;
+ }
+ }
+}
diff --git a/students/23K0087/23K0087-p24/src/main/java/ru/mirea/practice/s23k0087/task2/VictorianChair.java b/students/23K0087/23K0087-p24/src/main/java/ru/mirea/practice/s23k0087/task2/VictorianChair.java
new file mode 100644
index 000000000..d8343d2e1
--- /dev/null
+++ b/students/23K0087/23K0087-p24/src/main/java/ru/mirea/practice/s23k0087/task2/VictorianChair.java
@@ -0,0 +1,8 @@
+package ru.mirea.practice.s23k0087.task2;
+
+public class VictorianChair implements Chair {
+ @Override
+ public void sit() {
+ System.out.println("Аристократично и со вкусом.");
+ }
+}
diff --git a/students/23K0087/23K0087-p25/pom.xml b/students/23K0087/23K0087-p25/pom.xml
new file mode 100644
index 000000000..e2135cb61
--- /dev/null
+++ b/students/23K0087/23K0087-p25/pom.xml
@@ -0,0 +1,13 @@
+
+
+ 4.0.0
+
+ 23K0087
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0087-p25
+ Двадцать пятое задание
+
diff --git a/students/23K0087/23K0087-p25/src/main/java/ru/mirea/practice/s23k0087/Task1.java b/students/23K0087/23K0087-p25/src/main/java/ru/mirea/practice/s23k0087/Task1.java
new file mode 100644
index 000000000..f3b72ddb8
--- /dev/null
+++ b/students/23K0087/23K0087-p25/src/main/java/ru/mirea/practice/s23k0087/Task1.java
@@ -0,0 +1,19 @@
+package ru.mirea.practice.s23k0087;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public abstract class Task1 {
+ public static void main(String[] args) {
+ String text = "25.98 USD.\n 44 ERR\n 0.004 EU.\n 100.00 RUB,\n 75.50 EUR!";
+
+ String regex = "\\b\\d+\\.\\d{2}\\s+(USD|RUB|EUR)\\b(?=[\n,;!?.]|$)";
+
+ Pattern pattern = Pattern.compile(regex);
+ Matcher matcher = pattern.matcher(text);
+
+ while (matcher.find()) {
+ System.out.println(matcher.group());
+ }
+ }
+}
diff --git a/students/23K0087/23K0087-p25/src/main/java/ru/mirea/practice/s23k0087/Task4.java b/students/23K0087/23K0087-p25/src/main/java/ru/mirea/practice/s23k0087/Task4.java
new file mode 100644
index 000000000..35638092c
--- /dev/null
+++ b/students/23K0087/23K0087-p25/src/main/java/ru/mirea/practice/s23k0087/Task4.java
@@ -0,0 +1,19 @@
+package ru.mirea.practice.s23k0087;
+
+import java.util.Scanner;
+import java.util.regex.Pattern;
+
+public abstract class Task4 {
+ 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");
+ } else {
+ System.out.println("Input string is not a valid email address");
+ }
+ }
+}
diff --git a/students/23K0087/23K0087-p25/src/main/java/ru/mirea/practice/s23k0087/Task5.java b/students/23K0087/23K0087-p25/src/main/java/ru/mirea/practice/s23k0087/Task5.java
new file mode 100644
index 000000000..f10aaadf4
--- /dev/null
+++ b/students/23K0087/23K0087-p25/src/main/java/ru/mirea/practice/s23k0087/Task5.java
@@ -0,0 +1,33 @@
+package ru.mirea.practice.s23k0087;
+
+import java.util.regex.Pattern;
+
+public abstract class Task5 {
+
+ private static final String password_pattern = "^(?=.*[A-Z])(?=.*[a-z])(?=.*\\d)[A-Za-z\\d_]{8,}$";
+
+ private static final Pattern pattern = Pattern.compile(password_pattern);
+
+ public static boolean checkPassword(String password) {
+ return pattern.matcher(password).matches();
+ }
+
+ public static void main(String[] args) {
+ String[] passwords = {
+ "F032_Password",
+ "TrySpy11",
+ "smart_pass",
+ "A007",
+ "Valid_Pass1",
+ "InvalidPass!",
+ "Short1_",
+ "STOOPIDPASS1",
+ "stoopidpass2",
+ "Nonuminthis_"
+ };
+
+ for (String password : passwords) {
+ System.out.println("Пароль " + password + " - " + (checkPassword(password) ? "надежный." : "ненадежный!"));
+ }
+ }
+}
diff --git a/students/23K0087/23K0087-p26/pom.xml b/students/23K0087/23K0087-p26/pom.xml
new file mode 100644
index 000000000..93df5499d
--- /dev/null
+++ b/students/23K0087/23K0087-p26/pom.xml
@@ -0,0 +1,13 @@
+
+
+ 4.0.0
+
+ 23K0087
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0087-p26
+ Двадцать шестое задание
+
diff --git a/students/23K0087/23K0087-p26/src/main/java/ru/mirea/practice/s23k0087/Task1.java b/students/23K0087/23K0087-p26/src/main/java/ru/mirea/practice/s23k0087/Task1.java
new file mode 100644
index 000000000..f715c1f23
--- /dev/null
+++ b/students/23K0087/23K0087-p26/src/main/java/ru/mirea/practice/s23k0087/Task1.java
@@ -0,0 +1,27 @@
+package ru.mirea.practice.s23k0087;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Stack;
+
+public abstract class Task1 {
+ 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/23K0087/23K0087-p26/src/main/java/ru/mirea/practice/s23k0087/tasks2and3/CustomIterator.java b/students/23K0087/23K0087-p26/src/main/java/ru/mirea/practice/s23k0087/tasks2and3/CustomIterator.java
new file mode 100644
index 000000000..6791c0484
--- /dev/null
+++ b/students/23K0087/23K0087-p26/src/main/java/ru/mirea/practice/s23k0087/tasks2and3/CustomIterator.java
@@ -0,0 +1,20 @@
+package ru.mirea.practice.s23k0087.tasks2and3;
+
+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/23K0087/23K0087-p26/src/main/java/ru/mirea/practice/s23k0087/tasks2and3/CustomList.java b/students/23K0087/23K0087-p26/src/main/java/ru/mirea/practice/s23k0087/tasks2and3/CustomList.java
new file mode 100644
index 000000000..513371564
--- /dev/null
+++ b/students/23K0087/23K0087-p26/src/main/java/ru/mirea/practice/s23k0087/tasks2and3/CustomList.java
@@ -0,0 +1,39 @@
+package ru.mirea.practice.s23k0087.tasks2and3;
+
+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/23K0087/23K0087-p26/src/main/java/ru/mirea/practice/s23k0087/tasks2and3/Node.java b/students/23K0087/23K0087-p26/src/main/java/ru/mirea/practice/s23k0087/tasks2and3/Node.java
new file mode 100644
index 000000000..db7bb1986
--- /dev/null
+++ b/students/23K0087/23K0087-p26/src/main/java/ru/mirea/practice/s23k0087/tasks2and3/Node.java
@@ -0,0 +1,32 @@
+package ru.mirea.practice.s23k0087.tasks2and3;
+
+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/23K0087/23K0087-p27/pom.xml b/students/23K0087/23K0087-p27/pom.xml
new file mode 100644
index 000000000..1e383febe
--- /dev/null
+++ b/students/23K0087/23K0087-p27/pom.xml
@@ -0,0 +1,13 @@
+
+
+ 4.0.0
+
+ 23K0087
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0087-p27
+ Двадцать седьмое задание
+
diff --git a/students/23K0087/23K0087-p27/src/main/java/ru/mirea/practice/s23k0087/tasksfrom1to3/Hashtab.java b/students/23K0087/23K0087-p27/src/main/java/ru/mirea/practice/s23k0087/tasksfrom1to3/Hashtab.java
new file mode 100644
index 000000000..c639aeea0
--- /dev/null
+++ b/students/23K0087/23K0087-p27/src/main/java/ru/mirea/practice/s23k0087/tasksfrom1to3/Hashtab.java
@@ -0,0 +1,68 @@
+package ru.mirea.practice.s23k0087.tasksfrom1to3;
+
+import java.util.LinkedList;
+
+class Hashtab {
+ private static class KeyValue {
+ String key;
+ String value;
+
+ KeyValue(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+ }
+
+ private final LinkedList[] table;
+ private final int size;
+
+ public Hashtab(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/23K0087/23K0087-p27/src/main/java/ru/mirea/practice/s23k0087/tasksfrom1to3/Tester.java b/students/23K0087/23K0087-p27/src/main/java/ru/mirea/practice/s23k0087/tasksfrom1to3/Tester.java
new file mode 100644
index 000000000..464464132
--- /dev/null
+++ b/students/23K0087/23K0087-p27/src/main/java/ru/mirea/practice/s23k0087/tasksfrom1to3/Tester.java
@@ -0,0 +1,25 @@
+package ru.mirea.practice.s23k0087.tasksfrom1to3;
+
+public abstract class Tester {
+ public static void main(String[] args) {
+ Hashtab hashtab = new Hashtab(10);
+ hashtab.add("key 0", "value 0");
+ hashtab.add("key 1", "value 1");
+ hashtab.add("key 2", "value 2");
+ hashtab.add("key 3", "value 3");
+ hashtab.add("key 4", "value 4");
+ hashtab.add("key 5", "value 5");
+ hashtab.add("key 6", "value 6");
+ hashtab.add("key 7", "value 7");
+ hashtab.add("key 8", "value 8");
+ hashtab.add("key 9", "value 9");
+ System.out.println("Hashmap:");
+ hashtab.printTable();
+ String value = hashtab.lookup("key 2");
+ System.out.println("Looking for key 2... " + (value != null ? "Bingo! the value is: " + value : "not found"));
+ hashtab.delete("key 2");
+ hashtab.printTable();
+ value = hashtab.lookup("key 2");
+ System.out.println("Looking for key 2... " + (value != null ? "Bingo! the value is: " + value : "not found"));
+ }
+}
diff --git a/students/23K0087/23K0087-p28/pom.xml b/students/23K0087/23K0087-p28/pom.xml
new file mode 100644
index 000000000..e299df945
--- /dev/null
+++ b/students/23K0087/23K0087-p28/pom.xml
@@ -0,0 +1,13 @@
+
+
+ 4.0.0
+
+ 23K0087
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0087-p28
+ Двадцать восьмое задание
+
diff --git a/students/23K0087/23K0087-p28/src/main/java/ru/mirea/practice/s23k0087/Task1.java b/students/23K0087/23K0087-p28/src/main/java/ru/mirea/practice/s23k0087/Task1.java
new file mode 100644
index 000000000..c75a03d16
--- /dev/null
+++ b/students/23K0087/23K0087-p28/src/main/java/ru/mirea/practice/s23k0087/Task1.java
@@ -0,0 +1,19 @@
+package ru.mirea.practice.s23k0087;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.TreeMap;
+
+public abstract class Task1 {
+ public static void main(String[] args) {
+ Map hashmap = new HashMap<>();
+ hashmap.put(20, 31);
+ hashmap.put(23, 32);
+ hashmap.put(9, 92);
+ hashmap.put(13, 22);
+ Map treemap = new TreeMap<>(hashmap);
+ System.out.println(hashmap);
+ System.out.println(treemap);
+ }
+}
+
diff --git a/students/23K0087/23K0087-p28/src/main/java/ru/mirea/practice/s23k0087/Task2.java b/students/23K0087/23K0087-p28/src/main/java/ru/mirea/practice/s23k0087/Task2.java
new file mode 100644
index 000000000..16a2e32b1
--- /dev/null
+++ b/students/23K0087/23K0087-p28/src/main/java/ru/mirea/practice/s23k0087/Task2.java
@@ -0,0 +1,44 @@
+package ru.mirea.practice.s23k0087;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public abstract class Task2 {
+
+ public static int countMatchingNames(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 void main(String[] args) {
+ Map map = new HashMap<>();
+ map.put("Кузнецов", "Алексей");
+ map.put("Сидорова", "Мария");
+ map.put("Петров", "Илья");
+ map.put("Кузнецова", "Анна");
+ map.put("Иванов", "Дмитрий");
+ map.put("Петрова", "Мария");
+ map.put("Коммисаров", "Алексей");
+ map.put("Абсулов", "Даниил");
+ map.put("Мазеллов", "Илья");
+ map.put("Кирилленко", "Дмитрий");
+ System.out.println("Amount of matching names: " + countMatchingNames(map));
+ }
+}
diff --git a/students/23K0087/23K0087-p29/pom.xml b/students/23K0087/23K0087-p29/pom.xml
new file mode 100644
index 000000000..a3ce2e5ea
--- /dev/null
+++ b/students/23K0087/23K0087-p29/pom.xml
@@ -0,0 +1,13 @@
+
+
+ 4.0.0
+
+ 23K0087
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0087-p29
+ Двадцать девятое задание
+
diff --git a/students/23K0087/23K0087-p29/src/main/java/ru/mirea/practice/s23k0087/Task1.java b/students/23K0087/23K0087-p29/src/main/java/ru/mirea/practice/s23k0087/Task1.java
new file mode 100644
index 000000000..5f14c791b
--- /dev/null
+++ b/students/23K0087/23K0087-p29/src/main/java/ru/mirea/practice/s23k0087/Task1.java
@@ -0,0 +1,21 @@
+package ru.mirea.practice.s23k0087;
+
+import java.util.Scanner;
+
+public abstract class Task1 {
+ public static void main(String[] args) {
+ try (Scanner scanner = new Scanner(System.in)) {
+ int n = scanner.nextInt();
+ int res = 0;
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < n; j++) {
+ res += scanner.nextInt();
+ }
+ }
+ res /= 2;
+ System.out.println(res);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/students/23K0087/23K0087-p30/pom.xml b/students/23K0087/23K0087-p30/pom.xml
new file mode 100644
index 000000000..bab5f7a67
--- /dev/null
+++ b/students/23K0087/23K0087-p30/pom.xml
@@ -0,0 +1,13 @@
+
+
+ 4.0.0
+
+ 23K0087
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0087-p30
+ Тридцатое задание, часть 1
+
diff --git a/students/23K0087/23K0087-p30/src/main/java/ru/mirea/practice/s23k0087/task1/BinaryTree.java b/students/23K0087/23K0087-p30/src/main/java/ru/mirea/practice/s23k0087/task1/BinaryTree.java
new file mode 100644
index 000000000..9efaee3fe
--- /dev/null
+++ b/students/23K0087/23K0087-p30/src/main/java/ru/mirea/practice/s23k0087/task1/BinaryTree.java
@@ -0,0 +1,69 @@
+package ru.mirea.practice.s23k0087.task1;
+
+public class BinaryTree {
+ Node root;
+
+ int height(Node node) {
+ if (node == null) {
+ return 0;
+ }
+ int heightLeft = height(node.left);
+ int heightRight = height(node.right);
+ return Math.max(heightLeft, heightRight) + 1;
+ }
+
+ boolean lookup(Node node, int target) {
+ if (node == null) {
+ return false;
+ }
+ if (node.data == target) {
+ return true;
+ }
+ if (target < node.data) {
+ return lookup(node.left, target);
+ } else {
+ return lookup(node.right, target);
+ }
+ }
+
+ int getMaxWidth(Node root) {
+ int h = this.height(this.root);
+ int maxWidth = 0;
+ for (int i = 1; i <= h; i++) {
+ int w = getWidth(this.root, i);
+ if (w > maxWidth) {
+ maxWidth = w;
+ }
+ }
+ return maxWidth;
+ }
+
+ int getWidth(Node node, int level) {
+ if (node == null) {
+ return 0;
+ }
+ if (level == 1) {
+ return 1;
+ }
+ return getWidth(node.left, level - 1) + getWidth(node.right, level - 1);
+ }
+
+ int size(Node node) {
+ if (node == null) {
+ return 0;
+ }
+ return size(node.left) + 1 + size(node.right);
+ }
+
+ boolean sameTree(Node a, Node b) {
+ if (a == null && b == null) {
+ return true;
+ }
+ if (a != null && b != null) {
+ return a.data == b.data
+ && sameTree(a.left, b.left)
+ && sameTree(a.right, b.right);
+ }
+ return false;
+ }
+}
diff --git a/students/23K0087/23K0087-p30/src/main/java/ru/mirea/practice/s23k0087/task1/Node.java b/students/23K0087/23K0087-p30/src/main/java/ru/mirea/practice/s23k0087/task1/Node.java
new file mode 100644
index 000000000..0209e685c
--- /dev/null
+++ b/students/23K0087/23K0087-p30/src/main/java/ru/mirea/practice/s23k0087/task1/Node.java
@@ -0,0 +1,13 @@
+package ru.mirea.practice.s23k0087.task1;
+
+public class Node {
+ int data;
+ Node left;
+ Node right;
+
+ Node(int d) {
+ data = d;
+ left = null;
+ right = null;
+ }
+}
diff --git a/students/23K0087/23K0087-p30/src/main/java/ru/mirea/practice/s23k0087/task1/Tester.java b/students/23K0087/23K0087-p30/src/main/java/ru/mirea/practice/s23k0087/task1/Tester.java
new file mode 100644
index 000000000..e2b4e2af1
--- /dev/null
+++ b/students/23K0087/23K0087-p30/src/main/java/ru/mirea/practice/s23k0087/task1/Tester.java
@@ -0,0 +1,24 @@
+package ru.mirea.practice.s23k0087.task1;
+
+public abstract class Tester {
+ public static void main(String[] args) {
+ BinaryTree tree = new BinaryTree();
+ tree.root = new Node(2);
+ tree.root.left = new Node(4);
+ tree.root.right = new Node(6);
+ tree.root.left.left = new Node(8);
+ tree.root.left.right = new Node(10);
+ System.out.println("Tree height: " + tree.height(tree.root));
+ System.out.println("Tree size: " + tree.size(tree.root));
+ System.out.println("Max width of the tree: " + tree.getMaxWidth(tree.root));
+ int target1 = 5;
+ System.out.println("Looking for " + target1 + "... " + tree.lookup(tree.root, target1));
+ int target2 = 2;
+ System.out.println("Looking for " + target2 + "... " + tree.lookup(tree.root, target2));
+ BinaryTree tree2 = new BinaryTree();
+ tree2.root = new Node(1);
+ tree2.root.left = new Node(1);
+ tree2.root.right = new Node(1);
+ System.out.println("Are those trees the same? " + tree.sameTree(tree.root, tree2.root));
+ }
+}
diff --git a/students/23K0087/23K0087-p30_2/pom.xml b/students/23K0087/23K0087-p30_2/pom.xml
new file mode 100644
index 000000000..555aa45f6
--- /dev/null
+++ b/students/23K0087/23K0087-p30_2/pom.xml
@@ -0,0 +1,13 @@
+
+
+ 4.0.0
+
+ 23K0087
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0087-p30_2
+ Тридцатое задание, часть 2
+
diff --git a/students/23K0087/23K0087-p30_2/src/main/java/ru/mirea/practice/s23k0087/task1/BinarySearchTree.java b/students/23K0087/23K0087-p30_2/src/main/java/ru/mirea/practice/s23k0087/task1/BinarySearchTree.java
new file mode 100644
index 000000000..6567a4264
--- /dev/null
+++ b/students/23K0087/23K0087-p30_2/src/main/java/ru/mirea/practice/s23k0087/task1/BinarySearchTree.java
@@ -0,0 +1,199 @@
+package ru.mirea.practice.s23k0087.task1;
+
+
+public class BinarySearchTree> {
+ private Node root;
+ private int count;
+
+ public BinarySearchTree() {
+ root = null;
+ count = 0;
+ }
+
+ public Node getRoot() {
+ return root;
+ }
+
+ public void setRoot(Node root) {
+ this.root = root;
+ }
+
+ public int getCount() {
+ return count;
+ }
+
+ public void setCount(int count) {
+ this.count = count;
+ }
+
+ public boolean binSearch(E item) {
+ Node searchNode;
+ searchNode = this.getRoot();
+ while (true) {
+ if (searchNode == null) {
+ return false;
+ } else if (item.compareTo(searchNode.data) == 0) {
+ return true;
+ } else if (item.compareTo(searchNode.data) > 0) {
+ searchNode = searchNode.getRight();
+ } else {
+ searchNode = searchNode.getLeft();
+ }
+ }
+ }
+
+ //Cannot remove the root node because of a bug, would've fixed it later if I had time
+ public boolean insert(E data) {
+ // True - Inserted
+ // False - Already exists
+ if (this.getRoot() == null) {
+ setRoot(new Node<>(data));
+ return true;
+ }
+ Node searchNode = getRoot();
+ while (true) {
+ if (data.compareTo(searchNode.getData()) == 0) {
+ return false;
+ } else if (data.compareTo(searchNode.getData()) > 0) {
+ if (searchNode.getRight() == null) {
+ searchNode.setRight(new Node<>(data));
+ return true;
+ } else {
+ searchNode = searchNode.getRight();
+ }
+ } else {
+ if (searchNode.getLeft() == null) {
+ searchNode.setLeft(new Node<>(data));
+ return true;
+ } else {
+ searchNode = searchNode.getLeft();
+ }
+ }
+ }
+ }
+
+ public boolean delete(E data) {
+ Node q = getRoot();
+ Node z = getRoot();
+ while (true) {
+ if (z == null) {
+ return false;
+ } else if (data.compareTo(z.getData()) == 0) {
+ break;
+ } else if (data.compareTo(z.getData()) > 0) {
+ q = z;
+ z = z.getRight();
+ } else {
+ q = z;
+ z = z.getLeft();
+ }
+ }
+
+ if (z.getRight() == null) {
+ if (q.getLeft().equals(z)) {
+ q.setLeft(z.getLeft());
+ } else {
+ q.setRight(z.getLeft());
+ }
+ } else {
+ Node y = z.getRight();
+ if (y.getLeft() == null) {
+ y.setLeft(z.getLeft());
+ if (q.getLeft().equals(z)) {
+ q.setLeft(y);
+ } else {
+ q.setRight(y);
+ }
+ } else {
+ Node x = y.getLeft();
+ while (x.getLeft() != null) {
+ y = x;
+ x = y.getLeft();
+ }
+ y.setLeft(x.getRight());
+ x.setLeft(z.getLeft());
+ x.setRight(z.getRight());
+ if (q.getLeft().equals(z)) {
+ q.setLeft(x);
+ } else {
+ q.setRight(x);
+ }
+ }
+ }
+ this.count -= 1;
+ return true;
+ }
+
+ public String walk(Node searchNode) {
+ if (searchNode == null) {
+ return "";
+ }
+ String string = "";
+ string += searchNode.getData();
+ string += " ";
+ string += walk(searchNode.getLeft());
+ string += walk(searchNode.getRight());
+ return string;
+ }
+
+ public E min() {
+ Node searchNode;
+ searchNode = this.root;
+ while (searchNode.getLeft() != null) {
+ searchNode = searchNode.getLeft();
+ }
+ return searchNode.getData();
+ }
+
+ public E max() {
+ Node searchNode;
+ searchNode = this.root;
+ while (searchNode.getRight() != null) {
+ searchNode = searchNode.getRight();
+ }
+ return searchNode.getData();
+ }
+
+ @Override
+ public String toString() {
+ return walk(getRoot());
+ }
+
+ class Node {
+ private E data;
+ private Node left;
+ private Node right;
+
+ public Node() {
+ // Default constructor
+ }
+
+ public Node(E data) {
+ this.data = data;
+ }
+
+ public E getData() {
+ return data;
+ }
+
+ public void setData(E data) {
+ this.data = data;
+ }
+
+ public Node getLeft() {
+ return left;
+ }
+
+ public void setLeft(Node left) {
+ this.left = left;
+ }
+
+ public Node getRight() {
+ return right;
+ }
+
+ public void setRight(Node right) {
+ this.right = right;
+ }
+ }
+}
diff --git a/students/23K0087/23K0087-p30_2/src/main/java/ru/mirea/practice/s23k0087/task1/IntegerBinarySearchTree.java b/students/23K0087/23K0087-p30_2/src/main/java/ru/mirea/practice/s23k0087/task1/IntegerBinarySearchTree.java
new file mode 100644
index 000000000..07892857f
--- /dev/null
+++ b/students/23K0087/23K0087-p30_2/src/main/java/ru/mirea/practice/s23k0087/task1/IntegerBinarySearchTree.java
@@ -0,0 +1,23 @@
+package ru.mirea.practice.s23k0087.task1;
+
+
+public class IntegerBinarySearchTree extends BinarySearchTree {
+ IntegerBinarySearchTree() {
+ super();
+ }
+
+ public boolean isBst(Node node) {
+ return isBstUtil(node, Integer.MIN_VALUE, Integer.MAX_VALUE);
+ }
+
+ private boolean isBstUtil(Node node, int minValue, int maxValue) {
+ if (node == null) {
+ return true;
+ }
+ if (node.getData() < minValue || node.getData() > maxValue) {
+ return false;
+ }
+ return isBstUtil(node.getLeft(), minValue, node.getData()) && isBstUtil(node.getRight(), node.getData() + 1, maxValue);
+ }
+
+}
diff --git a/students/23K0087/23K0087-p30_2/src/main/java/ru/mirea/practice/s23k0087/task1/Main.java b/students/23K0087/23K0087-p30_2/src/main/java/ru/mirea/practice/s23k0087/task1/Main.java
new file mode 100644
index 000000000..f66fd7741
--- /dev/null
+++ b/students/23K0087/23K0087-p30_2/src/main/java/ru/mirea/practice/s23k0087/task1/Main.java
@@ -0,0 +1,15 @@
+package ru.mirea.practice.s23k0087.task1;
+
+
+public abstract class Main {
+ public static void main(String[] args) {
+ IntegerBinarySearchTree integerSearch = new IntegerBinarySearchTree();
+ int[] array = {11, 10, 1, 3, 5, 63, 32, 2, 23, 4};
+ for (int i : array) {
+ integerSearch.insert(i);
+ }
+ System.out.println(integerSearch);
+ integerSearch.delete(10);
+ System.out.println(integerSearch);
+ }
+}
diff --git a/students/23K0087/23K0087-p32/pom.xml b/students/23K0087/23K0087-p32/pom.xml
new file mode 100644
index 000000000..ed5036643
--- /dev/null
+++ b/students/23K0087/23K0087-p32/pom.xml
@@ -0,0 +1,13 @@
+
+
+ 4.0.0
+
+ 23K0087
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0087-p32
+ Тридцать второе задание
+
diff --git a/students/23K0087/23K0087-p32/src/main/java/ru/mirea/practice/s23k0087/Task1.java b/students/23K0087/23K0087-p32/src/main/java/ru/mirea/practice/s23k0087/Task1.java
new file mode 100644
index 000000000..faae3bace
--- /dev/null
+++ b/students/23K0087/23K0087-p32/src/main/java/ru/mirea/practice/s23k0087/Task1.java
@@ -0,0 +1,42 @@
+package ru.mirea.practice.s23k0087;
+
+
+public abstract class Task1 {
+ public static void perm(int n) {
+ int[] p = new int[n];
+ int[] pi = new int[n];
+ int[] dir = new int[n];
+ for (int i = 0; i < n; i++) {
+ dir[i] = -1;
+ p[i] = i;
+ pi[i] = i;
+ }
+ perm(0, p, pi, dir);
+ System.out.println(" (0 1)");
+ }
+
+ public static void perm(int n, int[] p, int[] pi, int[] dir) {
+ if (n >= p.length) {
+ for (int j : p) {
+ System.out.println(j);
+ }
+ return;
+ }
+ perm(n + 1, p, pi, dir);
+ for (int i = 0; i <= n - 1; i++) {
+ System.out.printf(" (%d %d)\n", pi[n], pi[n] + dir[n]);
+ int z = p[pi[n] + dir[n]];
+ p[pi[n]] = z;
+ p[pi[n] + dir[n]] = n;
+ pi[z] = pi[n];
+ pi[n] = pi[n] + dir[n];
+
+ perm(n + 1, p, pi, dir);
+ }
+ dir[n] = -dir[n];
+ }
+
+ public static void main(String[] args) {
+ perm(5);
+ }
+}
diff --git a/students/23K0087/pom.xml b/students/23K0087/pom.xml
index cf4c44512..ab896ecc2 100644
--- a/students/23K0087/pom.xml
+++ b/students/23K0087/pom.xml
@@ -34,5 +34,17 @@
23K0087-p18
23K0087-p19
23K0087-p20
+ 23K0087-p21
+ 23K0087-p22
+ 23K0087-p23
+ 23K0087-p24
+ 23K0087-p25
+ 23K0087-p26
+ 23K0087-p27
+ 23K0087-p28
+ 23K0087-p29
+ 23K0087-p30
+ 23K0087-p30_2
+ 23K0087-p32