Skip to content

Commit b8945a4

Browse files
committed
workbook 자동화
1 parent 9a4ecbf commit b8945a4

File tree

1 file changed

+100
-95
lines changed

1 file changed

+100
-95
lines changed

workbook/actions.py

Lines changed: 100 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -1,103 +1,107 @@
11
import os
2-
32
import requests
43

54
pbars = []
6-
# ['0x11', '그리디', 'https://www.acmicpc.net/workbook/view/7320']
5+
76
def parse_links():
8-
attrs = []
9-
with open('links.txt', encoding="UTF-8") as f:
10-
for line in f:
11-
attrs.append(line.strip().split(','))
12-
return attrs
7+
attrs = []
8+
with open('links.txt', encoding="UTF-8") as f:
9+
for line in f:
10+
attrs.append(line.strip().split(','))
11+
return attrs
1312

1413
def parse_category():
15-
category = []
16-
with open('problems.txt', encoding="UTF-8") as f:
17-
for line in f:
18-
category.append(line.strip().split(','))
19-
return category
14+
category = []
15+
with open('problems.txt', encoding="UTF-8") as f:
16+
for line in f:
17+
category.append(line.strip().split(','))
18+
return category
2019

2120
def get_problem_info(workbook_url):
22-
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36'}
23-
txt = requests.get(workbook_url, headers=headers).text
24-
pattern = '/problem/'
25-
ret = []
26-
while True:
27-
x = txt.find(pattern)
28-
if x == -1: break
29-
txt = txt[x+9:]
30-
prob_id, prob_name = '', ''
31-
i = 0
32-
while txt[i] in '0123456789':
33-
prob_id += txt[i]
34-
i += 1
35-
if not prob_id: continue
36-
i += 2
37-
while txt[i] != '<':
38-
prob_name += txt[i]
39-
i += 1
40-
ret.append((prob_id, prob_name))
41-
return ret
21+
headers = {
22+
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36'
23+
}
24+
txt = requests.get(workbook_url, headers=headers).text
25+
pattern = '/problem/'
26+
ret = []
27+
while True:
28+
x = txt.find(pattern)
29+
if x == -1:
30+
break
31+
txt = txt[x + 9:]
32+
prob_id, prob_name = '', ''
33+
i = 0
34+
while txt[i] in '0123456789':
35+
prob_id += txt[i]
36+
i += 1
37+
if not prob_id:
38+
continue
39+
i += 2
40+
while txt[i] != '<':
41+
prob_name += txt[i]
42+
i += 1
43+
ret.append((prob_id, prob_name))
44+
return ret
4245

4346
CATEGORY = ["연습 문제", "기본 문제✔", "기본 문제", "응용 문제✔", "응용 문제"]
4447

45-
# gen 0x00.md to 0x??.md, proper prob_id.cpp for each solution directory
4648
def gen_ind_workbook(attrs, category):
47-
txt = '''// Authored by : BaaaaaaaaaaarkingDog
49+
java_template = '''// Authored by : BaaaaaaaaaaarkingDog
4850
// Co-authored by : -
4951
// http://boj.kr/****************
50-
#include <bits/stdc++.h>
51-
using namespace std;
52-
53-
int main(void){
54-
ios::sync_with_stdio(0);
55-
cin.tie(0);
56-
57-
}'''
58-
chapter_idx = 0
59-
for attr in attrs:
60-
if len(attr) < 3: # No workbook
61-
pbars.append("")
62-
continue
63-
solution_num = 0
64-
solution_path = f'../{attr[0]}/solutions/'
65-
category_idx = 0
66-
problem_infos = get_problem_info(attr[2])
67-
prob_table = '| 문제 분류 | 문제 | 문제 제목 | 정답 코드 |\n| :--: | :--: | :--: | :--: |\n'
68-
for prob_id, prob_name in problem_infos:
69-
if prob_id in category[chapter_idx]:
70-
category_idx = category[chapter_idx].index(prob_id)
71-
file_path = solution_path + prob_id
72-
if not os.path.exists(file_path + '.cpp'):
73-
with open(file_path + '.cpp', 'w', encoding="UTF-8") as f:
74-
f.write(txt)
75-
try:
76-
codes = open(file_path + '.cpp', 'r', encoding="UTF-8").read()
77-
except: # EUC-KR -> UTF-8
78-
codes = open(file_path + '.cpp', 'r', encoding="EUC-KR").read()
79-
with open(file_path + '.cpp', 'w', encoding="UTF-8") as fw:
80-
fw.write(codes)
81-
if codes[:100] == txt[:100]:
82-
prob_table += f'| {CATEGORY[category_idx]} | {prob_id} | [{prob_name}](https://www.acmicpc.net/problem/{prob_id}) | - |\n'
83-
else:
84-
solution_num += 1
85-
code_attr = f'[정답 코드]({file_path.replace(" ", "%20")}.cpp)'
86-
MAX_DIFFERENT_SOLUTION = 9
87-
for i in range(1, MAX_DIFFERENT_SOLUTION+1):
88-
if os.path.exists(file_path+'_'+str(i)+'.cpp'):
89-
code_attr += f", [별해 {i}]({file_path+'_'+str(i)+'.cpp'})"
90-
prob_table += f'| {CATEGORY[category_idx]} | {prob_id} | [{prob_name}](https://www.acmicpc.net/problem/{prob_id}) | {code_attr} |\n'
91-
with open(attr[0]+'.md', 'w', encoding="UTF-8") as f:
92-
# progress bar
93-
f.write(f'# {attr[1]}\n\n')
94-
pbar = f'![100%](https://progress-bar.xyz/{solution_num}/?scale={len(problem_infos)}&title=progress&width=500&color=babaca&suffix=/{len(problem_infos)})'
95-
pbars.append(pbar)
96-
f.write(pbar + '\n\n')
97-
f.write(f'[문제집 링크]({attr[2]})\n\n')
98-
f.write(prob_table)
99-
chapter_idx += 1
100-
52+
'''
53+
54+
chapter_idx = 0
55+
for attr in attrs:
56+
if len(attr) < 3:
57+
pbars.append("")
58+
continue
59+
solution_num = 0
60+
solution_path = f'../{attr[0]}/solutions/'
61+
os.makedirs(solution_path, exist_ok=True)
62+
63+
category_idx = 0
64+
problem_infos = get_problem_info(attr[2])
65+
prob_table = '| 문제 분류 | 문제 | 문제 제목 | 정답 코드 |\n| :--: | :--: | :--: | :--: |\n'
66+
67+
for prob_id, prob_name in problem_infos:
68+
if prob_id in category[chapter_idx]:
69+
category_idx = category[chapter_idx].index(prob_id)
70+
file_path = os.path.join(solution_path, prob_id)
71+
java_file = file_path + '.java'
72+
73+
if not os.path.exists(java_file):
74+
with open(java_file, 'w', encoding="UTF-8") as f:
75+
f.write(java_template)
76+
77+
try:
78+
codes = open(java_file, 'r', encoding="UTF-8").read()
79+
except:
80+
codes = open(java_file, 'r', encoding="EUC-KR").read()
81+
with open(java_file, 'w', encoding="UTF-8") as fw:
82+
fw.write(codes)
83+
84+
if codes[:100] == java_template[:100]:
85+
prob_table += f'| {CATEGORY[category_idx]} | {prob_id} | [{prob_name}](https://www.acmicpc.net/problem/{prob_id}) | - |\n'
86+
else:
87+
solution_num += 1
88+
code_attr = f'[정답 코드]({java_file.replace(" ", "%20")})'
89+
for i in range(1, 10):
90+
alt_path = f'{file_path}_{i}.java'
91+
if os.path.exists(alt_path):
92+
code_attr += f", [별해 {i}]({alt_path.replace(' ', '%20')})"
93+
prob_table += f'| {CATEGORY[category_idx]} | {prob_id} | [{prob_name}](https://www.acmicpc.net/problem/{prob_id}) | {code_attr} |\n'
94+
95+
with open(attr[0] + '.md', 'w', encoding="UTF-8") as f:
96+
f.write(f'# {attr[1]}\n\n')
97+
pbar = f'![100%](https://progress-bar.xyz/{solution_num}/?scale={len(problem_infos)}&title=progress&width=500&color=babaca&suffix=/{len(problem_infos)})'
98+
pbars.append(pbar)
99+
f.write(pbar + '\n\n')
100+
f.write(f'[문제집 링크]({attr[2]})\n\n')
101+
f.write(prob_table)
102+
103+
chapter_idx += 1
104+
101105
# ['0x11', '그리디', 'https://www.acmicpc.net/workbook/view/7320']
102106
def gen_total_workbook(attrs):
103107
with open('../workbook.md', 'w', encoding="UTF-8") as f:
@@ -128,13 +132,14 @@ def gen_total_workbook(attrs):
128132
# 문제집
129133
| 번호 | 주제 | 진행도 |
130134
| :--: | :--: | :--: |\n''')
131-
for attr, pbar in zip(attrs, pbars):
132-
if len(attr) < 3: # No workbook
133-
f.write(f'| {attr[0]} | {attr[1]} | |\n')
134-
else:
135-
f.write(f'| {attr[0]} | [{attr[1]}](workbook/{attr[0].replace(" ", "%20")}.md) | {pbar} |\n')
136-
137-
attrs = parse_links()
138-
category = parse_category()
139-
gen_ind_workbook(attrs, category)
140-
gen_total_workbook(attrs)
135+
for attr, pbar in zip(attrs, pbars):
136+
if len(attr) < 3:
137+
f.write(f'| {attr[0]} | {attr[1]} | |\n')
138+
else:
139+
f.write(f'| {attr[0]} | [{attr[1]}](workbook/{attr[0].replace(" ", "%20")}.md) | {pbar} |\n')
140+
141+
if __name__ == "__main__":
142+
attrs = parse_links()
143+
category = parse_category()
144+
gen_ind_workbook(attrs, category)
145+
gen_total_workbook(attrs)

0 commit comments

Comments
 (0)