From 2e527e6ce36e264f4d1eb161d1bb39377e343d5c Mon Sep 17 00:00:00 2001 From: Ben Makusha Date: Sun, 11 Feb 2024 21:02:57 -0500 Subject: [PATCH] CodaMetrix interview question --- .idea/workspace.xml | 75 +++++++------- src/main/java/interview/MainClass.java | 40 ++++++++ src/main/java/interview/ProblemStatement.md | 31 ++++++ src/main/java/interview/TidyNumbers.java | 30 ++++++ src/main/resources/input-data-file.txt | 101 +++++++++++++++++++ src/test/java/interview/TidyNumbersTest.java | 30 ++++++ 6 files changed, 266 insertions(+), 41 deletions(-) create mode 100644 src/main/java/interview/MainClass.java create mode 100644 src/main/java/interview/ProblemStatement.md create mode 100644 src/main/java/interview/TidyNumbers.java create mode 100644 src/main/resources/input-data-file.txt create mode 100644 src/test/java/interview/TidyNumbersTest.java diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 9817fda..dd23ee0 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -5,7 +5,11 @@ - + + + + + - { - "keyToString": { - "ASKED_ADD_EXTERNAL_FILES": "true", - "RunOnceActivity.OpenProjectViewOnStart": "true", - "RunOnceActivity.ShowReadmeOnStart": "true", - "com.intellij.testIntegration.createTest.CreateTestDialog.defaultLibrary": "JUnit5", - "com.intellij.testIntegration.createTest.CreateTestDialog.defaultLibrarySuperClass.JUnit5": "", - "git-widget-placeholder": "main" + +}]]> @@ -92,7 +96,20 @@ - + + + - + - - - - - - false - true - false - true - - - + + + - - diff --git a/src/main/java/interview/MainClass.java b/src/main/java/interview/MainClass.java new file mode 100644 index 0000000..c5988a5 --- /dev/null +++ b/src/main/java/interview/MainClass.java @@ -0,0 +1,40 @@ +package interview; + +import java.io.FileInputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.util.Scanner; + +public class MainClass { + + private static final String IN_FILE_PATH = "src/main/resources/input-data-file.txt"; + private static TidyNumbers tidy = new TidyNumbers(); + public static void main(String[] args) { + System.out.println("Testing one, two, three"); + + FileInputStream file = null; + Scanner in = null; + FileWriter fw = null; + try { + file = new FileInputStream(IN_FILE_PATH); + in = new Scanner(file); + int t = in.nextInt(); + for (int i = 1; i <= t; i++) { + int n = in.nextInt(); + int result = tidy.getTidyNumber(n); + System.out.println(result); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + assert in != null; + in.close(); + assert file != null; + file.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } +} diff --git a/src/main/java/interview/ProblemStatement.md b/src/main/java/interview/ProblemStatement.md new file mode 100644 index 0000000..a125ce3 --- /dev/null +++ b/src/main/java/interview/ProblemStatement.md @@ -0,0 +1,31 @@ +# Problem +Tatiana likes to keep things tidy. Her toys are sorted from smallest to largest, +her pencils are sorted from shortest to longest and her computers from oldest to newest. +One day, when practicing her counting skills, she noticed that some integers, when written in base 10 with no leading zeroes, have their digits sorted in non-decreasing order. Some examples of this are 8, 123, 555, and 224488. She decided to call these numbers tidy. Numbers that do not have this property, like 20, 321, 495 and 999990, are not tidy. +She just finished counting all positive integers in ascending order from 1 to N. What was the last tidy number she counted? + +## Input +The first line of the input gives the number of test cases, T. T lines follow. Each line describes a test case with a single integer N, the last number counted by Tatiana. + +## Output +For each test case, output one line containing Case #x: y, where x is the test case number (starting from 1) and y is the last tidy number counted by Tatiana. + +## Limits +1 ≤ T ≤ 100. + +1 ≤ N ≤ 1000. + +### Example 1 +Input: 132 + +Output: 129 + +### Example 2 +Input: 1000 + +Output: 999 + +### Example 3 +Input: 7 + +Output: 7 diff --git a/src/main/java/interview/TidyNumbers.java b/src/main/java/interview/TidyNumbers.java new file mode 100644 index 0000000..2bed5cb --- /dev/null +++ b/src/main/java/interview/TidyNumbers.java @@ -0,0 +1,30 @@ +package interview; + +public class TidyNumbers { + + public int getTidyNumber(int n) { + int i = 0; + return lastTidyNumber(i, n); + } + public int lastTidyNumber(int i, long n) { + String ns = String.valueOf(n); + if (isTidy(ns)) return (int)n; + + int lastDigit = Integer.parseInt(String.valueOf(ns.charAt(ns.length() - 1 - i))) + 1; + + long subs = (long) Math.pow(10, i) * lastDigit; + i++; + return lastTidyNumber(i, n - subs); + } + + private boolean isTidy(String ns) { + int max = Integer.parseInt(String.valueOf(ns.charAt(0))); + + for (int i = 1; i < ns.length(); i++) { + int c = Integer.parseInt(String.valueOf(ns.charAt(i))); + if (c < max) return false; + else max = c; + } + return true; + } +} diff --git a/src/main/resources/input-data-file.txt b/src/main/resources/input-data-file.txt new file mode 100644 index 0000000..919f1ea --- /dev/null +++ b/src/main/resources/input-data-file.txt @@ -0,0 +1,101 @@ +100 +132 +1000 +7 +700 +154 +709 +181 +735 +441 +424 +364 +649 +925 +87 +692 +177 +397 +375 +342 +596 +768 +107 +967 +825 +393 +502 +999 +372 +155 +826 +383 +217 +173 +946 +212 +124 +560 +484 +924 +232 +264 +223 +980 +891 +179 +103 +636 +564 +244 +1 +117 +199 +453 +56 +814 +553 +27 +460 +433 +43 +34 +787 +879 +828 +9 +146 +328 +296 +792 +948 +498 +110 +357 +135 +584 +561 +903 +938 +982 +954 +638 +425 +922 +894 +827 +675 +930 +994 +757 +191 +704 +626 +469 +764 +303 +239 +653 +869 +932 +557 diff --git a/src/test/java/interview/TidyNumbersTest.java b/src/test/java/interview/TidyNumbersTest.java new file mode 100644 index 0000000..cf30e02 --- /dev/null +++ b/src/test/java/interview/TidyNumbersTest.java @@ -0,0 +1,30 @@ +package interview; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class TidyNumbersTest { + + private TidyNumbers coda; + private List testcases; + + @BeforeEach + void setUp() { + coda = new TidyNumbers(); + testcases = List.of(132, 1000, 7); + } + + @Test + void lastTidyNumber() { + List expectedResult = List.of(129, 999, 7); + + for (int i = 0; i < testcases.size(); i++) { + int actualResult = coda.getTidyNumber(testcases.get(i)); + assertEquals(expectedResult.get(i), actualResult); + } + } +} \ No newline at end of file