├── First.bat ├── LICENSE ├── README.md ├── Second-32.bat ├── Second.bat ├── config.sample.yml ├── images ├── android-desktop.png ├── dog.png ├── favicon.png ├── ios-desktop.png └── user.jpg ├── main.py ├── make.cpp ├── styles.css └── theme ├── LICENSE ├── count.txt ├── images ├── android-desktop.png ├── dog.png ├── favicon.png ├── ios-desktop.png └── user.jpg ├── index.html ├── source ├── LICENSE ├── images │ ├── android-desktop.png │ ├── dog.png │ ├── favicon.png │ ├── ios-desktop.png │ └── user.jpg ├── index.html └── styles.css └── styles.css /First.bat: -------------------------------------------------------------------------------- 1 | pip install pyyaml 2 | pip install requests 3 | copy config.sample.yml config.yml 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 由于收到了来自kkk的警告。 2 | # 此脚本已经不能使用。 3 | # 此项目将不会更新。 4 | 5 | # luogu-problem-difficulty-blog 6 | 7 | 这是一个来自memset0的开源洛谷应用——洛谷通过题目难度统计博客版本,灵感来自yyfcpp大佬。 8 | 9 | 完全采用自动化脚本方便各位使用 10 | 11 | 我只写了make.cpp部分和把main.py魔改了一下。 12 | 13 | 麻烦给颗小星星 14 | 15 | ![](https://i.loli.net/2018/08/23/5b7e99f5310af.png) 16 | 17 | [使用效果](https://www.luogu.org/blog/Douglas/tong-guo-ti-mu-nuo-du-tong-ji) 18 | 19 | -------------------------------------------------------------------------------- /Second-32.bat: -------------------------------------------------------------------------------- 1 | python main.py 2 | g++ -m32 -g3 make.cpp -o make 3 | make 4 | -------------------------------------------------------------------------------- /Second.bat: -------------------------------------------------------------------------------- 1 | python main.py 2 | g++ make.cpp -o make 3 | make 4 | -------------------------------------------------------------------------------- /config.sample.yml: -------------------------------------------------------------------------------- 1 | # Name: luogu-problem-difficulty 2 | # Description: 统计(通过)的洛谷题目的难度。 3 | 4 | # 用户id UserID 5 | # >> 默认是全洛谷最大佬的用户ID 6 | # 多个账号请用逗号分隔 7 | UserID: 55201 8 | 9 | # 是否已经统计过 hasStatisticsed 10 | # >> 如果已经统计过就可以设置为true以加快速度 11 | # 除非你想要重新统计一遍 12 | hasStatisticsed: false 13 | 14 | # 是否开启 Debug 模式 debug 15 | debug: false -------------------------------------------------------------------------------- /images/android-desktop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicDZ/luogu-problem-difficulty-blog/3672f727f273b1b6f02ebb3848bfb9ba7e67402a/images/android-desktop.png -------------------------------------------------------------------------------- /images/dog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicDZ/luogu-problem-difficulty-blog/3672f727f273b1b6f02ebb3848bfb9ba7e67402a/images/dog.png -------------------------------------------------------------------------------- /images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicDZ/luogu-problem-difficulty-blog/3672f727f273b1b6f02ebb3848bfb9ba7e67402a/images/favicon.png -------------------------------------------------------------------------------- /images/ios-desktop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicDZ/luogu-problem-difficulty-blog/3672f727f273b1b6f02ebb3848bfb9ba7e67402a/images/ios-desktop.png -------------------------------------------------------------------------------- /images/user.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicDZ/luogu-problem-difficulty-blog/3672f727f273b1b6f02ebb3848bfb9ba7e67402a/images/user.jpg -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import re 2 | import os 3 | import yaml 4 | import requests 5 | 6 | # ========== 初始化程序 ========== 7 | 8 | def init(): 9 | os.system("mkdir log") 10 | os.system("mkdir result") 11 | global request, config, debug, UserID, prob 12 | request = requests.Session() 13 | request.headers.update({'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}) 14 | print(request.headers) 15 | config = yaml.load(open('config.yml', 'r+', encoding = 'utf8')) 16 | debug = config['debug'] 17 | prob = {} 18 | try: 19 | UserID = config['UserID'].split(', ') 20 | except: 21 | UserID = [config['UserID']] 22 | if config['hasStatisticsed']: 23 | try: 24 | prob = yaml.load(open('result/problem.yml', 'r+', encoding = 'utf8')) 25 | except: 26 | pass 27 | 28 | # ========== 定义全局函数 ========== 29 | 30 | # ---------- 正则表达式截取一段内容 ---------- 31 | 32 | def strFind(before, after, old): 33 | return re.findall(r'{}[\s\S]*?{}'.format(before, after), old)[0]\ 34 | .replace(before, '').replace(after, '') 35 | 36 | # ---------- 输出内容到文件 ---------- 37 | 38 | def writeFile(path, mode, content): 39 | file = open(path, mode) 40 | file.write(content) 41 | file.close() 42 | 43 | # ---------- 把一些上千数据转换为正常数值 ---------- 44 | 45 | def isThousand(old): # 顺便吐槽一下某些大佬的AC数太多了 46 | if 'K' in old or 'k' in old: 47 | old = old.replace('K', '').replace('k', '') 48 | old = int(float(old) * 1000 // 1) 49 | return str(old) 50 | 51 | 52 | # ---------- 获取一道题目的难度 ---------- 53 | 54 | def getProblem(probID): 55 | 56 | global prob 57 | 58 | if not probID in prob: 59 | 60 | print('Statisticsing {}'.format(probID)) 61 | 62 | try: 63 | probWeb = 'https://www.luogu.org/problemnew/show/{}'.format(probID) 64 | 65 | req = request.get(probWeb) 66 | html = req.text 67 | base = req.content 68 | 69 | if debug: 70 | writeFile('log/prob.html', 'wb+', base) 71 | 72 | dify = re.findall(r'
  • 难度[\s\S]*?', html)[0] 73 | dify = re.sub(r'', '', dify) 74 | dify = dify.replace('', '') 75 | 76 | prob[probID] = dify 77 | return dify 78 | 79 | except: 80 | print('Met a problem at {}'.format(probID)) 81 | dify = '难度未知' 82 | 83 | prob[probID] = dify 84 | return dify 85 | 86 | else: 87 | return prob[probID] 88 | 89 | # ========== 获取个人信息页面 ========== 90 | 91 | def getUser(UserID): 92 | 93 | if config['hasStatisticsed'] == False: 94 | UserWeb = 'https://www.luogu.org/space/show?uid={}'.format(UserID) 95 | req = request.get(UserWeb) 96 | html = req.text 97 | base = req.content 98 | writeFile('log/U{}.html'.format(UserID), 'wb+', base) 99 | return html 100 | 101 | else: 102 | file = open('log/U{}.html'.format(UserID), 'r+', encoding='utf8') 103 | content = file.read() 104 | file.close() 105 | return content 106 | 107 | # ========== 列出已经AC的题目 ========== 108 | 109 | def listAC(UserID): 110 | 111 | print('List AC problems of U{}'.format(UserID)) 112 | 113 | html = getUser(UserID) 114 | html = re.findall(r'
    [\s\S]*?
    ', html)[0] 115 | html = html.replace('
    \n', '') 116 | html = html.replace('

    通过题目

    \n', '') 117 | html = html.replace('\n
    ', '') 118 | html = re.sub(r'\[', '', html) 119 | html = re.sub(r'\]', '', html) 120 | prob = re.split(r'\n', html) 121 | 122 | writeFile('log/AC.txt', 'w+', ", ".join(str(it) for it in prob)) 123 | 124 | return prob 125 | 126 | # ========== 按题号统计题目难度 ========== 127 | 128 | def statistics(prob): 129 | 130 | ans = [] 131 | for probID in prob: 132 | ans.append(getProblem(probID)) 133 | 134 | out = ", ".join(str(it) for it in ans) 135 | writeFile('log/ans.txt', 'w+', out) 136 | 137 | return ans 138 | 139 | # ========== 统计输出结果 ========== 140 | 141 | def modify(set, content): 142 | result = content 143 | for it in re.findall(r'{\|[\s\S]*?\|}', content): 144 | try: 145 | # print('Modify "{}"'.format(it[2:-2])) 146 | result = result.replace(it, set[it[2:-2]]) 147 | except: 148 | result = result.replace(it, '0') 149 | return result 150 | 151 | def modifyFile(oldPath, newPath, set): 152 | file = open(oldPath, 'r+', encoding='utf8') 153 | content = file.read() 154 | file.close() 155 | content = modify(set, content) 156 | file = open(newPath, 'w+', encoding='utf8') 157 | file.write(content) 158 | file.close() 159 | 160 | def result(UserID, ans): 161 | 162 | set = {} 163 | html = getUser(UserID) 164 | 165 | set['UserID'] = str(UserID) 166 | set['UserWeb'] = 'https://www.luogu.org/space/show?uid={}'.format(UserID) 167 | set['UserName'] = strFind('

    U{} '.format(UserID), '

    ', html) 168 | set['Submit'] = re.sub(r'<[\s\S]*?>', '', strFind('', '提交', html)) 169 | set['SubmitReal'] = isThousand(set['Submit']) 170 | set['Accept'] = re.sub(r'<[\s\S]*?>', '', strFind('
  • ', '通过', html)) 171 | set['AcceptReal'] = isThousand(set['Accept']) 172 | set['ACpercent'] = str(int(set['AcceptReal']) / int(set['SubmitReal'])) 173 | set['ACpercent%'] = str(int(set['AcceptReal']) * 100 // int(set['SubmitReal'])) 174 | 175 | for it in ans: 176 | set[it] = 0 177 | for it in ans: 178 | set[it] += 1 179 | for it in ans: 180 | set[it] = str(set[it]) 181 | 182 | print('Finish listing, now this it the information of U{}'.format(UserID), set) 183 | 184 | modifyFile('theme/count.txt', 'result/U{} - {}.txt'.format(UserID, set['UserName']), set) 185 | 186 | # ========== 结束程序 ========== 187 | 188 | def finish(): 189 | global prob 190 | content = '' 191 | for first, second in prob.items(): 192 | content += '{}\n{}\n'.format(first, second) 193 | file = open('problem.in', 'w+') 194 | file.write(content) 195 | file.write("end") 196 | file.close() 197 | print('Finish.') 198 | 199 | # ========== 主程序部分 ========== 200 | if __name__ == '__main__': 201 | init() 202 | 203 | for it in UserID: 204 | result(it, statistics(listAC(int(it)))) 205 | 206 | finish() 207 | -------------------------------------------------------------------------------- /make.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | 6 | string q[9][1000]; 7 | string t[9]={" ","入门难度","普及--","普及/提高--","普及+/提高","提高+/省选--","省选/NOI--","NOI/NOI+/CTSC","难度未知"}; 8 | string v[9]={" ","e74c3c","e67e22","f1c40f","5eb95e","3498db","9b59b6","34495e","bbbbbb"}; 9 | int cnt[9]; 10 | int main() { 11 | freopen("problem.in","r",stdin); 12 | freopen("result.txt","w",stdout); 13 | 14 | string a,b; 15 | for(int i=1; ; i++) { 16 | cin>>a; 17 | if(a=="end") break; 18 | else cin>>b; 19 | if(b=="入门难度") { 20 | cnt[1]++; 21 | q[1][cnt[1]]=a; 22 | } 23 | if(b=="普及-") { 24 | cnt[2]++; 25 | q[2][cnt[2]]=a; 26 | } 27 | if(b=="普及/提高-") { 28 | cnt[3]++; 29 | q[3][cnt[3]]=a; 30 | } 31 | if(b=="普及+/提高") { 32 | cnt[4]++; 33 | q[4][cnt[4]]=a; 34 | } 35 | if(b=="提高+/省选-") { 36 | cnt[5]++; 37 | q[5][cnt[5]]=a; 38 | } 39 | if(b=="省选/NOI-") { 40 | cnt[6]++; 41 | q[6][cnt[6]]=a; 42 | } 43 | if(b=="NOI/NOI+/CTSC") { 44 | cnt[7]++; 45 | q[7][cnt[7]]=a; 46 | } 47 | if(b=="难度未知") { 48 | cnt[8]++; 49 | q[8][cnt[8]]=a; 50 | } 51 | } 52 | 53 | for(int k=1; k<=8; k++) { 54 | cout<<"* ![]("<<"https://img.shields.io/badge/"< 2 | 3 | 4 | 5 | 6 | 7 | 8 | Material Design Lite 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 71 | 72 | 77 | 78 | 79 | 80 | 81 |
    82 |
    83 |
    84 | U{|UserID|} {|UserName|} - 洛谷AC代码数据分析 85 |
    86 | 89 |
      90 |
    • About
    • 91 |
    • Contact
    • 92 |
    • Legal information
    • 93 |
    94 |
    95 |
    96 |
    97 | 106 |
    107 |
    108 |
    109 |
    110 | 浏览器不支持canvas 111 | 浏览器不支持canvas 112 | 浏览器不支持canvas 113 |
    114 |
    115 | 116 | 117 | 118 | 119 | 120 | 121 |
    122 |
    123 |
    124 |
    125 |

    Updates

    126 |
    127 |
    128 | Non dolore elit adipisicing ea reprehenderit consectetur culpa. 129 |
    130 |
    131 | Read More 132 |
    133 |
    134 |
    135 |
    136 |
    137 |

    View options

    138 |
      139 |
    • 140 | 144 |
    • 145 |
    • 146 | 150 |
    • 151 |
    • 152 | 156 |
    • 157 |
    • 158 | 162 |
    • 163 |
    164 |
    165 |
    166 | Change location 167 |
    168 | location_on 169 |
    170 |
    171 |
    172 |
    173 |
    174 |
    175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 500 199 | 400 200 | 300 201 | 200 202 | 100 203 | 1 204 | 2 205 | 3 206 | 4 207 | 5 208 | 6 209 | 7 210 | 211 | 212 | 214 | 215 | 216 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | -------------------------------------------------------------------------------- /theme/source/LICENSE: -------------------------------------------------------------------------------- 1 | 2 | Apache License 3 | Version 2.0, January 2004 4 | http://www.apache.org/licenses/ 5 | 6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 7 | 8 | 1. Definitions. 9 | 10 | "License" shall mean the terms and conditions for use, reproduction, 11 | and distribution as defined by Sections 1 through 9 of this document. 12 | 13 | "Licensor" shall mean the copyright owner or entity authorized by 14 | the copyright owner that is granting the License. 15 | 16 | "Legal Entity" shall mean the union of the acting entity and all 17 | other entities that control, are controlled by, or are under common 18 | control with that entity. For the purposes of this definition, 19 | "control" means (i) the power, direct or indirect, to cause the 20 | direction or management of such entity, whether by contract or 21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 22 | outstanding shares, or (iii) beneficial ownership of such entity. 23 | 24 | "You" (or "Your") shall mean an individual or Legal Entity 25 | exercising permissions granted by this License. 26 | 27 | "Source" form shall mean the preferred form for making modifications, 28 | including but not limited to software source code, documentation 29 | source, and configuration files. 30 | 31 | "Object" form shall mean any form resulting from mechanical 32 | transformation or translation of a Source form, including but 33 | not limited to compiled object code, generated documentation, 34 | and conversions to other media types. 35 | 36 | "Work" shall mean the work of authorship, whether in Source or 37 | Object form, made available under the License, as indicated by a 38 | copyright notice that is included in or attached to the work 39 | (an example is provided in the Appendix below). 40 | 41 | "Derivative Works" shall mean any work, whether in Source or Object 42 | form, that is based on (or derived from) the Work and for which the 43 | editorial revisions, annotations, elaborations, or other modifications 44 | represent, as a whole, an original work of authorship. For the purposes 45 | of this License, Derivative Works shall not include works that remain 46 | separable from, or merely link (or bind by name) to the interfaces of, 47 | the Work and Derivative Works thereof. 48 | 49 | "Contribution" shall mean any work of authorship, including 50 | the original version of the Work and any modifications or additions 51 | to that Work or Derivative Works thereof, that is intentionally 52 | submitted to Licensor for inclusion in the Work by the copyright owner 53 | or by an individual or Legal Entity authorized to submit on behalf of 54 | the copyright owner. For the purposes of this definition, "submitted" 55 | means any form of electronic, verbal, or written communication sent 56 | to the Licensor or its representatives, including but not limited to 57 | communication on electronic mailing lists, source code control systems, 58 | and issue tracking systems that are managed by, or on behalf of, the 59 | Licensor for the purpose of discussing and improving the Work, but 60 | excluding communication that is conspicuously marked or otherwise 61 | designated in writing by the copyright owner as "Not a Contribution." 62 | 63 | "Contributor" shall mean Licensor and any individual or Legal Entity 64 | on behalf of whom a Contribution has been received by Licensor and 65 | subsequently incorporated within the Work. 66 | 67 | 2. Grant of Copyright License. Subject to the terms and conditions of 68 | this License, each Contributor hereby grants to You a perpetual, 69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 70 | copyright license to reproduce, prepare Derivative Works of, 71 | publicly display, publicly perform, sublicense, and distribute the 72 | Work and such Derivative Works in Source or Object form. 73 | 74 | 3. Grant of Patent License. Subject to the terms and conditions of 75 | this License, each Contributor hereby grants to You a perpetual, 76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 77 | (except as stated in this section) patent license to make, have made, 78 | use, offer to sell, sell, import, and otherwise transfer the Work, 79 | where such license applies only to those patent claims licensable 80 | by such Contributor that are necessarily infringed by their 81 | Contribution(s) alone or by combination of their Contribution(s) 82 | with the Work to which such Contribution(s) was submitted. If You 83 | institute patent litigation against any entity (including a 84 | cross-claim or counterclaim in a lawsuit) alleging that the Work 85 | or a Contribution incorporated within the Work constitutes direct 86 | or contributory patent infringement, then any patent licenses 87 | granted to You under this License for that Work shall terminate 88 | as of the date such litigation is filed. 89 | 90 | 4. Redistribution. You may reproduce and distribute copies of the 91 | Work or Derivative Works thereof in any medium, with or without 92 | modifications, and in Source or Object form, provided that You 93 | meet the following conditions: 94 | 95 | (a) You must give any other recipients of the Work or 96 | Derivative Works a copy of this License; and 97 | 98 | (b) You must cause any modified files to carry prominent notices 99 | stating that You changed the files; and 100 | 101 | (c) You must retain, in the Source form of any Derivative Works 102 | that You distribute, all copyright, patent, trademark, and 103 | attribution notices from the Source form of the Work, 104 | excluding those notices that do not pertain to any part of 105 | the Derivative Works; and 106 | 107 | (d) If the Work includes a "NOTICE" text file as part of its 108 | distribution, then any Derivative Works that You distribute must 109 | include a readable copy of the attribution notices contained 110 | within such NOTICE file, excluding those notices that do not 111 | pertain to any part of the Derivative Works, in at least one 112 | of the following places: within a NOTICE text file distributed 113 | as part of the Derivative Works; within the Source form or 114 | documentation, if provided along with the Derivative Works; or, 115 | within a display generated by the Derivative Works, if and 116 | wherever such third-party notices normally appear. The contents 117 | of the NOTICE file are for informational purposes only and 118 | do not modify the License. You may add Your own attribution 119 | notices within Derivative Works that You distribute, alongside 120 | or as an addendum to the NOTICE text from the Work, provided 121 | that such additional attribution notices cannot be construed 122 | as modifying the License. 123 | 124 | You may add Your own copyright statement to Your modifications and 125 | may provide additional or different license terms and conditions 126 | for use, reproduction, or distribution of Your modifications, or 127 | for any such Derivative Works as a whole, provided Your use, 128 | reproduction, and distribution of the Work otherwise complies with 129 | the conditions stated in this License. 130 | 131 | 5. Submission of Contributions. Unless You explicitly state otherwise, 132 | any Contribution intentionally submitted for inclusion in the Work 133 | by You to the Licensor shall be under the terms and conditions of 134 | this License, without any additional terms or conditions. 135 | Notwithstanding the above, nothing herein shall supersede or modify 136 | the terms of any separate license agreement you may have executed 137 | with Licensor regarding such Contributions. 138 | 139 | 6. Trademarks. This License does not grant permission to use the trade 140 | names, trademarks, service marks, or product names of the Licensor, 141 | except as required for reasonable and customary use in describing the 142 | origin of the Work and reproducing the content of the NOTICE file. 143 | 144 | 7. Disclaimer of Warranty. Unless required by applicable law or 145 | agreed to in writing, Licensor provides the Work (and each 146 | Contributor provides its Contributions) on an "AS IS" BASIS, 147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 148 | implied, including, without limitation, any warranties or conditions 149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 150 | PARTICULAR PURPOSE. You are solely responsible for determining the 151 | appropriateness of using or redistributing the Work and assume any 152 | risks associated with Your exercise of permissions under this License. 153 | 154 | 8. Limitation of Liability. In no event and under no legal theory, 155 | whether in tort (including negligence), contract, or otherwise, 156 | unless required by applicable law (such as deliberate and grossly 157 | negligent acts) or agreed to in writing, shall any Contributor be 158 | liable to You for damages, including any direct, indirect, special, 159 | incidental, or consequential damages of any character arising as a 160 | result of this License or out of the use or inability to use the 161 | Work (including but not limited to damages for loss of goodwill, 162 | work stoppage, computer failure or malfunction, or any and all 163 | other commercial damages or losses), even if such Contributor 164 | has been advised of the possibility of such damages. 165 | 166 | 9. Accepting Warranty or Additional Liability. While redistributing 167 | the Work or Derivative Works thereof, You may choose to offer, 168 | and charge a fee for, acceptance of support, warranty, indemnity, 169 | or other liability obligations and/or rights consistent with this 170 | License. However, in accepting such obligations, You may act only 171 | on Your own behalf and on Your sole responsibility, not on behalf 172 | of any other Contributor, and only if You agree to indemnify, 173 | defend, and hold each Contributor harmless for any liability 174 | incurred by, or claims asserted against, such Contributor by reason 175 | of your accepting any such warranty or additional liability. 176 | 177 | END OF TERMS AND CONDITIONS 178 | 179 | APPENDIX: How to apply the Apache License to your work. 180 | 181 | To apply the Apache License to your work, attach the following 182 | boilerplate notice, with the fields enclosed by brackets "[]" 183 | replaced with your own identifying information. (Don't include 184 | the brackets!) The text should be enclosed in the appropriate 185 | comment syntax for the file format. We also recommend that a 186 | file or class name and description of purpose be included on the 187 | same "printed page" as the copyright notice for easier 188 | identification within third-party archives. 189 | 190 | Copyright 2015 Google Inc 191 | 192 | Licensed under the Apache License, Version 2.0 (the "License"); 193 | you may not use this file except in compliance with the License. 194 | You may obtain a copy of the License at 195 | 196 | http://www.apache.org/licenses/LICENSE-2.0 197 | 198 | Unless required by applicable law or agreed to in writing, software 199 | distributed under the License is distributed on an "AS IS" BASIS, 200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 201 | See the License for the specific language governing permissions and 202 | limitations under the License. 203 | 204 | All code in any directories or sub-directories that end with *.html or 205 | *.css is licensed under the Creative Commons Attribution International 206 | 4.0 License, which full text can be found here: 207 | https://creativecommons.org/licenses/by/4.0/legalcode. 208 | 209 | As an exception to this license, all html or css that is generated by 210 | the software at the direction of the user is copyright the user. The 211 | user has full ownership and control over such content, including 212 | whether and how they wish to license it. 213 | -------------------------------------------------------------------------------- /theme/source/images/android-desktop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicDZ/luogu-problem-difficulty-blog/3672f727f273b1b6f02ebb3848bfb9ba7e67402a/theme/source/images/android-desktop.png -------------------------------------------------------------------------------- /theme/source/images/dog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicDZ/luogu-problem-difficulty-blog/3672f727f273b1b6f02ebb3848bfb9ba7e67402a/theme/source/images/dog.png -------------------------------------------------------------------------------- /theme/source/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicDZ/luogu-problem-difficulty-blog/3672f727f273b1b6f02ebb3848bfb9ba7e67402a/theme/source/images/favicon.png -------------------------------------------------------------------------------- /theme/source/images/ios-desktop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicDZ/luogu-problem-difficulty-blog/3672f727f273b1b6f02ebb3848bfb9ba7e67402a/theme/source/images/ios-desktop.png -------------------------------------------------------------------------------- /theme/source/images/user.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicDZ/luogu-problem-difficulty-blog/3672f727f273b1b6f02ebb3848bfb9ba7e67402a/theme/source/images/user.jpg -------------------------------------------------------------------------------- /theme/source/index.html: -------------------------------------------------------------------------------- 1 | 2 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | Material Design Lite 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 46 | 47 | 48 | 49 | 50 | 51 | 62 | 63 | 64 |
    65 |
    66 |
    67 | Home 68 |
    69 |
    70 | 73 |
    74 | 75 | 76 |
    77 |
    78 | 81 |
      82 |
    • About
    • 83 |
    • Contact
    • 84 |
    • Legal information
    • 85 |
    86 |
    87 |
    88 |
    89 |
    90 | 91 |
    92 | hello@example.com 93 |
    94 | 98 |
      99 |
    • hello@example.com
    • 100 |
    • info@example.com
    • 101 |
    • addAdd another account...
    • 102 |
    103 |
    104 |
    105 | 118 |
    119 |
    120 |
    121 |
    122 | 123 | 124 | 82% 125 | 126 | 127 | 128 | 82% 129 | 130 | 131 | 132 | 82% 133 | 134 | 135 | 136 | 82% 137 | 138 |
    139 |
    140 | 141 | 142 | 143 | 144 | 145 | 146 |
    147 |
    148 |
    149 |
    150 |

    Updates

    151 |
    152 |
    153 | Non dolore elit adipisicing ea reprehenderit consectetur culpa. 154 |
    155 |
    156 | Read More 157 |
    158 |
    159 |
    160 |
    161 |
    162 |

    View options

    163 |
      164 |
    • 165 | 169 |
    • 170 |
    • 171 | 175 |
    • 176 |
    • 177 | 181 |
    • 182 |
    • 183 | 187 |
    • 188 |
    189 |
    190 |
    191 | Change location 192 |
    193 | location_on 194 |
    195 |
    196 |
    197 |
    198 |
    199 |
    200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 500 224 | 400 225 | 300 226 | 200 227 | 100 228 | 1 229 | 2 230 | 3 231 | 4 232 | 5 233 | 6 234 | 7 235 | 236 | 237 | 239 | 240 | 241 | 243 | 244 | 245 | 246 | 247 | View Source 248 | 249 | 250 | 251 | -------------------------------------------------------------------------------- /theme/source/styles.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2015 Google Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | html, body { 18 | font-family: 'Roboto', 'Helvetica', sans-serif; 19 | } 20 | .demo-avatar { 21 | width: 48px; 22 | height: 48px; 23 | border-radius: 24px; 24 | } 25 | .demo-layout .mdl-layout__header .mdl-layout__drawer-button { 26 | color: rgba(0, 0, 0, 0.54); 27 | } 28 | .mdl-layout__drawer .avatar { 29 | margin-bottom: 16px; 30 | } 31 | .demo-drawer { 32 | border: none; 33 | } 34 | /* iOS Safari specific workaround */ 35 | .demo-drawer .mdl-menu__container { 36 | z-index: -1; 37 | } 38 | .demo-drawer .demo-navigation { 39 | z-index: -2; 40 | } 41 | /* END iOS Safari specific workaround */ 42 | .demo-drawer .mdl-menu .mdl-menu__item { 43 | display: -webkit-flex; 44 | display: -ms-flexbox; 45 | display: flex; 46 | -webkit-align-items: center; 47 | -ms-flex-align: center; 48 | align-items: center; 49 | } 50 | .demo-drawer-header { 51 | box-sizing: border-box; 52 | display: -webkit-flex; 53 | display: -ms-flexbox; 54 | display: flex; 55 | -webkit-flex-direction: column; 56 | -ms-flex-direction: column; 57 | flex-direction: column; 58 | -webkit-justify-content: flex-end; 59 | -ms-flex-pack: end; 60 | justify-content: flex-end; 61 | padding: 16px; 62 | height: 151px; 63 | } 64 | .demo-avatar-dropdown { 65 | display: -webkit-flex; 66 | display: -ms-flexbox; 67 | display: flex; 68 | position: relative; 69 | -webkit-flex-direction: row; 70 | -ms-flex-direction: row; 71 | flex-direction: row; 72 | -webkit-align-items: center; 73 | -ms-flex-align: center; 74 | align-items: center; 75 | width: 100%; 76 | } 77 | 78 | .demo-navigation { 79 | -webkit-flex-grow: 1; 80 | -ms-flex-positive: 1; 81 | flex-grow: 1; 82 | } 83 | .demo-layout .demo-navigation .mdl-navigation__link { 84 | display: -webkit-flex !important; 85 | display: -ms-flexbox !important; 86 | display: flex !important; 87 | -webkit-flex-direction: row; 88 | -ms-flex-direction: row; 89 | flex-direction: row; 90 | -webkit-align-items: center; 91 | -ms-flex-align: center; 92 | align-items: center; 93 | color: rgba(255, 255, 255, 0.56); 94 | font-weight: 500; 95 | } 96 | .demo-layout .demo-navigation .mdl-navigation__link:hover { 97 | background-color: #00BCD4; 98 | color: #37474F; 99 | } 100 | .demo-navigation .mdl-navigation__link .material-icons { 101 | font-size: 24px; 102 | color: rgba(255, 255, 255, 0.56); 103 | margin-right: 32px; 104 | } 105 | 106 | .demo-content { 107 | max-width: 1080px; 108 | } 109 | 110 | .demo-charts { 111 | -webkit-align-items: center; 112 | -ms-flex-align: center; 113 | align-items: center; 114 | } 115 | .demo-chart:nth-child(1) { 116 | color: #ACEC00; 117 | } 118 | .demo-chart:nth-child(2) { 119 | color: #00BBD6; 120 | } 121 | .demo-chart:nth-child(3) { 122 | color: #BA65C9; 123 | } 124 | .demo-chart:nth-child(4) { 125 | color: #EF3C79; 126 | } 127 | .demo-graphs { 128 | padding: 16px 32px; 129 | display: -webkit-flex; 130 | display: -ms-flexbox; 131 | display: flex; 132 | -webkit-flex-direction: column; 133 | -ms-flex-direction: column; 134 | flex-direction: column; 135 | -webkit-align-items: stretch; 136 | -ms-flex-align: stretch; 137 | align-items: stretch; 138 | } 139 | /* TODO: Find a proper solution to have the graphs 140 | * not float around outside their container in IE10/11. 141 | * Using a browserhacks.com solution for now. 142 | */ 143 | _:-ms-input-placeholder, :root .demo-graphs { 144 | min-height: 664px; 145 | } 146 | _:-ms-input-placeholder, :root .demo-graph { 147 | max-height: 300px; 148 | } 149 | /* TODO end */ 150 | .demo-graph:nth-child(1) { 151 | color: #00b9d8; 152 | } 153 | .demo-graph:nth-child(2) { 154 | color: #d9006e; 155 | } 156 | 157 | .demo-cards { 158 | -webkit-align-items: flex-start; 159 | -ms-flex-align: start; 160 | align-items: flex-start; 161 | -webkit-align-content: flex-start; 162 | -ms-flex-line-pack: start; 163 | align-content: flex-start; 164 | } 165 | .demo-cards .demo-separator { 166 | height: 32px; 167 | } 168 | .demo-cards .mdl-card__title.mdl-card__title { 169 | color: white; 170 | font-size: 24px; 171 | font-weight: 400; 172 | } 173 | .demo-cards ul { 174 | padding: 0; 175 | } 176 | .demo-cards h3 { 177 | font-size: 1em; 178 | } 179 | .demo-updates .mdl-card__title { 180 | min-height: 200px; 181 | background-image: url('images/dog.png'); 182 | background-position: 90% 100%; 183 | background-repeat: no-repeat; 184 | } 185 | .demo-cards .mdl-card__actions a { 186 | color: #00BCD4; 187 | text-decoration: none; 188 | } 189 | 190 | .demo-options h3 { 191 | margin: 0; 192 | } 193 | .demo-options .mdl-checkbox__box-outline { 194 | border-color: rgba(255, 255, 255, 0.89); 195 | } 196 | .demo-options ul { 197 | margin: 0; 198 | list-style-type: none; 199 | } 200 | .demo-options li { 201 | margin: 4px 0; 202 | } 203 | .demo-options .material-icons { 204 | color: rgba(255, 255, 255, 0.89); 205 | } 206 | .demo-options .mdl-card__actions { 207 | height: 64px; 208 | display: -webkit-flex; 209 | display: -ms-flexbox; 210 | display: flex; 211 | box-sizing: border-box; 212 | -webkit-align-items: center; 213 | -ms-flex-align: center; 214 | align-items: center; 215 | } 216 | -------------------------------------------------------------------------------- /theme/styles.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2015 Google Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | html, body { 18 | font-family: 'Roboto', 'Helvetica', sans-serif; 19 | } 20 | .demo-avatar { 21 | width: 48px; 22 | height: 48px; 23 | border-radius: 24px; 24 | } 25 | .demo-layout .mdl-layout__header .mdl-layout__drawer-button { 26 | color: rgba(0, 0, 0, 0.54); 27 | } 28 | .mdl-layout__drawer .avatar { 29 | margin-bottom: 16px; 30 | } 31 | .demo-drawer { 32 | border: none; 33 | } 34 | /* iOS Safari specific workaround */ 35 | .demo-drawer .mdl-menu__container { 36 | z-index: -1; 37 | } 38 | .demo-drawer .demo-navigation { 39 | z-index: -2; 40 | } 41 | /* END iOS Safari specific workaround */ 42 | .demo-drawer .mdl-menu .mdl-menu__item { 43 | display: -webkit-flex; 44 | display: -ms-flexbox; 45 | display: flex; 46 | -webkit-align-items: center; 47 | -ms-flex-align: center; 48 | align-items: center; 49 | } 50 | .demo-drawer-header { 51 | box-sizing: border-box; 52 | display: -webkit-flex; 53 | display: -ms-flexbox; 54 | display: flex; 55 | -webkit-flex-direction: column; 56 | -ms-flex-direction: column; 57 | flex-direction: column; 58 | -webkit-justify-content: flex-end; 59 | -ms-flex-pack: end; 60 | justify-content: flex-end; 61 | padding: 16px; 62 | height: 151px; 63 | } 64 | .demo-avatar-dropdown { 65 | display: -webkit-flex; 66 | display: -ms-flexbox; 67 | display: flex; 68 | position: relative; 69 | -webkit-flex-direction: row; 70 | -ms-flex-direction: row; 71 | flex-direction: row; 72 | -webkit-align-items: center; 73 | -ms-flex-align: center; 74 | align-items: center; 75 | width: 100%; 76 | } 77 | 78 | .demo-navigation { 79 | -webkit-flex-grow: 1; 80 | -ms-flex-positive: 1; 81 | flex-grow: 1; 82 | } 83 | .demo-layout .demo-navigation .mdl-navigation__link { 84 | display: -webkit-flex !important; 85 | display: -ms-flexbox !important; 86 | display: flex !important; 87 | -webkit-flex-direction: row; 88 | -ms-flex-direction: row; 89 | flex-direction: row; 90 | -webkit-align-items: center; 91 | -ms-flex-align: center; 92 | align-items: center; 93 | color: rgba(255, 255, 255, 0.56); 94 | font-weight: 500; 95 | } 96 | .demo-layout .demo-navigation .mdl-navigation__link:hover { 97 | background-color: #00BCD4; 98 | color: #37474F; 99 | } 100 | .demo-navigation .mdl-navigation__link .material-icons { 101 | font-size: 24px; 102 | color: rgba(255, 255, 255, 0.56); 103 | margin-right: 32px; 104 | } 105 | 106 | .demo-content { 107 | max-width: 1080px; 108 | } 109 | 110 | .demo-charts { 111 | -webkit-align-items: center; 112 | -ms-flex-align: center; 113 | align-items: center; 114 | } 115 | .demo-chart:nth-child(1) { 116 | color: #ACEC00; 117 | } 118 | .demo-chart:nth-child(2) { 119 | color: #00BBD6; 120 | } 121 | .demo-chart:nth-child(3) { 122 | color: #BA65C9; 123 | } 124 | .demo-chart:nth-child(4) { 125 | color: #EF3C79; 126 | } 127 | .demo-graphs { 128 | padding: 16px 32px; 129 | display: -webkit-flex; 130 | display: -ms-flexbox; 131 | display: flex; 132 | -webkit-flex-direction: column; 133 | -ms-flex-direction: column; 134 | flex-direction: column; 135 | -webkit-align-items: stretch; 136 | -ms-flex-align: stretch; 137 | align-items: stretch; 138 | } 139 | /* TODO: Find a proper solution to have the graphs 140 | * not float around outside their container in IE10/11. 141 | * Using a browserhacks.com solution for now. 142 | */ 143 | _:-ms-input-placeholder, :root .demo-graphs { 144 | min-height: 664px; 145 | } 146 | _:-ms-input-placeholder, :root .demo-graph { 147 | max-height: 300px; 148 | } 149 | /* TODO end */ 150 | .demo-graph:nth-child(1) { 151 | color: #00b9d8; 152 | } 153 | .demo-graph:nth-child(2) { 154 | color: #d9006e; 155 | } 156 | 157 | .demo-cards { 158 | -webkit-align-items: flex-start; 159 | -ms-flex-align: start; 160 | align-items: flex-start; 161 | -webkit-align-content: flex-start; 162 | -ms-flex-line-pack: start; 163 | align-content: flex-start; 164 | } 165 | .demo-cards .demo-separator { 166 | height: 32px; 167 | } 168 | .demo-cards .mdl-card__title.mdl-card__title { 169 | color: white; 170 | font-size: 24px; 171 | font-weight: 400; 172 | } 173 | .demo-cards ul { 174 | padding: 0; 175 | } 176 | .demo-cards h3 { 177 | font-size: 1em; 178 | } 179 | .demo-updates .mdl-card__title { 180 | min-height: 200px; 181 | background-image: url('images/dog.png'); 182 | background-position: 90% 100%; 183 | background-repeat: no-repeat; 184 | } 185 | .demo-cards .mdl-card__actions a { 186 | color: #00BCD4; 187 | text-decoration: none; 188 | } 189 | 190 | .demo-options h3 { 191 | margin: 0; 192 | } 193 | .demo-options .mdl-checkbox__box-outline { 194 | border-color: rgba(255, 255, 255, 0.89); 195 | } 196 | .demo-options ul { 197 | margin: 0; 198 | list-style-type: none; 199 | } 200 | .demo-options li { 201 | margin: 4px 0; 202 | } 203 | .demo-options .material-icons { 204 | color: rgba(255, 255, 255, 0.89); 205 | } 206 | .demo-options .mdl-card__actions { 207 | height: 64px; 208 | display: -webkit-flex; 209 | display: -ms-flexbox; 210 | display: flex; 211 | box-sizing: border-box; 212 | -webkit-align-items: center; 213 | -ms-flex-align: center; 214 | align-items: center; 215 | } 216 | --------------------------------------------------------------------------------