1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
type: edu
custom_name: stage4
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 \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 \n \n\
\ @Override\n public CheckResult check(String reply, Object clue) {\n \
\ long realTime = System.currentTimeMillis() - timeOnTestStart;\n \
\ reply = reply.toLowerCase();\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 \"hash table\",\n \
\ \"creating time\"\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() < 4) {\n return CheckResult.wrong(\"\
Your output should contain 4 times the phrase `500 / 500`\");\n }\n \
\ \n List<String> timestamps = findAll(reply, timeRegex);\n if (timestamps.size()\
\ != 10) {\n return CheckResult.wrong(\"Your output should contain\
\ 10 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 // qsort\n \
\ long t5 = parseTimestamp(timestamps.get(4));\n long t6 = parseTimestamp(timestamps.get(5));\n\
\ long t7 = parseTimestamp(timestamps.get(6));\n // hash table\n\
\ long t8 = parseTimestamp(timestamps.get(7));\n long t9 = parseTimestamp(timestamps.get(8));\n\
\ long t10 = parseTimestamp(timestamps.get(9));\n \n if (Math.abs(t3\
\ + t4 - t2) > 100) {\n return CheckResult.wrong(\"Your third and fourth\
\ timer outputs in total (bubble 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 (qsort and searching) \" +\n \
\ \"should be equal to the 5-th (total search time).\");\n \
\ }\n if (Math.abs(t9 + t10 - t8) > 100) {\n return CheckResult.wrong(\"\
Your 9-th and 10-th timer outputs in total (creating hashtable and searching)\
\ \" +\n \"should be equal to the 8-th (total search time).\"\
);\n }\n \n long estimatedTime = t1 + t2 + t5 + t8;\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 (t8 >= t5) {\n return\
\ CheckResult.wrong(\"Your hashtable works slower, than quick sort + binary search.\"\
);\n }\n return CheckResult.correct();\n }\n}\n"
learner_created: false
feedback_link: https://hyperskill.org/projects/63/stages/475/implement#comment
status: Unchecked
record: -1
|