diff options
author | AlisaLinUwU <alisalinuwu@gmail.com> | 2025-01-26 11:47:38 +0500 |
---|---|---|
committer | AlisaLinUwU <alisalinuwu@gmail.com> | 2025-01-26 11:47:38 +0500 |
commit | 4154d33fcdfbe8eefc66149e4a13d41a814a5abd (patch) | |
tree | 1d7474bc7dc04b90fd1d705d607e8bb76341e50a /Phone Book/Jumping bubbles |
Initializemain
Diffstat (limited to 'Phone Book/Jumping bubbles')
-rw-r--r-- | Phone Book/Jumping bubbles/task-info.yaml | 75 | ||||
-rw-r--r-- | Phone Book/Jumping bubbles/task-remote-info.yaml | 2 | ||||
-rw-r--r-- | Phone Book/Jumping bubbles/task.html | 33 |
3 files changed, 110 insertions, 0 deletions
diff --git a/Phone Book/Jumping bubbles/task-info.yaml b/Phone Book/Jumping bubbles/task-info.yaml new file mode 100644 index 0000000..383ec27 --- /dev/null +++ b/Phone Book/Jumping bubbles/task-info.yaml @@ -0,0 +1,75 @@ +type: edu +custom_name: stage2 +files: +- name: src/phonebook/Main.java + visible: true + text: | + package phonebook; + + public class Main { + public static void main(String[] args) { + System.out.println("Hello World!"); + } + } + learner_created: false +- name: test/PhoneBookTest.java + visible: false + text: "import org.hyperskill.hstest.stage.StageTest;\nimport org.hyperskill.hstest.testcase.CheckResult;\n\ + import org.hyperskill.hstest.testcase.TestCase;\n\nimport java.util.ArrayList;\n\ + import java.util.Arrays;\nimport java.util.List;\nimport java.util.regex.Matcher;\n\ + import java.util.regex.Pattern;\n\npublic class PhoneBookTest extends StageTest\ + \ {\n\n private long timeOnTestStart;\n \n @Override\n public List<TestCase>\ + \ generate() {\n timeOnTestStart = System.currentTimeMillis();\n \ + \ return Arrays.asList(\n new TestCase().setTimeLimit(30 * 60\ + \ * 1000)\n );\n }\n \n private CheckResult checkPhrases(String\ + \ reply, String... phrases) {\n reply = reply.toLowerCase();\n for\ + \ (String phrase : phrases) {\n if (!reply.contains(phrase.toLowerCase()))\ + \ {\n return CheckResult.wrong(\"Not found the part `\" + phrase\ + \ + \"` in your output.\");\n }\n }\n return CheckResult.correct();\n\ + \ }\n \n private List<String> findAll(String reply, String regex) {\n\ + \ Matcher matcher = Pattern.compile(regex).matcher(reply);\n List<String>\ + \ groups = new ArrayList<>();\n while (matcher.find()) {\n groups.add(matcher.group());\n\ + \ }\n return groups;\n }\n \n private String timeRegex\ + \ = \"(\\\\d+)\\\\s*min.*?(\\\\d+)\\\\s*sec.*?(\\\\d+)\\\\s*ms\";\n private\ + \ Pattern timeRegexPattern = Pattern.compile(timeRegex);\n \n private long\ + \ parseTimestamp(String timestamp) {\n Matcher matcher = timeRegexPattern.matcher(timestamp);\n\ + \ if (!matcher.matches() || matcher.groupCount() < 3) {\n throw\ + \ new IllegalStateException(\"???Not matches the line \" + timestamp);\n \ + \ }\n int min = Integer.parseInt(matcher.group(1));\n int sec\ + \ = Integer.parseInt(matcher.group(2));\n int ms = Integer.parseInt(matcher.group(3));\n\ + \ return ms + sec * 1000 + min * 1000 * 60;\n }\n \n @Override\n\ + \ public CheckResult check(String reply, Object clue) {\n long realTime\ + \ = System.currentTimeMillis() - timeOnTestStart;\n \n reply = reply.toLowerCase();\n\ + \ \n CheckResult res = checkPhrases(reply,\n \"found\"\ + ,\n \"min.\",\n \"sec.\",\n \"ms.\"\ + ,\n \"sorting time\",\n \"searching time\",\n \ + \ \"linear search\",\n \"bubble sort\",\n \ + \ \"jump search\");\n if (!res.isCorrect()) {\n return\ + \ res;\n }\n \n List<String> stat1 = findAll(reply, \"500\ + \ / 500\");\n List<String> stat2 = findAll(reply, \"500/500\");\n \ + \ \n if (stat1.size() + stat2.size() < 2) {\n return CheckResult.wrong(\"\ + Your output should contain twice the phrase `500 / 500`\");\n }\n \ + \ \n \n List<String> timestamps = findAll(reply, timeRegex);\n\ + \ if (timestamps.size() != 4) {\n return CheckResult.wrong(\"\ + Your output should contain 4 timer outputs, but found \"\n \ + \ + timestamps.size());\n }\n // should not fail..\n long\ + \ t1 = parseTimestamp(timestamps.get(0));\n long t2 = parseTimestamp(timestamps.get(1));\n\ + \ long t3 = parseTimestamp(timestamps.get(2));\n long t4 = parseTimestamp(timestamps.get(3));\n\ + \ \n if (Math.abs(t3 + t4 - t2) > 100) {\n return CheckResult.wrong(\"\ + Your third and fourth timer outputs in total (sorting and searching) \" +\n \ + \ \"should be equal to the second (total search time).\");\n\ + \ }\n \n long estimatedTime = t1 + t2;\n if (realTime\ + \ < 1000) {\n return CheckResult.wrong(\"Your program completes too\ + \ fast. Faster than a second!\");\n }\n \n if (Math.abs(estimatedTime\ + \ - realTime) > estimatedTime * 0.3) {\n return CheckResult.wrong(\"\ + Your estimated time is not similar to real time the program works. \" +\n \ + \ \"Real time: \" + realTime + \"ms, estimated time: \" + estimatedTime\ + \ + \"ms\");\n }\n \n if (reply.toLowerCase().contains(\"\ + stopped\")) {\n if (t3 < t1) {\n return CheckResult.wrong(\"\ + You printed `stopped`, \" +\n \"but the sorting time was\ + \ less than the first linear search time.\");\n }\n }\n \ + \ \n return CheckResult.correct();\n }\n}\n" + learner_created: false +feedback_link: https://hyperskill.org/projects/63/stages/341/implement#comment +status: Unchecked +record: -1 diff --git a/Phone Book/Jumping bubbles/task-remote-info.yaml b/Phone Book/Jumping bubbles/task-remote-info.yaml new file mode 100644 index 0000000..6bde784 --- /dev/null +++ b/Phone Book/Jumping bubbles/task-remote-info.yaml @@ -0,0 +1,2 @@ +id: 5483 +update_date: Tue, 28 Dec 2021 18:04:20 UTC diff --git a/Phone Book/Jumping bubbles/task.html b/Phone Book/Jumping bubbles/task.html new file mode 100644 index 0000000..9e3b970 --- /dev/null +++ b/Phone Book/Jumping bubbles/task.html @@ -0,0 +1,33 @@ +<h5 style="text-align: center;" id="description">Description</h5> + +<p>You have to iterate over each element of the number list every time you want to find someone's number. This is the only way to search if your list contains unordered data. Any number can be anywhere on the list, so you have to check every element.</p> + +<p>At this stage, you should sort the list of numbers alphabetically by the owner’s name. Sort the list using the <strong>bubble sort</strong> algorithm and search in the list using the <strong>jump search</strong> algorithm.</p> + +<p>After sorting, search for 500 phone numbers using the list from the previous stage. Note how long it takes to sort the list, and also measure the time the program spends searching. Don't include the sorting time in the searching time, because the list of numbers stays sorted after every search request. If you want to save the sorted list into the file so you don’t have to sort it again, do not override the file that contains the unsorted list of phone numbers. This file will also be required in the next stage.</p> + +<p>If the sorting process takes too long (more than 10 times longer than all 500 iterations of the linear search), you should stop sorting and use the linear search. Look at the second example to see what you need to output.</p> + +<h5 style="text-align: center;" id="example">Example</h5> + +<p>Output both approaches one after another and see which one is faster. The output example is shown below. Note that you can get totally different sorting and searching times!</p> + +<p><strong>Example 1:</strong></p> + +<pre><code class="java">Start searching (linear search)... +Found 500 / 500 entries. Time taken: 1 min. 56 sec. 328 ms. + +Start searching (bubble sort + jump search)... +Found 500 / 500 entries. Time taken: 9 min. 15 sec. 291 ms. +Sorting time: 8 min. 45 sec. 251 ms. +Searching time: 0 min. 30 sec. 40 ms.</code></pre> + +<p><strong>Example 2: </strong></p> + +<pre><code class="java">Start searching (linear search)... +Found 500 / 500 entries. Time taken: 2 min. 01 sec. 134 ms. + +Start searching (bubble sort + jump search)... +Found 500 / 500 entries. Time taken: 22 min. 14 sec. 482 ms. +Sorting time: 20 min. 12 sec. 251 ms. - STOPPED, moved to linear search +Searching time: 2 min. 02 sec. 231 ms.</code></pre>
\ No newline at end of file |