From c1d6b896d54b1d46a21619c41ef07e96607d315f Mon Sep 17 00:00:00 2001 From: "Andrei.Ovcharenko" Date: Sun, 17 Aug 2025 19:46:01 +0300 Subject: [PATCH 01/45] AB --- src/main/java/algorithms/sprint0/AB.java | 27 +++++++++++++++++++ .../java/algorithms/sprint0/Solution.java | 24 +++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 src/main/java/algorithms/sprint0/AB.java create mode 100644 src/main/java/algorithms/sprint0/Solution.java diff --git a/src/main/java/algorithms/sprint0/AB.java b/src/main/java/algorithms/sprint0/AB.java new file mode 100644 index 0000000..4475457 --- /dev/null +++ b/src/main/java/algorithms/sprint0/AB.java @@ -0,0 +1,27 @@ +package algorithms.sprint0; + +import org.junit.jupiter.api.Test; + +import java.util.Scanner; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class AB { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int a = sc.nextInt(); + int b = sc.nextInt(); + long sum = sum(a, b); + System.out.println(sum); + } + + public static long sum(int a, int b) { + return a + b; + } + + @Test + public void test() { + assertEquals(5, sum(2, 3)); + assertEquals(-1, sum(-2, 1)); + } +} diff --git a/src/main/java/algorithms/sprint0/Solution.java b/src/main/java/algorithms/sprint0/Solution.java new file mode 100644 index 0000000..798ab2a --- /dev/null +++ b/src/main/java/algorithms/sprint0/Solution.java @@ -0,0 +1,24 @@ +package algorithms.sprint0;// Java + +import java.io.*; +import java.util.Arrays; +import java.util.List; + +public class Solution { + public static void main(String[] args) throws IOException { + List arr; + try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { + int n = Integer.parseInt(reader.readLine().strip()); + arr = Arrays.stream(reader.readLine().strip().split(" ")) + .map(Integer::parseInt) + .toList(); + } + BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out)); + for (int i : arr) { + writer.write(String.valueOf(i)); + writer.write(" "); + } + writer.flush(); + } + +} \ No newline at end of file From 0670bb476b09a0a2515d8e146f42d7df5c07d0de Mon Sep 17 00:00:00 2001 From: "Andrei.Ovcharenko" Date: Sun, 17 Aug 2025 22:41:28 +0300 Subject: [PATCH 02/45] Zip --- src/main/java/algorithms/sprint0/Zip.java | 62 +++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 src/main/java/algorithms/sprint0/Zip.java diff --git a/src/main/java/algorithms/sprint0/Zip.java b/src/main/java/algorithms/sprint0/Zip.java new file mode 100644 index 0000000..fa1ecbf --- /dev/null +++ b/src/main/java/algorithms/sprint0/Zip.java @@ -0,0 +1,62 @@ +package algorithms.sprint0; + +import org.junit.jupiter.api.Test; + +import java.io.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class Zip { + + private static List zip(List a, List b, int n) { + ArrayList integers = new ArrayList<>(); + + for (int i = 0; i < n; i++) { + integers.add(a.get(i)); + integers.add(b.get(i)); + } + return integers; + } + + public static void main(String[] args) throws IOException { + try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); + BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out))) { + int n = Integer.parseInt(reader.readLine()); + List a = readList(reader); + List b = readList(reader); + printList(zip(a, b, n), writer); + } + } + + private static List readList(BufferedReader reader) throws IOException { + return Arrays.stream(reader.readLine().split(" ")) + .map(Integer::parseInt) + .collect(Collectors.toList()); + } + + private static void printList(List list, Writer writer) { + list.forEach(elem -> { + try { + writer.write(String.valueOf(elem)); + writer.write(" "); + } catch (IOException ignored) { + + } + } + ); + } + + @Test + void test1() { + List integers1 = List.of(1, 5, 6); + List integers2 = List.of(7, 8, 9); + List actualZip = zip(integers1, integers2, 3); + + List expected = List.of(1, 7, 5, 8, 6, 9); + assertEquals(expected, actualZip); + } +} From 602554648303c7f6fcb2d1b72ec41fd727bf847e Mon Sep 17 00:00:00 2001 From: "Andrei.Ovcharenko" Date: Sun, 17 Aug 2025 22:45:55 +0300 Subject: [PATCH 03/45] Zip --- src/main/java/algorithms/sprint0/Zip.java | 33 ++++++++++++++--------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/src/main/java/algorithms/sprint0/Zip.java b/src/main/java/algorithms/sprint0/Zip.java index fa1ecbf..5d6b029 100644 --- a/src/main/java/algorithms/sprint0/Zip.java +++ b/src/main/java/algorithms/sprint0/Zip.java @@ -13,9 +13,10 @@ public class Zip { private static List zip(List a, List b, int n) { - ArrayList integers = new ArrayList<>(); + int min = Math.min(n, Math.min(a.size(), b.size())); + ArrayList integers = new ArrayList<>(min * 2); - for (int i = 0; i < n; i++) { + for (int i = 0; i < min; i++) { integers.add(a.get(i)); integers.add(b.get(i)); } @@ -33,21 +34,19 @@ public static void main(String[] args) throws IOException { } private static List readList(BufferedReader reader) throws IOException { - return Arrays.stream(reader.readLine().split(" ")) + return Arrays.stream(reader.readLine().split("\\s+")) .map(Integer::parseInt) .collect(Collectors.toList()); } private static void printList(List list, Writer writer) { - list.forEach(elem -> { - try { - writer.write(String.valueOf(elem)); - writer.write(" "); - } catch (IOException ignored) { - - } - } - ); + for (T elem : list) { + try { + writer.write(String.valueOf(elem)); + writer.write(" "); + } catch (IOException ignored) { + } + } } @Test @@ -59,4 +58,14 @@ void test1() { List expected = List.of(1, 7, 5, 8, 6, 9); assertEquals(expected, actualZip); } + + @Test + void test2() { + List integers1 = List.of(1, 5, 6); + List integers2 = List.of(7, 8, 9); + List actualZip = zip(integers1, integers2, 0); + + List expected = List.of(); + assertEquals(expected, actualZip); + } } From 27e4649c00c14df82da1a47457a0f8c5031c5288 Mon Sep 17 00:00:00 2001 From: "Andrei.Ovcharenko" Date: Sun, 17 Aug 2025 23:03:27 +0300 Subject: [PATCH 04/45] Zip --- src/main/java/algorithms/sprint0/Zip.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/algorithms/sprint0/Zip.java b/src/main/java/algorithms/sprint0/Zip.java index 5d6b029..70b001f 100644 --- a/src/main/java/algorithms/sprint0/Zip.java +++ b/src/main/java/algorithms/sprint0/Zip.java @@ -13,6 +13,7 @@ public class Zip { private static List zip(List a, List b, int n) { + if (n < 0) throw new IllegalArgumentException("n >= 0 required"); int min = Math.min(n, Math.min(a.size(), b.size())); ArrayList integers = new ArrayList<>(min * 2); @@ -26,7 +27,7 @@ private static List zip(List a, List b, int n) { public static void main(String[] args) throws IOException { try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out))) { - int n = Integer.parseInt(reader.readLine()); + int n = Integer.parseInt(reader.readLine().trim()); List a = readList(reader); List b = readList(reader); printList(zip(a, b, n), writer); @@ -34,7 +35,7 @@ public static void main(String[] args) throws IOException { } private static List readList(BufferedReader reader) throws IOException { - return Arrays.stream(reader.readLine().split("\\s+")) + return Arrays.stream(reader.readLine().trim().split("\\s+")) .map(Integer::parseInt) .collect(Collectors.toList()); } From b5239c3688e8ded48c1cdb21b230a4689c05f7ac Mon Sep 17 00:00:00 2001 From: "Andrei.Ovcharenko" Date: Mon, 18 Aug 2025 00:04:54 +0300 Subject: [PATCH 05/45] SlidingAverage --- .../algorithms/sprint0/SlidingAverage.java | 112 ++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 src/main/java/algorithms/sprint0/SlidingAverage.java diff --git a/src/main/java/algorithms/sprint0/SlidingAverage.java b/src/main/java/algorithms/sprint0/SlidingAverage.java new file mode 100644 index 0000000..4837a41 --- /dev/null +++ b/src/main/java/algorithms/sprint0/SlidingAverage.java @@ -0,0 +1,112 @@ +package algorithms.sprint0; + +import org.junit.jupiter.api.Test; + +import java.io.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class SlidingAverage { + + private static List movingAverage(int n, List arr, int windowSize) { + int minSize = Math.min(arr.size(), n); + int count = minSize - windowSize + 1; + if (windowSize <= 0 || count <= 0) return java.util.Collections.emptyList(); + List result = new ArrayList<>(count); + long sum = 0; + for (int i = 0; i < windowSize; i++) sum += arr.get(i); + result.add(sum / (double) windowSize); + for (int i = windowSize; i < minSize; i++) { + sum += arr.get(i) - arr.get(i - windowSize); + result.add(sum / (double) windowSize); + } + return result; + } + + public static void main(String[] args) throws IOException { + try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); + BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out))) { + int n = readInt(reader); + List arr = readList(reader); + int windowSize = readInt(reader); + List result = movingAverage(n, arr, windowSize); + for (double elem : result) { + writer.write(elem + " "); + } + } + } + + + private static int readInt(BufferedReader reader) throws IOException { + return Integer.parseInt(reader.readLine()); + } + + private static List readList(BufferedReader reader) throws IOException { + return Arrays.asList(reader.readLine().split(" ")) + .stream() + .map(elem -> Integer.parseInt(elem)) + .collect(Collectors.toList()); + } + + private static void assertListDoubles(List actual, double... expected) { + assertEquals(expected.length, actual.size(), "size"); + for (int i = 0; i < expected.length; i++) { + assertEquals(expected[i], actual.get(i), 1e-9, "idx=" + i); + } + } + + @Test + void test1() { + List actual = movingAverage(7, List.of(1, 2, 3, 4, 5, 6, 7), 4); + assertListDoubles(actual, 2.5, 3.5, 4.5, 5.5); + } + + @Test + void w1_returnsOriginalValues() { + List actual = movingAverage(7, List.of(1,2,3,4,5,6,7), 1); + assertListDoubles(actual, 1,2,3,4,5,6,7); + } + + @Test + void wEqMin_singleAverage() { + List actual = movingAverage(7, List.of(1,2,3,4,5,6,7), 7); + assertListDoubles(actual, 4.0); + } + + @Test + void wGreaterThanMin_empty() { + List actual = movingAverage(5, List.of(1,2,3,4,5,6,7), 6); + assertEquals(List.of(), actual); + } + + @Test + void wZeroOrNegative_empty() { + assertEquals(List.of(), movingAverage(5, List.of(1,2,3,4,5), 0)); + assertEquals(List.of(), movingAverage(5, List.of(1,2,3,4,5), -3)); + } + + @Test + void cutByN_truncatesAndAverages() { + List actual = movingAverage(5, List.of(1,2,3,4,5,6,7), 3); + // окна по первым 5 элементам: [1,2,3],[2,3,4],[3,4,5] + assertListDoubles(actual, 2.0, 3.0, 4.0); + } + + @Test + void emptyArray_empty() { + List actual = movingAverage(10, List.of(), 3); + assertEquals(List.of(), actual); + } + + @Test + void largeValues_noOverflowInSum() { + int M = Integer.MAX_VALUE; + List actual = movingAverage(4, List.of(M, M, M, M), 2); + // три окна: [M,M],[M,M],[M,M] → среднее = M + assertListDoubles(actual, M, M, M); + } +} From 3c8cfaa4fc637cd50dd068f3b13c3b3999d7d7ea Mon Sep 17 00:00:00 2001 From: "Andrei.Ovcharenko" Date: Mon, 18 Aug 2025 00:16:45 +0300 Subject: [PATCH 06/45] Utils --- src/main/java/algorithms/sprint0/AB.java | 49 +++++++++++- .../algorithms/sprint0/SlidingAverage.java | 30 +++----- .../java/algorithms/sprint0/Solution.java | 24 ------ src/main/java/algorithms/sprint0/Utils.java | 34 ++++++++ src/main/java/algorithms/sprint0/Zip.java | 77 ++++++++++++------- 5 files changed, 142 insertions(+), 72 deletions(-) delete mode 100644 src/main/java/algorithms/sprint0/Solution.java create mode 100644 src/main/java/algorithms/sprint0/Utils.java diff --git a/src/main/java/algorithms/sprint0/AB.java b/src/main/java/algorithms/sprint0/AB.java index 4475457..5258660 100644 --- a/src/main/java/algorithms/sprint0/AB.java +++ b/src/main/java/algorithms/sprint0/AB.java @@ -1,10 +1,19 @@ package algorithms.sprint0; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.io.PrintStream; +import java.nio.charset.StandardCharsets; +import java.util.InputMismatchException; import java.util.Scanner; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; public class AB { public static void main(String[] args) { @@ -16,7 +25,7 @@ public static void main(String[] args) { } public static long sum(int a, int b) { - return a + b; + return (long) a + b; } @Test @@ -24,4 +33,42 @@ public void test() { assertEquals(5, sum(2, 3)); assertEquals(-1, sum(-2, 1)); } + + @ParameterizedTest + @CsvSource({ + "0,0,0", + "2,3,5", + "-1,4,3", + "2147483647,1,2147483648", + "2000000000,2000000000,4000000000" + }) + void sum_works(int a, int b, long expected) { + assertEquals(expected, AB.sum(a, b)); + } + + @Test + void main_prints_sum_basic() { + String in = "2 3\n"; + InputStream oldIn = System.in; + PrintStream oldOut = System.out; + try { + System.setIn(new ByteArrayInputStream(in.getBytes(StandardCharsets.UTF_8))); + ByteArrayOutputStream buf = new ByteArrayOutputStream(); + System.setOut(new PrintStream(buf, true, StandardCharsets.UTF_8)); + + AB.main(new String[0]); + + String nl = System.lineSeparator(); + assertEquals("5" + nl, buf.toString(StandardCharsets.UTF_8)); + } finally { + System.setIn(oldIn); + System.setOut(oldOut); + } + } + + @Test + void main_bad_input_throws() { + System.setIn(new ByteArrayInputStream("x y\n".getBytes(StandardCharsets.UTF_8))); + assertThrows(InputMismatchException.class, () -> AB.main(new String[0])); + } } diff --git a/src/main/java/algorithms/sprint0/SlidingAverage.java b/src/main/java/algorithms/sprint0/SlidingAverage.java index 4837a41..e5775bd 100644 --- a/src/main/java/algorithms/sprint0/SlidingAverage.java +++ b/src/main/java/algorithms/sprint0/SlidingAverage.java @@ -4,10 +4,10 @@ import java.io.*; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; -import java.util.stream.Collectors; +import static algorithms.sprint0.Utils.readInt; +import static algorithms.sprint0.Utils.readList; import static org.junit.jupiter.api.Assertions.assertEquals; public class SlidingAverage { @@ -40,18 +40,6 @@ public static void main(String[] args) throws IOException { } } - - private static int readInt(BufferedReader reader) throws IOException { - return Integer.parseInt(reader.readLine()); - } - - private static List readList(BufferedReader reader) throws IOException { - return Arrays.asList(reader.readLine().split(" ")) - .stream() - .map(elem -> Integer.parseInt(elem)) - .collect(Collectors.toList()); - } - private static void assertListDoubles(List actual, double... expected) { assertEquals(expected.length, actual.size(), "size"); for (int i = 0; i < expected.length; i++) { @@ -67,31 +55,31 @@ void test1() { @Test void w1_returnsOriginalValues() { - List actual = movingAverage(7, List.of(1,2,3,4,5,6,7), 1); - assertListDoubles(actual, 1,2,3,4,5,6,7); + List actual = movingAverage(7, List.of(1, 2, 3, 4, 5, 6, 7), 1); + assertListDoubles(actual, 1, 2, 3, 4, 5, 6, 7); } @Test void wEqMin_singleAverage() { - List actual = movingAverage(7, List.of(1,2,3,4,5,6,7), 7); + List actual = movingAverage(7, List.of(1, 2, 3, 4, 5, 6, 7), 7); assertListDoubles(actual, 4.0); } @Test void wGreaterThanMin_empty() { - List actual = movingAverage(5, List.of(1,2,3,4,5,6,7), 6); + List actual = movingAverage(5, List.of(1, 2, 3, 4, 5, 6, 7), 6); assertEquals(List.of(), actual); } @Test void wZeroOrNegative_empty() { - assertEquals(List.of(), movingAverage(5, List.of(1,2,3,4,5), 0)); - assertEquals(List.of(), movingAverage(5, List.of(1,2,3,4,5), -3)); + assertEquals(List.of(), movingAverage(5, List.of(1, 2, 3, 4, 5), 0)); + assertEquals(List.of(), movingAverage(5, List.of(1, 2, 3, 4, 5), -3)); } @Test void cutByN_truncatesAndAverages() { - List actual = movingAverage(5, List.of(1,2,3,4,5,6,7), 3); + List actual = movingAverage(5, List.of(1, 2, 3, 4, 5, 6, 7), 3); // окна по первым 5 элементам: [1,2,3],[2,3,4],[3,4,5] assertListDoubles(actual, 2.0, 3.0, 4.0); } diff --git a/src/main/java/algorithms/sprint0/Solution.java b/src/main/java/algorithms/sprint0/Solution.java deleted file mode 100644 index 798ab2a..0000000 --- a/src/main/java/algorithms/sprint0/Solution.java +++ /dev/null @@ -1,24 +0,0 @@ -package algorithms.sprint0;// Java - -import java.io.*; -import java.util.Arrays; -import java.util.List; - -public class Solution { - public static void main(String[] args) throws IOException { - List arr; - try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { - int n = Integer.parseInt(reader.readLine().strip()); - arr = Arrays.stream(reader.readLine().strip().split(" ")) - .map(Integer::parseInt) - .toList(); - } - BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out)); - for (int i : arr) { - writer.write(String.valueOf(i)); - writer.write(" "); - } - writer.flush(); - } - -} \ No newline at end of file diff --git a/src/main/java/algorithms/sprint0/Utils.java b/src/main/java/algorithms/sprint0/Utils.java new file mode 100644 index 0000000..50228a6 --- /dev/null +++ b/src/main/java/algorithms/sprint0/Utils.java @@ -0,0 +1,34 @@ +package algorithms.sprint0; + +import lombok.experimental.UtilityClass; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.Writer; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +@UtilityClass +public class Utils { + + public static List readList(BufferedReader reader) throws IOException { + return Arrays.stream(reader.readLine().trim().split("\\s+")) + .map(Integer::parseInt) + .collect(Collectors.toList()); + } + + public static void printList(List list, Writer writer) { + for (T elem : list) { + try { + writer.write(String.valueOf(elem)); + writer.write(" "); + } catch (IOException ignored) { + } + } + } + + public static int readInt(BufferedReader reader) throws IOException { + return Integer.parseInt(reader.readLine()); + } +} diff --git a/src/main/java/algorithms/sprint0/Zip.java b/src/main/java/algorithms/sprint0/Zip.java index 70b001f..257ef4a 100644 --- a/src/main/java/algorithms/sprint0/Zip.java +++ b/src/main/java/algorithms/sprint0/Zip.java @@ -6,9 +6,10 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.stream.Collectors; -import static org.junit.jupiter.api.Assertions.assertEquals; +import static algorithms.sprint0.Utils.printList; +import static algorithms.sprint0.Utils.readList; +import static org.junit.jupiter.api.Assertions.*; public class Zip { @@ -34,39 +35,63 @@ public static void main(String[] args) throws IOException { } } - private static List readList(BufferedReader reader) throws IOException { - return Arrays.stream(reader.readLine().trim().split("\\s+")) - .map(Integer::parseInt) - .collect(Collectors.toList()); + @Test + void equalLength_nEqualsSize() { + List a = Arrays.asList(1, 3, 5); + List b = Arrays.asList(2, 4, 6); + assertEquals(Arrays.asList(1, 2, 3, 4, 5, 6), zip(a, b, 3)); } - private static void printList(List list, Writer writer) { - for (T elem : list) { - try { - writer.write(String.valueOf(elem)); - writer.write(" "); - } catch (IOException ignored) { - } - } + @Test + void nSmallerThanSizes() { + List a = Arrays.asList(10, 30, 50); + List b = Arrays.asList(20, 40, 60); + assertEquals(Arrays.asList(10, 20, 30, 40), zip(a, b, 2)); + } + + @Test + void nZero_returnsEmpty() { + List a = Arrays.asList(1, 3, 5); + List b = Arrays.asList(2, 4, 6); + assertTrue(zip(a, b, 0).isEmpty()); + } + + @Test + void nGreaterThanSizes_clampedToMin() { + List a = Arrays.asList(1, 3, 5); + List b = Arrays.asList(2, 4, 6); + assertEquals(Arrays.asList(1, 2, 3, 4, 5, 6), zip(a, b, 10)); + } + + @Test + void oneListShorter_minByShorter() { + List a = List.of(1); + List b = Arrays.asList(2, 4, 6); + assertEquals(Arrays.asList(1, 2), zip(a, b, 3)); } @Test - void test1() { - List integers1 = List.of(1, 5, 6); - List integers2 = List.of(7, 8, 9); - List actualZip = zip(integers1, integers2, 3); + void emptyLists_anyN_returnsEmpty() { + List a = List.of(); + List b = List.of(); + assertTrue(zip(a, b, 5).isEmpty()); + } - List expected = List.of(1, 7, 5, 8, 6, 9); - assertEquals(expected, actualZip); + @Test + void negativeN_throwsIAE_withMessage() { + IllegalArgumentException ex = + assertThrows(IllegalArgumentException.class, + () -> zip(List.of(1), List.of(2), -1)); + assertTrue(ex.getMessage().contains("n >= 0")); } @Test - void test2() { - List integers1 = List.of(1, 5, 6); - List integers2 = List.of(7, 8, 9); - List actualZip = zip(integers1, integers2, 0); + void nullA_throwsNPE() { + assertThrows(NullPointerException.class, () -> zip(null, List.of(2), 1)); + } - List expected = List.of(); - assertEquals(expected, actualZip); + @Test + void nullB_throwsNPE() { + assertThrows(NullPointerException.class, () -> zip(List.of(1), null, 1)); } } From 86d31922f5ad8a2a97d4646da69029bb78cf8b2f Mon Sep 17 00:00:00 2001 From: "Andrei.Ovcharenko" Date: Mon, 18 Aug 2025 00:29:52 +0300 Subject: [PATCH 07/45] Utils --- pom.xml | 1 - src/main/java/algorithms/sprint0/Utils.java | 130 ++++++++++++++++++-- 2 files changed, 123 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index 7fced37..092333f 100644 --- a/pom.xml +++ b/pom.xml @@ -17,7 +17,6 @@ 21 17 17 - --enable-preview diff --git a/src/main/java/algorithms/sprint0/Utils.java b/src/main/java/algorithms/sprint0/Utils.java index 50228a6..17be8f2 100644 --- a/src/main/java/algorithms/sprint0/Utils.java +++ b/src/main/java/algorithms/sprint0/Utils.java @@ -1,19 +1,23 @@ package algorithms.sprint0; -import lombok.experimental.UtilityClass; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.junit.jupiter.api.Test; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.Writer; +import java.io.*; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; -@UtilityClass +import static org.junit.jupiter.api.Assertions.*; + +@NoArgsConstructor(access = AccessLevel.PUBLIC) public class Utils { public static List readList(BufferedReader reader) throws IOException { - return Arrays.stream(reader.readLine().trim().split("\\s+")) + String line = reader.readLine(); + if (line == null) throw new NumberFormatException("EOF"); + return Arrays.stream(line.trim().split("\\s+")) .map(Integer::parseInt) .collect(Collectors.toList()); } @@ -29,6 +33,118 @@ public static void printList(List list, Writer writer) { } public static int readInt(BufferedReader reader) throws IOException { - return Integer.parseInt(reader.readLine()); + String line = reader.readLine(); + if (line == null) throw new NumberFormatException("EOF"); + return Integer.parseInt(line); + } + + @Test + public void readListbasic() throws Exception { + BufferedReader br = new BufferedReader(new StringReader("1 2 3")); + List got = readList(br); + assertEquals(Arrays.asList(1, 2, 3), got); + } + + @Test + void readList_mixedWhitespace_and_signs() throws Exception { + BufferedReader br = new BufferedReader(new StringReader(" -1\t0 5 ")); + List got = readList(br); + assertEquals(Arrays.asList(-1, 0, 5), got); + } + + @Test + void readList_emptyLine_throwsNumberFormat() { + BufferedReader br = new BufferedReader(new StringReader("\\n")); + assertThrows(NumberFormatException.class, () -> readList(br)); + } + + @Test + void readList_EOF_throwsNumberFormat() { + BufferedReader br = new BufferedReader(new StringReader("")); + assertThrows(NumberFormatException.class, () -> readList(br)); + } + + @Test + void readList_nonIntegerToken_throwsNumberFormat() { + BufferedReader br = new BufferedReader(new StringReader("1 a 3")); + assertThrows(NumberFormatException.class, () -> readList(br)); + } + + @Test + void readList_overflow_throwsNumberFormat() { + BufferedReader br = new BufferedReader(new StringReader("2147483648")); + assertThrows(NumberFormatException.class, () -> readList(br)); + } + + // --- readInt --- + + @Test + void readInt_basic() throws Exception { + BufferedReader br = new BufferedReader(new StringReader("42")); + assertEquals(42, readInt(br)); + } + + @Test + void readInt_negative() throws Exception { + BufferedReader br = new BufferedReader(new StringReader("-7")); + assertEquals(-7, readInt(br)); + } + + @Test + void readInt_withSpaces_throwsNumberFormat() { + BufferedReader br = new BufferedReader(new StringReader(" 42 ")); + assertThrows(NumberFormatException.class, () -> readInt(br)); + } + + // --- printList --- + + @Test + void printList_integers_trailingSpace_noNewline() throws Exception { + StringWriter sw = new StringWriter(); + printList(Arrays.asList(1, 2, 3), sw); + assertEquals("1 2 3 ", sw.toString()); + } + + @Test + void printList_strings_usesToString() throws Exception { + StringWriter sw = new StringWriter(); + printList(Arrays.asList("a", "b"), sw); + assertEquals("a b ", sw.toString()); + } + + @Test + void printList_empty_writesNothing() throws Exception { + StringWriter sw = new StringWriter(); + printList(List.of(), sw); + assertEquals("", sw.toString()); + } + + @Test + void printList_ioExceptions_areSwallowed() { + Writer throwing = new Writer() { + @Override + public void write(char[] cbuf, int off, int len) throws IOException { + throw new IOException("boom"); + } + + @Override + public void flush() { + } + + @Override + public void close() { + } + + @Override + public void write(String str) throws IOException { + throw new IOException("boom"); + } + + @Override + public void write(int c) throws IOException { + throw new IOException("boom"); + } + }; + assertDoesNotThrow(() -> printList(Arrays.asList(1, 2, 3), throwing)); } } From ac301e61a61b38f1714623bf003330da213bb787 Mon Sep 17 00:00:00 2001 From: "Andrei.Ovcharenko" Date: Mon, 18 Aug 2025 00:30:34 +0300 Subject: [PATCH 08/45] Utils --- src/main/java/algorithms/sprint0/Utils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/algorithms/sprint0/Utils.java b/src/main/java/algorithms/sprint0/Utils.java index 17be8f2..37b903b 100644 --- a/src/main/java/algorithms/sprint0/Utils.java +++ b/src/main/java/algorithms/sprint0/Utils.java @@ -11,7 +11,7 @@ import static org.junit.jupiter.api.Assertions.*; -@NoArgsConstructor(access = AccessLevel.PUBLIC) +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class Utils { public static List readList(BufferedReader reader) throws IOException { From 2055d7247b7a545c94f509ff3800400d0cf2d134 Mon Sep 17 00:00:00 2001 From: "Andrei.Ovcharenko" Date: Sun, 15 Feb 2026 20:57:04 +0300 Subject: [PATCH 09/45] Solution2 --- .../java/algorithms/sprint1/Solution2.java | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 src/main/java/algorithms/sprint1/Solution2.java diff --git a/src/main/java/algorithms/sprint1/Solution2.java b/src/main/java/algorithms/sprint1/Solution2.java new file mode 100644 index 0000000..dcf5542 --- /dev/null +++ b/src/main/java/algorithms/sprint1/Solution2.java @@ -0,0 +1,55 @@ +package algorithms.sprint1; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +//