diff options
Diffstat (limited to 'Phone Book/Need for speed')
-rw-r--r-- | Phone Book/Need for speed/task-info.yaml | 77 | ||||
-rw-r--r-- | Phone Book/Need for speed/task-remote-info.yaml | 2 | ||||
-rw-r--r-- | Phone Book/Need for speed/task.html | 24 |
3 files changed, 103 insertions, 0 deletions
diff --git a/Phone Book/Need for speed/task-info.yaml b/Phone Book/Need for speed/task-info.yaml new file mode 100644 index 0000000..7864f71 --- /dev/null +++ b/Phone Book/Need for speed/task-info.yaml @@ -0,0 +1,77 @@ +type: edu +custom_name: stage3 +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 \"quick sort\",\n \"\ + binary search\"\n );\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() < 3) {\n return CheckResult.wrong(\"\ + Your output should contain 3 times the phrase `500 / 500`\");\n }\n \ + \ \n List<String> timestamps = findAll(reply, timeRegex);\n \ + \ if (timestamps.size() != 7) {\n return CheckResult.wrong(\"Your output\ + \ should contain 7 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 long t5 = parseTimestamp(timestamps.get(4));\n\ + \ long t6 = parseTimestamp(timestamps.get(5));\n long t7 = parseTimestamp(timestamps.get(6));\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 if (Math.abs(t6 + t7 - t5) > 100) {\n return CheckResult.wrong(\"\ + Your 6-th and 7-th timer outputs in total (sorting and searching) \" +\n \ + \ \"should be equal to the 5-th (total search time).\");\n \ + \ }\n \n long estimatedTime = t1 + t2 + t5;\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 return CheckResult.correct();\n \ + \ }\n}\n" + learner_created: false +feedback_link: https://hyperskill.org/projects/63/stages/342/implement#comment +status: Unchecked +record: -1 diff --git a/Phone Book/Need for speed/task-remote-info.yaml b/Phone Book/Need for speed/task-remote-info.yaml new file mode 100644 index 0000000..8f5485a --- /dev/null +++ b/Phone Book/Need for speed/task-remote-info.yaml @@ -0,0 +1,2 @@ +id: 5484 +update_date: Tue, 28 Dec 2021 18:04:21 UTC diff --git a/Phone Book/Need for speed/task.html b/Phone Book/Need for speed/task.html new file mode 100644 index 0000000..927e294 --- /dev/null +++ b/Phone Book/Need for speed/task.html @@ -0,0 +1,24 @@ +<h5 style="text-align: center;" id="description">Description</h5> + +<p>Let's use faster methods to sort the list of numbers and to search in the list.</p> + +<p>As in the previous stage, you should first sort the list of phone numbers by the owner’s name and then search for the numbers of the 500 people from the list given in the first stage. Remember: to get decent and comparable results, you should put all the algorithms in the same initial conditions.</p> + +<p>For sorting, use the quick sort algorithm, and for searching, use the binary search algorithm.</p> + +<h5 style="text-align: center;" id="example">Example</h5> + +<p>Output all three 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> + +<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. + +Start searching (quick sort + binary search)... +Found 500 / 500 entries. Time taken: 1 min. 21 sec. 996 ms. +Sorting time: 1 min. 17 sec. 381 ms. +Searching time: 0 min. 4 sec. 615 ms.</code></pre>
\ No newline at end of file |