diff --git a/students/23K0818/23K0818-p21/pom.xml b/students/23K0818/23K0818-p21/pom.xml
new file mode 100644
index 000000000..8e9805c70
--- /dev/null
+++ b/students/23K0818/23K0818-p21/pom.xml
@@ -0,0 +1,12 @@
+
+
+ 4.0.0
+
+ 23K0818
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0818-p21
+
diff --git a/students/23K0818/23K0818-p21/src/main/java/ru/mirea/practice/s0000001/task1/ArrayToListConverter.java b/students/23K0818/23K0818-p21/src/main/java/ru/mirea/practice/s0000001/task1/ArrayToListConverter.java
new file mode 100644
index 000000000..8ea0bafa9
--- /dev/null
+++ b/students/23K0818/23K0818-p21/src/main/java/ru/mirea/practice/s0000001/task1/ArrayToListConverter.java
@@ -0,0 +1,29 @@
+package ru.mirea.practice.s0000001.task1;
+
+import java.util.Arrays;
+import java.util.List;
+
+public abstract class ArrayToListConverter {
+
+
+ public static List convertStringArrayToList(String[] array) {
+ return Arrays.asList(array);
+ }
+
+
+ public static List convertIntegerArrayToList(Integer[] array) {
+ return Arrays.asList(array);
+ }
+
+ public static void main(String[] args) {
+
+ String[] stringArray = {"apple", "banana", "cherry"};
+ List stringList = convertStringArrayToList(stringArray);
+ System.out.println("Список строк: " + stringList);
+
+
+ Integer[] integerArray = {1, 2, 3, 4, 5};
+ List integerList = convertIntegerArrayToList(integerArray);
+ System.out.println("Список чисел: " + integerList);
+ }
+}
diff --git a/students/23K0818/23K0818-p21/src/main/java/ru/mirea/practice/s0000001/task2/GenericArray.java b/students/23K0818/23K0818-p21/src/main/java/ru/mirea/practice/s0000001/task2/GenericArray.java
new file mode 100644
index 000000000..6c60fe912
--- /dev/null
+++ b/students/23K0818/23K0818-p21/src/main/java/ru/mirea/practice/s0000001/task2/GenericArray.java
@@ -0,0 +1,68 @@
+package ru.mirea.practice.s0000001.task2;
+
+import java.util.Arrays;
+
+public abstract class GenericArray {
+ private Object[] array;
+ private int size;
+
+ public GenericArray(int capacity) {
+ if (capacity <= 0) {
+ throw new IllegalArgumentException("Capacity must be greater than 0");
+ }
+ array = new Object[capacity];
+ size = 0;
+ }
+
+ public void add(T element) {
+ if (size == array.length) {
+ array = Arrays.copyOf(array, array.length * 2);
+ }
+ array[size++] = element;
+ }
+
+ public T get(int index) {
+ if (index < 0 || index >= size) {
+ throw new IndexOutOfBoundsException("Index out of bounds");
+ }
+ return (T) array[index];
+ }
+
+ public int size() {
+ return size;
+ }
+
+ public void set(int index, T element) {
+ if (index < 0 || index >= size) {
+ throw new IndexOutOfBoundsException("Index out of bounds");
+ }
+ array[index] = element;
+ }
+
+ public void remove(int index) {
+ if (index < 0 || index >= size) {
+ throw new IndexOutOfBoundsException("Index out of bounds");
+ }
+ System.arraycopy(array, index + 1, array, index, size - index - 1);
+ size--;
+ }
+
+ public boolean contains(T element) {
+ for (int i = 0; i < size; i++) {
+ if (array[i].equals(element)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public void clear() {
+ array = new Object[array.length];
+ size = 0;
+ }
+
+ @Override
+ public String toString() {
+ return Arrays.toString(Arrays.copyOf(array, size));
+ }
+}
diff --git a/students/23K0818/23K0818-p21/src/main/java/ru/mirea/practice/s0000001/task4/DirectoryContent.java b/students/23K0818/23K0818-p21/src/main/java/ru/mirea/practice/s0000001/task4/DirectoryContent.java
new file mode 100644
index 000000000..f848f41bd
--- /dev/null
+++ b/students/23K0818/23K0818-p21/src/main/java/ru/mirea/practice/s0000001/task4/DirectoryContent.java
@@ -0,0 +1,32 @@
+package ru.mirea.practice.s0000001.task4;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+public abstract class DirectoryContent {
+
+ public static void main(String[] args) {
+ String directoryPath = "your_directory_path_here";
+ List directoryContents = getDirectoryContents(directoryPath);
+
+ for (int i = 0; i < Math.min(5, directoryContents.size()); i++) {
+ System.out.println(directoryContents.get(i));
+ }
+ }
+
+ public static List getDirectoryContents(String directoryPath) {
+ List contents = new ArrayList<>();
+ File directory = new File(directoryPath);
+
+ if (directory.exists() && directory.isDirectory()) {
+ File[] files = directory.listFiles();
+ if (files != null) {
+ for (File file : files) {
+ contents.add(file.getName());
+ }
+ }
+ }
+ return contents;
+ }
+}
diff --git a/students/23K0818/23K0818-p22/pom.xml b/students/23K0818/23K0818-p22/pom.xml
new file mode 100644
index 000000000..d9d668c14
--- /dev/null
+++ b/students/23K0818/23K0818-p22/pom.xml
@@ -0,0 +1,12 @@
+
+
+ 4.0.0
+
+ 23K0818
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0818-p22
+
diff --git a/students/23K0818/23K0818-p22/src/main/java/ru/mirea/practice/s0000001/task1/RpnCalculator.java b/students/23K0818/23K0818-p22/src/main/java/ru/mirea/practice/s0000001/task1/RpnCalculator.java
new file mode 100644
index 000000000..2982ec0d6
--- /dev/null
+++ b/students/23K0818/23K0818-p22/src/main/java/ru/mirea/practice/s0000001/task1/RpnCalculator.java
@@ -0,0 +1,38 @@
+package ru.mirea.practice.s0000001.task1;
+
+import java.util.Stack;
+
+public abstract class RpnCalculator {
+
+ public static double evaluaterpn(String[] tokens) {
+ Stack stack = new Stack<>();
+
+ for (String token : tokens) {
+ switch (token) {
+ case "+":
+ stack.push(stack.pop() + stack.pop());
+ break;
+ case "-":
+ double subtrahend = stack.pop();
+ stack.push(stack.pop() - subtrahend);
+ break;
+ case "*":
+ stack.push(stack.pop() * stack.pop());
+ break;
+ case "/":
+ double divisor = stack.pop();
+ stack.push(stack.pop() / divisor);
+ break;
+ default:
+ stack.push(Double.parseDouble(token));
+ break;
+ }
+ }
+ return stack.pop();
+ }
+
+ public static void main(String[] args) {
+ String[] expression = {"2", "3", "+", "4", "5", "*", "+"}; // (2 + 3) + (4 * 5)
+ System.out.println("Result: " + evaluaterpn(expression));
+ }
+}
diff --git a/students/23K0818/23K0818-p22/src/main/java/ru/mirea/practice/s0000001/task2/CalculatorApp.java b/students/23K0818/23K0818-p22/src/main/java/ru/mirea/practice/s0000001/task2/CalculatorApp.java
new file mode 100644
index 000000000..e98902435
--- /dev/null
+++ b/students/23K0818/23K0818-p22/src/main/java/ru/mirea/practice/s0000001/task2/CalculatorApp.java
@@ -0,0 +1,11 @@
+package ru.mirea.practice.s0000001.task2;
+
+public abstract class CalculatorApp {
+ public static void main(String[] args) {
+ CalculatorModel model = new CalculatorModel();
+ CalculatorView view = new CalculatorView();
+ new CalculatorController(model, view);
+
+ view.setVisible(true);
+ }
+}
diff --git a/students/23K0818/23K0818-p22/src/main/java/ru/mirea/practice/s0000001/task2/CalculatorController.java b/students/23K0818/23K0818-p22/src/main/java/ru/mirea/practice/s0000001/task2/CalculatorController.java
new file mode 100644
index 000000000..334935e41
--- /dev/null
+++ b/students/23K0818/23K0818-p22/src/main/java/ru/mirea/practice/s0000001/task2/CalculatorController.java
@@ -0,0 +1,25 @@
+package ru.mirea.practice.s0000001.task2;
+
+import javax.swing.JButton;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+public class CalculatorController {
+ public CalculatorController(CalculatorModel model, CalculatorView view) {
+ view.addButtonListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ JButton source = (JButton) e.getSource();
+ String buttonText = source.getText();
+
+ if ("=".equals(buttonText)) {
+ String expression = view.getDisplayText();
+ String result = model.calculate(expression);
+ view.setDisplayText(result);
+ } else {
+ view.setDisplayText(view.getDisplayText() + buttonText + " ");
+ }
+ }
+ });
+ }
+}
diff --git a/students/23K0818/23K0818-p22/src/main/java/ru/mirea/practice/s0000001/task2/CalculatorModel.java b/students/23K0818/23K0818-p22/src/main/java/ru/mirea/practice/s0000001/task2/CalculatorModel.java
new file mode 100644
index 000000000..e5b7648ad
--- /dev/null
+++ b/students/23K0818/23K0818-p22/src/main/java/ru/mirea/practice/s0000001/task2/CalculatorModel.java
@@ -0,0 +1,51 @@
+package ru.mirea.practice.s0000001.task2;
+
+import java.util.Stack;
+
+public class CalculatorModel {
+
+ public String calculate(String expression) {
+ Stack stack = new Stack<>();
+
+ String[] tokens = expression.split(" ");
+
+ try {
+ for (String token : tokens) {
+ if (isNumber(token)) {
+ stack.push(Double.parseDouble(token));
+ } else {
+ double b = stack.pop();
+ double a = stack.pop();
+ switch (token) {
+ case "+":
+ stack.push(a + b);
+ break;
+ case "-":
+ stack.push(a - b);
+ break;
+ case "*":
+ stack.push(a * b);
+ break;
+ case "/":
+ stack.push(a / b);
+ break;
+ default:
+ throw new IllegalArgumentException("Недопустимая операция");
+ }
+ }
+ }
+ return String.valueOf(stack.pop());
+ } catch (Exception e) {
+ return "Ошибка";
+ }
+ }
+
+ private boolean isNumber(String token) {
+ try {
+ Double.parseDouble(token);
+ return true;
+ } catch (NumberFormatException e) {
+ return false;
+ }
+ }
+}
diff --git a/students/23K0818/23K0818-p22/src/main/java/ru/mirea/practice/s0000001/task2/CalculatorView.java b/students/23K0818/23K0818-p22/src/main/java/ru/mirea/practice/s0000001/task2/CalculatorView.java
new file mode 100644
index 000000000..bea0e8ef0
--- /dev/null
+++ b/students/23K0818/23K0818-p22/src/main/java/ru/mirea/practice/s0000001/task2/CalculatorView.java
@@ -0,0 +1,53 @@
+package ru.mirea.practice.s0000001.task2;
+
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.GridLayout;
+import java.awt.event.ActionListener;
+
+public class CalculatorView extends JFrame {
+ private final JTextField display = new JTextField();
+
+ public CalculatorView() {
+ setTitle("Калькулятор");
+ setSize(400, 500);
+ setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ setLocationRelativeTo(null);
+ setLayout(new BorderLayout());
+
+ display.setEditable(false);
+ display.setHorizontalAlignment(JTextField.RIGHT);
+ add(display, BorderLayout.NORTH);
+
+ JPanel buttonPanel = new JPanel();
+ buttonPanel.setLayout(new GridLayout(4, 4));
+
+ String[] buttons = {"7", "8", "9", "/", "4", "5", "6", "*", "1", "2", "3", "-", "0", ".", "=", "+"};
+ for (String text : buttons) {
+ JButton button = new JButton(text);
+ buttonPanel.add(button);
+ }
+
+ add(buttonPanel, BorderLayout.CENTER);
+ }
+
+ public String getDisplayText() {
+ return display.getText();
+ }
+
+ public void setDisplayText(String text) {
+ display.setText(text);
+ }
+
+ public void addButtonListener(ActionListener listener) {
+ for (Component component : ((JPanel) getContentPane().getComponent(1)).getComponents()) {
+ if (component instanceof JButton) {
+ ((JButton) component).addActionListener(listener);
+ }
+ }
+ }
+}
diff --git a/students/23K0818/23K0818-p23/pom.xml b/students/23K0818/23K0818-p23/pom.xml
new file mode 100644
index 000000000..ad52e66cf
--- /dev/null
+++ b/students/23K0818/23K0818-p23/pom.xml
@@ -0,0 +1,12 @@
+
+
+ 4.0.0
+
+ 23K0818
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0818-p23
+
diff --git a/students/23K0818/23K0818-p23/src/main/java/ru/mirea/practice/s0000001/task1/ArrayQueue.java b/students/23K0818/23K0818-p23/src/main/java/ru/mirea/practice/s0000001/task1/ArrayQueue.java
new file mode 100644
index 000000000..dbd7727a0
--- /dev/null
+++ b/students/23K0818/23K0818-p23/src/main/java/ru/mirea/practice/s0000001/task1/ArrayQueue.java
@@ -0,0 +1,64 @@
+package ru.mirea.practice.s0000001.task1;
+
+public class ArrayQueue {
+ private int capacity = 10;
+ private Object[] queue;
+ private int front = 0;
+ private int rear = 0;
+ private int size = 0;
+
+ public ArrayQueue() {
+ queue = new Object[capacity];
+ }
+
+ public void enqueue(Object element) {
+ if (size == capacity) {
+ throw new IllegalStateException("Queue is full");
+ }
+ queue[rear] = element;
+ rear = (rear + 1) % capacity;
+ size++;
+ }
+
+ public Object element() {
+ if (size == 0) {
+ throw new IllegalStateException("Queue is empty");
+ }
+ return queue[front];
+ }
+
+ public Object dequeue() {
+ if (size == 0) {
+ throw new IllegalStateException("Queue is empty");
+ }
+ Object result = queue[front];
+ front = (front + 1) % capacity;
+ size--;
+ return result;
+ }
+
+ public boolean isEmpty() {
+ return size == 0;
+ }
+
+ public int size() {
+ return size;
+ }
+
+ public void clear() {
+ front = 0;
+ rear = 0;
+ size = 0;
+ }
+
+ public static void main(String[] args) {
+ ArrayQueue queue = new ArrayQueue();
+ queue.enqueue(1);
+ queue.enqueue(2);
+ System.out.println(queue.element());
+ System.out.println(queue.dequeue());
+ System.out.println(queue.size());
+ queue.clear();
+ System.out.println(queue.isEmpty());
+ }
+}
diff --git a/students/23K0818/23K0818-p23/src/main/java/ru/mirea/practice/s0000001/task1/ArrayQueueAdt.java b/students/23K0818/23K0818-p23/src/main/java/ru/mirea/practice/s0000001/task1/ArrayQueueAdt.java
new file mode 100644
index 000000000..72c19e710
--- /dev/null
+++ b/students/23K0818/23K0818-p23/src/main/java/ru/mirea/practice/s0000001/task1/ArrayQueueAdt.java
@@ -0,0 +1,64 @@
+package ru.mirea.practice.s0000001.task1;
+
+public class ArrayQueueAdt {
+ private int capacity = 10;
+ private Object[] queue;
+ private int front = 0;
+ private int rear = 0;
+ private int size = 0;
+
+ public ArrayQueueAdt() {
+ queue = new Object[capacity];
+ }
+
+ public void enqueue(Object element) {
+ if (size == capacity) {
+ throw new IllegalStateException("Queue is full");
+ }
+ queue[rear] = element;
+ rear = (rear + 1) % capacity;
+ size++;
+ }
+
+ public Object element() {
+ if (size == 0) {
+ throw new IllegalStateException("Queue is empty");
+ }
+ return queue[front];
+ }
+
+ public Object dequeue() {
+ if (size == 0) {
+ throw new IllegalStateException("Queue is empty");
+ }
+ Object result = queue[front];
+ front = (front + 1) % capacity;
+ size--;
+ return result;
+ }
+
+ public boolean isEmpty() {
+ return size == 0;
+ }
+
+ public int size() {
+ return size;
+ }
+
+ public void clear() {
+ front = 0;
+ rear = 0;
+ size = 0;
+ }
+
+ public static void main(String[] args) {
+ ArrayQueueAdt queue = new ArrayQueueAdt();
+ queue.enqueue(1);
+ queue.enqueue(2);
+ System.out.println(queue.element());
+ System.out.println(queue.dequeue());
+ System.out.println(queue.size());
+ queue.clear();
+ System.out.println(queue.isEmpty());
+ }
+}
diff --git a/students/23K0818/23K0818-p23/src/main/java/ru/mirea/practice/s0000001/task1/ArrayQueueModule.java b/students/23K0818/23K0818-p23/src/main/java/ru/mirea/practice/s0000001/task1/ArrayQueueModule.java
new file mode 100644
index 000000000..8e7c9dbd4
--- /dev/null
+++ b/students/23K0818/23K0818-p23/src/main/java/ru/mirea/practice/s0000001/task1/ArrayQueueModule.java
@@ -0,0 +1,59 @@
+package ru.mirea.practice.s0000001.task1;
+
+public abstract class ArrayQueueModule {
+ private static final int CAPACITY = 10;
+ private static Object[] queue = new Object[CAPACITY];
+ private static int front = 0;
+ private static int rear = 0;
+ private static int size = 0;
+
+ public static void enqueue(Object element) {
+ if (size == CAPACITY) {
+ throw new IllegalStateException("Queue is full");
+ }
+ queue[rear] = element;
+ rear = (rear + 1) % CAPACITY;
+ size++;
+ }
+
+ public static Object element() {
+ if (size == 0) {
+ throw new IllegalStateException("Queue is empty");
+ }
+ return queue[front];
+ }
+
+ public static Object dequeue() {
+ if (size == 0) {
+ throw new IllegalStateException("Queue is empty");
+ }
+ Object result = queue[front];
+ front = (front + 1) % CAPACITY;
+ size--;
+ return result;
+ }
+
+ public static boolean isEmpty() {
+ return size == 0;
+ }
+
+ public static int size() {
+ return size;
+ }
+
+ public static void clear() {
+ front = 0;
+ rear = 0;
+ size = 0;
+ }
+
+ public static void main(String[] args) {
+ enqueue(1);
+ enqueue(2);
+ System.out.println(element());
+ System.out.println(dequeue());
+ System.out.println(size());
+ clear();
+ System.out.println(isEmpty());
+ }
+}
diff --git a/students/23K0818/23K0818-p23/src/main/java/ru/mirea/practice/s0000001/task2/AbstractQueue.java b/students/23K0818/23K0818-p23/src/main/java/ru/mirea/practice/s0000001/task2/AbstractQueue.java
new file mode 100644
index 000000000..6e2144966
--- /dev/null
+++ b/students/23K0818/23K0818-p23/src/main/java/ru/mirea/practice/s0000001/task2/AbstractQueue.java
@@ -0,0 +1,33 @@
+package ru.mirea.practice.s0000001.task2;
+
+public abstract class AbstractQueue implements Queue {
+ protected int size;
+
+ public AbstractQueue(int size) {
+ this.size = size;
+ }
+
+ @Override
+ public int size() {
+ return size;
+ }
+
+ @Override
+ public void clear() {
+ size = 0;
+ }
+
+ @Override
+ public abstract void enqueue(Object element);
+
+ @Override
+ public abstract Object dequeue();
+
+ @Override
+ public abstract Object element();
+
+ @Override
+ public boolean isEmpty() {
+ return size == 0;
+ }
+}
diff --git a/students/23K0818/23K0818-p23/src/main/java/ru/mirea/practice/s0000001/task2/LinkedQueue.java b/students/23K0818/23K0818-p23/src/main/java/ru/mirea/practice/s0000001/task2/LinkedQueue.java
new file mode 100644
index 000000000..36e4959d3
--- /dev/null
+++ b/students/23K0818/23K0818-p23/src/main/java/ru/mirea/practice/s0000001/task2/LinkedQueue.java
@@ -0,0 +1,82 @@
+package ru.mirea.practice.s0000001.task2;
+
+public class LinkedQueue implements Queue {
+ private Nodes head;
+ private Nodes tail;
+
+ public LinkedQueue() {
+ head = null;
+ tail = null;
+ }
+
+ @Override
+ public int size() {
+ int count = 0;
+ Nodes current = head;
+ while (current != null) {
+ count++;
+ current = current.next;
+ }
+ return count;
+ }
+
+ @Override
+ public void clear() {
+ head = tail = null;
+ }
+
+ @Override
+ public void enqueue(Object a) {
+ Nodes newNode = new Nodes(a);
+ if (tail == null) {
+ head = tail = newNode;
+ } else {
+ tail.next = newNode;
+ tail = newNode;
+ }
+ }
+
+ @Override
+ public Object dequeue() {
+ if (isEmpty()) {
+ return null;
+ }
+ Object data = head.cons;
+ head = head.next;
+ if (head == null) {
+ tail = null;
+ }
+ return data;
+ }
+
+ @Override
+ public Object element() {
+ if (isEmpty()) {
+ return null;
+ }
+ return head.cons;
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return head == null;
+ }
+
+
+ public static void main(String[] args) {
+ LinkedQueue queue = new LinkedQueue();
+ queue.enqueue("a");
+ queue.enqueue(1);
+ queue.enqueue(true);
+ System.out.println(queue.dequeue());
+ System.out.println(queue.element());
+ System.out.println(queue.dequeue());
+ queue.enqueue("a");
+ queue.enqueue(1);
+ queue.enqueue(true);
+ System.out.println(queue.size());
+ queue.clear();
+ System.out.println(queue.size());
+ System.out.println(queue.isEmpty());
+ }
+}
diff --git a/students/23K0818/23K0818-p23/src/main/java/ru/mirea/practice/s0000001/task2/Nodes.java b/students/23K0818/23K0818-p23/src/main/java/ru/mirea/practice/s0000001/task2/Nodes.java
new file mode 100644
index 000000000..10aaafdb2
--- /dev/null
+++ b/students/23K0818/23K0818-p23/src/main/java/ru/mirea/practice/s0000001/task2/Nodes.java
@@ -0,0 +1,11 @@
+package ru.mirea.practice.s0000001.task2;
+
+public class Nodes {
+ Object cons;
+ Nodes next;
+
+ public Nodes(Object one) {
+ this.cons = one;
+ this.next = null;
+ }
+}
diff --git a/students/23K0818/23K0818-p23/src/main/java/ru/mirea/practice/s0000001/task2/Queue.java b/students/23K0818/23K0818-p23/src/main/java/ru/mirea/practice/s0000001/task2/Queue.java
new file mode 100644
index 000000000..a7453446e
--- /dev/null
+++ b/students/23K0818/23K0818-p23/src/main/java/ru/mirea/practice/s0000001/task2/Queue.java
@@ -0,0 +1,15 @@
+package ru.mirea.practice.s0000001.task2;
+
+public interface Queue {
+ void enqueue(Object a);
+
+ Object element();
+
+ Object dequeue();
+
+ int size();
+
+ boolean isEmpty();
+
+ void clear();
+}
diff --git a/students/23K0818/23K0818-p24/pom.xml b/students/23K0818/23K0818-p24/pom.xml
new file mode 100644
index 000000000..19ac159ef
--- /dev/null
+++ b/students/23K0818/23K0818-p24/pom.xml
@@ -0,0 +1,12 @@
+
+
+ 4.0.0
+
+ 23K0818
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0818-p24
+
diff --git a/students/23K0818/23K0818-p24/src/main/java/ru/mirea/practice/s0000001/task1/Complex.java b/students/23K0818/23K0818-p24/src/main/java/ru/mirea/practice/s0000001/task1/Complex.java
new file mode 100644
index 000000000..c54f6e625
--- /dev/null
+++ b/students/23K0818/23K0818-p24/src/main/java/ru/mirea/practice/s0000001/task1/Complex.java
@@ -0,0 +1,32 @@
+package ru.mirea.practice.s0000001.task1;
+
+public class Complex {
+ private int real;
+ private int image;
+
+ public Complex(int real, int image) {
+ this.real = real;
+ this.image = image;
+ }
+
+ public int getReal() {
+ return real;
+ }
+
+ public void setReal(int real) {
+ this.real = real;
+ }
+
+ public int getImage() {
+ return image;
+ }
+
+ public void setImage(int image) {
+ this.image = image;
+ }
+
+ @Override
+ public String toString() {
+ return real + " + " + image + "i";
+ }
+}
diff --git a/students/23K0818/23K0818-p24/src/main/java/ru/mirea/practice/s0000001/task1/ComplexAbstractFactory.java b/students/23K0818/23K0818-p24/src/main/java/ru/mirea/practice/s0000001/task1/ComplexAbstractFactory.java
new file mode 100644
index 000000000..5acaf8236
--- /dev/null
+++ b/students/23K0818/23K0818-p24/src/main/java/ru/mirea/practice/s0000001/task1/ComplexAbstractFactory.java
@@ -0,0 +1,7 @@
+package ru.mirea.practice.s0000001.task1;
+
+public interface ComplexAbstractFactory {
+ Complex createComplex();
+
+ Complex createComplex(int real, int image);
+}
diff --git a/students/23K0818/23K0818-p24/src/main/java/ru/mirea/practice/s0000001/task1/ConcreteFactory.java b/students/23K0818/23K0818-p24/src/main/java/ru/mirea/practice/s0000001/task1/ConcreteFactory.java
new file mode 100644
index 000000000..abcaeaca3
--- /dev/null
+++ b/students/23K0818/23K0818-p24/src/main/java/ru/mirea/practice/s0000001/task1/ConcreteFactory.java
@@ -0,0 +1,14 @@
+package ru.mirea.practice.s0000001.task1;
+
+public class ConcreteFactory implements ComplexAbstractFactory {
+
+ @Override
+ public Complex createComplex() {
+ return new Complex(0, 0);
+ }
+
+ @Override
+ public Complex createComplex(int real, int image) {
+ return new Complex(real, image);
+ }
+}
diff --git a/students/23K0818/23K0818-p24/src/main/java/ru/mirea/practice/s0000001/task1/Main.java b/students/23K0818/23K0818-p24/src/main/java/ru/mirea/practice/s0000001/task1/Main.java
new file mode 100644
index 000000000..3863c2654
--- /dev/null
+++ b/students/23K0818/23K0818-p24/src/main/java/ru/mirea/practice/s0000001/task1/Main.java
@@ -0,0 +1,13 @@
+package ru.mirea.practice.s0000001.task1;
+
+public abstract class Main {
+ public static void main(String[] args) {
+ ComplexAbstractFactory factory = new ConcreteFactory();
+
+ Complex defaultComplex = factory.createComplex();
+ System.out.println("Default complex number: " + defaultComplex);
+
+ Complex customComplex = factory.createComplex(5, 10);
+ System.out.println("Custom complex number: " + customComplex);
+ }
+}
diff --git a/students/23K0818/23K0818-p24/src/main/java/ru/mirea/practice/s0000001/task2/AbstractChairFactory.java b/students/23K0818/23K0818-p24/src/main/java/ru/mirea/practice/s0000001/task2/AbstractChairFactory.java
new file mode 100644
index 000000000..791152afe
--- /dev/null
+++ b/students/23K0818/23K0818-p24/src/main/java/ru/mirea/practice/s0000001/task2/AbstractChairFactory.java
@@ -0,0 +1,15 @@
+package ru.mirea.practice.s0000001.task2;
+
+public class AbstractChairFactory {
+ public Chair createMagicChair() {
+ return new VagicChair();
+ }
+
+ public Chair createFunctionalChair() {
+ return new MultiFuncChair();
+ }
+
+ public Chair createVictorianChair(int age) {
+ return new VictorinaChair(age);
+ }
+}
diff --git a/students/23K0818/23K0818-p24/src/main/java/ru/mirea/practice/s0000001/task2/Chair.java b/students/23K0818/23K0818-p24/src/main/java/ru/mirea/practice/s0000001/task2/Chair.java
new file mode 100644
index 000000000..32e4beb17
--- /dev/null
+++ b/students/23K0818/23K0818-p24/src/main/java/ru/mirea/practice/s0000001/task2/Chair.java
@@ -0,0 +1,5 @@
+package ru.mirea.practice.s0000001.task2;
+
+public interface Chair {
+ void sitinOn();
+}
diff --git a/students/23K0818/23K0818-p24/src/main/java/ru/mirea/practice/s0000001/task2/Client.java b/students/23K0818/23K0818-p24/src/main/java/ru/mirea/practice/s0000001/task2/Client.java
new file mode 100644
index 000000000..360a74069
--- /dev/null
+++ b/students/23K0818/23K0818-p24/src/main/java/ru/mirea/practice/s0000001/task2/Client.java
@@ -0,0 +1,31 @@
+package ru.mirea.practice.s0000001.task2;
+
+public class Client {
+ private Chair c;
+
+ public Client(Chair c) {
+ this.c = c;
+ }
+
+ public void setChair(Chair c) {
+ this.c = c;
+ }
+
+ public void toSit() {
+ this.c.sitinOn();
+ }
+
+ public static void main(String[] args) {
+ AbstractChairFactory creation = new AbstractChairFactory();
+ Chair a = creation.createMagicChair();
+ Client one = new Client(a);
+ Chair b = creation.createVictorianChair(1234);
+ Chair c = creation.createFunctionalChair();
+ one.toSit();
+ one.setChair(b);
+ one.toSit();
+ one.setChair(c);
+ one.toSit();
+
+ }
+}
diff --git a/students/23K0818/23K0818-p24/src/main/java/ru/mirea/practice/s0000001/task2/MultiFuncChair.java b/students/23K0818/23K0818-p24/src/main/java/ru/mirea/practice/s0000001/task2/MultiFuncChair.java
new file mode 100644
index 000000000..06c767d42
--- /dev/null
+++ b/students/23K0818/23K0818-p24/src/main/java/ru/mirea/practice/s0000001/task2/MultiFuncChair.java
@@ -0,0 +1,12 @@
+package ru.mirea.practice.s0000001.task2;
+
+public class MultiFuncChair implements Chair {
+ public int sum(int a, int b) {
+ return a + b;
+ }
+
+ @Override
+ public void sitinOn() {
+ System.out.println("u siting on MultiFuncChair");
+ }
+}
diff --git a/students/23K0818/23K0818-p24/src/main/java/ru/mirea/practice/s0000001/task2/VagicChair.java b/students/23K0818/23K0818-p24/src/main/java/ru/mirea/practice/s0000001/task2/VagicChair.java
new file mode 100644
index 000000000..7c2929f73
--- /dev/null
+++ b/students/23K0818/23K0818-p24/src/main/java/ru/mirea/practice/s0000001/task2/VagicChair.java
@@ -0,0 +1,12 @@
+package ru.mirea.practice.s0000001.task2;
+
+public class VagicChair implements Chair {
+ public void doMagic() {
+ System.exit(1);
+ }
+
+ @Override
+ public void sitinOn() {
+ System.out.println("u siting on MagicChair");
+ }
+}
diff --git a/students/23K0818/23K0818-p24/src/main/java/ru/mirea/practice/s0000001/task2/VictorinaChair.java b/students/23K0818/23K0818-p24/src/main/java/ru/mirea/practice/s0000001/task2/VictorinaChair.java
new file mode 100644
index 000000000..58a5f8802
--- /dev/null
+++ b/students/23K0818/23K0818-p24/src/main/java/ru/mirea/practice/s0000001/task2/VictorinaChair.java
@@ -0,0 +1,19 @@
+package ru.mirea.practice.s0000001.task2;
+
+public class VictorinaChair implements Chair {
+ private int age;
+
+ public VictorinaChair(int age) {
+ this.age = age;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ @Override
+ public void sitinOn() {
+ System.out.println("u siting on VictorinaChair");
+ }
+}
+
diff --git a/students/23K0818/23K0818-p25/pom.xml b/students/23K0818/23K0818-p25/pom.xml
new file mode 100644
index 000000000..aaf4554ee
--- /dev/null
+++ b/students/23K0818/23K0818-p25/pom.xml
@@ -0,0 +1,12 @@
+
+
+ 4.0.0
+
+ 23K0818
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0818-p25
+
diff --git a/students/23K0818/23K0818-p25/src/main/java/ru/mirea/practice/s0000001/task1/StringManipulator.java b/students/23K0818/23K0818-p25/src/main/java/ru/mirea/practice/s0000001/task1/StringManipulator.java
new file mode 100644
index 000000000..0d047588a
--- /dev/null
+++ b/students/23K0818/23K0818-p25/src/main/java/ru/mirea/practice/s0000001/task1/StringManipulator.java
@@ -0,0 +1,34 @@
+package ru.mirea.practice.s0000001.task1;
+
+
+import java.util.Scanner;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public abstract class StringManipulator {
+
+ public static void main(String[] args) {
+ Scanner scanner = new Scanner(System.in);
+
+ try {
+ System.out.print("Введите строку для обработки: ");
+ String inputString = scanner.nextLine();
+
+ System.out.print("Введите регулярное выражение для разбивки строки: ");
+ String regex = scanner.nextLine();
+
+ Pattern pattern = Pattern.compile(regex);
+ Matcher matcher = pattern.matcher(inputString);
+
+ System.out.println("Результаты разбиения:");
+ while (matcher.find()) {
+ System.out.println(matcher.group());
+ }
+
+ } finally {
+ if (scanner != null) {
+ scanner.close();
+ }
+ }
+ }
+}
diff --git a/students/23K0818/23K0818-p25/src/main/java/ru/mirea/practice/s0000001/task2/ExactSame.java b/students/23K0818/23K0818-p25/src/main/java/ru/mirea/practice/s0000001/task2/ExactSame.java
new file mode 100644
index 000000000..5f06b0bd3
--- /dev/null
+++ b/students/23K0818/23K0818-p25/src/main/java/ru/mirea/practice/s0000001/task2/ExactSame.java
@@ -0,0 +1,24 @@
+package ru.mirea.practice.s0000001.task2;
+
+import java.util.regex.Pattern;
+
+public abstract class ExactSame {
+ public static void main(String[] args) {
+ String[] texts = {
+ "abcdefghijklmnopqrstuv18340",
+ "abcdefghijklmnopqrstqwrfuv18340",
+ "abcdefg8340",
+ "abcdefghijklmnopqrstuv18340abcdefghijklmnopqrstuv18340"};
+ String regex = "abcdefghijklmnopqrstuv18340{1}";
+ String corect = "";
+ String wrong = "";
+ for (String x : texts) {
+ if (Pattern.matches(regex, x)) {
+ corect += x + "\t";
+ } else {
+ wrong += x + "\t";
+ }
+ }
+ System.out.println(corect + "\n\n" + wrong);
+ }
+}
diff --git a/students/23K0818/23K0818-p26/pom.xml b/students/23K0818/23K0818-p26/pom.xml
new file mode 100644
index 000000000..2dac6f5dd
--- /dev/null
+++ b/students/23K0818/23K0818-p26/pom.xml
@@ -0,0 +1,12 @@
+
+
+ 4.0.0
+
+ 23K0818
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0818-p26
+
diff --git a/students/23K0818/23K0818-p26/src/main/java/ru/mirea/practice/s0000001/task1/Iterator.java b/students/23K0818/23K0818-p26/src/main/java/ru/mirea/practice/s0000001/task1/Iterator.java
new file mode 100644
index 000000000..2f0dd1dae
--- /dev/null
+++ b/students/23K0818/23K0818-p26/src/main/java/ru/mirea/practice/s0000001/task1/Iterator.java
@@ -0,0 +1,28 @@
+package ru.mirea.practice.s0000001.task1;
+
+import java.util.List;
+
+public class Iterator {
+
+ private int curentInd;
+
+ public Iterator() {
+ this.curentInd = 0;
+ }
+
+ public int getCurentInd() {
+ return curentInd;
+ }
+
+ public void next(List> list) {
+ if (curentInd + 1 < list.size()) {
+ System.out.println(list.get(curentInd));
+ } else {
+ System.out.println("Ошибка: выход за пределы списка");
+ }
+ }
+
+ public boolean hasNext(List> list) {
+ return curentInd + 1 < list.size();
+ }
+}
diff --git a/students/23K0818/23K0818-p26/src/main/java/ru/mirea/practice/s0000001/task1/Test.java b/students/23K0818/23K0818-p26/src/main/java/ru/mirea/practice/s0000001/task1/Test.java
new file mode 100644
index 000000000..45dce1c62
--- /dev/null
+++ b/students/23K0818/23K0818-p26/src/main/java/ru/mirea/practice/s0000001/task1/Test.java
@@ -0,0 +1,19 @@
+package ru.mirea.practice.s0000001.task1;
+
+import java.util.ArrayList;
+
+abstract class Test {
+ public static void main(String[] args) {
+ ArrayList al = new ArrayList();
+
+ for (int i = 0; i < 10; i++) {
+ al.add(i);
+ }
+ Iterator iterator = new Iterator();
+ iterator.next(al);
+ iterator.next(al);
+ iterator.next(al);
+ System.out.println(iterator.hasNext(al));
+
+ }
+}
diff --git a/students/23K0818/23K0818-p26/src/main/java/ru/mirea/practice/s0000001/task2/StringValidator.java b/students/23K0818/23K0818-p26/src/main/java/ru/mirea/practice/s0000001/task2/StringValidator.java
new file mode 100644
index 000000000..1969e159b
--- /dev/null
+++ b/students/23K0818/23K0818-p26/src/main/java/ru/mirea/practice/s0000001/task2/StringValidator.java
@@ -0,0 +1,31 @@
+package ru.mirea.practice.s0000001.task2;
+
+import java.util.Scanner;
+import java.util.regex.Pattern;
+
+public abstract class StringValidator {
+
+ public static void main(String[] args) {
+ Scanner scanner = new Scanner(System.in);
+
+ try {
+ System.out.print("Введите строку для проверки: ");
+ String inputString = scanner.nextLine();
+
+ String regex = "^abcdefghijklmnopqrstuv18340$";
+
+ boolean isValid = Pattern.matches(regex, inputString);
+
+ if (isValid) {
+ System.out.println("Строка корректна.");
+ } else {
+ System.out.println("Строка некорректна.");
+ }
+
+ } finally {
+ if (scanner != null) {
+ scanner.close();
+ }
+ }
+ }
+}
diff --git a/students/23K0818/23K0818-p27/pom.xml b/students/23K0818/23K0818-p27/pom.xml
new file mode 100644
index 000000000..4b0b49018
--- /dev/null
+++ b/students/23K0818/23K0818-p27/pom.xml
@@ -0,0 +1,12 @@
+
+
+ 4.0.0
+
+ 23K0818
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0818-p27
+
diff --git a/students/23K0818/23K0818-p27/src/main/java/ru/mirea/practice/s0000001/task1/Hashtable.java b/students/23K0818/23K0818-p27/src/main/java/ru/mirea/practice/s0000001/task1/Hashtable.java
new file mode 100644
index 000000000..809c271bc
--- /dev/null
+++ b/students/23K0818/23K0818-p27/src/main/java/ru/mirea/practice/s0000001/task1/Hashtable.java
@@ -0,0 +1,69 @@
+package ru.mirea.practice.s0000001.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/23K0818/23K0818-p27/src/main/java/ru/mirea/practice/s0000001/task1/Test.java b/students/23K0818/23K0818-p27/src/main/java/ru/mirea/practice/s0000001/task1/Test.java
new file mode 100644
index 000000000..fd772b6c0
--- /dev/null
+++ b/students/23K0818/23K0818-p27/src/main/java/ru/mirea/practice/s0000001/task1/Test.java
@@ -0,0 +1,31 @@
+package ru.mirea.practice.s0000001.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/23K0818/23K0818-p28/pom.xml b/students/23K0818/23K0818-p28/pom.xml
new file mode 100644
index 000000000..c906cf837
--- /dev/null
+++ b/students/23K0818/23K0818-p28/pom.xml
@@ -0,0 +1,12 @@
+
+
+ 4.0.0
+
+ 23K0818
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0818-p28
+
diff --git a/students/23K0818/23K0818-p28/src/main/java/ru/mirea/practice/s0000001/task1/Main.java b/students/23K0818/23K0818-p28/src/main/java/ru/mirea/practice/s0000001/task1/Main.java
new file mode 100644
index 000000000..26cbc7cf7
--- /dev/null
+++ b/students/23K0818/23K0818-p28/src/main/java/ru/mirea/practice/s0000001/task1/Main.java
@@ -0,0 +1,22 @@
+package ru.mirea.practice.s0000001.task1;
+
+import java.util.HashSet;
+import java.util.TreeSet;
+
+public abstract class Main {
+ public static void main(String[] args) {
+ HashSet hashSet = new HashSet<>();
+ hashSet.add("яблоко");
+ hashSet.add("апельсин");
+ hashSet.add("банан");
+ hashSet.add("виноград");
+
+ TreeSet treeSet = new TreeSet<>(hashSet);
+
+ System.out.println("Элементы TreeSet (упорядочены):");
+ for (String item : treeSet) {
+ System.out.println(item);
+ }
+ }
+}
+
diff --git a/students/23K0818/23K0818-p28/src/main/java/ru/mirea/practice/s0000001/task2/MapExample.java b/students/23K0818/23K0818-p28/src/main/java/ru/mirea/practice/s0000001/task2/MapExample.java
new file mode 100644
index 000000000..979ee42b1
--- /dev/null
+++ b/students/23K0818/23K0818-p28/src/main/java/ru/mirea/practice/s0000001/task2/MapExample.java
@@ -0,0 +1,59 @@
+package ru.mirea.practice.s0000001.task2;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.HashSet;
+import java.util.Set;
+
+public abstract class MapExample {
+
+ 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 firstNameCount = new HashMap<>();
+ for (String firstName : map.values()) {
+ firstNameCount.put(firstName, firstNameCount.getOrDefault(firstName, 0) + 1);
+ }
+
+ int count = 0;
+ for (int value : firstNameCount.values()) {
+ if (value > 1) {
+ count += value;
+ }
+ }
+ return count;
+ }
+
+ public static int getSameLastNameCount(Map map) {
+ Set lastNames = new HashSet<>();
+ int count = 0;
+ for (String lastName : map.keySet()) {
+ if (lastNames.contains(lastName)) {
+ count++;
+ } else {
+ lastNames.add(lastName);
+ }
+ }
+ return count;
+ }
+
+ public static void main(String[] args) {
+ Map map = createMap();
+
+ System.out.println("Количество людей с одинаковыми именами: " + getSameFirstNameCount(map));
+ System.out.println("Количество людей с одинаковыми фамилиями: " + getSameLastNameCount(map));
+ }
+}
diff --git a/students/23K0818/23K0818-p29/pom.xml b/students/23K0818/23K0818-p29/pom.xml
new file mode 100644
index 000000000..3f77f8c49
--- /dev/null
+++ b/students/23K0818/23K0818-p29/pom.xml
@@ -0,0 +1,12 @@
+
+
+ 4.0.0
+
+ 23K0818
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0818-p29
+
diff --git a/students/23K0818/23K0818-p29/src/main/java/ru/mirea/practice/s0000001/task1/Main.java b/students/23K0818/23K0818-p29/src/main/java/ru/mirea/practice/s0000001/task1/Main.java
new file mode 100644
index 000000000..6bdbff49a
--- /dev/null
+++ b/students/23K0818/23K0818-p29/src/main/java/ru/mirea/practice/s0000001/task1/Main.java
@@ -0,0 +1,35 @@
+package ru.mirea.practice.s0000001.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/23K0818/23K0818-p29/src/main/java/ru/mirea/practice/s0000001/task2/Main.java b/students/23K0818/23K0818-p29/src/main/java/ru/mirea/practice/s0000001/task2/Main.java
new file mode 100644
index 000000000..a495809ac
--- /dev/null
+++ b/students/23K0818/23K0818-p29/src/main/java/ru/mirea/practice/s0000001/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/23K0818/23K0818-p29/src/main/java/ru/mirea/practice/s0000001/task2/graph b/students/23K0818/23K0818-p29/src/main/java/ru/mirea/practice/s0000001/task2/graph
new file mode 100644
index 000000000..ef0636769
--- /dev/null
+++ b/students/23K0818/23K0818-p29/src/main/java/ru/mirea/practice/s0000001/task2/graph
@@ -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
\ No newline at end of file
diff --git a/students/23K0818/23K0818-p29/src/main/java/ru/mirea/practice/s0000001/task2/graphShortest b/students/23K0818/23K0818-p29/src/main/java/ru/mirea/practice/s0000001/task2/graphShortest
new file mode 100644
index 000000000..adc608142
--- /dev/null
+++ b/students/23K0818/23K0818-p29/src/main/java/ru/mirea/practice/s0000001/task2/graphShortest
@@ -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/23K0818/23K0818-p30/pom.xml b/students/23K0818/23K0818-p30/pom.xml
new file mode 100644
index 000000000..575b75057
--- /dev/null
+++ b/students/23K0818/23K0818-p30/pom.xml
@@ -0,0 +1,12 @@
+
+
+ 4.0.0
+
+ 23K0818
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0818-p30
+
diff --git a/students/23K0818/23K0818-p30/src/main/java/ru/mirea/practice/s0000001/task1/Comparison.java b/students/23K0818/23K0818-p30/src/main/java/ru/mirea/practice/s0000001/task1/Comparison.java
new file mode 100644
index 000000000..d538c1874
--- /dev/null
+++ b/students/23K0818/23K0818-p30/src/main/java/ru/mirea/practice/s0000001/task1/Comparison.java
@@ -0,0 +1,33 @@
+package ru.mirea.practice.s0000001.task1;
+
+public abstract class Comparison {
+ public static boolean compare(Node node1, Node node2) {
+ if (node1 == null && node2 == null) {
+ return true;
+ } else if (node1 != null && node2 != null) {
+ return node1.data == node2.data && compare(node1.left, node2.left) && compare(node1.right, node2.right);
+ } else {
+ return false;
+ }
+ }
+
+ public static void main(String[] args) {
+ Node root1 = new Node(1);
+ root1.left = new Node(2);
+ root1.right = new Node(3);
+ root1.left.left = new Node(4);
+ root1.left.right = new Node(5);
+
+ Node root2 = new Node(1);
+ root2.left = new Node(2);
+ root2.right = new Node(3);
+ root2.left.left = new Node(4);
+ root2.left.right = new Node(5);
+
+ if (compare(root1, root2)) {
+ System.out.println("Деревья равны");
+ } else {
+ System.out.println("Деревья разные");
+ }
+ }
+}
diff --git a/students/23K0818/23K0818-p30/src/main/java/ru/mirea/practice/s0000001/task1/CountOfNode.java b/students/23K0818/23K0818-p30/src/main/java/ru/mirea/practice/s0000001/task1/CountOfNode.java
new file mode 100644
index 000000000..3d20e86db
--- /dev/null
+++ b/students/23K0818/23K0818-p30/src/main/java/ru/mirea/practice/s0000001/task1/CountOfNode.java
@@ -0,0 +1,21 @@
+package ru.mirea.practice.s0000001.task1;
+
+public abstract class CountOfNode {
+ public static int countOfNode(Node node) {
+ if (node == null) {
+ return 0;
+ } else {
+ return countOfNode(node.left) + countOfNode(node.right) + 1;
+ }
+ }
+
+ public static void main(String[] args) {
+ Node root = new Node(1);
+ root.left = new Node(2);
+ root.right = new Node(3);
+ root.left.left = new Node(4);
+ root.left.right = new Node(5);
+
+ System.out.println("Количество узлов в дереве: " + countOfNode(root));
+ }
+}
diff --git a/students/23K0818/23K0818-p30/src/main/java/ru/mirea/practice/s0000001/task1/HeightTree.java b/students/23K0818/23K0818-p30/src/main/java/ru/mirea/practice/s0000001/task1/HeightTree.java
new file mode 100644
index 000000000..7306f7e91
--- /dev/null
+++ b/students/23K0818/23K0818-p30/src/main/java/ru/mirea/practice/s0000001/task1/HeightTree.java
@@ -0,0 +1,25 @@
+package ru.mirea.practice.s0000001.task1;
+
+import static java.lang.Math.max;
+
+public abstract class HeightTree {
+ public static int heightTree(Node node) {
+ if (node == null) {
+ return -1;
+ } else {
+ int leftHeight = heightTree(node.left);
+ int rightHeight = heightTree(node.right);
+ return max(leftHeight, rightHeight) + 1;
+ }
+ }
+
+ public static void main(String[] args) {
+ Node root = new Node(1);
+ root.left = new Node(2);
+ root.right = new Node(3);
+ root.left.left = new Node(4);
+ root.left.right = new Node(5);
+
+ System.out.println("Высота бинарного дерева " + heightTree(root));
+ }
+}
diff --git a/students/23K0818/23K0818-p30/src/main/java/ru/mirea/practice/s0000001/task1/Lookup.java b/students/23K0818/23K0818-p30/src/main/java/ru/mirea/practice/s0000001/task1/Lookup.java
new file mode 100644
index 000000000..cdc10cb01
--- /dev/null
+++ b/students/23K0818/23K0818-p30/src/main/java/ru/mirea/practice/s0000001/task1/Lookup.java
@@ -0,0 +1,34 @@
+package ru.mirea.practice.s0000001.task1;
+
+public abstract class Lookup {
+ public static int lookup(Node node, int key) {
+ if (node == null) {
+ return 0;
+ } else {
+ if (key == node.data) {
+ return 1;
+ } else {
+ if (key < node.data) {
+ return lookup(node.left, key);
+ } else {
+ return lookup(node.right, key);
+ }
+ }
+ }
+ }
+
+ public static void main(String[] args) {
+ Node root = new Node(1);
+ root.left = new Node(2);
+ root.right = new Node(3);
+ root.left.left = new Node(4);
+ root.left.right = new Node(5);
+
+ if (lookup(root, 3) == 1) {
+ System.out.println("Значение найдено");
+ } else {
+ System.out.println("Значение отсутствует");
+ }
+
+ }
+}
diff --git a/students/23K0818/23K0818-p30/src/main/java/ru/mirea/practice/s0000001/task1/Node.java b/students/23K0818/23K0818-p30/src/main/java/ru/mirea/practice/s0000001/task1/Node.java
new file mode 100644
index 000000000..fccd937db
--- /dev/null
+++ b/students/23K0818/23K0818-p30/src/main/java/ru/mirea/practice/s0000001/task1/Node.java
@@ -0,0 +1,47 @@
+package ru.mirea.practice.s0000001.task1;
+
+public class Node {
+ int data;
+ Node left;
+ Node right;
+
+ public Node(int data) {
+ this.data = data;
+ this.left = null;
+ this.right = null;
+ }
+
+ public int getData() {
+ return data;
+ }
+
+ public void setData(int 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;
+ }
+
+ public void print() {
+ System.out.print(data + " ");
+ if (left != null) {
+ left.print();
+ }
+ if (right != null) {
+ right.print();
+ }
+ }
+}
diff --git a/students/23K0818/23K0818-p30/src/main/java/ru/mirea/practice/s0000001/task1/Reverse.java b/students/23K0818/23K0818-p30/src/main/java/ru/mirea/practice/s0000001/task1/Reverse.java
new file mode 100644
index 000000000..b02a5cc0c
--- /dev/null
+++ b/students/23K0818/23K0818-p30/src/main/java/ru/mirea/practice/s0000001/task1/Reverse.java
@@ -0,0 +1,42 @@
+package ru.mirea.practice.s0000001.task1;
+
+public abstract class Reverse {
+ public static void reverse(Node node) {
+ if (node == null) {
+ return;
+ } else {
+ Node temp = node.left;
+ node.left = node.right;
+ node.right = temp;
+
+ reverse(node.left);
+ reverse(node.right);
+ }
+ }
+
+ public static void printTree(Node node, String prefix, boolean isLeft) {
+ if (node != null) {
+ System.out.println(prefix + (isLeft ? "├── " : "└── ") + node.getData());
+ printTree(node.getLeft(), prefix + (isLeft ? "│ " : " "), true);
+ printTree(node.getRight(), prefix + (isLeft ? "│ " : " "), false);
+ }
+ }
+
+ public static void printTree(Node node) {
+ printTree(node, "", false);
+ }
+
+ public static void main(String[] args) {
+ Node root = new Node(1);
+ root.left = new Node(2);
+ root.right = new Node(3);
+ root.left.left = new Node(4);
+ root.left.right = new Node(5);
+
+ System.out.println("Оригинальное дерево:");
+ printTree(root);
+ reverse(root);
+ System.out.println("Зеркальное дерево:");
+ printTree(root);
+ }
+}
diff --git a/students/23K0818/23K0818-p30/src/main/java/ru/mirea/practice/s0000001/task1/Weight.java b/students/23K0818/23K0818-p30/src/main/java/ru/mirea/practice/s0000001/task1/Weight.java
new file mode 100644
index 000000000..e30cc95ec
--- /dev/null
+++ b/students/23K0818/23K0818-p30/src/main/java/ru/mirea/practice/s0000001/task1/Weight.java
@@ -0,0 +1,44 @@
+package ru.mirea.practice.s0000001.task1;
+
+public abstract class Weight {
+ public static int widht(Node node) {
+ int maxWidht = 0;
+ int widht = 0;
+ int h = height(node);
+ for (int i = 1; i < h; i++) {
+ widht = getWidht(node, i);
+ maxWidht = Math.max(widht, maxWidht);
+ }
+ return maxWidht;
+ }
+
+ public static int getWidht(Node node, int level) {
+ if (node == null) {
+ return 0;
+ } else if (level == 1) {
+ return 1;
+ } else {
+ return getWidht(node.left, level - 1) + getWidht(node.right, level - 1);
+ }
+ }
+
+ public static int height(Node node) {
+ if (node == null) {
+ return 0;
+ } else {
+ int leftHeight = height(node.left);
+ int rightHeight = height(node.right);
+ return Math.max(leftHeight + 1, rightHeight + 1);
+ }
+ }
+
+ public static void main(String[] args) {
+ Node root = new Node(1);
+ root.left = new Node(2);
+ root.right = new Node(3);
+ root.left.left = new Node(4);
+ root.left.right = new Node(5);
+
+ System.out.println("Вес дерева: " + widht(root));
+ }
+}
diff --git a/students/23K0818/23K0818-p30/src/main/java/ru/mirea/practice/s0000001/task2/Haffman.java b/students/23K0818/23K0818-p30/src/main/java/ru/mirea/practice/s0000001/task2/Haffman.java
new file mode 100644
index 000000000..205aa3381
--- /dev/null
+++ b/students/23K0818/23K0818-p30/src/main/java/ru/mirea/practice/s0000001/task2/Haffman.java
@@ -0,0 +1,55 @@
+package ru.mirea.practice.s0000001.task2;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.PriorityQueue;
+
+public abstract class Haffman {
+ public static void haffman(Map charFreq) {
+ PriorityQueue pq = new PriorityQueue<>();
+
+ for (Map.Entry entry : charFreq.entrySet()) {
+ pq.add(new Node(entry.getKey(), entry.getValue()));
+ }
+
+ while (pq.size() > 1) {
+ Node left = pq.poll();
+ Node right = pq.poll();
+
+ Node parent = new Node('\0', left.getFrequency() + right.getFrequency());
+ parent.setLeft(left);
+ parent.setRight(right);
+ pq.add(parent);
+ }
+
+ Node root = pq.peek();
+ Map huffmanCodes = new HashMap<>();
+ printCodes(root, "", huffmanCodes);
+
+ System.out.println("Символ\tкод");
+ for (Map.Entry entry : huffmanCodes.entrySet()) {
+ System.out.println(entry.getKey() + "\t\t" + entry.getValue());
+ }
+ }
+
+ private static void printCodes(Node root, String currentCode, Map huffmanCodes) {
+ if (root == null) {
+ return;
+ } else if (root.name != '\0') {
+ huffmanCodes.put(root.name, currentCode);
+ }
+ printCodes(root.left, currentCode + "0", huffmanCodes);
+ printCodes(root.right, currentCode + "1", huffmanCodes);
+ }
+
+ public static void main(String[] args) {
+ Map charFrequencies = new HashMap<>();
+ charFrequencies.put('A', 1);
+ charFrequencies.put('B', 2);
+ charFrequencies.put('C', 3);
+ charFrequencies.put('D', 4);
+ charFrequencies.put('E', 5);
+
+ haffman(charFrequencies);
+ }
+}
diff --git a/students/23K0818/23K0818-p30/src/main/java/ru/mirea/practice/s0000001/task2/Node.java b/students/23K0818/23K0818-p30/src/main/java/ru/mirea/practice/s0000001/task2/Node.java
new file mode 100644
index 000000000..a1e669ba7
--- /dev/null
+++ b/students/23K0818/23K0818-p30/src/main/java/ru/mirea/practice/s0000001/task2/Node.java
@@ -0,0 +1,50 @@
+package ru.mirea.practice.s0000001.task2;
+
+public class Node implements Comparable {
+ char name;
+ float frequency;
+ Node left;
+ Node right;
+
+ public Node(char name, float frequency) {
+ this.name = name;
+ this.frequency = frequency;
+ }
+
+ public char getName() {
+ return name;
+ }
+
+ public void setName(char name) {
+ this.name = name;
+ }
+
+ public float getFrequency() {
+ return frequency;
+ }
+
+ public void setFrequency(float frequency) {
+ this.frequency = frequency;
+ }
+
+ 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;
+ }
+
+ @Override
+ public int compareTo(Node other) {
+ return (int) (this.frequency - other.frequency);
+ }
+}
diff --git a/students/23K0818/23K0818-p31/pom.xml b/students/23K0818/23K0818-p31/pom.xml
new file mode 100644
index 000000000..c5fe617a0
--- /dev/null
+++ b/students/23K0818/23K0818-p31/pom.xml
@@ -0,0 +1,12 @@
+
+
+ 4.0.0
+
+ 23K0818
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0818-p31
+
diff --git a/students/23K0818/23K0818-p31/src/main/java/ru/mirea/practice/s0000001/task1/Node.java b/students/23K0818/23K0818-p31/src/main/java/ru/mirea/practice/s0000001/task1/Node.java
new file mode 100644
index 000000000..5ef5b3435
--- /dev/null
+++ b/students/23K0818/23K0818-p31/src/main/java/ru/mirea/practice/s0000001/task1/Node.java
@@ -0,0 +1,119 @@
+package ru.mirea.practice.s0000001.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/23K0818/23K0818-p31/src/main/java/ru/mirea/practice/s0000001/task1/Test.java b/students/23K0818/23K0818-p31/src/main/java/ru/mirea/practice/s0000001/task1/Test.java
new file mode 100644
index 000000000..fc6c6870f
--- /dev/null
+++ b/students/23K0818/23K0818-p31/src/main/java/ru/mirea/practice/s0000001/task1/Test.java
@@ -0,0 +1,15 @@
+package ru.mirea.practice.s0000001.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/23K0818/23K0818-p31/src/main/java/ru/mirea/practice/s0000001/task1/TwoThreeTree.java b/students/23K0818/23K0818-p31/src/main/java/ru/mirea/practice/s0000001/task1/TwoThreeTree.java
new file mode 100644
index 000000000..e1d828e4d
--- /dev/null
+++ b/students/23K0818/23K0818-p31/src/main/java/ru/mirea/practice/s0000001/task1/TwoThreeTree.java
@@ -0,0 +1,464 @@
+package ru.mirea.practice.s0000001.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/23K0818/23K0818-p32/pom.xml b/students/23K0818/23K0818-p32/pom.xml
new file mode 100644
index 000000000..a271eb348
--- /dev/null
+++ b/students/23K0818/23K0818-p32/pom.xml
@@ -0,0 +1,12 @@
+
+
+ 4.0.0
+
+ 23K0818
+ ru.mirea.practice
+ 2024.1
+ ../pom.xml
+
+ 23K0818-p32
+
diff --git a/students/23K0818/23K0818-p32/src/main/java/ru/mirea/practice/s0000001/task1/Trotter.java b/students/23K0818/23K0818-p32/src/main/java/ru/mirea/practice/s0000001/task1/Trotter.java
new file mode 100644
index 000000000..83430d8f8
--- /dev/null
+++ b/students/23K0818/23K0818-p32/src/main/java/ru/mirea/practice/s0000001/task1/Trotter.java
@@ -0,0 +1,73 @@
+package ru.mirea.practice.s0000001.task1;
+
+public abstract class Trotter {
+
+ public static void printPermutation(int[] permutation) {
+ for (int num : permutation) {
+ System.out.print(num + " ");
+ }
+ System.out.println();
+ }
+
+ public static void generatePermutations(int n) {
+ int[] permutation = new int[n];
+ int[] direction = new int[n];
+
+ for (int i = 0; i < n; i++) {
+ permutation[i] = i + 1;
+ direction[i] = 0;
+ }
+
+ printPermutation(permutation);
+
+ boolean hasNext = true;
+ while (hasNext) {
+ int largestMobile = -1;
+ int largestMobileIndex = -1;
+
+ for (int i = 0; i < n; i++) {
+ if (direction[i] == 0 && i > 0 && permutation[i] > permutation[i - 1]
+ || direction[i] == 1 && i < n - 1 && permutation[i] > permutation[i + 1]) {
+
+ if (permutation[i] > largestMobile) {
+ largestMobile = permutation[i];
+ largestMobileIndex = i;
+ }
+ }
+ }
+
+ if (largestMobile == -1) {
+ hasNext = false;
+ } else {
+ int index = largestMobileIndex;
+ int temp = permutation[index];
+
+
+ if (direction[index] == 0) {
+ permutation[index] = permutation[index - 1];
+ permutation[index - 1] = temp;
+ direction[index] = 1;
+ direction[index - 1] = 0;
+ } else {
+ permutation[index] = permutation[index + 1];
+ permutation[index + 1] = temp;
+ direction[index] = 0;
+ direction[index + 1] = 1;
+ }
+
+ for (int i = 0; i < n; i++) {
+ if (permutation[i] > largestMobile) {
+ direction[i] = 1 - direction[i];
+ }
+ }
+
+ printPermutation(permutation);
+ }
+ }
+ }
+
+ public static void main(String[] args) {
+ int n = 3;
+ generatePermutations(n);
+ }
+}
diff --git a/students/23K0818/pom.xml b/students/23K0818/pom.xml
index 01b7368a6..903d0405f 100644
--- a/students/23K0818/pom.xml
+++ b/students/23K0818/pom.xml
@@ -32,6 +32,18 @@
23K0818-p18
23K0818-p19
23K0818-p20
+ 23K0818-p21
+ 23K0818-p22
+ 23K0818-p23
+ 23K0818-p24
+ 23K0818-p25
+ 23K0818-p26
+ 23K0818-p27
+ 23K0818-p28
+ 23K0818-p29
+ 23K0818-p30
+ 23K0818-p31
+ 23K0818-p32