-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgenerator.js
185 lines (161 loc) · 5.16 KB
/
generator.js
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
let input =
[ /* 나중 오는 규칙이 우선 순위 */
{
"where":"subway", /* subway or yesulin 기준역 */
"start":"08:00", /* String Seperated with : 시작 시간 */
"end":"19:00", /* String Seperated with : 끝나는 시간 */
"when": [40,50], /* Number 매시간 몇분마다 */
"isNonStop":"Y", /* "Y" or "N" 직항인가 */
},
{
"where":"yesulin", /* subway or yesulin 기준역 */
"start":"08:00", /* String Seperated with : 시작 시간 */
"end":"19:00", /* String Seperated with : 끝나는 시간 */
"when": [10,20], /* Number 매시간 몇분마다 */
"isNonStop":"Y", /* "Y" or "N" 직항인가 */
},
{
"where":"subway", /* subway or yesulin 기준역 */
"start":"08:00", /* String Seperated with : 시작 시간 */
"end":"19:00", /* String Seperated with : 끝나는 시간 */
"when": [0,30], /* Number 매시간 몇분마다 */
"isNonStop":"N", /* "Y" or "N" 직항인가 */
}
];
/**
* where , isNonStop은 3가지의 경우만 존재한다
* subway Y
* subway N
* yesulin Y
* yesulin N => 순환인경우에는 subway에 포함됨 그러므로 rule에 포함 시킬 필요 X
*/
/* giksa or subway or shuttlecock_i or shuttlecock_o or subway or yesulin */
// make(input)
console.log(make(input));
let output = {
"giksa":[],
"shuttlecock_i":[],
"shuttlecock_o":[],
"subway":[],
"yesulin":[],
}
function make(query){
let result = {
"giksa":[],
"shuttlecock_i":[],
"shuttlecock_o":[],
"subway":[],
"yesulin":[],
}
query.forEach(rule=>{
result = makeRule(result, rule);
})
Object.keys(result).map((key)=>{
result[key]= result[key].map(i=>{
i.time = timeToString(i.time)
return i
})
});
return result;
}
/* rule 마다 규칙 적용 */
function makeRule(output, rule){
let flag = true;
let [startSi,startBun] = rule.start.split(':');
let [endSi,endBun] = rule.end.split(':');
let startTime=parseInt(startSi)*60+parseInt(startBun);
let endTime=parseInt(endSi)*60+parseInt(endBun);
if(startTime > endTime) endTime+=1440; // 끝나는 시간이 더 적을 때
let nowTime=parseInt(startSi)*60;
while(flag){
rule.when.forEach(targetBun=>{
if (((nowTime+targetBun) <= endTime) && ((nowTime+targetBun) > startTime)){
if (rule.isNonStop==="Y"){
/* 직행 */
output = makeD(output, rule.where, nowTime+targetBun)
} else if (rule.isNonStop==="N"){
/* 순환 */
output = makeC(output, nowTime+targetBun)
} else {
throw 'rule needs isNonStop property!'
}
} else {
flag = false;
}
})
nowTime+=60;
}
return output;
}
/**
* 직행 노선 인 경우
*/
function makeD(output,where,time){
output["giksa"] = safePush(output["giksa"],time-15,where==="subway"?"DH":"DY"); // 기숙사
output["shuttlecock_o"] = safePush(output["shuttlecock_o"],time-10,where==="subway"?"DH":"DY"); // 셔틀콕_나가는거 out
output[where] = safePush(output[where],time,where==="subway"?"DH":"DY"); // 목적지
output["shuttlecock_i"] = safePush(output["shuttlecock_i"],time+10,"R"); // 셔틀콕_들어오는거 in
return output;
}
/*
C 순환노선
DH 한대앞역 행
DY 예술인아파트 행
R 기숙사행
NA 정보없음
*/
/**
* 순환 노선 인 경우
* Tip: 무조건 한대앞 시간일수 밖에없음
*/
function makeC(output,time){
output["giksa"] = safePush(output["giksa"],time-15,"C"); // 기숙사
output["shuttlecock_o"] = safePush(output["shuttlecock_o"],time-10,"C"); // 셔틀콕_나가는거 out
output["subway"] = safePush(output["subway"],time,"C"); // 한대앞
output["yesulin"] = safePush(output["yesulin"],time+5,"C"); // 예술인
output["shuttlecock_i"] = safePush(output["shuttlecock_i"],time+10,"C"); // 셔틀콕_들어오는거 in
return output;
}
/**
* 이미 존재하는 시간인지 검사
*/
function safePush(arr,time,type){
time = time % 1440; // 24시간 기준 검열
let idx = arr.findIndex(i=>i.time===time);
if (idx == -1 ){
/* 없는 경우 */
arr.push({"time":time,"type":type});
} else {
/* 존재하는 경우*/
arr[idx]={"time":time,"type":type};
}
arr = arr.sort((a,b)=>{
if (a.time < b.time) {
return -1;
}
if (a.time > b.time) {
return 1;
}
return 0;
});
return arr;
}
/**
* 시간을 문자로 변환
*/
function timeToString(time){
return ""+isTwoDigit(parseInt(time/60))+":"+isTwoDigit(time%60);
}
function isTwoDigit(num){
if (num<10) return "0" + num;
return "" + num;
}
/*
소요시간
If C 순환
긱사 5 셔틀콕 10 한대앞 5 예술인 10 셔틀콕 5 긱사
IF DH 한대앞
긱사 5 셔틀콕 10 한대앞 10 셔틀콕 5 긱사
IF DC 예술인
긱사 5 셔틀콕 10 예술인 10 셔틀콕 5 긱사
*/