├── .project ├── .vscode └── settings.json ├── README.md ├── about.html ├── css ├── about.css ├── footer.css ├── general.css ├── indexx.css ├── nav.css ├── post.css ├── post_common.css ├── star_canvas.css ├── tool_common.css └── tools.css ├── footer.html ├── images ├── banner1.png ├── banner2.png ├── banner3.png ├── moon.png ├── post0_0.png ├── post0_1.png ├── post1_0.png └── star.png ├── index.html ├── js ├── footer.js ├── index.js ├── jquery.js ├── nav.js ├── post_common.js ├── post_info.js ├── posts.js ├── star_canvas.js ├── tool0.js ├── tool0_thread.js ├── tool1.js ├── tool2.js ├── tool3.js ├── tool_common.js └── tools.js ├── nav.html ├── post0.html ├── post1.html ├── post2.html ├── post3.html ├── post4.html ├── post5.html ├── post6.html ├── posts.html ├── tool0.html ├── tool1.html ├── tool2.html ├── tool3.html └── tools.html /.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | hwf 4 | 5 | 6 | 7 | 8 | 9 | com.aptana.ide.core.unifiedBuilder 10 | 11 | 12 | 13 | 14 | 15 | com.aptana.projects.webnature 16 | 17 | 18 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "C_Cpp.default.compilerPath": "c:\\Users\\lr580\\.vscode\\extensions\\bartmanabyss.amiga-debug-1.0.0\\bin\\opt\\bin\\m68k-amiga-elf-gcc.exe" 3 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## 文件结构 2 | 3 | ### HTML 4 | 5 | - `index.html` 首页(轮播图、网站介绍、固定文章/工具推荐) 6 | - `nav.html` 顶部导航栏 7 | - `footer.html` 底部栏(copyright行) 8 | - `posts.html` 帖子首页(分页显示帖子概况、搜索) 9 | - `post0.html` 帖子-拓展欧拉定理:从快速幂到疾速幂 10 | - `post1.html` 帖子-C语言输入流浅析 11 | - `post2.html` 帖子-Python高阶函数浅析 12 | - `post3.html` 帖子-git指令小结 13 | - `post4.html` 帖子-线段树、树状数组和块状数组小结 14 | - `post5.html` 帖子-记解决Ubuntu系统上的小问题几则 15 | - `post6.html` 帖子-编程相关使用网站小推荐 16 | - `tools.html` 工具首页 17 | - `tool0.html` 工具-多功能计算器(常见算法函数计算,代码eval执行) 18 | - `tool1.html` 工具-文本处理器(查找、替换、统计、正则搜索) 19 | - `tool2.html` 工具-随机抽取器(多种模式的随机抽签模拟) 20 | - `tool3.html` 工具-乱数假文生成器(中英) 21 | - `about.html` 关于(联系方式) 22 | 23 | ### CSS 24 | 25 | `css/` 下 26 | 27 | - `general.css` 通用样式 28 | - `indexx.css` 首页专用样式 29 | - `nav.css` 导航栏专用样式 30 | - `footer.css` 底部栏专用样式 31 | - `tools.css` 工具首页专用样式 32 | - `tools_common.css` 四个具体工具专用样式 33 | - `posts.css` 帖子首页专用样式 34 | - `post_common.css` 七个具体帖子专用样式 35 | - `star_canvas.css` 首页星星月亮动画样式 36 | - `about.css` 关于页专用样式 37 | 38 | ### JS 39 | 40 | `js/` 下 41 | 42 | - `jquery.js` jQuery 库 43 | - `index.js` 首页脚本 44 | - `nav.js` 导航脚本 45 | - `footer.js` 底部栏脚本 46 | - `star_canvas.js` 首页星星月亮动画脚本 47 | - `posts.js` 帖子首页脚本 48 | - `post_info.js` 帖子分类、各帖子概述信息、帖子代码块常量内容 49 | - `post_common.js` 具体帖子通用脚本 50 | - `tools.js` 工具首页脚本 51 | - `tool_common.js` 工具通用脚本 52 | - `tool0.js` 多功能计算器显示逻辑脚本、说明书常量 53 | - `tool0_thread.js` 多功能计算器各函数具体实现 54 | - `tool1.js` 文本处理器显示逻辑脚本、说明书常量 55 | - `tool2.js` 随机抽取器显示逻辑脚本 56 | - `tool3.js` 乱数假文生成器显示逻辑脚本、常用汉字表 57 | 58 | ### 图片 59 | 60 | `images/` 下 61 | 62 | - `banner1.png` 首页横幅图片 63 | - `banner2.png` 首页横幅图片 64 | - `banner3.png` 首页横幅图片 65 | - `star.png` 星星动画静态素材图 66 | - `moon.png` 月亮动画静态素材图 67 | - `post0_0.png` 帖子附图(欧拉定理数学表述) 68 | - `post0_1.png` 帖子附图(扩展欧拉定理数学表述) 69 | - `post1_0.png` 帖子附图(代码运行结果) 70 | 71 | 72 | 73 | ## 关键逻辑概述 74 | 75 | ### 通用 76 | 77 | #### 导航栏 78 | 79 | ##### 加载 80 | 81 | `nav.js` 82 | 83 | 具体逻辑:代码注入。即在具体要加载导航栏的网页中,设置一个 id 为 `ifr` 的 div 标签用于装载导航栏,然后在具体网页执行 `nav.js`,然后该 JS 将 HTML 代码以字符串形式传送到具体网页,并重新加载。 84 | 85 | 为了鲁棒性考虑了多种情况(跨域与否)。 86 | 87 | ##### 当前高亮 88 | 89 | 比如当前在首页,导航栏当前位置高亮,主要是 `build_href` 函数,具体而言,通过读取当前 URL,截取 URL 的一部分名字(如得出 `index`),然后查看是否跟当前导航栏名字一致,如果一致就高亮。 90 | 91 | ##### 回到顶部 92 | 93 | 当页面太长时,浏览到下面时,点击回到顶部。主要是 `set_goto_top` 函数。 94 | 95 | ##### 自动调整宽高 96 | 97 | 监听 `resize` 和 `scroll` 事件,如果调整了宽高,重新加载一次页面,因为 CSS 是按百分比设置的,所以能自动通过 CSS 计算新的宽高。下同。 98 | 99 | #### 底部栏 100 | 101 | `footer.js` 102 | 103 | 主要逻辑代码是自动调整宽高,同上理。 104 | 105 | ### 首页 106 | 107 | #### 横幅轮播 108 | 109 | `index.js` 的大部分逻辑都是这个相关的。 110 | 111 | - 自动播放:具体实现为设置周期事件,每次在播放上一张图片消失的同时播放下一张图片出现的动画,从而实现轮播效果。播放结束更新相关状态。 112 | - 手动跳转:点击左下方可以直接跳转到对应横幅,并播放跳转动画。 113 | 114 | #### 星星月亮动画 115 | 116 | 实现了首页星星和月亮若隐若现的效果。 117 | 118 | 具体而言,在 `star_canvas.js` 反复加载了多次同一个星星静态图,并通过给不同的 CSS 样式(`star_canvas.css`)设置了位置和旋转角度等,然后通过 CSS3 定义了几种若隐若现的动画,并通过 JS 将星星插入到具体 id 为 `star` 的标签上。月亮同理。 119 | 120 | ### 帖子首页 121 | 122 | #### 搜索 123 | 124 | 搜索帖子,主要通过 GET 方法实现,即在 URL 上添加参数代表搜索的要求(如 type 代表类型),在 `load_post` 函数具体实现,找到具体满足要求的的帖子列表,如果超过每页显示的数量就分页显示,否则单页显示。 125 | 126 | 具体浏览哪一页通过 URL 上的 page 参数控制页数。 127 | 128 | #### 加载帖子概述 129 | 130 | 通过 `generate_abbr` 函数,动态地生成一个帖子概述,通过搜索找到帖子ID(pid),即帖子位于常量数组的哪个下标,然后根据 ID 读取帖子的标题、日期、标签等内容,并动态组织成帖子信息块,生成的标签添加到 `posts` 标签里。 131 | 132 | ### 具体帖子 133 | 134 | `post_common.js` 135 | 136 | 每一个帖子都用同一个 JS 生成,动态性较强。具体而言动态生成的部分包括: 137 | 138 | #### 标题信息 139 | 140 | 标题信息是帖子概述和具体帖子共用的,为了实现复用,所以只存了一份信息。通过 `build_common` 函数加载帖子的标题、标签、日期等具体信息,然后动态加载到网页首部。 141 | 142 | #### 渲染代码块 143 | 144 | 代码块即显示在帖子里的代码文本,属于帖子的一部分。 145 | 146 | 首先根据代码块的信息(HTML提供,在 `render_all_code` 进行读取),读取代码常量(`render_code`),将不能正常显示的特殊符号替换,然后处理好分行,合成到一个有序列表里,形成代码文本。 147 | 148 | #### 随机推荐 149 | 150 | 一个帖子的底部会随机推荐若干篇其他帖子。这个随机算法通过 `select_except` 具体实现,最后在构建帖子的 `build_common` 调用。 151 | 152 | ### 工具首页 153 | 154 | `tools.js` 155 | 156 | 主要逻辑代码是自动调整宽高,同上理。 157 | 158 | 并批量地实现了点击跳转到具体逻辑。 159 | 160 | ### 多功能计算器 161 | 162 | 具体显示逻辑略(即读取说明书常量,动态注入到 HTML 里,和控制表单、按钮输入输出等代码),下同略。仅概述核心逻辑。 163 | 164 | 整体逻辑: 165 | 166 | - 加载网页时,事先通过 `append_func_list` 调用代码,加载具体的代码说明到前端,并通过 `tool0_thread.js` 定义对应的函数并加载。 167 | - 用户输入要执行的计算代码(可执行的多行 JS 代码),然后调用 `_cal` 函数,通过内置函数 `eval` 执行计算,并返回计算结果(保存在全局变量 `_res`)里,通过 `_show` 显示结果。 168 | 169 | 170 | 171 | ### 文本处理器 172 | 173 | 常用正则表达式通过动态方式加入到 HTML 列表里显示。 174 | 175 | 整体逻辑虽然长,但是很好懂,无非就是字符串统计、搜索,并显示搜索结果而已。 176 | 177 | ### 随机抽取器 178 | 179 | 整体逻辑虽然长,但是很好懂,无非就是多种情况下的具体随机抽取逻辑。为了提高性能进行了一定的优化和复杂度分析。 180 | 181 | ### 乱数假文生成器 182 | 183 | 具体生成逻辑实际上是随机抽取的延伸,即随机从字典里抽取字符,然后抽取一定的长度后抽取标点符号,加多点分类讨论即可。 184 | -------------------------------------------------------------------------------- /about.html: -------------------------------------------------------------------------------- 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 |
如果您对本网站有任何宝贵的建议或意见,欢迎您随时向网站的建设者lr580提出。请联系微信:qzx23320
31 |
32 |
33 |
更新日志:
34 | 41 |
42 |
43 |
44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /css/about.css: -------------------------------------------------------------------------------- 1 | @charset "utf-8"; 2 | .about_frame { 3 | margin-top: 20px; 4 | margin-bottom: 40px; 5 | margin-left: 4%; 6 | margin-right: 6%; 7 | } 8 | 9 | .about_title { 10 | width: 90%; 11 | font-size: 38px; 12 | color: navy; 13 | margin-top: 30px; 14 | margin-left: 30px; 15 | margin-bottom: 20px; 16 | font-weight: bold; 17 | } 18 | 19 | .about_title2 { 20 | width: 90%; 21 | font-size: 24px; 22 | color: rgb(0, 0, 82); 23 | margin-top: 6px; 24 | margin-left: 20px; 25 | margin-bottom: 12px; 26 | font-weight: bold; 27 | } 28 | 29 | .about_list { 30 | position: relative; 31 | left: 15%; 32 | text-indent: 0; 33 | font-size: 18px; 34 | color: rgb(14, 44, 100); 35 | /* margin-bottom: 12px; */ 36 | word-spacing: 1em; 37 | } 38 | 39 | .about_list li { 40 | padding-top: 5px; 41 | /* padding-bottom: 5px; */ 42 | } 43 | 44 | .about_text { 45 | text-indent: 2em; 46 | font-size: 18px; 47 | color: rgb(14, 44, 100); 48 | } 49 | 50 | .about_align { 51 | position: absolute; 52 | top: 150px; 53 | } 54 | 55 | .about_left { 56 | /*不知道为什么只要有两个float就会炸掉排版*/ 57 | /* float: left; */ 58 | /* width: 400px; */ 59 | /* margin-right: 40px; */ 60 | /* position: relative; */ 61 | width: 45%; 62 | /* background-color: wheat; */ 63 | left: 6%; 64 | } 65 | 66 | .about_right { 67 | /* position: relative; */ 68 | width: 35%; 69 | /* background-color: gold; */ 70 | right: 8%; 71 | /* float: left; */ 72 | /* float: left; */ 73 | /* width: 400px; 74 | overflow: hidden; */ 75 | /* float: right; 76 | width: 300px; 77 | margin: 20px 30px; */ 78 | } 79 | 80 | .about_mb { 81 | margin-bottom: 12px; 82 | } -------------------------------------------------------------------------------- /css/footer.css: -------------------------------------------------------------------------------- 1 | @charset "utf-8"; 2 | * { 3 | margin: 0; 4 | padding: 0; 5 | -webkit-user-select: none; 6 | -moz-user-select: none; 7 | -ms-user-select: none; 8 | user-select: none; 9 | } 10 | 11 | .footer { 12 | width: 100%; 13 | height: 48px; 14 | background-color: rgb(188, 220, 246); 15 | position: absolute; 16 | bottom: 0; 17 | line-height: 48px; 18 | text-align: right; 19 | } 20 | 21 | 22 | /*发现这样的方法在内联框架内无效,所以转用div*/ 23 | 24 | small .footer_text { 25 | padding-right: 6%; 26 | } 27 | 28 | .footer_frame { 29 | position: static; 30 | bottom: 0; 31 | } 32 | 33 | .footer_contain { 34 | float: left; 35 | margin-left: 80px; 36 | } -------------------------------------------------------------------------------- /css/general.css: -------------------------------------------------------------------------------- 1 | @charset "utf-8"; 2 | * { 3 | margin: 0; 4 | padding: 0; 5 | } 6 | 7 | * { 8 | -webkit-user-select: none; 9 | -moz-user-select: none; 10 | -ms-user-select: none; 11 | user-select: none; 12 | } 13 | 14 | img { 15 | -webkit-user-drag: none; 16 | /*firefox无效*/ 17 | } 18 | 19 | .allow_select { 20 | -webkit-user-select: text; 21 | -moz-user-select: text; 22 | -ms-user-select: text; 23 | user-select: text; 24 | } 25 | 26 | body { 27 | background-color: rgb(247, 240, 228); 28 | } 29 | 30 | input[type='text'], 31 | input[type='number'], 32 | textarea, 33 | option, 34 | select { 35 | background-color: rgb(247, 240, 228); 36 | } -------------------------------------------------------------------------------- /css/indexx.css: -------------------------------------------------------------------------------- 1 | @charset "utf-8"; 2 | * { 3 | margin: 0; 4 | padding: 0; 5 | /*因为写错成bottom:0导致过一些bugs……*/ 6 | } 7 | 8 | * { 9 | -webkit-user-select: none; 10 | -moz-user-select: none; 11 | -ms-user-select: none; 12 | user-select: none; 13 | } 14 | 15 | img { 16 | -webkit-user-drag: none; 17 | /*firefox无效*/ 18 | } 19 | 20 | .allow_select { 21 | -webkit-user-select: text; 22 | -moz-user-select: text; 23 | -ms-user-select: text; 24 | user-select: text; 25 | } 26 | 27 | #mains, 28 | .mains { 29 | height: 920px; 30 | background-color: rgb(247, 240, 228); 31 | padding-left: 6%; 32 | padding-right: 4%; 33 | padding-top: 8px; 34 | /* margin-bottom: 48px; */ 35 | /* color: red; */ 36 | } 37 | 38 | .title1 { 39 | font-size: 28px; 40 | font-weight: 700; 41 | /* text-indent: 2em; */ 42 | display: none; 43 | margin-bottom: 8px; 44 | color: rgb(0, 0, 71); 45 | } 46 | 47 | .content1 { 48 | display: none; 49 | text-indent: 2em; 50 | font-size: 18px; 51 | color: rgb(14, 44, 100); 52 | /* margin-top: 6px; */ 53 | } 54 | 55 | .title0 { 56 | width: 90%; 57 | text-align: center; 58 | font-size: 38px; 59 | color: rgb(4, 4, 107); 60 | margin-top: 30px; 61 | margin-bottom: 20px; 62 | font-weight: bold; 63 | display: none; 64 | } 65 | 66 | .title2 { 67 | font-size: 24px; 68 | font-weight: 700; 69 | display: none; 70 | margin-top: 28px; 71 | margin-bottom: 8px; 72 | color: navy; 73 | } 74 | 75 | .index_left { 76 | float: left; 77 | width: 40%; 78 | } 79 | 80 | .index_right { 81 | float: left; 82 | width: 40%; 83 | margin-left: 10%; 84 | } 85 | 86 | .index_list li { 87 | padding-top: 8px; 88 | } 89 | 90 | .index_list a { 91 | text-decoration: none; 92 | color: rgb(14, 44, 100); 93 | transition: all 0.3s; 94 | /* margin-top: 10px; */ 95 | } 96 | 97 | .index_list a:hover { 98 | color: goldenrod; 99 | transition: all 0.3s; 100 | } 101 | 102 | .index_list { 103 | /* position: relative; */ 104 | /* left: 15%; */ 105 | text-indent: 0; 106 | font-size: 18px; 107 | color: rgb(14, 44, 100); 108 | word-spacing: 1em; 109 | } 110 | 111 | .banner { 112 | /* background-color: wheat; */ 113 | height: 192px; 114 | margin-bottom: 20px; 115 | margin-top: 10px; 116 | } 117 | 118 | .slide { 119 | display: none; 120 | height: 192px; 121 | width: 100%; 122 | /* cursor: pointer; */ 123 | /*暂未打算图片跳转*/ 124 | } 125 | 126 | .slide_button_normal { 127 | position: absolute; 128 | height: 18px; 129 | width: 18px; 130 | border-radius: 30px; 131 | border: 2px solid rgb(4, 46, 80); 132 | background-color: rgb(77, 164, 235); 133 | /* top: 220px; 无标题时 */ 134 | top: 312px; 135 | z-index: 100; 136 | cursor: pointer; 137 | transition: background-color 0.3s, border 0.3s; 138 | } 139 | 140 | .slide_button_normal:hover, 141 | .slide_button_now { 142 | transition: background-color 0.3s, border 0.3s; 143 | background-color: rgb(240, 198, 61); 144 | border: 2px solid rgb(105, 82, 7) 145 | } -------------------------------------------------------------------------------- /css/nav.css: -------------------------------------------------------------------------------- 1 | @charset "utf-8"; 2 | * { 3 | margin: 0; 4 | padding: 0; 5 | } 6 | 7 | .nav_main_bg { 8 | background-color: rgb(188, 220, 246); 9 | height: 48px; 10 | width: 100%; 11 | overflow: hidden; 12 | } 13 | 14 | .nav_main_cf { 15 | /*自动居中*/ 16 | margin: 0 auto; 17 | /* background-color: rgb(123, 173, 238); */ 18 | width: 80%; 19 | height: 48px; 20 | } 21 | 22 | .nav_main_cf_rf { 23 | float: right; 24 | line-height: 48px; 25 | font-weight: 700; 26 | font-size: 16px; 27 | } 28 | 29 | 30 | /* .nav_add_border { 31 | border-left: 2px solid rgb(3, 12, 92); 32 | } */ 33 | 34 | .nav_bar { 35 | /* border-right: 2px solid rgb(3, 12, 92); */ 36 | width: 18%; 37 | float: left; 38 | line-height: 48px; 39 | text-align: center; 40 | font-size: 18px; 41 | font-weight: 700; 42 | color: rgb(0, 48, 138); 43 | cursor: pointer; 44 | transition: all 0.3s; 45 | } 46 | 47 | .nav_barrier { 48 | background-color: rgb(3, 12, 92); 49 | width: 2px; 50 | height: 28px; 51 | float: left; 52 | position: relative; 53 | top: 10px; 54 | /* transition: all 0.3s; */ 55 | /* border: 0.5px solid rgb(3, 12, 92); */ 56 | /* border-radius: 1px; */ 57 | } 58 | 59 | .nav_bar:hover, 60 | .nav_bar[now] { 61 | transition: all 0.3s; 62 | background-color: rgb(246, 218, 175); 63 | color: rgb(93, 71, 16); 64 | /* border-radius: 36%/24%; 不好看…… */ 65 | } 66 | 67 | .nav_selei { 68 | opacity: 0.5; 69 | background-color: rgb(235, 203, 151); 70 | position: absolute; 71 | height: 48px; 72 | } 73 | 74 | .nav_to_top { 75 | position: fixed; 76 | height: 36px; 77 | line-height: 36px; 78 | width: 86px; 79 | background-color: rgb(188, 220, 246); 80 | bottom: 10px; 81 | right: 10px; 82 | font-weight: 500; 83 | text-align: center; 84 | border-radius: 22%/44%; 85 | transition: all 0.3s; 86 | cursor: pointer; 87 | display: none; 88 | } 89 | 90 | .nav_to_top:hover { 91 | background-color: rgb(247, 223, 179); 92 | outline: 1px solid rgb(0, 0, 39); 93 | } 94 | 95 | .nav_to_top:hover a:hover { 96 | color: #000; 97 | /* border: 0; */ 98 | /* outline: 0; */ 99 | /*必须双重hover才起作用!*/ 100 | } 101 | 102 | .nav_to_top a { 103 | color: black; 104 | text-decoration: none; 105 | /* border: 0; 暂未解决:chorme hover时会自动加边框且没办法消去,firefox不会 */ 106 | } -------------------------------------------------------------------------------- /css/post.css: -------------------------------------------------------------------------------- 1 | @charset "utf-8"; 2 | body { 3 | background-color: rgb(247, 240, 228); 4 | margin: 0; 5 | } 6 | 7 | .post_main { 8 | /* height: 1000px; */ 9 | background-color: rgb(247, 240, 228); 10 | padding-left: 96px; 11 | padding-right: 4%; 12 | padding-top: 24px; 13 | padding-bottom: 40px; 14 | } 15 | 16 | .sidebar { 17 | position: fixed; 18 | background-color: rgb(188, 220, 246); 19 | width: 64px; 20 | height: 100%; 21 | top: 0; 22 | } 23 | 24 | .sidebar_main { 25 | position: relative; 26 | top: 62px; 27 | text-align: center; 28 | } 29 | 30 | .sidebar_barrier { 31 | height: 3px; 32 | position: relative; 33 | left: 12px; 34 | width: 60%; 35 | background-color: rgb(3, 12, 92); 36 | border-radius: 30px/3px; 37 | } 38 | 39 | .sidebar_column { 40 | height: 64px; 41 | font-size: 18px; 42 | font-weight: 700; 43 | color: rgb(2, 9, 22); 44 | /* background-color: darkgoldenrod; */ 45 | cursor: pointer; 46 | transition: all 0.3s; 47 | } 48 | 49 | .sc1 { 50 | line-height: 64px; 51 | /*一行就是一行栏*/ 52 | } 53 | 54 | .sc2 { 55 | line-height: 24px; 56 | /*一行强行分两行的方法*/ 57 | } 58 | 59 | .sc21 { 60 | position: relative; 61 | top: 8px; 62 | } 63 | 64 | .sc22 { 65 | position: relative; 66 | top: 6px; 67 | } 68 | 69 | .sidebar_column_now, 70 | .sidebar_column:hover { 71 | transition: all 0.3s; 72 | background-color: rgb(93, 147, 192); 73 | /*rgb(0, 228, 228);*/ 74 | color: rgb(0, 6, 15); 75 | border-radius: 36%; 76 | } 77 | 78 | #search_input { 79 | transition: all 0.3s; 80 | height: 36px; 81 | font-size: 16px; 82 | border-radius: 12px; 83 | width: 75%; 84 | text-indent: 1em; 85 | -webkit-user-select: text; 86 | -moz-user-select: text; 87 | -ms-user-select: text; 88 | user-select: text; 89 | } 90 | 91 | #search_input:focus { 92 | transition: all 0.3s; 93 | /*为了修复一个chorme上点击后产生的方框不美观的问题*/ 94 | border-radius: 0px; 95 | } 96 | 97 | #search_list { 98 | transition: all 0.3s; 99 | width: 75%; 100 | /* background-color: red; */ 101 | /*似乎search_list无法设置样式……*/ 102 | } 103 | 104 | #search_button { 105 | margin-left: 16px; 106 | height: 36px; 107 | width: 56px; 108 | font-size: 18px; 109 | border: 1px solid transparent; 110 | border-radius: 12px; 111 | background-color: rgb(211, 211, 211); 112 | box-shadow: 3px 3px 3px darkgray; 113 | cursor: pointer; 114 | transition: all 0.3s; 115 | color: black; 116 | text-decoration: none; 117 | } 118 | 119 | #search_button_now, 120 | #search_button:hover { 121 | background-color: rgb(148, 148, 148); 122 | box-shadow: 3px 3px 3px rgb(70, 70, 70); 123 | transition: all 0.3s; 124 | /* color: red; */ 125 | } 126 | 127 | @keyframes click_search { 128 | 50% { 129 | background-color: gold; 130 | box-shadow: 3px 3px 3px goldenrod; 131 | } 132 | 100% { 133 | background-color: rgb(211, 211, 211); 134 | box-shadow: 3px 3px 3px darkgray; 135 | } 136 | } 137 | 138 | .search_button_clicking { 139 | animation-name: click_search; 140 | animation-duration: 0.3s; 141 | } 142 | 143 | .post { 144 | width: 100%; 145 | /* height: 192px; let it auto better */ 146 | transition: all 0.3s; 147 | margin-top: 30px; 148 | display: none; 149 | border: 2px dotted rgb(15, 13, 29); 150 | border-radius: 25px; 151 | padding: 8px; 152 | cursor: pointer; 153 | background-color: rgb(251, 251, 219); 154 | transition: all 0.3s; 155 | } 156 | 157 | .post:hover { 158 | transition: all 0.3s; 159 | background-color: rgb(253, 253, 193); 160 | /* border: 2px groove rgb(15, 13, 29); */ 161 | } 162 | 163 | .post_title { 164 | font-size: 22px; 165 | font-weight: 700; 166 | padding-top: 10px; 167 | padding-left: 35px; 168 | padding-bottom: 8px; 169 | color: navy; 170 | } 171 | 172 | .post_abbr { 173 | text-indent: 2em; 174 | font-size: 18px; 175 | padding: 12px; 176 | color: rgb(14, 44, 100); 177 | } 178 | 179 | .post_date { 180 | float: right; 181 | /* text-align: right; */ 182 | padding-right: 32px; 183 | font-size: 15px; 184 | color: rgb(14, 44, 100); 185 | } 186 | 187 | .post_bottom { 188 | height: 26px; 189 | } 190 | 191 | .post_tag { 192 | float: left; 193 | font-size: 15px; 194 | padding-left: 30px; 195 | color: rgb(14, 44, 100); 196 | } 197 | 198 | #search_feedback { 199 | font-size: 16px; 200 | font-weight: 700; 201 | margin-top: 12px; 202 | margin-left: 30px; 203 | } 204 | 205 | .page_block { 206 | transition: all 0.3s; 207 | width: 28px; 208 | height: 28px; 209 | /* background-color: wheat; */ 210 | /* border: 1px solid black; */ 211 | margin-right: 15px; 212 | float: left; 213 | line-height: 28px; 214 | text-align: center; 215 | font-size: 24px; 216 | font-weight: 900; 217 | color: rgb(182, 130, 0); 218 | cursor: pointer; 219 | } 220 | 221 | .page_last { 222 | /* background-color: goldenrod; */ 223 | /* height: 1px; */ 224 | position: relative; 225 | top: 4px; 226 | left: 6px; 227 | border-left: 18px solid rgb(182, 130, 0); 228 | border-top: 10px solid transparent; 229 | border-bottom: 10px solid transparent; 230 | transition: all 0.3s; 231 | } 232 | 233 | .page_last_on, 234 | .page_last:hover { 235 | transition: all 0.3s; 236 | border-left: 18px solid rgb(98, 69, 13); 237 | } 238 | 239 | .page_first { 240 | position: relative; 241 | top: 4px; 242 | left: -4px; 243 | border-right: 18px solid rgb(182, 130, 0); 244 | border-top: 10px solid transparent; 245 | border-bottom: 10px solid transparent; 246 | transition: all 0.3s; 247 | } 248 | 249 | .page_first_on, 250 | .page_first:hover { 251 | transition: all 0.3s; 252 | border-right: 18px solid rgb(98, 69, 13); 253 | /*该hover事实上与page_block hover触发范围不一致,所以用了jQuery手写*/ 254 | } 255 | 256 | .page_button { 257 | height: 40px; 258 | /* background-color: wheat; */ 259 | } 260 | 261 | .pb_list { 262 | float: right; 263 | margin-top: 20px; 264 | } 265 | 266 | .page_block:hover { 267 | transition: all 0.3s; 268 | background-color: wheat; 269 | color: rgb(98, 69, 13); 270 | } -------------------------------------------------------------------------------- /css/post_common.css: -------------------------------------------------------------------------------- 1 | @charset "utf-8"; 2 | .post_frame { 3 | margin-top: 20px; 4 | margin-bottom: 40px; 5 | margin-left: 6%; 6 | margin-right: 6%; 7 | /* color: red; */ 8 | } 9 | 10 | .post_hrefs { 11 | /* background-color: wheat; */ 12 | width: 100%; 13 | height: 32px; 14 | } 15 | 16 | .post_sub_href { 17 | color: rgb(16, 54, 124); 18 | font-size: 18px; 19 | text-decoration: none; 20 | float: left; 21 | } 22 | 23 | .post_sub_href_conn { 24 | color: rgb(16, 54, 124); 25 | font-size: 18px; 26 | text-decoration: none; 27 | float: left; 28 | padding-left: 10px; 29 | padding-right: 10px; 30 | } 31 | 32 | .post_title { 33 | text-align: center; 34 | font-size: 30px; 35 | color: rgb(5, 41, 107); 36 | font-weight: 900; 37 | } 38 | 39 | .post_info_frame { 40 | /* background-color: wheat; */ 41 | height: 32px; 42 | line-height: 32px; 43 | color: rgb(1, 1, 56); 44 | margin-left: 10%; 45 | } 46 | 47 | .post_info_tag { 48 | float: left; 49 | } 50 | 51 | .post_info_time { 52 | float: left; 53 | margin-left: 50px; 54 | } 55 | 56 | .post_link_frame { 57 | /* background-color: wheat; */ 58 | height: 32px; 59 | margin-top: 40px; 60 | color: rgb(16, 54, 124); 61 | font-size: 16px; 62 | text-decoration: none; 63 | line-height: 32px; 64 | } 65 | 66 | .post_link_prev { 67 | float: left; 68 | } 69 | 70 | .post_link_next { 71 | float: right; 72 | margin-right: 10%; 73 | } 74 | 75 | a { 76 | text-decoration: none; 77 | color: rgb(16, 54, 124); 78 | transition: color 0.3s; 79 | } 80 | 81 | hr { 82 | width: 90%; 83 | } 84 | 85 | .post_recommend_head { 86 | height: 32px; 87 | color: rgb(4, 44, 119); 88 | font-size: 16px; 89 | text-decoration: none; 90 | line-height: 32px; 91 | font-weight: 700; 92 | } 93 | 94 | .post_recommend { 95 | height: 32px; 96 | color: rgb(4, 44, 119); 97 | font-size: 16px; 98 | text-decoration: none; 99 | line-height: 32px; 100 | margin-left: 48px; 101 | /* display: block; */ 102 | } 103 | 104 | a[href]:hover { 105 | transition: color 0.3s; 106 | color: goldenrod; 107 | } 108 | 109 | .post_normal { 110 | text-indent: 2em; 111 | font-size: 18px; 112 | color: rgb(14, 44, 100); 113 | line-height: 28px; 114 | width: 90%; 115 | } 116 | 117 | .post_italic { 118 | text-indent: 2em; 119 | font-size: 16px; 120 | color: rgb(14, 44, 100); 121 | line-height: 24px; 122 | width: 90%; 123 | font-style: italic; 124 | } 125 | 126 | .post_subtitle { 127 | font-size: 26px; 128 | color: rgb(5, 41, 107); 129 | font-weight: 900; 130 | margin-left: 5%; 131 | margin-top: 18px; 132 | margin-bottom: 12px; 133 | } 134 | 135 | .post_subsubtitle { 136 | font-size: 22px; 137 | color: rgb(5, 41, 107); 138 | font-weight: 700; 139 | margin-left: 5%; 140 | margin-top: 18px; 141 | margin-bottom: 10px; 142 | } 143 | 144 | .post_smalltitle { 145 | font-size: 20px; 146 | color: rgb(18, 61, 141); 147 | font-weight: 700; 148 | margin-left: 5%; 149 | margin-top: 14px; 150 | margin-bottom: 12px; 151 | } 152 | 153 | .post_href { 154 | text-decoration: underline; 155 | color: rgb(14, 44, 100); 156 | } 157 | 158 | .post_code { 159 | /* border: 1px solid black; */ 160 | width: 90%; 161 | font-size: 18px; 162 | font-family: monospace; 163 | background-color: rgb(243, 234, 219); 164 | margin-left: 22px; 165 | white-space: pre; 166 | margin-top: 10px; 167 | margin-bottom: 10px; 168 | color: rgb(1, 1, 56); 169 | } 170 | 171 | .post_code li { 172 | font-size: 18px; 173 | } 174 | 175 | .post_img { 176 | margin: 10px auto; 177 | /* background-color: wheat; */ 178 | text-align: center; 179 | width: 90%; 180 | } 181 | 182 | .post_list { 183 | margin-top: 8px; 184 | margin-bottom: 8px; 185 | padding-left: 45px; 186 | } 187 | 188 | .post_list div, 189 | .post_list li { 190 | font-size: 18px; 191 | color: rgb(14, 44, 100); 192 | line-height: 28px; 193 | width: 90%; 194 | } 195 | 196 | .dtac { 197 | position: relative; 198 | left: -45px; 199 | } 200 | 201 | strong, 202 | .post_list li, 203 | .post_list div { 204 | /*终于起作用了*/ 205 | -webkit-user-select: text; 206 | -moz-user-select: text; 207 | -ms-user-select: text; 208 | user-select: text; 209 | } -------------------------------------------------------------------------------- /css/star_canvas.css: -------------------------------------------------------------------------------- 1 | @charset "utf-8"; 2 | #star { 3 | height: 150px; 4 | /* z-index: -1; */ 5 | /* background-color: #fff; */ 6 | } 7 | 8 | .fix1 { 9 | position: relative; 10 | /* top: 230px; */ 11 | top: 160px; 12 | right: 20px; 13 | } 14 | 15 | .fix2 { 16 | position: relative; 17 | left: 60%; 18 | top: 300px; 19 | z-index: -1; 20 | } 21 | 22 | .stars { 23 | width: 32px; 24 | height: 32px; 25 | } 26 | 27 | @keyframes ssm1 { 28 | 0% { 29 | opacity: 1; 30 | } 31 | 80% { 32 | opacity: 1; 33 | } 34 | 90% { 35 | opacity: 0; 36 | } 37 | 100% { 38 | opacity: 1; 39 | } 40 | } 41 | 42 | .ss1 { 43 | animation-name: ssm1; 44 | animation-duration: 5s; 45 | animation-play-state: running; 46 | animation-iteration-count: infinite; 47 | position: relative; 48 | right: 70%; 49 | top: 60%; 50 | } 51 | 52 | .ss4 { 53 | animation-name: ssm1; 54 | animation-duration: 7s; 55 | animation-play-state: running; 56 | animation-iteration-count: infinite; 57 | /* transition: rotate(45deg); 似乎实现不了?…… */ 58 | position: relative; 59 | right: 85%; 60 | top: 70%; 61 | } 62 | 63 | @keyframes ssm2 { 64 | 0% { 65 | opacity: 1; 66 | } 67 | 20% { 68 | opacity: 0; 69 | } 70 | 40% { 71 | opacity: 1; 72 | } 73 | 100% { 74 | opacity: 1; 75 | } 76 | } 77 | 78 | .ss2 { 79 | animation-name: ssm2; 80 | animation-duration: 4s; 81 | animation-play-state: running; 82 | animation-iteration-count: infinite; 83 | /* transition: rotateX(45deg); */ 84 | position: relative; 85 | right: 60%; 86 | /* background-color: red; */ 87 | top: 80%; 88 | } 89 | 90 | .ss5 { 91 | animation-name: ssm2; 92 | animation-duration: 10s; 93 | animation-play-state: running; 94 | animation-iteration-count: infinite; 95 | position: relative; 96 | right: 40%; 97 | top: 65%; 98 | } 99 | 100 | @keyframes ssm3 { 101 | 0% { 102 | opacity: 1; 103 | } 104 | 35% { 105 | opacity: 1; 106 | } 107 | 40% { 108 | opacity: 0; 109 | } 110 | 45% { 111 | opacity: 1; 112 | } 113 | 100% { 114 | opacity: 1; 115 | } 116 | } 117 | 118 | .ss3 { 119 | animation-name: ssm3; 120 | animation-duration: 7s; 121 | animation-play-state: running; 122 | animation-iteration-count: infinite; 123 | position: relative; 124 | right: 25%; 125 | top: 30%; 126 | } 127 | 128 | .ss6 { 129 | animation-name: ssm3; 130 | animation-duration: 4s; 131 | animation-play-state: running; 132 | animation-iteration-count: infinite; 133 | position: relative; 134 | right: 15%; 135 | top: 60%; 136 | } 137 | 138 | .moon { 139 | height: 48px; 140 | width: 48px; 141 | position: relative; 142 | right: 2%; 143 | top: 15%; 144 | } -------------------------------------------------------------------------------- /css/tool_common.css: -------------------------------------------------------------------------------- 1 | @charset "utf-8"; 2 | .tool_main { 3 | margin-top: 40px; 4 | margin-bottom: 40px; 5 | margin-left: 6%; 6 | margin-right: 8%; 7 | /* background-color: wheat; */ 8 | } 9 | 10 | .tool_title { 11 | font-size: 32px; 12 | font-weight: 900; 13 | color: rgb(5, 41, 107); 14 | } 15 | 16 | .tool_input_text { 17 | font-size: 18px; 18 | color: rgb(14, 44, 100); 19 | } 20 | 21 | .tool_main input[type="text"], 22 | .tool_main input[type="number"] { 23 | font-size: 20px; 24 | line-height: 20px; 25 | color: rgb(14, 44, 100); 26 | height: 26px; 27 | -webkit-user-select: text; 28 | -moz-user-select: text; 29 | -ms-user-select: text; 30 | user-select: text; 31 | } 32 | 33 | .tool_main input[type="number"] { 34 | width: 80px; 35 | } 36 | 37 | .tool_main input[type="button"] { 38 | font-size: 18px; 39 | line-height: 18px; 40 | color: rgb(14, 44, 100); 41 | transition: all 0.3s; 42 | /* height: 30px; */ 43 | } 44 | 45 | .tool_main input[type="button"]:hover { 46 | transition: all 0.3s; 47 | /* height: 28.5px; */ 48 | /* background-color: rgb(226, 227, 228); */ 49 | /* border: 1px solid transparent; 手写貌似不大美观 */ 50 | /*不手写的话transition没有丝毫作用……*/ 51 | } 52 | 53 | .tool_main input[type="file"] { 54 | margin-top: 8px; 55 | margin-bottom: 8px; 56 | font-size: 18px; 57 | line-height: 18px; 58 | color: rgb(14, 44, 100); 59 | } 60 | 61 | .tool_main select { 62 | font-size: 18px; 63 | line-height: 24px; 64 | height: 28px; 65 | color: rgb(14, 44, 100); 66 | } 67 | 68 | .tool_main option { 69 | /* color: red; */ 70 | color: rgb(14, 44, 100); 71 | /*似乎对option的CSS不起效果*/ 72 | } 73 | 74 | .tool_table_4c { 75 | /* width: 90%; 这样只有半屏好看,全屏不美观 */ 76 | padding: 5px; 77 | font-size: 20px; 78 | color: rgb(14, 44, 100); 79 | border-spacing: 6px; 80 | /* margin: 20px; */ 81 | } 82 | 83 | table.tool_table_4c tr td:nth-child(odd) { 84 | text-align: right; 85 | padding-right: 8px; 86 | /* background-color: #fff; */ 87 | /*注意选择器的格式*/ 88 | } 89 | 90 | table.tool_table_4c tr td:nth-child(3) { 91 | padding-left: 30px; 92 | } 93 | 94 | .tool_table_editable { 95 | padding: 8px; 96 | font-size: 20px; 97 | color: rgb(14, 44, 100); 98 | border-spacing: 6px; 99 | border-collapse: collapse; 100 | border: 2px solid rgb(14, 44, 100); 101 | margin: 6px; 102 | margin-left: 40px; 103 | text-align: center; 104 | vertical-align: middle; 105 | } 106 | 107 | table input[type="button"], 108 | table input[type="file"] { 109 | cursor: pointer; 110 | } 111 | 112 | table select { 113 | cursor: pointer; 114 | } 115 | 116 | .tool_table_editable td, 117 | .tool_table_editable th { 118 | padding: 6px; 119 | /*这样的选择器格式也行*/ 120 | } 121 | 122 | .tool_table_editable a { 123 | text-decoration: none; 124 | } 125 | 126 | .textbutton { 127 | cursor: pointer; 128 | color: navy; 129 | transition: all 0.3s; 130 | } 131 | 132 | .textbutton:hover { 133 | transition: all 0.3s; 134 | color: goldenrod; 135 | } 136 | 137 | .fl { 138 | float: left; 139 | /* background-color: #fff; */ 140 | } 141 | 142 | .tool_edit_item { 143 | background-color: rgb(247, 240, 228); 144 | border: 0; 145 | border-bottom: 1px solid rgb(14, 44, 100); 146 | text-align: center; 147 | } 148 | 149 | .res_board_1 { 150 | position: absolute; 151 | left: 680px; 152 | top: 120px; 153 | width: 600px; 154 | height: 540px; 155 | /* background-color: wheat; */ 156 | } 157 | 158 | .res_board_1[half] { 159 | position: inherit; 160 | left: 50px; 161 | } 162 | 163 | .tool_res_title { 164 | font-size: 20px; 165 | color: navy; 166 | margin: 6px; 167 | padding: 6px; 168 | font-weight: 700; 169 | } 170 | 171 | .tool_res_title input[type="button"], 172 | .tool_res_title select { 173 | margin-left: 20px; 174 | } 175 | 176 | .tool_help { 177 | font-size: 16px; 178 | color: rgb(14, 44, 100); 179 | text-indent: 2em; 180 | width: 580px; 181 | } 182 | 183 | .lit_bold { 184 | font-weight: 700; 185 | /* background-color: #fff; */ 186 | } 187 | 188 | .res_text { 189 | font-size: 20px; 190 | margin-left: 12px; 191 | color: rgb(14, 44, 100); 192 | width: 90%; 193 | resize: none; 194 | /* padding: 6px; */ 195 | } 196 | 197 | .aligncf { 198 | position: relative; 199 | left: -40px; 200 | /*手动特判排版……*/ 201 | /* text-align: center; */ 202 | /* width: 300px; */ 203 | } 204 | 205 | .alignlf { 206 | position: relative; 207 | left: 100px; 208 | } 209 | 210 | .alignlf2 { 211 | position: relative; 212 | left: -20px; 213 | } 214 | 215 | .alignrf { 216 | position: relative; 217 | left: 40px; 218 | } 219 | 220 | #clipboard { 221 | display: none; 222 | /*剪贴板*/ 223 | } 224 | 225 | .hide { 226 | display: none; 227 | } 228 | 229 | .ti2em { 230 | text-indent: 2em; 231 | } 232 | 233 | .ti2em:first-letter { 234 | color: red; 235 | /* 未起作用 */ 236 | } 237 | 238 | .ti2em:first-line { 239 | background-color: #fff; 240 | /* color: blue; */ 241 | /*起作用了*/ 242 | } 243 | 244 | .pad_bottom { 245 | margin-left: 40px; 246 | margin-bottom: 100px; 247 | } 248 | 249 | .ts { 250 | background-color: wheat; 251 | } 252 | 253 | .tool_scroll_frame { 254 | /* height: 485px; */ 255 | /* height: 326px; firefox最佳高度 */ 256 | height: 319px; 257 | /*chorme最佳高度*/ 258 | overflow: auto; 259 | /* overflow: scroll; */ 260 | /* overflow-x: scroll; */ 261 | /* over */ 262 | } 263 | 264 | .tool_scroll_frame_2 { 265 | height: 229px; 266 | overflow: auto; 267 | } 268 | 269 | .narrow_input { 270 | width: 180px; 271 | } 272 | 273 | .extra_height_1 { 274 | /* height: 700px; */ 275 | height: 700px; 276 | /*防止半屏时出显示bugs*/ 277 | } 278 | 279 | .extra_height_2 { 280 | /* height: 700px; */ 281 | height: 500px; 282 | /*防止半屏时出显示bugs*/ 283 | } 284 | 285 | .cp { 286 | cursor: pointer; 287 | } 288 | 289 | .regex_frame_width { 290 | width: 600px; 291 | position: relative; 292 | left: -30px; 293 | } 294 | 295 | .regex_table_width { 296 | width: 540px; 297 | } 298 | 299 | .help_lim_width { 300 | width: 600px; 301 | } 302 | 303 | .tool_title input[type="button"] { 304 | margin-left: 30px; 305 | } 306 | 307 | .extra_mb_1 { 308 | margin-bottom: 20px; 309 | } 310 | 311 | .p2, 312 | textarea { 313 | padding: 2px; 314 | /*不然的话在chorme下根本行首看不到光标……*/ 315 | } -------------------------------------------------------------------------------- /css/tools.css: -------------------------------------------------------------------------------- 1 | @charset "utf-8"; 2 | .tool_frame { 3 | /* background-color: wheat; */ 4 | margin-top: 40px; 5 | margin-bottom: 40px; 6 | margin-left: 6%; 7 | margin-right: 8%; 8 | height: 680px; 9 | } 10 | 11 | .tool_board { 12 | background-color: rgb(251, 251, 219); 13 | margin-top: 30px; 14 | display: none; 15 | transition: all 0.3s; 16 | border: 1px solid rgb(15, 13, 29); 17 | border-radius: 25px; 18 | cursor: pointer; 19 | } 20 | 21 | .tool_board:hover { 22 | transition: all 0.3s; 23 | background-color: rgb(253, 253, 193); 24 | } 25 | 26 | .tool_name { 27 | font-weight: 700; 28 | font-size: 22px; 29 | color: navy; 30 | padding-left: 35px; 31 | padding-bottom: 8px; 32 | padding-top: 10px; 33 | } 34 | 35 | .tool_hr { 36 | position: relative; 37 | left: 35px; 38 | width: 90%; 39 | } 40 | 41 | .tool_abbr { 42 | text-indent: 2em; 43 | font-size: 18px; 44 | padding-top: 12px; 45 | padding-bottom: 12px; 46 | padding-left: 24px; 47 | padding-right: 5%; 48 | color: rgb(14, 44, 100); 49 | } -------------------------------------------------------------------------------- /footer.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 底部框架页面(用于框架) 9 | 10 | 11 | 12 | 13 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /images/banner1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lr580/web_homework/af8c49d15dbdd7fbfb10f418d36aaa2af776192c/images/banner1.png -------------------------------------------------------------------------------- /images/banner2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lr580/web_homework/af8c49d15dbdd7fbfb10f418d36aaa2af776192c/images/banner2.png -------------------------------------------------------------------------------- /images/banner3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lr580/web_homework/af8c49d15dbdd7fbfb10f418d36aaa2af776192c/images/banner3.png -------------------------------------------------------------------------------- /images/moon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lr580/web_homework/af8c49d15dbdd7fbfb10f418d36aaa2af776192c/images/moon.png -------------------------------------------------------------------------------- /images/post0_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lr580/web_homework/af8c49d15dbdd7fbfb10f418d36aaa2af776192c/images/post0_0.png -------------------------------------------------------------------------------- /images/post0_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lr580/web_homework/af8c49d15dbdd7fbfb10f418d36aaa2af776192c/images/post0_1.png -------------------------------------------------------------------------------- /images/post1_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lr580/web_homework/af8c49d15dbdd7fbfb10f418d36aaa2af776192c/images/post1_0.png -------------------------------------------------------------------------------- /images/star.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lr580/web_homework/af8c49d15dbdd7fbfb10f418d36aaa2af776192c/images/star.png -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 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 | 36 |
37 |
38 |
39 |
这是一个什么网站?
40 |
这是一个提供编程学习相关文章分享和编程实用工具在线使用的网站。
41 |
本网站提供了若干精选的个人编程学习相关的心得体会和相关学习笔记、学习资源的分享,范围囊括算法与数据结构、C/C++、Python等编程语言、git等开发工具、精选电子书、电子课程资源分享等丰富的文章帖子,均为个人在学习过程中记录下来的实践体会。
42 |
此外,这里还提供了一些较为实用的编程在线小工具,包括多功能计算器、文本处理器、随机抽取器和乱数假文生成器。这些工具在进行编程时也许可以提供非常便利的作用。
43 |
44 |
文章推荐:
45 | 50 |
51 |
52 |
工具推荐:
53 | 58 |
59 |
60 |
61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /js/footer.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var banner_width = 1000 + 'px'; 3 | $(() => { 4 | footer_obj = $('#footer_frame'); 5 | set_footer_position(); 6 | $(window).scroll(set_footer_position).resize(set_footer_position); 7 | }) 8 | 9 | var footer_height = 0, 10 | footer_top = 0, 11 | footer_obj; 12 | 13 | function set_footer_position() { 14 | footer_height = footer_obj.height(); 15 | footer_top = ($(window).scrollTop() + $(window).height() - footer_height) + 'px'; 16 | if (($(document.body)).height() < $(window).height()) { 17 | footer_obj.css({ position: 'absolute' }).stop().animate({ top: footer_top }); 18 | } else { 19 | footer_obj.css({ position: 'static' }); 20 | } 21 | } -------------------------------------------------------------------------------- /js/index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var banner_width = 1000; 3 | const normal_speed = 500; 4 | const slow_speed = 800; 5 | const banner_button_dif = 45; 6 | // const banner_button_dif = -100; 7 | const banner_button_edif = 35; 8 | const banner_cycle = 5000; 9 | var slide_event; 10 | var now_slide_id = 1; 11 | var slide_moving = false; //移动中禁点 12 | $(() => { 13 | // let thread = new Worker('js/inner_server.js'); 14 | // thread.postMessage({ type: 1, info: location.href }); //更新导航栏 15 | 16 | // let x = document.getElementById('index'); 17 | // console.log(x); //getElementsByTagName('iframe')[0] 18 | // let x = document.getElementById('ifr') 19 | // let y = x.contentWindow.document 20 | // console.dir(y); 21 | // setTimeout(() => { 22 | // $('#mains').addClass('mains') 23 | // }, 1000); 24 | 25 | //播放动画 26 | $('img').prop('draggable', false); /*firefox即便禁止了也可以拖动 */ 27 | // $('img').draggable({ disabled: true }); 28 | $('#what_is_it').fadeIn(normal_speed); 29 | // $('.what_is_it_qa').css({ display: 'none' }); 30 | $('.content1').fadeIn(normal_speed); 31 | $('.title2').fadeIn(normal_speed); 32 | $('.title0').fadeIn(normal_speed); 33 | $(window).scroll(set_banner_width).resize(set_banner_width); 34 | 35 | $('#b_img1').slideDown(slow_speed); 36 | slide_event = setInterval(next_banner, banner_cycle); 37 | // $('img').bind('click', function() { 38 | // console.log($(this).attr('id')); 39 | // }) 40 | set_banner_width(); 41 | }); 42 | 43 | function set_banner_width() { 44 | banner_width = $('#banner').width(); //+ 'px' 45 | // $('.slide').css({ width: banner_width }); 46 | reposition_banner_button(); 47 | } 48 | 49 | function i_to_banner_obj(i) { 50 | return $('#b_img' + i); 51 | } 52 | 53 | function i_to_banbut_obj(i) { 54 | return $('#b_but' + i); 55 | } 56 | 57 | function switch_banner(from, to) { 58 | slide_moving = true; 59 | let obj_from = i_to_banner_obj(from); 60 | let obj_to = i_to_banner_obj(to); 61 | obj_from.slideUp(slow_speed); 62 | obj_to.slideDown(slow_speed); 63 | let obj_but_from = i_to_banbut_obj(from); 64 | let obj_but_to = i_to_banbut_obj(to); 65 | obj_but_from.removeClass('slide_button_now'); 66 | obj_but_to.addClass('slide_button_now'); 67 | // setTimeout(() => { 68 | // for (let i = 1; i <= 3; ++i) { 69 | // console.log(i, i_to_banner_obj(i).css('display'), from, to); 70 | // } 71 | // }, 1000); 修复了一个愚蠢的bugs 72 | setTimeout(() => { 73 | slide_moving = false; 74 | }, slow_speed); 75 | } 76 | 77 | function reposition_banner_button() { 78 | for (let i = 1; i <= 3; ++i) { 79 | let obj = i_to_banbut_obj(i); 80 | obj.css({ left: banner_button_dif + i * banner_button_edif + 'px' }) 81 | // obj.css({ left: banner_width + banner_button_dif + i * banner_button_edif + 'px' }) 82 | } 83 | } 84 | 85 | function next_banner() { 86 | let next_slide_id = (now_slide_id) % 3 + 1; 87 | switch_banner(now_slide_id, next_slide_id); 88 | now_slide_id = next_slide_id; 89 | } 90 | 91 | function to_banner(to) { 92 | if (slide_moving || to == now_slide_id) { 93 | return; 94 | } 95 | switch_banner(now_slide_id, to); 96 | now_slide_id = to; 97 | clearInterval(slide_event); /*重新计时 */ 98 | slide_event = setInterval(next_banner, banner_cycle); 99 | } -------------------------------------------------------------------------------- /js/nav.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | //nav.js 承载导航栏和(标题更新)的功能 3 | var xmlhttp; 4 | const ajax_on = false; //手动调整是否使用ajax,手动解决ajax跨域问题 5 | $(() => { 6 | // $(window).resize(size_change); 7 | // size_change(); 8 | // console.log(location.href); 9 | 10 | // build_href('index'); 11 | // build_href('posts'); 12 | 13 | //读取nav.html并将body内容增加到其他html内 14 | //已经尝试过了frame, iframe, worker多线程等方法,能力有限,均未能框架间或跨页面的信息交互,所以采用这样的方法实现导航栏模板 15 | 16 | //ajax如果是用vscode的live插件则没有问题,否则会出现跨域问题,暂无非手动修改浏览器外的解决办法…… 17 | 18 | if (ajax_on) { 19 | try { 20 | if (window.XMLHttpRequest) { 21 | xmlhttp = new XMLHttpRequest(); 22 | } else { 23 | xmlhttp = new ActiveXObject('Microsoft.XMLHTTP'); 24 | } 25 | xmlhttp.onreadystatechange = load_nav_html; 26 | xmlhttp.open('GET', 'nav.html', true); 27 | xmlhttp.send(); //.catch(error => console.log(error)); 28 | } catch (err) { 29 | console.log('err from ajax make', err); 30 | get_nav_html(htmlcode_without_ajax); 31 | } 32 | } else { 33 | get_nav_html(htmlcode_without_ajax); 34 | // console.log('waiting for updating'); 35 | } 36 | 37 | //无论是普通AJAX还是jQuery的ajax都暂时个人无法解决跨域问题的报错捕获 38 | // try { 39 | // $.ajax({ 40 | // type: 'get', 41 | // url: 'nav.html', 42 | // async: true, 43 | // success: (rel) => { 44 | // console.log(rel); 45 | // get_nav_html(rel); 46 | // }, 47 | // error: (err) => { 48 | // console.log(err); 49 | // } 50 | // }) 51 | // } catch (err) { 52 | // console.log('err from ajax make', err); 53 | // } 54 | 55 | if (1 || location.href.indexOf('posts') == -1 && location.href.indexOf('post') != -1) { 56 | // console.log('ac'); 57 | $(window).scroll(set_goto_top).resize(set_goto_top); 58 | set_goto_top(); 59 | } 60 | 61 | }); 62 | 63 | var goto_top_displaying = false; 64 | var goto_top_transisitioning = false; 65 | 66 | function set_goto_top() { 67 | if (goto_top_transisitioning) { 68 | return; 69 | } 70 | let scroll_top = document.documentElement.scrollTop || document.body.scrollTop; 71 | let window_height = document.documentElement.clientHeight; 72 | // console.log(scroll_top, window_height); 73 | if (scroll_top > window_height && !goto_top_displaying) { 74 | goto_top_displaying = true; 75 | goto_top_transisitioning = true; 76 | $('.nav_to_top').fadeIn(300); 77 | setTimeout(() => { 78 | goto_top_transisitioning = false; 79 | }, 300); 80 | } 81 | if (scroll_top <= window_height && goto_top_displaying) { 82 | // console.log(scroll_top, window_height); 83 | goto_top_displaying = false; 84 | $('.nav_to_top').fadeOut(300); 85 | //因为紧接着又写了一个fadeIn(ctrl+v忘记删掉)而导致过bugs,已修复 86 | goto_top_transisitioning = true; 87 | setTimeout(() => { 88 | goto_top_transisitioning = false; 89 | }, 300); 90 | } 91 | } 92 | 93 | function load_nav_html() { 94 | try { 95 | if (xmlhttp.readyState == 4) { 96 | if (xmlhttp.status == 200) { 97 | let htmlcode = xmlhttp.responseText; 98 | // console.log(JSON.stringify(htmlcode)); 99 | get_nav_html(htmlcode); 100 | } 101 | // } else { 102 | // console.log('err', xmlhttp.statusText); 103 | // } 104 | } 105 | } catch (err) { 106 | console.log('err from onreadystatechange', err) 107 | } 108 | } 109 | 110 | function get_nav_html(htmlcode) { 111 | let regexp = /]*>([\s\S]+?)<\/body>/i; 112 | let body_innerHTML = htmlcode.match(regexp)[1]; 113 | $('#ifr')[0].innerHTML = body_innerHTML; 114 | build_href('index'); 115 | build_href('posts'); 116 | build_href('tools'); 117 | build_href('about'); 118 | } 119 | 120 | // var href_info; 121 | // onmessage = (e) => { 122 | // console.log(e.data); 123 | // href_info = e.data; 124 | // // let objs = document.getElementsByClassName('nav_bar'); 125 | 126 | // }; 127 | 128 | function build_href(htm) { 129 | let obj = $('#' + htm); 130 | let new_href = location.href; 131 | let fix_pos = Math.max(0, new_href.lastIndexOf('/')); 132 | let now_htm_name = new_href.substr(fix_pos + 1).split('.')[0]; 133 | // console.log(htm, now_htm_name); 134 | if (now_htm_name == htm || htm == 'posts' && -1 != now_htm_name.indexOf('post') || htm == 'tools' && -1 != now_htm_name.indexOf('tool')) { 135 | obj.attr('now', htm); 136 | } 137 | // let obj = document.getElementBdyId(htm); 138 | obj[0].onclick = () => { 139 | $('.nav_bar').removeAttr('now'); 140 | obj.attr('now', htm); 141 | 142 | new_href = new_href.substr(0, fix_pos) + '/' + htm + '.html'; 143 | if (new_href == location) { 144 | return; 145 | } 146 | location.href = new_href; 147 | // console.log(location.href); 148 | }; 149 | //obj.unbind('click'); 150 | // obj.bind('click', () => { 151 | // $('.nav_bar').removeAttr('now'); 152 | // obj.attr('now', htm); 153 | // let new_href = location.href; 154 | // let fix_pos = Math.max(0, new_href.lastIndexOf('/')); 155 | // new_href = new_href.substr(0, fix_pos) + '/' + htm + '.html'; 156 | // location.href = new_href; 157 | // }); 158 | } 159 | 160 | // function size_change() { 161 | // let w = parseFloat($('#nav_cf').css('width')) * 0.18; 162 | // $('#selei').css('width', w); 163 | // } 164 | 165 | //nav.html 纯文本常量,用于解决因出现ajax跨域问题而无法send的补救方法 166 | const htmlcode_without_ajax = "\r\n\r\n\r\n\r\n \r\n \r\n \r\n 导航栏页面(用于框架)\r\n \r\n \r\n \r\n\r\n\r\n\r\n
\r\n
\r\n \r\n \r\n\r\n
\r\n
首页
\r\n
\r\n
帖子
\r\n
\r\n
工具
\r\n
\r\n
关于
\r\n
\r\n
\r\n 欢迎您,访客!\r\n
\r\n \r\n
\r\n
\r\n\n\r\n\r\n"; -------------------------------------------------------------------------------- /js/post_common.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | $(() => { 3 | get_pid(); 4 | build_common(); 5 | // code_txt_to_js_string('ts.py'); 6 | render_all_code(); 7 | set_footer_position(); 8 | }); 9 | 10 | // import { posts_abbr } from "./post_info.js"; 11 | 12 | var pid = -1; 13 | // var post_info; 14 | 15 | function get_pid() { 16 | pid = parseInt(location.href.match(/post(\d*)/i)[1]); 17 | } 18 | 19 | //辅助函数:文本转string 20 | async function code_txt_to_js_string(url) { 21 | function f() { 22 | return new Promise((resolve) => { 23 | $.ajax({ 24 | type: 'get', 25 | url: 'resources/' + url, 26 | async: true, 27 | success: (rel) => { 28 | resolve(rel); 29 | }, 30 | }) 31 | }) 32 | } 33 | var res = await f(); 34 | console.log(JSON.stringify(res)); 35 | return res; 36 | } 37 | 38 | //渲染所有id为code_$的代码片段 39 | function render_all_code() { 40 | let objs = $('.post_code'); 41 | for (let i = 0; i < objs.length; ++i) { 42 | let cid = parseInt(objs[i].id.match(/code_(\d*)/i)[1]); 43 | render_code(cid); 44 | } 45 | } 46 | 47 | //根据code的id渲染代码(不含高亮) 48 | function render_code(cid) { 49 | let obj = $('#code_' + cid); 50 | let codetext = posts_code[cid].split('\r\n'); 51 | // console.log(codetext); 52 | for (let i = 0; i < codetext.length; ++i) { 53 | let dealt_text = codetext[i]; //.replaceAll(' ', ' '); 54 | // dealt_text.replaceAll('\t', '    '); 55 | // console.log(dealt_text[0]); 56 | dealt_text = dealt_text.replaceAll('&', '&'); //&必须首先处理 57 | dealt_text = dealt_text.replaceAll('>', '>'); 58 | dealt_text = dealt_text.replaceAll('<', '<'); 59 | dealt_text = dealt_text.replaceAll('"', '"'); 60 | let newline = $('
  • '); 61 | newline.html(dealt_text); 62 | obj.append(newline); 63 | } 64 | } 65 | 66 | //从帖子列表里随机抽取一个除arr外的帖子,抽到的帖子加入arr 67 | function select_except(arr) { 68 | if (arr.length >= posts_abbr.length) { 69 | throw "已经没有更多帖子了!"; //当下版本不会触发该throw 70 | } 71 | while (true) { 72 | var rid = Math.floor(Math.random() * posts_abbr.length); 73 | if (-1 == arr.indexOf(rid)) { 74 | break; 75 | } 76 | } 77 | arr.push(rid); 78 | return rid; 79 | } 80 | 81 | function locationorigin() { 82 | return location.href.substr(0, Math.max(0, location.href.lastIndexOf('/'))); 83 | } 84 | 85 | //建立帖子的头部和尾部内容 86 | //因为对于丰富格式的html帖子正文文本存json操作不便,所以还是打算直接放在html里 87 | function build_common() { 88 | const now_post_info = posts_abbr[pid]; 89 | document.title = now_post_info.title + ' - 星月编程学习小站'; 90 | var obj_frame = $('.post_frame'); 91 | 92 | var obj_frame_info = $('
    '); 93 | obj_frame.prepend(obj_frame_info); 94 | 95 | var obj_tag = $('
    '); 96 | obj_tag.html('标签:' + now_post_info.tag); 97 | obj_frame_info.append(obj_tag); 98 | 99 | var obj_time = $('
    '); 100 | obj_time.html(now_post_info.date); 101 | obj_frame_info.append(obj_time); 102 | 103 | var obj_title = $('
    '); 104 | obj_title.html(now_post_info.title); 105 | obj_frame.prepend(obj_title); 106 | 107 | var obj_frame_href = $('
    '); 108 | obj_frame.prepend(obj_frame_href); 109 | 110 | var obj_href1 = $('帖子'); 111 | obj_href1.attr('href', locationorigin() + '/posts.html'); 112 | obj_frame_href.append(obj_href1); 113 | 114 | const conn_htmlcode = '
    >>
    '; 115 | var obj_hconn1 = $(conn_htmlcode); 116 | obj_frame_href.append(obj_hconn1); 117 | 118 | var obj_href2 = $(''); 119 | obj_href2.attr('href', locationorigin() + '/posts.html?type=' + now_post_info.type); 120 | obj_href2.html(sc_type[now_post_info.type]); 121 | obj_frame_href.append(obj_href2); 122 | 123 | var obj_frame_links = $('
    '); 124 | obj_frame.append(obj_frame_links); 125 | 126 | var obj_link_prev = $(''); 127 | if (pid > 0) { 128 | obj_link_prev.html('上一篇:' + posts_abbr[pid - 1].title); 129 | obj_link_prev.attr('href', locationorigin() + '/post' + (pid - 1) + '.html'); 130 | } else { 131 | obj_link_prev.html('已经是第一篇文章了'); 132 | } 133 | obj_frame_links.append(obj_link_prev); 134 | 135 | var obj_link_next = $(''); 136 | if (pid + 1 < posts_abbr.length) { 137 | obj_link_next.html('下一篇:' + posts_abbr[pid + 1].title); 138 | obj_link_next.attr('href', locationorigin() + '/post' + (pid + 1) + '.html'); 139 | } else { 140 | obj_link_next.html('已经是最后一篇文章了'); 141 | } 142 | obj_frame_links.append(obj_link_next); 143 | 144 | var obj_hr = $('
    '); 145 | obj_frame.append(obj_hr); 146 | 147 | var obj_recommend_head = $('
    '); 148 | obj_recommend_head.html('更多推荐文章:'); 149 | obj_frame.append(obj_recommend_head); 150 | 151 | const recommend_nums = 3; 152 | let already_posts = [pid - 1, pid, pid + 1]; 153 | for (let i = 0; i < 3; ++i) { 154 | let rid = select_except(already_posts); 155 | var obj_recommend_post = $(''); 156 | var obj_temp_div = $('
    '); 157 | obj_recommend_post.html(posts_abbr[rid].title); 158 | obj_recommend_post.attr('href', locationorigin() + '/post' + rid + '.html'); 159 | obj_temp_div.append(obj_recommend_post); 160 | obj_frame.append(obj_temp_div); 161 | } 162 | } -------------------------------------------------------------------------------- /js/post_info.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | //存储帖子部分信息(概述信息和代码)和其他常量的js 3 | const sc_type = { 4 | sc_all: '', 5 | sc_alg: '算法', 6 | sc_lan: '编程语言', 7 | sc_dev: '开发工具', 8 | sc_res: '资源分享', 9 | sc_oth: '杂项', 10 | }; 11 | 12 | const posts_abbr = [{ 13 | title: '拓展欧拉定理:从快速幂到疾速幂', 14 | abbr: '对于a的b次幂关于素数p取模下的结果,如果使用一般的快速幂需要log(b)对数复杂度求解,然而,根据数论里的拓展欧拉原理,可以把复杂度降至b%φ(p)+φ(p)的对数,这对于b特别大时是特别有优化意义的……', 15 | date: '2021/06/15 22:18', 16 | tag: '数论,快速幂,欧拉定理', 17 | type: 'sc_alg', 18 | id: 0, 19 | }, 20 | { 21 | title: 'C语言输入流浅析', 22 | abbr: '针对大多数C语言初学者对C语言输入的原理了解不深,本帖子以C语言的scanf,getchar和gets三个函数为例,具体分析了C语言标准输入流的工作机制……', 23 | date: '2021/06/16 21:29', 24 | tag: 'C/C++,输入流', 25 | type: 'sc_lan', 26 | id: 1, 27 | }, 28 | { 29 | title: 'Python高阶函数浅析', 30 | abbr: '同其他高级程序语言一样,Python也可以使用函数作为函数参数,这样的函数称为高阶函数。高阶函数在实践中非常有用,用得好的话,可以很好地优化代码结构、降低代码量,让代码更易于维护。本篇帖子将简要介绍Python高阶函数及常用的标准高阶函数……', 31 | date: '2021/06/18 19:04', 32 | tag: 'Python,函数', 33 | type: 'sc_lan', 34 | id: 2, 35 | }, 36 | { 37 | title: 'git指令小结', 38 | abbr: 'git是十分强大的版本管理工具,其指令较为庞多,容易混淆和错乱。因此,本帖给出了常用指令的分类汇总,可以在遗忘指令时快速查阅本帖,以找到自己想要使用的相应git指令……', 39 | date: '2021/06/18 20:53', 40 | tag: 'git', 41 | type: 'sc_dev', 42 | id: 3, 43 | }, 44 | { 45 | title: '线段树、树状数组和块状数组小结', 46 | abbr: '对于需要以较优的时间空间复杂度快速修改或查询一个区间内的每个信息时,较为常用的选择是使用线段树、树状数组和块状数组。它们各有各的优缺点,使用场景也有所差异。这篇帖子简单总结一下这三者的简单异同……', 47 | date: '2021/06/18 21:41', 48 | tag: '数据结构,线段树/树状数组,分块', 49 | type: 'sc_alg', 50 | id: 4, 51 | }, 52 | { 53 | title: '记解决Ubuntu系统上的小问题几则', 54 | abbr: '这是一篇Linux使用相关的记录,主要是笔者在使用Ubuntu 20.10时遇到的若干小问题以及笔者自己找到的解决方案的记录……', 55 | date: '2021/06/18 22:40', 56 | tag: 'Linux,Ubuntu,使用', 57 | type: 'sc_dev', 58 | id: 5, 59 | }, 60 | { 61 | title: '编程相关实用网站小推荐', 62 | abbr: '这是个人经常使用的一些与编程和计算机科学技术相关的干货网站的小汇总推荐……', 63 | date: '2021/06/18 23:59', 64 | tag: '网站分享', 65 | type: 'sc_res', 66 | id: 6, 67 | }, 68 | ]; 69 | 70 | const posts_code = [ 71 | "int qpower(int a, int b)\r\n{\r\n int r = 1;\r\n while (b)\r\n {\r\n if (b & 1)\r\n r *= a;\r\n b >>= 1;\r\n a *= a;\r\n }\r\n return r;\r\n}", //0 72 | 73 | "ll t = phi = m; //typedef ll int/long long\r\nfor (ll i = 2; i * i <= m; ++i)\r\n if (t % i == 0)\r\n {\r\n phi = phi - phi / i;\r\n while (t % i == 0)\r\n t /= i;\r\n }\r\nif (t > 1)\r\n phi = phi - phi / t; //phi为所求", //1 74 | 75 | "#include \r\nusing namespace std;\r\ntypedef int ll;\r\nll a, b, m, t, phi, ans = 1;\r\nchar c;\r\nbool flag;\r\nsigned main()\r\n{\r\n scanf(\"%d%d\", &a, &m);\r\n t = phi = m;\r\n //欧拉函数模板\r\n for (ll i = 2; i * i <= m; ++i)\r\n if (t % i == 0)\r\n {\r\n phi = phi - phi / i;\r\n while (t % i == 0)\r\n t /= i;\r\n }\r\n if (t > 1)\r\n phi = phi - phi / t;\r\n //快读模板,读入高精度整数并实时取模,取模满足分配律\r\n while (!isdigit(c = getchar()));\r\n for (; isdigit(c); c = getchar()) \r\n {\r\n b = (b << 1) + (b << 3) + (c ^ '0');\r\n if (b >= phi)\r\n flag = true, b %= phi;\r\n }\r\n if (flag)\r\n b += phi;//取模负数特判\r\n //快速幂模板\r\n for (ans = 1; b; b >>= 1, a = 1LL * a * a % m)\r\n if (b & 1)\r\n ans = 1LL * ans * a % m;\r\n printf(\"%d\", ans);\r\n return 0;\r\n}", //2 76 | 77 | "#include \r\nint main()\r\n{\r\n char x[1024], y[1024];\r\n scanf(\"%s%s\", x, y);\r\n printf(\"[%s][%s]\", x, y);\r\n return 0;\r\n}", //3 78 | 79 | "int scanf(参数)\r\n{\r\n 获取输入流开始;\r\n while (1)\r\n {\r\n if (输入流队空)\r\n 激活输入流;\r\n 取输入流队首进行对应操作,输入流队首离队;\r\n if (对应操作完毕)\r\n break;\r\n }\r\n 获取输入流结束;\r\n return 相应值;\r\n}", //4 80 | 81 | "int scanf(char x[], char *y) //x是\"%c\",y是一个char变量的&形式\r\n{\r\n 获取输入流开始;\r\n if (输入流队空)\r\n 激活输入流;\r\n 取输入流队首赋值给y,输入流队首离队;\r\n 获取输入流结束;\r\n return 相应值;\r\n}", //5 82 | 83 | "int scanf(char x[], int *y) //x是\"%c\",y是一个int变量的&形式\r\n{\r\n 获取输入流开始;\r\n while (1)\r\n {\r\n if (输入流队空)\r\n 激活输入流;\r\n 取输入流队首h;\r\n if (正在预处理)\r\n {\r\n if (isspace(h))\r\n h离队, 且continue;\r\n else if (isdight(h))\r\n 预处理结束;\r\n else\r\n break;\r\n }\r\n if ((h == '+' || h == '-'))\r\n {\r\n if (从获取输入流开始未曾读取过 + 或 -)\r\n h离队,确定正负号,且continue;\r\n else\r\n break;\r\n }\r\n if (isdigit(h))\r\n h离队,存储值;\r\n else\r\n break;\r\n }\r\n\r\n 获取输入流结束;\r\n return 相应值;\r\n}", //6 84 | 85 | "int scanf(char x[], double *y)\r\n{\r\n 获取输入流开始;\r\n while (1)\r\n {\r\n if (输入流队空)\r\n 激活输入流;\r\n 取输入流队首h;\r\n\r\n //底数部分\r\n 进行与scanf(\"%d\") 一样的预处理和正负号处理;\r\n if (h == '.')\r\n {\r\n if (获取输入流开始未曾出现过 '.')\r\n h离队,确定小数点,且continue;\r\n else\r\n break;\r\n }\r\n if (isdigit(h))\r\n h离队,存储值;\r\n\r\n //指数部分\r\n else if ((h == 'e' || h == 'E') && 未曾出现过 'e', 'E')\r\n {\r\n int k;\r\n scanf(\"%d\", &k); //这部分与scanf读一个整数一样\r\n k的内容作为指数,对底数求幂;\r\n }\r\n else\r\n break;\r\n }\r\n\r\n 获取输入流结束;\r\n return 相应值;\r\n}", //7 86 | 87 | "int scanf(char x[], char *y)\r\n{\r\n 获取输入流开始;\r\n while (1)\r\n {\r\n if (输入流队空)\r\n 激活输入流;\r\n 取输入流队首h;\r\n if (isspace(h))\r\n {\r\n if (正在预处理)\r\n h离队且continue;\r\n else\r\n break;\r\n }\r\n else\r\n 预处理结束,h离队,赋值;\r\n }\r\n 获取输入流结束;\r\n return 相应值;\r\n}", //8 88 | 89 | "int scanf(char x)\r\n{\r\n 获取输入流开始;\r\n if (输入流队空)\r\n 激活输入流;\r\n 取输入流队首h;\r\n if(h==x)\r\n h出队;\r\n 获取输入流结束;\r\n return 相应值;\r\n}", //9 90 | 91 | "int scanf(若干参数)\r\n{\r\n 获取输入流开始;\r\n while (还有下一个参数)\r\n {\r\n scanf(当前参数);\r\n if (当前参数结束了获取输入流)\r\n break;\r\n 当前参数 = 下一个参数;\r\n }\r\n 获取输入流结束;\r\n return 相应值;\r\n}", //10 92 | 93 | "#include \r\nint main()\r\n{\r\n int i1 = 0, i2 = 0, i3 = 0, i4 = 0;\r\n double f1 = 0.0, f2 = 0.0, f3 = 0.0;\r\n char c1 = '_', c2 = '_', c3 = '_', c4 = '_', c5 = '_';\r\n char s[20];\r\n scanf(\"%d\", &i1);\r\n scanf(\"%c\", &c1);\r\n scanf(\"%lf\", &f1);\r\n scanf(\"%lf\", &f2);\r\n scanf(\"%lf\", &f3);\r\n scanf(\"g\");\r\n scanf(\"%c\", &c2);\r\n scanf(\"%s\", s);\r\n scanf(\"%d%c\", &i3, &c3);\r\n scanf(\"%d%c\", &i4, &c4);\r\n scanf(\"%c\", &c5);\r\n printf(\"i1:%d\\nc1:%c\\nf1:%lf\\nf2:%lf\\n\\n\", i1, c1, f1, f2);\r\n printf(\"f3:%lf\\nc2:%c\\ns:%s\\n\\n\", f3, c2, s);\r\n printf(\"i3:%d\\nc3:%c\\ni4:%d\\nc4:%c\\nc5:%c\", i3, c3, i4, c4, c5);\r\n return 0;\r\n}\r\n", //11 94 | 95 | "+-5.3e-1.2\r\n\r\n\r\n 5.gc lr580 53c d56 e", //12 96 | 97 | "i1:0\r\nc1:-\r\nf1:0.530000\r\nf2:0.200000\r\n\r\nf3:5.000000\r\nc2:c\r\ns:lr580\r\n\r\ni3:53\r\nc3:c\r\ni4:0\r\nc4:_\r\nc5:d", //13 98 | 99 | "char getchar()\r\n{\r\n char x;\r\n scanf(\"%c\",&x);\r\n return x;\r\n}", //14 100 | 101 | "void gets(char x[])\r\n{\r\n char c;\r\n int len = 0;\r\n for (; '\\n' != (c = getchar()); len++)\r\n x[len] = c;\r\n x[len] = '\\0';\r\n}", //15 102 | 103 | "print(max(-7,2,4,key=abs)) #输出-7", //16 104 | 105 | "def g1(x):\r\n return x*x\r\ndef g2(x):\r\n return x+10\r\ndef f(x,h):\r\n return h(2*x)+h(x+1)\r\nprint(f(1,g1)) #g1(2)+g1(2)=4+4=8\r\nprint(f(1,g2)) #g2(2)+g2(2)=12+12=24\r\nprint(f(5,g1)) #g1(10)+g1(6)=100+36=136\r\nprint(f(5,g2)) #g2(10)+g2(6)=20+16=36", //17 106 | 107 | "def f(x):\r\n return x*x\r\ndef g(x):\r\n return x.upper()*2\r\nprint(list(map(f,[1,-2,2.5])))\r\n#[1, 4, 6.25]\r\nprint(set(map(g,{'hi','yE5'})))\r\n#{'YE5YE5', 'HIHI'}\r\nprint(list(map(g,'world'))) #不可以用str强转\r\n#['WW', 'OO', 'RR', 'LL', 'DD']", //18 108 | 109 | "lambda 参数列表:返回值", //19 110 | 111 | "def f(参数列表):\r\n return 返回值\r\nf", //20 112 | 113 | "print(list(map(lambda x:x*x,[1,-2,2.5])))\r\nprint(set(map(lambda x:x.upper()*2,{'hi','yE5'})))\r\nprint(list(map(lambda x:x.upper()*2,'world')))", //21 114 | 115 | "k='a'\r\ndef prt(x,h):\r\n print(x+h())\r\nprt('123',lambda :k*5) #123aaaaa\r\n\r\ndef my_add(a,b,f):\r\n return f(a,b)+f(b,a)\r\nprint(my_add(-2,3,lambda x,y:x*x+y/x))\r\n#f(-2,3)+f(3,-2)=(4-0.67)+(9-1.5)=10.83", //22 116 | 117 | "from functools import reduce\r\n#map例子里面的第三个例子,现在将其转化为str\r\n#然后使用字符串重载运算符+两两连接\r\nx=list(map(lambda x:x.upper()*2,'world'))\r\n#x=['WW', 'OO', 'RR', 'LL', 'DD']\r\nprint(reduce(lambda x,y:x+y,x)) #现在是str了\r\n\r\nbase=2 #二进制\r\nb=[1,1,0,1] #0b1101\r\nprint(reduce(lambda x,y:x*base+y,b)) \r\n#将01 base进制数组转化为十进制", //23 118 | 119 | "print(list(filter(lambda x:x%2,[1,2,4,0,-5])))\r\n#保留奇数 [1, -5]\r\na=[1,36,35,7,1024,1025]\r\nprint(list(filter(lambda x:abs(x**0.5-int(x**0.5))<1e-5,a)))\r\n#保留平方数 [1, 36, 1024]", //24 120 | 121 | "print(sorted('hello'))\r\n#['e', 'h', 'l', 'l', 'o']\r\nprint(sorted({3,2e2,-1,0,0.5},reverse=True))\r\n#[200.0, 3, 0.5, 0, -1]\r\nprint(sorted((-3,4,-2,1),key=abs))\r\n#[1, -2, -3, 4]\r\nw={1:-2, 5:-4, 6:-3, 100:-9, -3:-10}\r\nprint(sorted(w,key=lambda x:abs(x-5),reverse=True))\r\n#[100, -3, 1, 6, 5] 取keys按照离5的远近排序返回keys", //25 122 | 123 | "#include \r\nusing namespace std;\r\ntypedef long long ll;\r\n#define mn 100002\r\n#define mkcf ll cf=lf+rf>>1\r\nll m,n,a[mn],d[mn<<2],b[mn<<2],lc,rc,cmd,k;//b是懒标签\r\nvoid build(ll lf, ll rf, ll rot)\r\n{\r\n if(lf==rf)\r\n {\r\n d[rot]=a[lf];\r\n return;\r\n }\r\n mkcf;\r\n build(lf,cf,rot<<1);\r\n build(cf+1,rf,rot<<1|1);\r\n d[rot]=d[rot<<1]+d[rot<<1|1];\r\n}\r\ninline void push_down(ll& lf, ll& cf, ll& rf, ll& rot)\r\n{\r\n d[rot<<1]+=b[rot]*(cf-lf+1);\r\n d[rot<<1|1]+=b[rot]*(rf-cf);\r\n b[rot<<1]+=b[rot],b[rot<<1|1]+=b[rot],b[rot]=0;\r\n}\r\nvoid add(ll& lc, ll& rc, ll lf, ll rf, ll rot, ll& k)\r\n{\r\n if(lf>=lc&&rf<=rc)//节点自己更新,懒标签代表左右儿子未更新\r\n {\r\n d[rot]+=k*(rf-lf+1);\r\n b[rot]+=k;//+=是因为可能有多个修改才对应一个查询\r\n return; //同理所以push_down的变化量不是k\r\n }\r\n mkcf;\r\n if(b[rot]) push_down(lf,cf,rf,rot);\r\n//可以加&&lf!=rf,但基本无影响(且很多其他线段树操作是不允许加的),\r\n//更甚一步add和query都不需要if(b[rot])判定,这样做代价仅是常数变差\r\n if(cf>=lc) add(lc,rc,lf,cf,rot<<1,k);\r\n if(cf=lc&&rf<=rc) return d[rot];\r\n mkcf;\r\n ll res=0;\r\n if(b[rot]) push_down(lf,cf,rf,rot);\r\n if(cf>=lc) res+=query(lc,rc,lf,cf,rot<<1);//这个+=或=均可\r\n if(cf\r\n#define MAXN 500002\r\nusing namespace std;\r\ntypedef long long ll;\r\nint n,m,c,x;\r\nll a[MAXN],k;\r\ninline int lowbit(int &k){return k & -k;}\r\ninline void addsg(int x, ll &v)\r\n{\r\n while(x<=n)\r\n {\r\n a[x]+=v;\r\n x+=lowbit(x);\r\n }\r\n}\r\ninline ll sumo(int x)\r\n{\r\n ll ans = 0LL;\r\n while(x!=0)\r\n {\r\n ans+=a[x];\r\n x-=lowbit(x);\r\n }\r\n return ans;\r\n}\r\ninline ll sump(int &l, int r) {return sumo(r)-sumo(l-1);}\r\nint main()\r\n{\r\n scanf(\"%d%d\",&n,&m);\r\n for(int i=1;i<=n;i++)\r\n {\r\n scanf(\"%lld\",&k);\r\n addsg(i,k);\r\n }\r\n while(m--)\r\n {\r\n scanf(\"%d%d%lld\",&c,&x,&k);\r\n if(c==1)\r\n {\r\n addsg(x,k);\r\n }\r\n else\r\n {\r\n printf(\"%lld\\n\", sump(x,k));\r\n }\r\n }\r\n return 0;\r\n}\r\n", //27 126 | 127 | "#include \r\nusing namespace std;\r\ntypedef double db;\r\ntypedef long long ll;\r\n#define re register\r\n#define il inline\r\n#define rep(i,a,b) for(re ll i=a;ib;--i)\r\n#define rede(i,a,b) for(re ll i=a;i>=b;--i)\r\nil ll read()\r\n{\r\n\tre char p = 0; re ll r = 0, o = 0;\r\n\tfor (; p < '0' || p>'9'; o |= p == '-', p = getchar());\r\n\tfor (; p >= '0' && p <= '9';\r\n r = (r << 1) + (r << 3) + (p ^ 48), p = getchar());\r\n\treturn o ? (~r) + 1 : r;\r\n}\r\n#define mn 100010\r\n#define ms 320\r\nll n, m, cmd, lf, rf, k, bl[ms], br[ms], be[mn], laz[ms];\r\nll a[mn], ns, bs[ms], bq[ms];\r\nvoid change()\r\n{\r\n if (be[lf] == be[rf])//零散块\r\n repe(i, lf, rf) a[i] += k, bs[be[i]] += k;\r\n else\r\n {//零散块两个+整块一堆,记得懒标签laz,否则复杂度无任何优化\r\n repe(i, lf, br[be[lf]]) a[i] += k, bs[be[i]] += k;\r\n repe(i, bl[be[rf]], rf) a[i] += k, bs[be[i]] += k;\r\n rep(i, be[lf] + 1, be[rf]) laz[i] += k;\r\n }\r\n}\r\nll query()\r\n{\r\n re ll s = 0;\r\n if (be[lf] == be[rf])\r\n repe(i, lf, rf) s += a[i] + laz[i];\r\n else\r\n {//记得加上懒标签\r\n repe(i, lf, br[be[lf]]) s += a[i] + laz[be[i]];\r\n repe(i, bl[be[rf]], rf) s += a[i] + laz[be[i]];\r\n rep(i, be[lf] + 1, be[rf]) s += bs[i] + laz[i] * bq[i];\r\n }\r\n return s;//不返回出bugs\r\n}\r\nsigned main()\r\n{\r\n n = read(), m = read(), ns = sqrt(n);\r\n repe(i, 1, n) a[i] = read();\r\n repe(i, 1, ns)\r\n {\r\n bl[i] = n / ns * (i - 1) + 1;\r\n br[i] = n / ns * i;\r\n }\r\n br[ns] = n; //最后一块大小有变,其他都是等大小的\r\n repe(i, 1, ns) repe(j, bl[i], br[i]) be[j] = i, bs[i] += a[j];\r\n//每一块存储的信息是bs,是块的和\r\n repe(i, 1, ns) bq[i] = br[i] - bl[i] + 1;\r\n while (m--)\r\n {\r\n cmd = read(), lf = read(), rf = read();\r\n if (cmd == 1)\r\n {\r\n k = read();\r\n change();\r\n }\r\n else\r\n printf(\"%lld\\n\", query());\r\n }\r\n return 0;\r\n}\r\n", //28 128 | 129 | // "#define mn 100010\r\n#define ms 320\r\nll n, m, cmd, lf, rf, k, bl[ms], br[ms], be[mn], laz[ms];\r\nll a[mn], ns, bs[ms], bq[ms];\r\nvoid change()\r\n{\r\n if (be[lf] == be[rf])//零散块\r\n repe(i, lf, rf) a[i] += k, bs[be[i]] += k;\r\n else\r\n {//零散块两个+整块一堆,记得懒标签laz,否则复杂度无任何优化\r\n repe(i, lf, br[be[lf]]) a[i] += k, bs[be[i]] += k;\r\n repe(i, bl[be[rf]], rf) a[i] += k, bs[be[i]] += k;\r\n rep(i, be[lf] + 1, be[rf]) laz[i] += k;\r\n }\r\n}\r\nll query()\r\n{\r\n re ll s = 0;\r\n if (be[lf] == be[rf])\r\n repe(i, lf, rf) s += a[i] + laz[i];\r\n else\r\n {//记得加上懒标签\r\n repe(i, lf, br[be[lf]]) s += a[i] + laz[be[i]];\r\n repe(i, bl[be[rf]], rf) s += a[i] + laz[be[i]];\r\n rep(i, be[lf] + 1, be[rf]) s += bs[i] + laz[i] * bq[i];\r\n }\r\n return s;//不返回见bugs\r\n}\r\nsigned main()\r\n{\r\n n = read(), m = read(), ns = sqrt(n);\r\n repe(i, 1, n) a[i] = read();\r\n repe(i, 1, ns)\r\n {\r\n bl[i] = n / ns * (i - 1) + 1;\r\n br[i] = n / ns * i;\r\n }\r\n br[ns] = n; //最后一块大小有变,其他都是等大小的\r\n repe(i, 1, ns) repe(j, bl[i], br[i]) be[j] = i, bs[i] += a[j];\r\n//每一块存储的信息是bs,是块的和\r\n repe(i, 1, ns) bq[i] = br[i] - bl[i] + 1;\r\n while (m--)\r\n {\r\n cmd = read(), lf = read(), rf = read();\r\n if (cmd == 1)\r\n {\r\n k = read();\r\n change();\r\n }\r\n else\r\n printf(\"%lld\\n\", query());\r\n }\r\n return 0;\r\n}\r\n", //28 130 | ]; 131 | 132 | // export {posts_abbr}; -------------------------------------------------------------------------------- /js/posts.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | $(() => { 3 | $('.sidebar_column').bind('click', sidebar_click); //注意使用箭头函数的话无法使用this…… 4 | update_page(); 5 | // $('#search_button').hover(function() { 6 | // console.log($(this)); 7 | // $(this).addClass('search_button_hover'); 8 | // }); 9 | 10 | $('#page_first_fa').hover(page_first_hover); 11 | $('#page_last_fa').hover(page_last_hover); 12 | load_post(posts_abbr); 13 | 14 | $('#search_input').keydown(search_keydown); 15 | }); 16 | 17 | const post_nums = 5; //一页最多多少个帖子 18 | var page_num = 0; 19 | var now_page = 0; 20 | 21 | function sidebar_click() { 22 | let click_name = $(this).attr('id'); 23 | // console.log($(this).attr('id')); 24 | let pref = location.href; 25 | let whereis_question_mark = location.href.indexOf('?'); 26 | if (whereis_question_mark != -1) { 27 | pref = location.href.substr(0, whereis_question_mark); 28 | } 29 | let new_href = pref + '?type=' + click_name 30 | if (location.href == new_href) { 31 | return; 32 | } 33 | location.href = new_href; 34 | // $('title').attr({ innerHTML: sc_type[click_name] }); 35 | // console.log($('title').attr('innerHTML')); 36 | // document.title = sc_type[click_name]; 37 | //疑似在这里改刷新后标题还会回去…… 38 | } 39 | 40 | var now_type; 41 | //更新侧边栏、标题和主页 //绑定相关事件等页面初始化行为 42 | function update_page() { 43 | if (location.search) { 44 | let text = location.search; 45 | let text_type_res = text.match(/type=(.*)/i); 46 | if (!text_type_res) { 47 | now_type = 'sc_all'; 48 | return; 49 | } 50 | let text_dealt = text_type_res[1]; 51 | if (text_dealt.indexOf('&') != -1) { 52 | text_type_res = text_dealt.match(/([^\&]*)\&/i)[1]; 53 | } else { 54 | text_type_res = text_dealt; 55 | } 56 | now_type = text_type_res; 57 | // console.log(text_type_res); 58 | if (text_type_res) { 59 | $('.sidebar_column_now').removeClass('sidebar_column_now'); 60 | $('#' + text_type_res).addClass('sidebar_column_now'); 61 | 62 | let correspond_title = sc_type[text_type_res]; 63 | // console.log(correspond_title); 64 | if (correspond_title) { 65 | // $('title').attr({ innerHTML: correspond_title + ' - 帖子 - 星月编程学习小站' }); 66 | document.title = correspond_title + ' - 帖子 - 星月编程学习小站'; 67 | // document.getElementsByTagName('title')[0].innerText = 'try'; 68 | } 69 | } 70 | } 71 | } 72 | 73 | function search_keydown(e) { 74 | if (e.keyCode == 13) { 75 | show_search(); 76 | } else { 77 | let obj_search_select = $('#search_list'); 78 | obj_search_select.empty(); 79 | let ac_items = search(); 80 | if (!ac_items) { 81 | return; 82 | } 83 | for (let i = 0; i < ac_items.length; ++i) { 84 | let obj_item = $(''); 85 | obj_search_select.append(obj_item); 86 | } 87 | } 88 | } 89 | 90 | function search() { 91 | let nr = $('#search_input').val().trim(); 92 | 93 | let ac_posts = []; 94 | for (let i = 0; i < posts_abbr.length; ++i) { 95 | if (-1 != posts_abbr[i].title.toLowerCase().indexOf(nr.toLowerCase())) { 96 | ac_posts.push(posts_abbr[i]); 97 | } 98 | } 99 | return ac_posts; 100 | } 101 | 102 | function show_search() { 103 | let nr = $('#search_input').val().trim(); 104 | 105 | $('#search_button').addClass('search_button_clicking'); 106 | setTimeout(() => { 107 | $('#search_button').removeClass('search_button_clicking'); 108 | }, 300); 109 | if (!nr) { 110 | $('#search_feedback').html('搜索内容不能为空!'); 111 | return; 112 | } 113 | $('#search_feedback').html(''); 114 | let ac_posts = search(); 115 | 116 | //从下列实现机制上而言,如果用户输入的关键字含有search,page,type,应当屏蔽 117 | nr = nr.toLowerCase(); 118 | nr = nr.replaceAll('search', ''); 119 | nr = nr.replaceAll('page', ''); 120 | nr = nr.replaceAll('type', ''); 121 | 122 | if (-1 == location.search.indexOf('?')) { 123 | location.href += '?search=' + encodeURI(nr); 124 | } else if (-1 == location.search.indexOf('search')) { 125 | location.href += '&search=' + encodeURI(nr); 126 | } else { 127 | let new_href = location.href.replace(/search=[^&]*/i, 'search=' + encodeURI(nr)); 128 | if (true || new_href != location.href) { //直接转吧…… 129 | location.href = new_href; 130 | } 131 | } 132 | 133 | // load_post(ac_posts); 直接load会有很大的bugs,原因未知,已避免 134 | } 135 | 136 | function page_first_hover() { 137 | let obj_first = $('.page_first'); 138 | if (obj_first.hasClass('page_first_on')) { 139 | obj_first.removeClass('page'); 140 | } else { 141 | obj_first.addClass('page'); 142 | } 143 | } 144 | 145 | function page_last_hover() { 146 | let obj_last = $('.page_last'); 147 | if (obj_last.hasClass('page_last_on')) { 148 | obj_last.removeClass('page'); 149 | } else { 150 | obj_last.addClass('page'); 151 | } 152 | } 153 | 154 | function generate_abbr(pid) { 155 | var new_obj = $('
    '); 156 | 157 | var new_obj_title = $('
    '); 158 | new_obj_title.html(posts_abbr[pid].title); 159 | new_obj.append(new_obj_title); 160 | 161 | var new_obj_abbr = $('
    '); 162 | new_obj_abbr.html(posts_abbr[pid].abbr); 163 | new_obj.append(new_obj_abbr); 164 | 165 | var new_obj_bottom = $('
    '); 166 | new_obj.append(new_obj_bottom); 167 | 168 | var new_obj_tag = $(''); 169 | new_obj_tag.html('标签:' + posts_abbr[pid].tag); 170 | new_obj_bottom.append(new_obj_tag); 171 | 172 | var new_obj_date = $(''); 173 | new_obj_date.html(posts_abbr[pid].date); 174 | new_obj_bottom.append(new_obj_date); 175 | 176 | $('#posts').append(new_obj); 177 | new_obj.fadeIn(180); 178 | } 179 | 180 | function goto_post(pid) { 181 | console.log(pid); 182 | let slash_position = Math.max(0, location.href.lastIndexOf('/')); 183 | let new_href = location.href.substr(0, slash_position); 184 | new_href += '/post' + pid + '.html'; 185 | // console.log(new_href); 186 | location.href = new_href; 187 | } 188 | 189 | function load_post(ac_posts) { 190 | if (-1 != location.search.indexOf('search')) { 191 | var search_nr = location.search.match(/search=([^\&]*)/i); 192 | if (search_nr) { 193 | search_nr = search_nr[1]; 194 | search_nr = decodeURI(search_nr); 195 | } else { 196 | throw 'err in searching:' + location.search; 197 | } 198 | 199 | let ad_posts = []; 200 | for (let i = 0; i < ac_posts.length; ++i) { 201 | if (-1 != ac_posts[i].title.toLowerCase().indexOf(search_nr.toLowerCase())) { 202 | ad_posts.push(ac_posts[i]); 203 | } 204 | } 205 | ac_posts = ad_posts; 206 | 207 | $('#search_feedback').html('搜索完毕,共找到' + ad_posts.length + '条含“' + search_nr + '”的帖子。'); 208 | } 209 | // $('.post').remove(); 210 | // console.log(now_type); 211 | // let pids = []; 212 | let cnt_pid = 0; 213 | // let notype = false; 214 | page_num = 0; //暂时不打算做省略号页数和相关的内容代码 215 | if (!now_type || now_type == 'sc_all') { 216 | cnt_pid = ac_posts.length; 217 | } else { 218 | let ae_posts = []; 219 | for (let i = 0; i < ac_posts.length; ++i) { 220 | if (ac_posts[i].type == now_type) { 221 | ae_posts.push(ac_posts[i]); 222 | ++cnt_pid; 223 | } 224 | } 225 | ac_posts = ae_posts; 226 | } 227 | page_num = Math.max(1, Math.ceil(cnt_pid / post_nums)); 228 | // console.log(page_num); 229 | 230 | let page_inserta = $('#page_first_fa'); 231 | for (let i = page_num; i >= 1; --i) { 232 | // console.log(i); 233 | let obj_page = $('
    ' + i + '
    '); 234 | obj_page.bind('click', click_page); 235 | page_inserta.after(obj_page); 236 | } 237 | $('#page_last_fa').bind('click', click_last_page); 238 | 239 | let now_page_text = location.search.match(/page=(\d)/i); 240 | if (now_page_text) { 241 | now_page = parseInt(now_page_text[1]); 242 | } else { 243 | now_page = 1; 244 | } 245 | // console.log(now_page); 246 | // console.log(cnt_pid); 247 | 248 | for (let i = (now_page - 1) * post_nums, j = 0; j < cnt_pid && i < Math.min(now_page * post_nums, ac_posts.length); ++i) { 249 | generate_abbr(ac_posts[i].id); 250 | } 251 | 252 | if (cnt_pid === 0 && $('#search_feedback').html().length === 0) { 253 | $('#search_feedback').html('暂时没有相关帖子。'); 254 | } 255 | 256 | if (search_nr) { //事实上变量提升了search_nr,但let的话不会变量提升 257 | $('#search_input').val(search_nr); 258 | } 259 | } 260 | 261 | function click_last_page() { 262 | goto_page(page_num); 263 | } 264 | 265 | function click_page(e) { 266 | goto_page(parseInt($(this).html())); 267 | } 268 | 269 | function goto_page(i) { 270 | let pos_question_mark = location.href.indexOf('?'); 271 | if (-1 == pos_question_mark) { 272 | location.href += '?page=' + i; 273 | } else if (-1 == location.search.indexOf('page')) { 274 | location.href += '&page=' + i; 275 | } else { 276 | let new_href = location.href.replace(/page=\d*/, 'page=' + i); 277 | if (new_href == location.href) { 278 | return; 279 | } 280 | location.href = new_href; 281 | } 282 | } 283 | 284 | // type="module" import后onclick均会失效…… 285 | // import { posts_abbr } from "./post_info.js"; 286 | 287 | if (!posts_abbr) { 288 | const posts_abbr = [{ 289 | title: '拓展欧拉定理:从快速幂到疾速幂', 290 | abbr: '对于a的b次幂关于素数p取模下的结果,如果使用一般的快速幂需要log(b)对数复杂度求解,然而,根据数论里的拓展欧拉原理,可以把复杂度降至b%φ(p)+φ(p)的对数,这对于b特别大时是特别有优化意义的……', 291 | date: '2021/06/15 22:18', 292 | tag: '数论,快速幂,欧拉定理', 293 | type: 'sc_alg', 294 | }]; 295 | } 296 | 297 | if (!sc_type) { 298 | const sc_type = { 299 | sc_all: '', 300 | sc_alg: '算法', 301 | sc_lan: '编程语言', 302 | sc_dev: '开发工具', 303 | sc_res: '资源分享', 304 | sc_oth: '杂项', 305 | }; 306 | } -------------------------------------------------------------------------------- /js/star_canvas.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | //模仿画布做星星动效 3 | $(() => { 4 | init_star(); 5 | }); 6 | 7 | function init_star() { 8 | let obj = $('#star'); 9 | // console.log(obj); 10 | 11 | let star1 = $(''); 12 | star1.addClass('stars'); 13 | star1.addClass('ss1'); 14 | obj.append(star1); 15 | 16 | let star2 = $(''); 17 | star2.addClass('stars'); 18 | star2.addClass('ss2'); 19 | obj.append(star2); 20 | 21 | let star3 = $(''); 22 | star3.addClass('stars'); 23 | star3.addClass('ss3'); 24 | obj.append(star3); 25 | 26 | let star4 = $(''); 27 | star4.addClass('stars'); 28 | star4.addClass('ss4'); 29 | obj.append(star4); 30 | 31 | let star5 = $(''); 32 | star5.addClass('stars'); 33 | star5.addClass('ss5'); 34 | obj.append(star5); 35 | 36 | let star6 = $(''); 37 | star6.addClass('stars'); 38 | star6.addClass('ss6'); 39 | obj.append(star6); 40 | 41 | let moon = $(''); 42 | moon.addClass('moon'); 43 | obj.append(moon); 44 | } -------------------------------------------------------------------------------- /js/tool0.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | $(() => { 3 | //因为执行脚本的代码时间复杂度非常不稳定(用户跑什么脚本就是什么复杂度),所以建议跑多线程…… 4 | // console.log('qwq'); 5 | // let w = new Worker('/js/tool_common.js'); 6 | // w.postMessage('test'); 7 | // w.onmessage = (e) => { 8 | // console.log(e); 9 | // } 10 | load_memory(); //记忆上次输入的脚本代码 11 | append_func_list(); 12 | set_footer_position(); 13 | }); 14 | 15 | function select_regex(nr) { 16 | let oval = $('#cal_input').val(); 17 | if (oval) { 18 | if (oval[oval.length - 1] != ';') { 19 | oval += ';'; 20 | } 21 | oval += '\n'; 22 | } 23 | $('#cal_input').val(oval + nr); 24 | } 25 | 26 | function append_func_item(nr, dsc, eg) { 27 | let obj = $('#calfx_item'); 28 | let obj_tr = $(''); 29 | obj.append(obj_tr); 30 | obj_tr.bind('click', () => { select_regex(eg); }); 31 | 32 | let obj_regex = $(""); 33 | obj_regex.html(nr); 34 | obj_tr.append(obj_regex); 35 | 36 | let obj_dsc = $(''); 37 | obj_dsc.html(dsc); 38 | obj_tr.append(obj_dsc); 39 | } 40 | 41 | function append_func_list() { 42 | for (let i = 0; i < func_item.length; ++i) { 43 | append_func_item(func_item[i][0], func_item[i][1], func_item[i][2]); 44 | } 45 | } 46 | 47 | function load_memory() { 48 | try { 49 | let ls = localStorage; 50 | if (!ls.length) { 51 | return; 52 | } 53 | let memo = ls.getItem(ls.key(0)); //目前来说,整个网页只有这里需要存储 54 | memo = JSON.parse(memo); 55 | // console.log(memo); 56 | $('#cal_input').val(memo.v); 57 | } catch (err) { //非live可能会炸一次初始化 58 | // console.log(err); 59 | } 60 | } 61 | 62 | function save_memory() { 63 | let ls = localStorage; 64 | let memo = $('#cal_input').val(); 65 | // ls.clear(); 66 | ls.setItem(0, JSON.stringify({ v: memo })); 67 | } 68 | 69 | function locationorigin() { 70 | return location.href.substr(0, Math.max(0, location.href.lastIndexOf('/'))); 71 | } 72 | 73 | const ban_webworker = true; //修锅 chorme (非live或未设置过下)不支持 webworker 74 | 75 | function _cal() { //live可以……非live又出锅了 76 | $('#cal_res').val('计算中,请稍等……'); 77 | 78 | if (ban_webworker) { 79 | let code = $('#cal_input').val(); 80 | try { 81 | eval(code); 82 | _show(); 83 | } catch (err) { 84 | _res = '脚本出错:' + err; 85 | _show(); 86 | } 87 | } else { 88 | let dir = locationorigin() + '/js/tool0_thread.js' //非live炸掉一锅 89 | let w = new Worker(dir); //chorme不能开web worker??? 90 | w.postMessage($('#cal_input').val()); 91 | w.onmessage = (e) => { 92 | // console.log(e.data); 93 | $('#cal_res').val(e.data); 94 | } 95 | } 96 | //p.s. 实践表明:web worker 并不是严格意义的多线程,跑着的时候还是会卡的,只不过不会卡死而已 97 | 98 | 99 | // return; 100 | // let code = $('#cal_input').val(); 101 | // eval(code); 102 | // _show(); 103 | } 104 | 105 | var _res = ''; 106 | 107 | //清屏并输出所有累积的print,调试用 108 | function _show() { 109 | $('#cal_res').val(_res); 110 | _res = ''; 111 | } 112 | 113 | //取输入框的全部str并转json,调试用 114 | function _json() { 115 | let k = $('#cal_input').val(); 116 | return k; //JSON.stringify(k); 117 | } 118 | 119 | const func_item = [ 120 | ['print', '传入若干个参数,在处理结果下方新建一行并在该行中显示这些参数(以空格隔开)。这些参数可以是任何可类型转化为字符串的常量或变量。无返回值。', "print(99.9*2);\nvar x=-1;\nfor(var i=1;i<=5;i++)\n x+=i;\nprint('x:',x);"], 121 | ['gcd', '传入一个或以上整数参数,返回一个整数代表它们的公共最大公因数。', "var x=gcd(12,18);\nprint('x: ',x);\nprint(gcd(9,27,3,15,9));"], 122 | ['lcm', '传入一个或以上整数参数,返回一个整数代表它们的公共最小公倍数。', "var x=lcm(2,3,5,7);\\nprint(x);\\nprint(lcm(6,8));"], 123 | ['fact', '传入一个自然数n,返回n的阶乘。', "print(fact(5));"], 124 | ['fib', '传入一个自然数n,返回斐波那契数列的第n项。', "for(var i=1;i<=9;++i)\n print(fib(i));"], 125 | ['A', '传入两个自然数a,b(a>b),返回从b个元素中选择a个元素的排列数。', "for(var i=0;i<=5;++i)\n{\n var t=[];\n for(var j=0;j<=i;++j)\n t.push(A(j,i));\n print(t);\n}"], 126 | ['C', '传入两个自然数a,b(a>b),返回从b个元素中选择a个元素的组合数。', "for(var i=0;i<=5;++i)\n{\n var t=[];\n for(var j=0;j<=i;++j)\n t.push(C(j,i));\n print(t);\n}"], 127 | ['isprime', '传入一个正整数n(n>1),返回一个布尔值代表n是否是素数。', "var x=[2,4,6,7,10,19];\nfor(let i=0;i<6;++i)\n print(x[i],isprime(x[i])?'是素数':'是合数');", ['primes', '传入一个正整数n,返回区间[1,n]内的所有素数的数组。', "print(primes(100));"]], 128 | ['catalan', '传入一个自然数n,返回第n个卡特兰数。', "for(var i=0;i<=6;++i)\n print(catalan(i));"], 129 | ['qpow', '传入整数a,自然数b和正整数p,返回a的b次放对p取模的结果', "print(qpow(2,10,10000));\nprint(qpow(3,12345678,1000000007));"], 130 | ['inv', '传入整数n和p,返回n模p的逆元。', "print(inv(3,7));\nprint(inv(2,1000000007));"], 131 | ]; 132 | 133 | //这里仅提供了一部分函数供调试用,更多的全部函数在tool0_thread.js上 134 | function print() { 135 | let r = ''; 136 | if (arguments.length) { 137 | r += arguments[0]; 138 | } 139 | for (let i = 1; i < arguments.length; ++i) { 140 | r += ' ' + arguments[i]; 141 | } 142 | _res += r + '\n'; 143 | } 144 | 145 | function _gcd(a, b) { 146 | return (b > 0) ? gcd(b, a % b) : a; 147 | } 148 | 149 | function gcd() { //假设传入的都是整数 150 | // _raise('gcd', arguments, '我说出错就是出错'); 151 | if (arguments.length == 1) { 152 | return parseInt(arguments[0]); 153 | } else if (arguments.length > 1) { 154 | let g = _gcd(parseInt(arguments[0]), parseInt(arguments[1])); 155 | for (let i = 2; i < arguments.length; ++i) { 156 | g = _gcd(g, parseInt(arguments[i])); 157 | } 158 | return g; 159 | } else { //error分支 160 | return 1; 161 | } 162 | } 163 | 164 | //函数主动提示报错 165 | function _raise(fname, fpara, reason) { 166 | let spara = ''; 167 | if (fpara.length) { 168 | spara += fpara[0]; 169 | } 170 | for (let i = 1; i < fpara.length; ++i) { 171 | spara += ', ' + fpara[i]; 172 | } 173 | print('[error]执行函数' + fname + '(' + spara + ')出错:' + reason); 174 | // _show(); 175 | } 176 | 177 | function _raise(a, b, c) { //调试函数重名的结果 178 | console.log(a, b, c); 179 | } -------------------------------------------------------------------------------- /js/tool0_thread.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | onmessage = function(msg) { 3 | _res = ''; 4 | let thee = this; 5 | try { 6 | // console.log(msg.data); 7 | eval(msg.data); //msg暴死,必须要msg.data 8 | // console.log(_res); 9 | thee.postMessage(_res); 10 | } catch (err) { 11 | thee.postMessage('执行出错:' + err); 12 | } 13 | } 14 | 15 | var _res = ''; 16 | 17 | function print() { 18 | let r = ''; 19 | if (arguments.length) { 20 | r += arguments[0]; 21 | } 22 | for (let i = 1; i < arguments.length; ++i) { 23 | r += ' ' + arguments[i]; 24 | } 25 | _res += r + '\n'; 26 | } 27 | 28 | function _gcd(a, b) { 29 | return (b > 0) ? gcd(b, a % b) : a; 30 | } 31 | 32 | function gcd() { //假设传入的都是整数 33 | // _raise('gcd', arguments, '我说出错就是出错'); 34 | if (arguments.length == 1) { 35 | return parseInt(arguments[0]); 36 | } else if (arguments.length > 1) { 37 | let g = _gcd(parseInt(arguments[0]), parseInt(arguments[1])); 38 | for (let i = 2; i < arguments.length; ++i) { 39 | g = _gcd(g, parseInt(arguments[i])); 40 | } 41 | return g; 42 | } else { //error分支 43 | return 1; 44 | } 45 | } 46 | 47 | function _lcm(a, b) { 48 | return parseInt(a * b / _gcd(a, b)); 49 | } 50 | 51 | function lcm() { //假设传入的都是整数 52 | if (arguments.length == 1) { 53 | return parseInt(arguments[0]); 54 | } else if (arguments.length > 1) { 55 | let g = _lcm(parseInt(arguments[0]), parseInt(arguments[1])); 56 | for (let i = 2; i < arguments.length; ++i) { 57 | g = _lcm(g, parseInt(arguments[i])); 58 | } 59 | return g; 60 | } else { //error分支 61 | return 1; 62 | } 63 | } 64 | 65 | function fact(n) { 66 | if (n <= 1) { 67 | return 1; 68 | } 69 | let v = 1; 70 | for (let i = 2; i <= n; ++i) { 71 | v *= i; 72 | } 73 | return v; 74 | } 75 | 76 | function fib(n) { 77 | if (n <= 2) { 78 | return 1; 79 | } 80 | let dp = [0, 1, 1]; 81 | for (let i = 3; i <= n; ++i) { 82 | dp[i] = dp[i - 1] + dp[i - 2]; 83 | } 84 | return dp[n]; 85 | } 86 | 87 | function A(uf, df) { 88 | if (uf > df || uf < 0 || df < 0) { 89 | return 0; 90 | } 91 | let r = 1; 92 | for (let i = df - uf + 1; i <= df; ++i) { 93 | r *= i; 94 | } 95 | return r; 96 | } 97 | 98 | function C(uf, df) { //让计算过程尽可能小,从而尽可能不爆int范围 99 | if (uf > df || uf < 0 || df < 0) { 100 | return 0; 101 | } 102 | let r = 1; 103 | uf = Math.min(uf, df - uf); //组合数定律,用于化简 104 | // if (df - uf < uf) { 105 | // return C(df - uf, df); 106 | // } 107 | for (let h = 0, i = df, j = 1; h < uf; ++h, --i, ++j) { 108 | r = r * i / j; 109 | } 110 | return Math.round(r); //写成j暴死 111 | } 112 | 113 | function isprime(n) { 114 | if (n == 2 || n == 3) { 115 | return true; 116 | } 117 | if (n < 2 || (n % 6 != 1 && n % 6 != 5)) { 118 | return false; 119 | } 120 | for (let i = 5; i * i <= n; i += 6) { 121 | if (n % i == 0 || n % (i + 2) == 0) { 122 | return false; 123 | } 124 | } 125 | return true; 126 | } 127 | 128 | function primes(n) { 129 | var vis = []; 130 | var p = []; 131 | var k = 0; 132 | for (let i = 2; i <= n; ++i) { 133 | if (!vis[i]) { 134 | p[k++] = i; 135 | } 136 | for (let j = 0; j < k; ++j) { 137 | if (p[j] * i > n) { 138 | break; 139 | } 140 | vis[p[j] * i] = true; 141 | if (i % p[j] == 0) { 142 | break; 143 | } 144 | } 145 | } 146 | return p; 147 | } 148 | 149 | function catalan(n) { 150 | if (n <= 1) { 151 | return 1; 152 | } 153 | let dp = [1]; 154 | for (let i = 1; i <= n; ++i) { 155 | let k = 0; 156 | for (let j = 0; j < i; ++j) { 157 | k += dp[j] * dp[i - j - 1]; 158 | } 159 | dp[i] = k; 160 | } 161 | return dp[n]; 162 | } 163 | 164 | function qpow(a, b, p) { 165 | let r = 1; 166 | for (; b; b >>= 1, a = a * a % p) { 167 | if (b & 1) { 168 | r = r * a % p; 169 | } 170 | } 171 | return r; 172 | } 173 | 174 | function inv(a, p) { 175 | var x, y; 176 | 177 | function exgcd(a, b) { 178 | if (!b) { 179 | x = 1; 180 | y = 0; 181 | } else { 182 | exgcd(b, a % b); //js没有传引用……只能这样搞,不然这里压根不用交换变量 183 | let t = x; 184 | x = y; 185 | y = t - parseInt(a / b) * y; 186 | } 187 | } 188 | exgcd(a, p); 189 | return (x % p + p) % p; 190 | } 191 | 192 | //质因数分解……后续版本更新 193 | // function factor(n) { 194 | 195 | // } 196 | 197 | //欧拉函数……后续版本更新 198 | // function euler(n) { 199 | 200 | // } 201 | 202 | //函数主动提示报错 203 | function _raise(fname, fpara, reason) { 204 | let spara = ''; 205 | if (fpara.length) { 206 | spara += fpara[0]; 207 | } 208 | for (let i = 1; i < fpara.length; ++i) { 209 | spara += ', ' + fpara[i]; 210 | } 211 | print('[error]执行函数' + fname + '(' + spara + ')出错:' + reason); 212 | // _show(); 213 | } 214 | 215 | // //清屏并输出所有累积的print 216 | // function _show() { 217 | // $('#cal_res').val(_res); 218 | // _res = ''; 219 | // } 220 | 221 | // //取输入框的全部str并转json 222 | // function _json() { 223 | // let k = $('#cal_input').val(); 224 | // return JSON.stringify(k); 225 | // } -------------------------------------------------------------------------------- /js/tool1.js: -------------------------------------------------------------------------------- 1 | $(() => { 2 | // console.log('qwq'); 3 | sele_text_rmode(); 4 | append_regex_list(); 5 | }); 6 | 7 | function sele_text_smode() { 8 | let v = $('#text_smode').val(); 9 | // console.log(v); 10 | } 11 | 12 | function sele_text_rmode() { 13 | let v = $('#text_rmode').val(); 14 | if ('n' == v) { 15 | $('#text_rnr_text').html(' ') //这个td如果直接display none再display initial的话就不会居右了…… 16 | $('#text_rnr').css('display', 'none'); 17 | // $('#text_deal_butt').val('替换'); //而不是html 18 | $('#text_deal_butt').val('搜索'); //而不是html 19 | } else { 20 | $('#text_rnr_text').html('替换为:'); 21 | $('#text_rnr').css('display', 'initial'); 22 | $('#text_deal_butt').val('替换'); 23 | // $('#text_deal_butt').val('搜索'); 24 | } 25 | } 26 | 27 | function select_regex(nr) { 28 | $('#text_smode').val('r'); 29 | $('#text_snr').val(nr); 30 | } 31 | 32 | function append_regex_item(nr, dsc) { 33 | let obj = $('#regex_item'); 34 | let obj_tr = $(''); 35 | obj.append(obj_tr); 36 | obj_tr.bind('click', () => { select_regex(nr); }); 37 | 38 | let obj_regex = $(""); 39 | obj_regex.html(nr); 40 | obj_tr.append(obj_regex); 41 | 42 | let obj_dsc = $(''); 43 | obj_dsc.html(dsc); 44 | obj_tr.append(obj_dsc); 45 | } 46 | 47 | function append_regex_list() { 48 | for (let i = 0; i < regex_list.length; ++i) { 49 | append_regex_item(regex_list[i][0], regex_list[i][1]); 50 | } 51 | } 52 | 53 | //文本处理整体上是线性时间复杂度的……所以不考虑使用web worker多线程 54 | 55 | function text_stat(mode) { 56 | let input = $('#text_input').val(); 57 | let res = ''; 58 | let lenx = input.length; 59 | res += '字符串长度:' + lenx + '\n'; 60 | let nonvoid = len(input.match(/\S/img)); 61 | res += '非空字符数:' + nonvoid + '\n'; 62 | let chendig = len(input.match(/[\u4E00-\u9FA5A-Za-z0-9_]/img)); 63 | res += '中英文和数字数:' + chendig + '\n'; 64 | let words = len(input.match(/\b[a-zA-Z]+\b/img)); 65 | res += '单词数:' + words + '\n'; 66 | let half_stn = len(input.match(/[,。?;!…,\.\?\!;\:]/img)); 67 | res += '分句数:' + half_stn + '\n'; 68 | let stn = len(input.match(/[,,]/img)); 69 | res += '句子数:' + (half_stn - stn) + '\n'; 70 | let para = len(input.match(/\n/img)) + 1; 71 | res += '段落数:' + para + '\n'; 72 | let parane = len(input.match(/\s+\n/img)) + 1; 73 | res += '非空段落数:' + parane + '\n'; 74 | 75 | if (mode == 2) { 76 | let um = new unordered_map(); 77 | for (let i = 0; i < input.length; ++i) { 78 | um.fix(input[i], 1); 79 | } 80 | let umarray = um.to_array(); 81 | umarray.sort(sort_pair()); 82 | res += '\n共有' + umarray.length + '种字符,出现频率分别如下:\n'; 83 | for (let i = 0; i < umarray.length; ++i) { 84 | res += '"' + umarray[i][0] + '" x' + umarray[i][1] + '\n'; 85 | } 86 | 87 | let word = input.match(/\b[a-zA-Z]+\b/img); 88 | if (!word) { 89 | res += '\n文本中没有出现单词。'; 90 | } else { 91 | um = new unordered_map(); 92 | for (let i = 0; i < word.length; ++i) { 93 | um.fix(word[i], 1); 94 | } 95 | umarray = um.to_array(); 96 | umarray.sort(sort_pair()); 97 | res += '\n共有' + umarray.length + '种单词,出现频率分别如下:\n'; 98 | for (let i = 0; i < umarray.length; ++i) { 99 | res += '"' + umarray[i][0] + '" x' + umarray[i][1] + '\n'; 100 | } 101 | } 102 | } 103 | 104 | $('#text_res').val(res); 105 | } 106 | 107 | function text_deal() { 108 | let input = $('#text_input').val(); 109 | let snr = $('#text_snr').val(); 110 | let rnr = $('#text_rnr').val(); 111 | let smode = $('#text_smode').val(); 112 | let rmode = $('#text_rmode').val(); 113 | let res = []; 114 | let rtx = ''; 115 | if (smode == 'r') { 116 | try { 117 | snr = eval(snr); 118 | if (!(snr instanceof RegExp)) { //为了能够处理空白字符 119 | snr = $('#text_snr').val(); 120 | } 121 | if (rmode == 'n') { 122 | res = input.match(snr); 123 | if (!snr) { 124 | snr = ''; 125 | } 126 | rtx = ((rmode != 'r') ? '匹配' : '替换') + '完毕,对于"' + snr + '"一共搜索到' + len(res) + '个结果,分别如下:\n'; 127 | // rtx = ((rmode != 'r') ? '匹配' : '替换') + '完毕,对于' + snr + '一共搜索到' + res.length + '个结果,分别如下:\n'; 128 | } else { 129 | res = input.replace(snr, rnr); 130 | rtx = res; 131 | } 132 | 133 | } catch (err) { 134 | rtx = ((rmode != 'r') ? '匹配' : '替换') + '失败:' + err; 135 | } 136 | } else { 137 | try { 138 | if (rmode == 'n') { 139 | //以后可以用KMP算法优化 140 | let now = 0; 141 | // let ed = input.length - 1; 142 | let cnt = 0; 143 | let last_end = 0; 144 | let rrtx = ''; 145 | while (1) { 146 | let pos = input.indexOf(snr, now); 147 | if (pos == -1) { 148 | break; 149 | } else { 150 | now = pos + snr.length; 151 | // rrtx += input.substr(pos, snr.length); 152 | // console.log(pos, now, last_end); 153 | rrtx += input.substr(last_end, now - last_end - snr.length); 154 | // rrtx += '' + snr + ''; 155 | rrtx += ' <' + snr + '> '; 156 | last_end = now; 157 | ++cnt; 158 | } 159 | } 160 | rrtx += input.substr(last_end); 161 | // console.log(rrtx); 162 | rtx = '搜索成功,共找到' + cnt + '个"' + snr + '",查找结果如下:\n' + rrtx; 163 | } else { 164 | res = input.replace(snr, rnr); 165 | rtx = res; 166 | } 167 | } catch (err) { 168 | rtx = ((rmode != 'r') ? '匹配' : '替换') + '失败:' + err; 169 | } 170 | } 171 | // console.log(input, snr, rnr, smode, rmode, typeof snr); 172 | if (rmode == 'n') { 173 | // for (let i = 0; i < res.length; ++i) { 174 | for (let i = 0; i < len(res); ++i) { 175 | rtx += res[i] + '\n'; 176 | } 177 | } 178 | $('#text_res').val(rtx); 179 | } 180 | 181 | const regex_list = [ 182 | [/[0-9]*/img, '0~n个数字'], 183 | [/\d{n}/img, 'n位整数(n自行设置,下同)'], 184 | [/\d{n,}/img, '至少n位的数字'], 185 | [/\d{n,m}/img, '位数在整数区间[n,m]的数字'], 186 | [/([1-9][0-9]*)+(\.[0-9]{1,2})?/img, '非0开头,最多带两位小数的数字'], 187 | [/(\-)?\d+(\.\d{1,2})?/img, '带1~2位小数的正数或负数'], 188 | [/[1-9]\d*/img, '非零正整数'], 189 | [/\-[1-9]\d*/img, '非零负整数'], 190 | [/(\-?\d+)(\.\d+)?/img, '浮点数'], 191 | [/[\u4e00-\u9fa5]{0,}/img, '汉字'], 192 | [/[A-Za-z0-9]+/img, '数字和字母组成的字符串'], 193 | [/.{6,30}/img, '长度为6~30的所有字符'], 194 | [/[A-Za-z]+/img, '大小写英文字母'], 195 | [/[A-Z]+/mg, '大写英文字母'], 196 | [/[a-z]+/mg, '小写英文字母'], 197 | [/\w+/img, '数字、英文和下划线'], 198 | [/[\u4E00-\u9FA5A-Za-z0-9_]+/img, '中文、数字、英文和下划线'], 199 | [/#?([a-f0-9]{6}|[a-f0-9]{3})/img, '十六进制值'], 200 | [/\d{3}-\d{8}|\d{4}-\d{7}/img, '国内电话号码'], 201 | [/\d{15}|\d{17}[0-9]X/mg, '身份证号'], 202 | [/\d{4}-\d{1,2}-\d{1,2}/img, '日期'], 203 | [/[1-9][0-9]{4,}/img, 'QQ号,从10000开始'], 204 | [/\n\s*\r/img, '可以用来删除空白行'], 205 | [/[1-9]\d{5}(?!\d)/img, '邮政编码,其中(?!\d)表示自身位置后面不能匹配\d'], 206 | [/[+]{0,1}(d){1,3}[]?([-]?((d)|[]){1,12})+/img, '手机号码'], 207 | [/[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+/img, 'Email邮箱'], 208 | [/((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)/, 'IP地址'], 209 | ]; -------------------------------------------------------------------------------- /js/tool2.js: -------------------------------------------------------------------------------- 1 | $(() => { 2 | // console.log('qwq'); 3 | sele_ran_rep(); 4 | sele_ran_num(); 5 | sele_ran_wmode(); 6 | }); 7 | 8 | function ran_help() { 9 | let obj = $('#ran_help'); 10 | if (obj.val() == '收起帮助') { 11 | obj.val('展开帮助'); 12 | $('.tool_help').slideUp(500); 13 | } else { 14 | obj.val('收起帮助'); 15 | $('.tool_help').slideDown(500); 16 | } 17 | setTimeout(() => { 18 | set_footer_position(); 19 | }, 501); 20 | } 21 | 22 | function sele_ran_num() { 23 | get_and_fix_number('ran_num'); 24 | } 25 | 26 | function ran_read(files) { //根据filereader性质,再次选择同样文件不会触发,所以不算是bugs 27 | if (files.length) { 28 | let file = files[0]; 29 | let reader = new FileReader(); 30 | // console.log(file.type); 31 | if (/text+/.test(file.type)) { 32 | // console.log('yes'); 33 | reader.onload = function() { 34 | // console.log(this); 35 | // console.log(this.result); 36 | ran_deal_read(this.result); 37 | } 38 | reader.readAsText(file); 39 | } 40 | } 41 | } 42 | 43 | var ran_item = []; //二元数组[nam,w]为元素, 44 | var tid = 0; //用于查找和删除的唯一id 45 | 46 | function append_rand_item(nam, w = 1) { 47 | ran_item.push([nam, w]); 48 | 49 | let obj = $('#ran_item'); 50 | let row_num = $('tr[id^=x]').length; 51 | // let obj_rows = obj.children().length - 1; 52 | // console.log(obj, row_num); 53 | let obj_tr = $(''); 54 | obj.append(obj_tr); //先放这里就啥bugs都解决了……忌放在函数末尾 55 | 56 | let obj_tr_sid = $('' + (row_num + 1) + ''); 57 | 58 | obj_tr.append(obj_tr_sid); 59 | 60 | let obj_tr_name = $(''); 61 | obj_tr_name.children()[0].value = nam; 62 | later_bind(tid, obj_tr_name.children(), change_item_name); 63 | // obj_tr_name.children().bind('keyup', () => { change_item_name(tid); }); 64 | // obj_tr_name.children()[0].oninput = change_item_name(tid); 65 | //似乎这样绑定无用…… 66 | // setTimeout(() => { 67 | // obj_tr_name.children()[0].oninput = change_item_name(tid); 68 | // }, 1); 69 | // obj_tr.append(obj_tr_name); 70 | // setTimeout(later_bind(tid, obj_tr_name.children()[0], change_item_name), 1); 71 | obj_tr.append(obj_tr_name); 72 | 73 | let obj_tr_w = $(''); 74 | obj_tr_w.children()[0].value = parseFloat(w); 75 | later_bind(tid, obj_tr_w.children(), change_item_w); 76 | obj_tr.append(obj_tr_w); 77 | 78 | let obj_tr_del = $('
    删除该项
    ') 79 | obj_tr.append(obj_tr_del); 80 | 81 | ++tid; 82 | set_footer_position(); //但凡可能改变高度都应该设置一下…… 83 | } 84 | 85 | //曾经:一定要settimeout才不会出错……但是settimeout之后tid变了,所以异步一下 86 | //现在:bind似乎本身是异步的,tid直接传会出问题,所以包一层函数存一下临时的tid 87 | function later_bind(now_tid, obj, funcname) { 88 | // obj.oninput = funcname(now_tid); 89 | obj.bind('keyup', () => { funcname(now_tid); }); 90 | } 91 | 92 | function delete_rand_item(tid) { 93 | // console.log(tid); 94 | let xtid = 'x' + tid; 95 | // let objs = $('tr[id^=x]'); 96 | // for (let i = 0; i < objs.length; ++i) { 97 | // if (objs[i].id == xtid) { 98 | // erase(ran_item, i); 99 | // break; 100 | // } 101 | // } 102 | let idx = tid_to_index(tid); 103 | erase(ran_item, idx); 104 | $('#' + xtid).remove(); 105 | 106 | let objs_new = $('td[id^=iix]'); 107 | for (let i = 0; i < objs_new.length; ++i) { 108 | // console.log('iix', i, objs_new[i].innerHTML); 109 | objs_new[i].innerHTML = (i + 1); 110 | } 111 | 112 | // console.log(ran_item); 113 | set_footer_position(); 114 | } 115 | 116 | function tid_to_index(tid) { 117 | let xtid = 'x' + tid; 118 | let objs = $('tr[id^=x]'); 119 | // console.log(tid, objs, objs.length); 120 | for (let i = 0; i < objs.length; ++i) { 121 | // console.log(xtid, objs[i].id); 122 | if (objs[i].id == xtid) { 123 | return i; 124 | } 125 | } 126 | throw "not found " + tid + ' in ' + ran_item; 127 | } 128 | 129 | //事实上建立节点的时候也会激活 130 | function change_item_name(tid) { 131 | let idx = tid_to_index(tid); 132 | // console.log($('#inx' + tid)); 133 | ran_item[idx][0] = $('#inx' + tid).val(); 134 | // console.log(ran_item); 135 | } 136 | 137 | function change_item_w(tid) { 138 | let idx = tid_to_index(tid); 139 | let ttid = 'iwx' + tid; 140 | let val = get_and_fix_number_float(ttid, 1); 141 | ran_item[idx][1] = val; 142 | // console.log(ran_item); 143 | } 144 | 145 | function ran_deal_read(tx) { 146 | let text = tx.split('\n'); 147 | // console.log(text); 148 | let ran_type = $('#ran_wmode').val(); 149 | // console.log(ran_type); 150 | for (let i = 0; i < text.length; ++i) { 151 | let nowline = text[i].trim(); 152 | if (!nowline) { 153 | continue; 154 | } 155 | // console.log(nowline); 156 | if (ran_type == 'n') { 157 | append_rand_item(nowline, 1); 158 | } else { 159 | // console.log('qwq'); 160 | let last_space_pos = nowline.lastIndexOf(' '); 161 | // console.log(nowline, last_space_pos); 162 | if (last_space_pos == -1) { 163 | append_rand_item(nowline, 1); 164 | } else { 165 | let front = nowline.substr(0, last_space_pos); 166 | let last = nowline.substr(last_space_pos + 1); 167 | last = parseFloat(last); 168 | last = Math.min(Math.max(0.1, last), 99999); 169 | append_rand_item(front, last); 170 | // console.log(front, 'bet', last); 171 | } 172 | } 173 | } 174 | } 175 | 176 | function sele_ran_wmode() { 177 | let ran_type = $('#ran_wmode').val(); 178 | //暂时放弃权重列的动态显示和隐藏 179 | // if (ran_type == 'w') { 180 | // $('#wcx').css('display', 'none'); 181 | // $('input[id^=iwx]').css('display', 'none'); 182 | // $('#wwx').html(''); 183 | // } else { 184 | // $('#wcx').css('display', 'initial'); 185 | // $('input[id^=iwx]').css('display', 'initial'); 186 | // $('#wwx').html('权重'); 187 | // } 188 | } 189 | 190 | function sele_ran_fold() { 191 | //该函数暂不需要使用 192 | } 193 | 194 | function sele_ran_rep() { 195 | let ran_rep = $('#ran_rep').val(); 196 | if (ran_rep == 'n') { 197 | $('#ran_fold_text').html(' '); 198 | $('#ran_fold').css('display', 'none'); 199 | } else { 200 | $('#ran_fold_text').html('是否折叠结果:'); 201 | $('#ran_fold').css('display', 'initial'); 202 | } 203 | } 204 | 205 | //因为在该数据范围内时间复杂度绝大多数情况下暂时没有太高,所以不需要开web worker多线程 206 | function ran_generate() { 207 | let obj = $('#ran_res'); 208 | if (ran_item.length <= 0) { 209 | obj.val('当前项目列表为空!'); 210 | return; 211 | } 212 | let ran_type = $('#ran_wmode').val(); 213 | let ran_rep = $('#ran_rep').val(); 214 | let ran_num = get_number_float('ran_num'); 215 | let ran_fold = $('#ran_fold').val(); 216 | // console.log(ran_type, ran_rep, ran_num, ran_fold); 217 | if ('n' == ran_rep && ran_item.length < ran_num) { 218 | obj.val('不允许重复时无法抽取多于项目数的次数!'); 219 | return; 220 | } 221 | 222 | let ran_w_sum = 0; 223 | let ran_w_pref_sum = [0]; //权重前缀和 224 | let ran_item_name = []; 225 | for (let i = 0; i < ran_item.length; ++i) { 226 | ran_w_sum += (ran_type == 'w') ? ran_item[i][1] : 1; 227 | ran_w_pref_sum.push(ran_w_sum); 228 | ran_item_name.push(ran_item[i][0]); 229 | } 230 | // console.log(ran_w_sum, ran_w_pref_sum); 231 | 232 | let ran_result = []; 233 | let r = ''; 234 | 235 | if ('y' == ran_rep) { 236 | for (let i = 0; i < ran_num; ++i) { 237 | ran_result.push(choice_w(ran_item_name, ran_w_pref_sum, ran_w_sum, false)); 238 | } 239 | 240 | if ('n' == ran_fold) { 241 | for (let i = 0; i < ran_num; ++i) { 242 | r += ran_result[i] + '\n'; 243 | } 244 | } else { 245 | let um = new unordered_map(); 246 | for (let i = 0; i < ran_result.length; ++i) { 247 | um.fix(ran_result[i], 1); 248 | } 249 | let umarray = um.to_array(); 250 | umarray.sort(sort_pair()); 251 | // console.log(umarray); 252 | 253 | for (let i = 0; i < umarray.length; ++i) { 254 | r += umarray[i][0] + ' x' + umarray[i][1] + '\n'; 255 | } 256 | } 257 | } else { 258 | //然而理论上……不重复随机数暴力搜索的事件复杂度是平方的,所以考虑转换思路,使用shuffle然后只取前ran_num个元素,按理来说可以实现等权随机抽取,而加权随机抽取的直接暴力法最坏时间复杂度非常差,可以考虑模拟成等权随机抽取,即插入重复元素,重复数等于相对权重……但是这样的问题在于仍然需要筛掉重复元素,所以时间复杂度又会退化成本来的复杂度……暂时没想到更好的做法 259 | 260 | //综上所述,不加权,不允许重复,总时间复杂度是线性的;近似来说,加权平均复杂度是次数乘权重和,最坏时间复杂度大约是次数乘(权重和除以最小权重(假设是小于1的实数)) 261 | 262 | //……后续……想到了一种优化策略:每次抽取完之后重新搞前缀和,那么时间复杂度是次数的平方,以后有空再优化吧 263 | 264 | //此外,理论上全局的最优复杂度可以用数学公式降到线性……但是暂时没有想到如何做 265 | if (ran_type == 'n') { 266 | shuffle(ran_item_name); 267 | for (let i = 0; i < ran_num; ++i) { 268 | r += ran_item_name[i] + '\n'; 269 | } 270 | } else { 271 | //为了实现O(1)的常数时间复杂度查询,使用哈希表 272 | let um = new unordered_map(); 273 | // for (let i = 0; i < ran_item.length; ++i) { 274 | // um.fix(ran_item_name[i], 1); 275 | // } 276 | let suc = 0; 277 | while (suc < ran_num) { 278 | let v = choice_w(ran_item_name, ran_w_pref_sum, ran_w_sum, false); 279 | if (um.find(v)) { 280 | continue; 281 | } else { 282 | r += v + '\n'; 283 | um.fix(v, 1); 284 | ++suc; 285 | } 286 | } 287 | 288 | } 289 | } 290 | $('#ran_res').val(r); 291 | } 292 | 293 | // function ran_deal() { 294 | 295 | // } -------------------------------------------------------------------------------- /js/tool3.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | $(() => { 3 | // console.log('qwq'); 4 | // $.ajax({ 5 | // type: 'get', 6 | // url: 'resources/lorem_ch.txt', 7 | // async: true, 8 | // success: (rel) => { 9 | // // console.dir(rel.split('\n')); 10 | // } 11 | // }) 12 | // let x = []; 13 | // for (let i = 0; i < 26; ++i) { 14 | // x.push(String.fromCharCode(97 + i)); 15 | // } 16 | // console.log(JSON.stringify(x)); 17 | sele_lorem_lan(); 18 | }) 19 | 20 | var now_lorem_lan = 'ch'; 21 | var now_lorem_num = 20; 22 | var now_para_num = 1; 23 | 24 | function sele_lorem_lan() { 25 | let new_lorem_lan = $('#lorem_lan').val(); 26 | // console.log(new_lorem_lan); 27 | // if (new_lorem_lan === now_lorem_lan) { 28 | // return; 29 | // } 30 | now_lorem_lan = new_lorem_lan; 31 | $('#lorem_num_text').html(now_lorem_lan === 'ch' ? '汉字数量:' : '单词数量:'); 32 | $('#word_max_text').html(now_lorem_lan === 'en' ? '单词最大长度:' : ' '); 33 | $('#word_max').css('display', now_lorem_lan === 'en' ? 'initial' : 'none'); 34 | // $('#word_max_text').css('display', now_lorem_lan == 'ch' ? 'none' : 'inline-block'); 35 | } 36 | 37 | function sele_lorem_num() { 38 | let new_lorem_num = $("#lorem_num").val(); 39 | // console.log($("#lorem_num").val()); 40 | if (!new_lorem_num) { 41 | $("#lorem_num").val('1'); 42 | new_lorem_num = 1; 43 | } 44 | now_lorem_num = Math.max(1, Math.min(parseInt($("#lorem_num").attr('max')), Math.abs(parseInt(new_lorem_num)))); 45 | $("#lorem_num").val(now_lorem_num); 46 | $('#para_num').attr('max', now_lorem_num); 47 | let new_para_num = $('#para_num').val(); 48 | if (new_para_num > now_lorem_num) { 49 | new_para_num = now_lorem_num; 50 | } 51 | now_para_num = new_para_num; 52 | $('#para_num').val(now_para_num); 53 | 54 | //将来可以尝试重构代码,全盘使用tool_common.js 55 | //以上是未重构的代码 56 | //以下是部分重构的代码 57 | down_fix_number('word_max', now_lorem_num); 58 | down_fix_number('stn_min', now_lorem_num); 59 | // up_fix_number('stn_max', now_lorem_num, true); 60 | // up_fix_number('stn_max', Math.min(now_lorem_num, parseInt($('#stn_max').attr('min')))); 61 | down_fix_number('stn_max', now_lorem_num); 62 | up_fix_number('stn_max', parseInt($('#stn_min').val())); 63 | // down_fix_number('stn_max', now_lorem_num); 64 | 65 | //可能仍然存在一些细节问题 66 | } 67 | 68 | function sele_para_num() { 69 | //未重构的代码 70 | let new_para_num = $("#para_num").val(); 71 | if (!new_para_num) { 72 | $("#para_num").val('1'); 73 | new_para_num = 1; 74 | } 75 | now_para_num = Math.max(1, Math.min(parseInt($("#para_num").attr('max')), Math.abs(parseInt(new_para_num)))); 76 | $("#para_num").val(now_para_num); 77 | } 78 | 79 | function sele_word_max() { 80 | get_and_fix_number('word_max'); 81 | } 82 | 83 | function sele_stn_min() { 84 | let val = get_and_fix_number('stn_min'); 85 | up_fix_number('stn_max', val); 86 | // up_fix_number('stn_max', Math.max(parseInt($('#stn_max').val()), val)); 87 | } 88 | 89 | function sele_stn_max() { 90 | get_and_fix_number('stn_max'); 91 | } 92 | 93 | function lorem_clip(e) { 94 | // let content = '1123'; 95 | // console.log(content); 96 | let target = document.getElementById('lorem_res'); 97 | // target.value = content; 98 | target.select(); 99 | // let target2 = document.getElementById('clipboard'); 100 | let x = document.execCommand('Copy'); 101 | // console.log(x); 102 | // target2.select(); 103 | let obj2 = $('#clip_butt'); 104 | obj2.val('复制文本成功'); 105 | target.blur(); 106 | setTimeout(() => { 107 | obj2.val('复制到剪贴板'); 108 | }, 1500); 109 | } 110 | 111 | function lorem_save() { 112 | let _txt = $('#lorem_res').val(); 113 | let isIE = (navigator.userAgent.indexOf('MSIE') >= 0); 114 | if (isIE) { 115 | let strHTML = _txt; 116 | let winSave = window.open(); 117 | winSave.document.open("text", "utf-8"); 118 | winSave.document.write(strHTML); 119 | winSave.document.execCommand("SaveAs", true, "code.txt"); 120 | winSave.close(); 121 | } else { 122 | let elHtml = _txt; 123 | let mimeType = 'text/plain'; 124 | $('#createInvote').attr('href', 'data:' + mimeType + ';charset=utf-8,' + encodeURIComponent(elHtml)); 125 | document.getElementById('createInvote').click(); 126 | } 127 | } 128 | 129 | function lorem_word(mx) { 130 | let len = randint(1, mx); 131 | let res = ''; 132 | for (let i = 0; i < len; ++i) { 133 | res += choice(lorem_en, false); 134 | } 135 | return res; 136 | } 137 | 138 | //返回二元组,对应字符及实际句长 139 | function lorem_sentence(lan, min, max, wmx) { 140 | let len = randint(min, max); 141 | let res = ''; 142 | if (lan == 'ch') { 143 | for (let i = 0; i < len; ++i) { 144 | res += choice(lorem_ch, false); 145 | } 146 | res += choice(lorem_ch_punc, false); 147 | } else { 148 | for (let i = 0, ie = len - 1; i < ie; ++i) { 149 | res += lorem_word(wmx) + ' '; 150 | } 151 | res += lorem_word(wmx) + choice(lorem_en_punc, false); 152 | } 153 | return [res, len]; 154 | } 155 | 156 | function lorem_paragraph(lan, min, max, wmx, len) { 157 | let res = ''; 158 | let left = len; 159 | while (left > 0) { 160 | let new_stn = lorem_sentence(lan, min, Math.min(left, max), wmx); 161 | res += new_stn[0]; 162 | left -= new_stn[1]; 163 | if (lan == 'en' && left) { 164 | res += ' '; 165 | } 166 | } 167 | let reslen = res.length; 168 | // if (lan == 'ch' && (res[reslen - 1] == ',' || res[reslen - 1] == ';')) { 169 | // res[reslen - 1] = '。'; //修改小的语法问题…… 170 | // } 似乎因为一些情况会出编码相关的Unicode辅助平面bugs,所以删去该细节 171 | 172 | return ' ' + res; 173 | //行首空格由CSS修饰,这里不需要多余处理,这样保存的文本也更好 174 | //最新状况:突然发现不知道为什么神奇地只有首行了……所以还是要这么做 175 | } 176 | 177 | function lorem_main() { 178 | let landata, landata_len, landata_p; 179 | if ('ch' == now_lorem_lan) { 180 | landata = lorem_ch; 181 | landata_len = lorem_ch_len; 182 | landata_p = lorem_ch_punc; 183 | } else { 184 | landata = lorem_en; 185 | landata_len = lorem_en_len; 186 | landata_p = lorem_en_punc; 187 | } 188 | let lorem_num = get_number('lorem_num'); 189 | let para_num = get_number('para_num'); 190 | let word_max = get_number('word_max'); 191 | let stn_min = get_number('stn_min'); 192 | let stn_max = get_number('stn_max'); 193 | // let word_len = get_number('word_len'); 194 | // console.log(lorem_num, para_num, word_max, stn_min, stn_max); 195 | 196 | //生成随机段落长度 197 | // const delta_epara = 0.5; //段落字数差 198 | const ep_avg_len = lorem_num / para_num; 199 | const left_ran = Math.max(1, Math.floor(ep_avg_len / 2)); 200 | const right_ran = Math.floor(ep_avg_len * 1.5); 201 | let p_len = []; 202 | let p_cnt = 0; 203 | for (let i = 0; i < para_num - 1; ++i) { 204 | // let v = (Math.random() - 0.5) * ep_avg_len + ep_avg_len; 205 | let rlim = lorem_num - p_cnt - (para_num - i) + 1; 206 | // console.log(rlim); 207 | // let v = randint(Math.max(1, Math.floor(rlim)), 100); 208 | // console.log(left_ran, Math.min(right_ran, rlim)); 209 | let v = randint(left_ran, Math.min(right_ran, rlim)); 210 | p_len.push(v); 211 | p_cnt += v; 212 | } 213 | p_len.push(lorem_num - p_cnt); 214 | 215 | let res = ''; 216 | for (let i = 0; i < para_num; ++i) { 217 | res += lorem_paragraph(now_lorem_lan, stn_min, stn_max, word_max, p_len[i]) + '\n'; 218 | } 219 | return res; 220 | } 221 | 222 | async function lorem_generate() { 223 | $('#lorem_res').val('生成中,请稍后……'); 224 | let res = await new Promise((r) => { 225 | r(lorem_main()); 226 | //研究表明……还是web worker才是真正的多线程,async并不是真正的多线程…… 227 | }); 228 | $('#lorem_res').val(res); 229 | } 230 | 231 | const lorem_en_punc = ',;!?.....,,'; //手动配置权重 232 | 233 | const lorem_en_len = 26; 234 | 235 | const lorem_en = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]; 236 | //以后可以考虑给元音aeiou加权,或按照字母出现频率加权 237 | 238 | const lorem_ch_punc = ',,,。。。。。。?!;'; 239 | 240 | const lorem_ch_len = 3500; 241 | 242 | const lorem_ch = ['一', '丁', '七', '万', '丈', '三', '上', '下', '不', '与', '丐', '丑', '专', '且', '世', '丘', '丙', '业', '丛', '东', '丝', '丢', '两', '严', '丧', '个', '中', '丰', '串', '临', '丸', '丹', '为', '主', '丽', '举', '乃', '久', '么', '义', '之', '乌', '乍', '乎', '乏', '乐', '乒', '乓', '乔', '乖', '乘', '乙', '九', '乞', '也', '习', '乡', '书', '买', '乱', '乳', '乾', '了', '予', '争', '事', '二', '于', '亏', '云', '互', '五', '井', '亚', '些', '亡', '交', '亥', '亦', '产', '亩', '享', '京', '亭', '亮', '亲', '人', '亿', '什', '仁', '仅', '仆', '仇', '今', '介', '仍', '从', '仑', '仓', '仔', '他', '仗', '付', '仙', '代', '令', '以', '仪', '们', '仰', '仲', '件', '价', '任', '份', '仿', '企', '伊', '伍', '伏', '伐', '休', '众', '优', '伙', '会', '伞', '伟', '传', '伤', '伦', '伪', '伯', '估', '伴', '伶', '伸', '伺', '似', '佃', '但', '位', '低', '住', '佑', '体', '何', '余', '佛', '作', '你', '佣', '佩', '佳', '使', '侄', '侈', '例', '侍', '供', '依', '侠', '侣', '侥', '侦', '侧', '侨', '侮', '侯', '侵', '便', '促', '俄', '俊', '俏', '俐', '俗', '俘', '保', '信', '俩', '俭', '修', '俯', '俱', '俺', '倍', '倒', '倔', '倘', '候', '倚', '借', '倡', '倦', '债', '值', '倾', '假', '偎', '偏', '做', '停', '健', '偶', '偷', '偿', '傀', '傅', '傍', '储', '催', '傲', '傻', '像', '僚', '僧', '僵', '僻', '儒', '儡', '儿', '允', '元', '兄', '充', '兆', '先', '光', '克', '免', '兑', '兔', '党', '兜', '兢', '入', '全', '八', '公', '六', '兰', '共', '关', '兴', '兵', '其', '具', '典', '养', '兼', '兽', '冀', '内', '冈', '册', '再', '冒', '冕', '冗', '写', '军', '农', '冠', '冤', '冬', '冯', '冰', '冲', '决', '况', '冶', '冷', '冻', '净', '凄', '准', '凉', '凌', '减', '凑', '凛', '凝', '几', '凡', '凤', '凫', '凭', '凯', '凰', '凳', '凶', '凸', '凹', '出', '击', '函', '凿', '刀', '刁', '刃', '分', '切', '刊', '刑', '划', '列', '刘', '则', '刚', '创', '初', '删', '判', '刨', '利', '别', '刮', '到', '制', '刷', '券', '刹', '刺', '刻', '刽', '剂', '剃', '削', '前', '剑', '剔', '剖', '剥', '剧', '剩', '剪', '副', '割', '剿', '劈', '力', '劝', '办', '功', '加', '务', '劣', '动', '助', '努', '劫', '励', '劲', '劳', '势', '勃', '勇', '勉', '勋', '勒', '勘', '募', '勤', '勺', '勾', '勿', '匀', '包', '匆', '匈', '匕', '化', '北', '匙', '匠', '匣', '匪', '匹', '区', '医', '匾', '匿', '十', '千', '升', '午', '半', '华', '协', '卑', '卒', '卓', '单', '卖', '南', '博', '卜', '占', '卡', '卢', '卤', '卦', '卧', '卫', '印', '危', '即', '却', '卵', '卷', '卸', '卿', '厂', '厅', '历', '厉', '压', '厌', '厕', '厘', '厚', '原', '厢', '厦', '厨', '去', '县', '叁', '参', '又', '叉', '及', '友', '双', '反', '发', '叔', '取', '受', '变', '叙', '叛', '叠', '口', '古', '句', '另', '叨', '只', '叫', '召', '叭', '叮', '可', '台', '史', '右', '叶', '号', '司', '叹', '叼', '叽', '吁', '吃', '各', '吆', '合', '吉', '吊', '同', '名', '后', '吏', '吐', '向', '吓', '吕', '吗', '君', '吝', '吞', '吟', '吠', '否', '吧', '吨', '吩', '含', '听', '吭', '吮', '启', '吱', '吴', '吵', '吸', '吹', '吻', '吼', '呀', '呆', '呈', '告', '呐', '呕', '员', '呛', '呜', '呢', '周', '味', '呵', '呻', '呼', '命', '咆', '和', '咏', '咐', '咒', '咕', '咖', '咙', '咧', '咨', '咪', '咬', '咱', '咳', '咸', '咽', '哀', '品', '哄', '哆', '哈', '响', '哎', '哑', '哗', '哟', '哥', '哨', '哩', '哪', '哭', '哮', '哲', '哺', '哼', '唁', '唆', '唇', '唉', '唐', '唠', '唤', '唧', '唬', '售', '唯', '唱', '唾', '啃', '啄', '商', '啊', '啡', '啤', '啥', '啦', '啰', '啸', '啼', '喂', '善', '喇', '喉', '喊', '喘', '喜', '喝', '喧', '喳', '喷', '喻', '嗅', '嗓', '嗜', '嗡', '嗤', '嗦', '嗽', '嘀', '嘁', '嘉', '嘱', '嘲', '嘴', '嘶', '嘹', '嘿', '器', '噩', '噪', '嚎', '嚣', '嚷', '嚼', '囊', '囚', '四', '回', '因', '团', '囤', '园', '困', '囱', '围', '固', '国', '图', '圃', '圆', '圈', '土', '圣', '在', '地', '场', '圾', '址', '均', '坊', '坎', '坏', '坐', '坑', '块', '坚', '坛', '坝', '坞', '坟', '坠', '坡', '坤', '坦', '坪', '坯', '坷', '垂', '垃', '垄', '型', '垒', '垛', '垢', '垦', '垫', '垮', '埂', '埃', '埋', '城', '域', '埠', '培', '基', '堂', '堆', '堕', '堡', '堤', '堪', '堰', '堵', '塌', '塑', '塔', '塘', '塞', '填', '境', '墅', '墓', '墙', '增', '墨', '墩', '壁', '壕', '壤', '士', '壮', '声', '壳', '壶', '壹', '处', '备', '复', '夏', '夕', '外', '多', '夜', '够', '大', '天', '太', '夫', '夭', '央', '夯', '失', '头', '夷', '夸', '夹', '夺', '奄', '奇', '奈', '奉', '奋', '奏', '契', '奔', '奕', '奖', '套', '奠', '奢', '奥', '女', '奴', '奶', '奸', '她', '好', '如', '妄', '妆', '妇', '妈', '妒', '妓', '妖', '妙', '妥', '妨', '妹', '妻', '姆', '姊', '始', '姐', '姑', '姓', '委', '姚', '姜', '姥', '姨', '姻', '姿', '威', '娃', '娄', '娇', '娘', '娜', '娩', '娱', '娶', '婆', '婉', '婚', '婴', '婶', '婿', '媒', '媚', '媳', '嫁', '嫂', '嫉', '嫌', '嫡', '嫩', '嬉', '子', '孔', '孕', '字', '存', '孙', '孝', '孟', '季', '孤', '学', '孩', '孵', '孽', '宁', '它', '宅', '宇', '守', '安', '宋', '完', '宏', '宗', '官', '宙', '定', '宛', '宜', '宝', '实', '宠', '审', '客', '宣', '室', '宦', '宪', '宫', '宰', '害', '宴', '宵', '家', '容', '宽', '宾', '宿', '寂', '寄', '密', '寇', '富', '寒', '寓', '寝', '寞', '察', '寡', '寥', '寨', '寸', '对', '寺', '寻', '导', '寿', '封', '射', '将', '尉', '尊', '小', '少', '尔', '尖', '尘', '尚', '尝', '尤', '就', '尸', '尺', '尼', '尽', '尾', '尿', '局', '屁', '层', '居', '屈', '屉', '届', '屋', '屎', '屏', '屑', '展', '属', '屠', '屡', '履', '屯', '山', '屹', '屿', '岁', '岂', '岔', '岖', '岗', '岛', '岩', '岭', '岳', '岸', '峡', '峦', '峭', '峰', '峻', '崇', '崎', '崔', '崖', '崩', '崭', '嵌', '巍', '川', '州', '巡', '巢', '工', '左', '巧', '巨', '巩', '巫', '差', '己', '已', '巴', '巷', '巾', '币', '市', '布', '帅', '帆', '师', '希', '帐', '帕', '帖', '帘', '帚', '帜', '帝', '带', '席', '帮', '常', '帽', '幅', '幌', '幔', '幕', '幢', '干', '平', '年', '并', '幸', '幻', '幼', '幽', '广', '庄', '庆', '庇', '床', '序', '庐', '库', '应', '底', '店', '庙', '府', '庞', '废', '度', '座', '庭', '庵', '庶', '康', '庸', '廉', '廊', '廓', '延', '廷', '建', '开', '异', '弃', '弄', '弊', '式', '弓', '引', '弛', '弟', '张', '弥', '弦', '弧', '弯', '弱', '弹', '强', '归', '当', '录', '形', '彤', '彩', '彪', '彬', '彭', '彰', '影', '役', '彻', '彼', '往', '征', '径', '待', '很', '徊', '律', '徐', '徒', '得', '徘', '徙', '御', '循', '微', '德', '徽', '心', '必', '忆', '忌', '忍', '志', '忘', '忙', '忠', '忧', '快', '忱', '念', '忽', '忿', '怀', '态', '怎', '怒', '怔', '怕', '怖', '怜', '思', '怠', '急', '性', '怨', '怪', '怯', '总', '恃', '恋', '恍', '恐', '恒', '恕', '恢', '恤', '恨', '恩', '恬', '恭', '息', '恰', '恳', '恶', '恼', '悄', '悉', '悍', '悔', '悟', '悠', '患', '悦', '您', '悬', '悯', '悲', '悴', '悼', '情', '惊', '惋', '惑', '惕', '惜', '惠', '惦', '惧', '惨', '惩', '惫', '惭', '惯', '惰', '想', '惶', '惹', '愁', '愈', '愉', '意', '愕', '愚', '感', '愤', '愧', '愿', '慈', '慌', '慎', '慕', '慢', '慧', '慨', '慰', '慷', '憋', '憎', '憔', '憨', '憾', '懂', '懈', '懊', '懒', '懦', '戈', '戏', '成', '我', '戒', '或', '战', '戚', '截', '戳', '戴', '户', '房', '所', '扁', '扇', '手', '才', '扎', '扑', '扒', '打', '扔', '托', '扛', '扣', '执', '扩', '扫', '扬', '扭', '扮', '扯', '扰', '扳', '扶', '批', '扼', '找', '承', '技', '抄', '把', '抑', '抒', '抓', '投', '抖', '抗', '折', '抚', '抛', '抠', '抡', '抢', '护', '报', '披', '抬', '抱', '抵', '抹', '押', '抽', '拂', '拄', '担', '拆', '拇', '拉', '拌', '拍', '拐', '拒', '拓', '拔', '拖', '拗', '拘', '拙', '招', '拜', '拟', '拢', '拣', '拥', '拦', '拧', '拨', '择', '括', '拭', '拯', '拱', '拳', '拴', '拷', '拼', '拾', '拿', '持', '挂', '指', '按', '挎', '挑', '挖', '挚', '挟', '挠', '挡', '挣', '挤', '挥', '挨', '挪', '挫', '振', '挺', '挽', '捂', '捅', '捆', '捉', '捌', '捍', '捎', '捏', '捐', '捕', '捞', '损', '捡', '换', '捣', '捧', '据', '捶', '捷', '捺', '捻', '掀', '掂', '授', '掉', '掌', '掏', '掐', '排', '掖', '掘', '掠', '探', '接', '控', '推', '掩', '措', '掰', '掷', '掸', '掺', '揉', '揍', '描', '提', '插', '揖', '握', '揣', '揩', '揪', '揭', '援', '揽', '搀', '搁', '搂', '搅', '搏', '搓', '搔', '搜', '搞', '搪', '搬', '搭', '携', '摄', '摆', '摇', '摊', '摔', '摘', '摧', '摩', '摸', '摹', '撇', '撑', '撒', '撕', '撞', '撤', '撩', '撬', '播', '撮', '撰', '撵', '撼', '擂', '擅', '操', '擎', '擒', '擦', '攀', '攒', '攘', '支', '收', '改', '攻', '放', '政', '故', '效', '敌', '敏', '救', '教', '敛', '敞', '敢', '散', '敦', '敬', '数', '敲', '整', '敷', '文', '斋', '斑', '斗', '料', '斜', '斟', '斤', '斥', '斧', '斩', '断', '斯', '新', '方', '施', '旁', '旅', '旋', '族', '旗', '无', '既', '日', '旦', '旧', '旨', '早', '旬', '旭', '旱', '时', '旷', '旺', '昂', '昆', '昌', '明', '昏', '易', '昔', '昙', '星', '映', '春', '昧', '昨', '昭', '是', '昵', '昼', '显', '晃', '晋', '晌', '晒', '晓', '晕', '晚', '晤', '晦', '晨', '普', '景', '晰', '晴', '晶', '智', '晾', '暂', '暇', '暑', '暖', '暗', '暮', '暴', '曙', '曲', '更', '曹', '曼', '曾', '替', '最', '月', '有', '朋', '服', '朗', '望', '朝', '期', '朦', '木', '未', '末', '本', '术', '朱', '朴', '朵', '机', '朽', '杀', '杂', '权', '杆', '杈', '杉', '李', '杏', '材', '村', '杖', '杜', '束', '杠', '条', '来', '杨', '杭', '杯', '杰', '松', '板', '极', '构', '枉', '析', '枕', '林', '枚', '果', '枝', '枢', '枣', '枪', '枫', '枯', '架', '枷', '柄', '柏', '某', '柑', '柒', '染', '柔', '柜', '柠', '查', '柬', '柱', '柳', '柴', '柿', '栅', '标', '栈', '栋', '栏', '树', '栓', '栖', '栗', '校', '株', '样', '核', '根', '格', '栽', '桂', '桃', '桅', '框', '案', '桌', '桐', '桑', '档', '桥', '桦', '桨', '桩', '桶', '梁', '梅', '梆', '梗', '梢', '梦', '梧', '梨', '梭', '梯', '械', '梳', '检', '棉', '棋', '棍', '棒', '棕', '棘', '棚', '棠', '森', '棱', '棵', '棺', '椅', '植', '椎', '椒', '椭', '椰', '椿', '楔', '楚', '楞', '楣', '楷', '楼', '概', '榄', '榆', '榔', '榕', '榛', '榜', '榨', '榴', '槐', '槽', '樊', '樟', '模', '横', '樱', '橄', '橘', '橙', '橡', '橱', '檀', '檐', '檩', '檬', '欠', '次', '欢', '欣', '欧', '欲', '欺', '款', '歇', '歉', '歌', '止', '正', '此', '步', '武', '歧', '歪', '歹', '死', '歼', '殃', '殉', '殊', '残', '殖', '殴', '段', '殷', '殿', '毁', '毅', '母', '每', '毒', '比', '毕', '毙', '毛', '毡', '毫', '毯', '氏', '民', '氓', '气', '氛', '氢', '氧', '氨', '氮', '氯', '水', '永', '汁', '求', '汇', '汉', '汗', '汛', '汞', '江', '池', '污', '汤', '汪', '汰', '汹', '汽', '沃', '沈', '沉', '沐', '沙', '沛', '沟', '没', '沥', '沦', '沧', '沪', '沫', '沮', '河', '沸', '油', '治', '沼', '沽', '沾', '沿', '泄', '泉', '泊', '泌', '法', '泛', '泞', '泡', '波', '泣', '泥', '注', '泪', '泰', '泳', '泵', '泻', '泼', '泽', '洁', '洋', '洒', '洗', '洛', '洞', '津', '洪', '洲', '活', '洼', '洽', '派', '流', '浅', '浆', '浇', '浊', '测', '济', '浑', '浓', '浙', '浦', '浩', '浪', '浮', '浴', '海', '浸', '涂', '消', '涉', '涌', '涎', '涕', '涛', '涝', '涡', '涣', '涤', '润', '涧', '涨', '涩', '涮', '涯', '液', '涵', '淀', '淆', '淋', '淌', '淑', '淘', '淡', '淤', '淫', '淮', '深', '淳', '混', '淹', '添', '清', '渊', '渐', '渔', '渗', '渠', '渡', '渣', '渤', '温', '港', '渴', '游', '渺', '湃', '湖', '湘', '湾', '湿', '溃', '溅', '溉', '源', '溜', '溢', '溪', '溯', '溶', '溺', '滋', '滑', '滓', '滔', '滚', '滞', '满', '滤', '滥', '滨', '滩', '滴', '漂', '漆', '漏', '漓', '演', '漠', '漩', '漫', '漱', '漾', '潘', '潜', '潦', '潭', '潮', '澄', '澈', '澎', '澜', '澡', '澳', '激', '濒', '瀑', '灌', '火', '灭', '灯', '灰', '灵', '灶', '灸', '灼', '灾', '灿', '炉', '炊', '炎', '炒', '炕', '炫', '炬', '炭', '炮', '炸', '点', '炼', '烁', '烂', '烈', '烘', '烙', '烛', '烟', '烤', '烦', '烧', '烫', '热', '烹', '焊', '焕', '焙', '焚', '焦', '焰', '然', '煌', '煎', '煞', '煤', '照', '煮', '熄', '熊', '熏', '熔', '熙', '熟', '熬', '燃', '燎', '燕', '燥', '爆', '爪', '爬', '爱', '爵', '父', '爷', '爸', '爹', '爽', '片', '版', '牌', '牍', '牙', '牛', '牡', '牢', '牧', '物', '牲', '牵', '特', '牺', '犀', '犁', '犬', '犯', '状', '犹', '狂', '狈', '狐', '狗', '狞', '狠', '狡', '独', '狭', '狮', '狰', '狱', '狸', '狼', '猎', '猖', '猛', '猜', '猩', '猪', '猫', '猬', '献', '猴', '猾', '猿', '玄', '率', '玉', '王', '玖', '玛', '玩', '玫', '环', '现', '玲', '玷', '玻', '珊', '珍', '珠', '班', '球', '琅', '理', '琉', '琐', '琢', '琳', '琴', '琼', '瑞', '瑟', '瑰', '璃', '璧', '瓜', '瓢', '瓣', '瓤', '瓦', '瓮', '瓶', '瓷', '甘', '甚', '甜', '生', '甥', '用', '甩', '甫', '田', '由', '甲', '申', '电', '男', '甸', '画', '畅', '界', '畏', '畔', '留', '畜', '略', '畦', '番', '畴', '畸', '疆', '疏', '疑', '疗', '疙', '疚', '疟', '疤', '疫', '疮', '疯', '疲', '疹', '疼', '疾', '病', '症', '痊', '痒', '痕', '痘', '痛', '痢', '痪', '痰', '痴', '痹', '瘟', '瘤', '瘦', '瘩', '瘪', '瘫', '瘸', '瘾', '癌', '癞', '癣', '登', '白', '百', '皂', '的', '皆', '皇', '皮', '皱', '皿', '盅', '盆', '盈', '益', '盏', '盐', '监', '盒', '盔', '盖', '盗', '盘', '盛', '盟', '目', '盯', '盲', '直', '相', '盹', '盼', '盾', '省', '眉', '看', '真', '眠', '眨', '眯', '眶', '眷', '眼', '着', '睁', '睛', '睡', '督', '睦', '睬', '睹', '瞄', '瞎', '瞒', '瞧', '瞪', '瞬', '瞭', '瞳', '瞻', '矗', '矛', '矢', '知', '矩', '矫', '短', '矮', '石', '矾', '矿', '码', '砂', '砌', '砍', '研', '砖', '砚', '砰', '破', '砸', '砾', '础', '硅', '硕', '硝', '硫', '硬', '确', '硼', '碉', '碌', '碍', '碎', '碑', '碗', '碘', '碟', '碧', '碰', '碱', '碳', '碴', '碾', '磁', '磅', '磕', '磨', '磷', '磺', '礁', '示', '礼', '社', '祈', '祖', '祝', '神', '祟', '祠', '祥', '票', '祭', '祷', '祸', '禀', '禁', '福', '离', '禽', '禾', '秀', '私', '秃', '秆', '秉', '秋', '种', '科', '秒', '秕', '秘', '租', '秤', '秦', '秧', '秩', '秫', '积', '称', '秸', '移', '秽', '稀', '程', '稍', '税', '稚', '稠', '稳', '稻', '稼', '稽', '稿', '穆', '穗', '穴', '究', '穷', '空', '穿', '突', '窃', '窄', '窍', '窑', '窒', '窖', '窗', '窘', '窜', '窝', '窟', '窥', '窿', '立', '竖', '站', '竞', '竟', '章', '竣', '童', '竭', '端', '竹', '竿', '笆', '笋', '笑', '笔', '笙', '笛', '笤', '符', '笨', '第', '笼', '等', '筋', '筏', '筐', '筑', '筒', '答', '策', '筛', '筝', '筷', '筹', '签', '简', '箍', '箕', '算', '管', '箩', '箫', '箭', '箱', '篇', '篓', '篙', '篡', '篮', '篱', '篷', '簇', '簸', '簿', '籍', '米', '类', '籽', '粉', '粒', '粗', '粘', '粟', '粤', '粥', '粪', '粮', '粱', '粹', '精', '糊', '糕', '糖', '糙', '糜', '糟', '糠', '糯', '系', '紊', '素', '索', '紧', '紫', '累', '絮', '繁', '纠', '红', '纤', '约', '级', '纪', '纫', '纬', '纯', '纱', '纲', '纳', '纵', '纷', '纸', '纹', '纺', '纽', '线', '练', '组', '绅', '细', '织', '终', '绊', '绍', '绎', '经', '绑', '绒', '结', '绕', '绘', '给', '络', '绝', '绞', '统', '绢', '绣', '继', '绩', '绪', '续', '绰', '绳', '维', '绵', '绷', '绸', '综', '绽', '绿', '缀', '缅', '缆', '缎', '缓', '缔', '缕', '编', '缘', '缚', '缝', '缠', '缤', '缨', '缩', '缭', '缰', '缴', '缸', '缺', '罐', '网', '罕', '罗', '罚', '罢', '罩', '罪', '置', '署', '羊', '美', '羔', '羞', '羡', '群', '羹', '羽', '翁', '翅', '翎', '翔', '翘', '翠', '翩', '翰', '翻', '翼', '耀', '老', '考', '者', '而', '耍', '耐', '耕', '耗', '耘', '耙', '耳', '耸', '耻', '耽', '耿', '聂', '聊', '聋', '职', '联', '聘', '聚', '聪', '肃', '肄', '肆', '肉', '肋', '肌', '肖', '肘', '肚', '肛', '肝', '肠', '股', '肢', '肤', '肥', '肩', '肪', '肮', '肯', '育', '肴', '肺', '肾', '肿', '胀', '胁', '胃', '胆', '背', '胎', '胖', '胚', '胜', '胞', '胡', '胧', '胯', '胰', '胳', '胶', '胸', '能', '脂', '脆', '脉', '脊', '脏', '脐', '脑', '脓', '脖', '脚', '脯', '脱', '脸', '脾', '腊', '腋', '腌', '腐', '腔', '腕', '腥', '腮', '腰', '腹', '腺', '腻', '腾', '腿', '膀', '膊', '膏', '膘', '膛', '膜', '膝', '膨', '膳', '臀', '臂', '臊', '臣', '自', '臭', '至', '致', '臼', '舀', '舅', '舆', '舌', '舍', '舒', '舔', '舞', '舟', '航', '般', '舰', '舱', '舵', '舶', '舷', '船', '艇', '艘', '良', '艰', '色', '艳', '艺', '艾', '节', '芋', '芍', '芒', '芙', '芜', '芝', '芥', '芦', '芬', '芭', '芯', '花', '芳', '芹', '芽', '苇', '苍', '苏', '苔', '苗', '苛', '苞', '苟', '若', '苦', '苫', '英', '苹', '茁', '茂', '范', '茄', '茅', '茉', '茎', '茧', '茫', '茬', '茴', '茵', '茶', '茸', '荆', '草', '荐', '荒', '荔', '荚', '荞', '荠', '荡', '荣', '荤', '荧', '药', '荷', '荸', '莉', '莫', '莱', '莲', '获', '莹', '莺', '莽', '菇', '菊', '菌', '菜', '菠', '菩', '菱', '菲', '萄', '萌', '萍', '萎', '萝', '萤', '营', '萧', '萨', '落', '著', '葛', '葡', '董', '葫', '葬', '葱', '葵', '蒂', '蒋', '蒙', '蒜', '蒲', '蒸', '蒿', '蓄', '蓉', '蓖', '蓝', '蓬', '蔑', '蔓', '蔗', '蔚', '蔫', '蔬', '蔼', '蔽', '蕉', '蕊', '蕴', '蕾', '薄', '薇', '薛', '薪', '薯', '藏', '藐', '藕', '藤', '藻', '蘑', '蘸', '虎', '虏', '虐', '虑', '虚', '虫', '虱', '虹', '虽', '虾', '蚀', '蚁', '蚂', '蚊', '蚌', '蚓', '蚕', '蚜', '蚣', '蚤', '蚪', '蚯', '蛀', '蛆', '蛇', '蛉', '蛋', '蛔', '蛙', '蛛', '蛤', '蛮', '蛹', '蛾', '蜀', '蜂', '蜈', '蜒', '蜓', '蜕', '蜗', '蜘', '蜜', '蜡', '蜻', '蝇', '蝉', '蝌', '蝎', '蝗', '蝙', '蝠', '蝴', '蝶', '螃', '融', '螟', '螺', '蟀', '蟆', '蟋', '蟹', '蠕', '蠢', '血', '衅', '行', '衍', '衔', '街', '衙', '衡', '衣', '补', '表', '衩', '衫', '衬', '衰', '衷', '袁', '袄', '袋', '袍', '袒', '袖', '袜', '被', '袭', '袱', '裁', '裂', '装', '裆', '裕', '裙', '裤', '裳', '裸', '裹', '褂', '褐', '褒', '褥', '褪', '襟', '西', '要', '覆', '见', '观', '规', '觅', '视', '览', '觉', '角', '解', '触', '言', '誉', '誊', '誓', '警', '譬', '计', '订', '认', '讥', '讨', '让', '训', '议', '讯', '记', '讲', '讳', '讶', '许', '讹', '论', '讼', '讽', '设', '访', '诀', '证', '评', '诅', '识', '诈', '诉', '诊', '词', '译', '试', '诗', '诚', '话', '诞', '诡', '询', '该', '详', '诫', '诬', '语', '误', '诱', '诲', '说', '诵', '请', '诸', '诺', '读', '诽', '课', '谁', '调', '谅', '谆', '谈', '谊', '谋', '谍', '谎', '谐', '谒', '谓', '谚', '谜', '谢', '谣', '谤', '谦', '谨', '谬', '谭', '谱', '谴', '谷', '豁', '豆', '豌', '象', '豪', '豫', '豹', '豺', '貌', '贝', '贞', '负', '贡', '财', '责', '贤', '败', '账', '货', '质', '贩', '贪', '贫', '贬', '购', '贮', '贯', '贰', '贱', '贴', '贵', '贷', '贸', '费', '贺', '贼', '贾', '贿', '赁', '赂', '赃', '资', '赊', '赋', '赌', '赎', '赏', '赐', '赔', '赖', '赘', '赚', '赛', '赞', '赠', '赡', '赢', '赤', '赦', '赫', '走', '赴', '赵', '赶', '起', '趁', '超', '越', '趋', '趟', '趣', '足', '趴', '趾', '跃', '跋', '跌', '跑', '跛', '距', '跟', '跨', '跪', '路', '跳', '践', '跷', '跺', '踊', '踏', '踢', '踩', '踪', '踱', '蹂', '蹄', '蹈', '蹋', '蹦', '蹬', '蹭', '蹲', '躁', '躏', '身', '躬', '躯', '躲', '躺', '车', '轧', '轨', '轩', '转', '轮', '软', '轰', '轴', '轻', '载', '轿', '较', '辅', '辆', '辈', '辉', '辐', '辑', '输', '辕', '辖', '辙', '辛', '辜', '辞', '辟', '辣', '辨', '辩', '辫', '辰', '辱', '边', '辽', '达', '迁', '迂', '迄', '迅', '过', '迈', '迎', '运', '近', '返', '还', '这', '进', '远', '违', '连', '迟', '迫', '述', '迷', '迹', '追', '退', '送', '适', '逃', '逆', '选', '逊', '透', '逐', '递', '途', '逗', '通', '逛', '逝', '逞', '速', '造', '逢', '逮', '逸', '逻', '逼', '逾', '遂', '遇', '遍', '遏', '道', '遗', '遣', '遥', '遭', '遮', '遵', '避', '邀', '邑', '邓', '邢', '那', '邦', '邪', '邮', '邻', '郁', '郊', '郎', '郑', '部', '郭', '都', '鄙', '酌', '配', '酒', '酗', '酝', '酣', '酥', '酪', '酬', '酱', '酵', '酷', '酸', '酿', '醇', '醉', '醋', '醒', '采', '释', '里', '重', '野', '量', '金', '鉴', '针', '钉', '钓', '钙', '钝', '钞', '钟', '钠', '钢', '钥', '钦', '钧', '钩', '钮', '钱', '钳', '钻', '钾', '铁', '铃', '铅', '铆', '铐', '铛', '铜', '铝', '铡', '铣', '铭', '铲', '银', '铸', '铺', '链', '销', '锁', '锄', '锅', '锈', '锉', '锋', '锌', '锐', '错', '锚', '锡', '锣', '锤', '锥', '锦', '锨', '锭', '键', '锯', '锰', '锹', '锻', '镀', '镇', '镊', '镐', '镜', '镣', '镰', '镶', '长', '门', '闪', '闭', '问', '闯', '闰', '闲', '间', '闷', '闸', '闹', '闺', '闻', '闽', '阀', '阁', '阅', '阎', '阐', '阔', '队', '阱', '防', '阳', '阴', '阵', '阶', '阻', '阿', '附', '际', '陆', '陈', '陋', '陌', '降', '限', '陕', '陡', '院', '除', '陨', '险', '陪', '陵', '陶', '陷', '隅', '隆', '随', '隐', '隔', '隘', '隙', '障', '隧', '隶', '难', '雀', '雁', '雄', '雅', '集', '雇', '雌', '雏', '雕', '雨', '雪', '雳', '零', '雷', '雹', '雾', '需', '震', '霉', '霍', '霎', '霜', '霞', '露', '霸', '霹', '青', '靖', '静', '非', '靠', '靡', '面', '革', '靴', '靶', '鞋', '鞍', '鞠', '鞭', '韧', '韩', '韭', '音', '韵', '页', '顶', '顷', '项', '顺', '须', '顽', '顾', '顿', '颁', '颂', '预', '颅', '领', '颇', '颈', '颊', '频', '颓', '颖', '颗', '题', '颜', '额', '颠', '颤', '风', '飒', '飘', '飞', '食', '餐', '饥', '饭', '饮', '饰', '饱', '饲', '饵', '饶', '饺', '饼', '饿', '馁', '馅', '馆', '馋', '馍', '馏', '馒', '首', '香', '马', '驮', '驯', '驰', '驱', '驳', '驴', '驶', '驹', '驻', '驼', '驾', '骂', '骄', '骆', '骇', '验', '骏', '骑', '骗', '骚', '骡', '骤', '骨', '髓', '高', '鬓', '鬼', '魁', '魂', '魄', '魏', '魔', '鱼', '鲁', '鲜', '鲤', '鲫', '鲸', '鳄', '鳍', '鳖', '鳞', '鸟', '鸠', '鸡', '鸣', '鸥', '鸦', '鸭', '鸯', '鸳', '鸵', '鸽', '鸿', '鹃', '鹅', '鹉', '鹊', '鹏', '鹤', '鹦', '鹰', '鹿', '麦', '麸', '麻', '黄', '黍', '黎', '黑', '黔', '默', '鼎', '鼓', '鼠', '鼻', '齐', '齿', '龄', '龙', '龟']; -------------------------------------------------------------------------------- /js/tool_common.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | //主要是作为一个模板头文件一样的存在提供给各tools使用的中间函数 3 | $(() => { 4 | tool_id = parseInt(location.href.match(/tool(\d*)/i)[1]); 5 | 6 | // console.log(tool_id); 7 | detect_css(); 8 | $(window).scroll(modify_css).resize(modify_css); 9 | modify_css(); 10 | }); 11 | var tool_id = -1; 12 | 13 | //取input type的值,修正值,更新显示并返回 (修正默认值为1) 14 | function get_and_fix_number(id, def = 1) { 15 | let obj = $('#' + id); 16 | let val = obj.val(); 17 | if (!val) { 18 | obj.val('' + def); 19 | val = def; 20 | } 21 | val = Math.max(parseInt(obj.attr('min')), 22 | Math.min(parseInt(obj.attr('max')), Math.abs(parseInt(val))) 23 | ); 24 | obj.val(val); 25 | return val; 26 | } 27 | 28 | function get_and_fix_number_float(id, def = 0) { 29 | let obj = $('#' + id); 30 | let val = obj.val(); 31 | if (!val) { 32 | obj.val('' + def); 33 | val = def; 34 | } 35 | val = Math.max(parseFloat(obj.attr('min')), 36 | Math.min(parseFloat(obj.attr('max')), Math.abs(parseFloat(val))) 37 | ); 38 | obj.val(val); 39 | return val; 40 | } 41 | 42 | //更新input type的最大值并产生作用 43 | function down_fix_number(id, max) { 44 | let obj = $('#' + id); 45 | obj.attr('max', max); 46 | get_and_fix_number(id); 47 | } 48 | 49 | //更新input type的最小值并产生作用,prot为true时,新的最小值不能小于原有最小值,prot未实体化 50 | function up_fix_number(id, min, prot = false) { 51 | let obj = $('#' + id); 52 | // if (prot) { 53 | // let ori = parseInt(obj.attr('min')); 54 | // obj.attr(Math.min(ori, min)); 55 | // } else { 56 | // obj.attr('min', min); 57 | // } 58 | obj.attr('min', min); 59 | get_and_fix_number(id); 60 | } 61 | 62 | function get_number(id) { 63 | return parseInt($('#' + id).val()); 64 | } 65 | 66 | function get_number_float(id) { 67 | return parseFloat($('#' + id).val()); 68 | } 69 | 70 | var full_height_board_1 = 0; 71 | 72 | function detect_css() { 73 | let obj_board_1 = $('.res_board_1'); 74 | if (obj_board_1) { 75 | full_height_board_1 = parseInt(obj_board_1.css('left')) + parseInt(obj_board_1.css('width')) + 20; 76 | } 77 | 78 | } 79 | 80 | function modify_css() { 81 | //本来打算让CSS自己智能调节的,但是效果不尽人意,所以被迫手写 82 | let obj_board_1 = $('.res_board_1'); 83 | if (obj_board_1) { 84 | let window_height = document.documentElement.clientWidth; 85 | // console.log(full_height_board_1); 86 | if (full_height_board_1 > window_height) { 87 | obj_board_1.attr('half', 'half'); 88 | } else { 89 | obj_board_1.removeAttr('half'); 90 | } 91 | set_footer_position(); 92 | // console.log(now_height); 93 | } 94 | } 95 | 96 | //由于有不止一个工具需要使用到随机数,所以直接在tool_common提供随机数中间函数 97 | //从数组里随机选择一个元素,返回下标或值(return_index为true或false) 98 | function choice(arr, return_index = true) { 99 | let id = Math.floor(arr.length * Math.random()); 100 | return (return_index) ? id : arr[id]; 101 | } 102 | 103 | //从arr数组里随机选择一个不在spe数组的元素 104 | function choice_except(arr, spe, return_index = true) { 105 | if (arr.length <= spe.length) { 106 | throw "" + spe + "长度不小于" + arr; 107 | } 108 | while (true) { 109 | let id = choice(arr, true); 110 | if (spe.indexOf(arr[id]) == -1) { 111 | return (return_index) ? id : arr[id]; 112 | } 113 | } 114 | } 115 | 116 | //返回区间[a,b]的随机数 117 | function randrange(a, b) { 118 | return Math.random() * (b - a) + a; 119 | } 120 | 121 | //返回区间[a,b]的随机整数 122 | function randint(a, b) { 123 | return Math.floor(randrange(a, b + 1)); 124 | } 125 | 126 | //随机打乱一个数组 127 | function shuffle(arr) { 128 | for (let i = 0; i < arr.length; ++i) { 129 | let x = randint(0, arr.length - 1); 130 | let y = randint(0, arr.length - 1); 131 | let t = arr[x]; 132 | arr[x] = arr[y]; 133 | arr[y] = t; 134 | } 135 | return arr; 136 | } 137 | 138 | //复制到剪贴板 139 | // function clip(obj) { 140 | 141 | // } 142 | 143 | //删除数组下标为i的元素 144 | function erase(arr, i) { 145 | arr.splice(i, 1); 146 | } 147 | 148 | //二分查找,返回非降序数组arr中首个大于等于v的元素所在的下标(如果比首个元素小,也返回下标0) 149 | function lower_bound(arr, v) { 150 | let lf = 0; 151 | let rf = arr.length - 1; 152 | let cf; 153 | let res = arr.length; 154 | while (lf <= rf) { 155 | cf = Math.floor((lf + rf) / 2); 156 | // console.log(cf, arr[cf], arr[cf] <= v); 157 | if (arr[cf] < v) { 158 | lf = cf + 1; 159 | } else { 160 | res = cf; 161 | rf = cf - 1; 162 | } 163 | } 164 | return res; 165 | } 166 | 167 | //二分查找,返回非降序数组arr中首个大于等于v的元素所在的下标 168 | function upper_bound(arr, v) { 169 | let lf = 0; 170 | let rf = arr.length - 1; 171 | let cf; 172 | let res = arr.length; 173 | while (lf <= rf) { 174 | cf = Math.floor((lf + rf) / 2); 175 | // console.log(cf, arr[cf], arr[cf] <= v); 176 | if (arr[cf] <= v) { 177 | lf = cf + 1; 178 | } else { 179 | res = cf; 180 | rf = cf - 1; 181 | } 182 | } 183 | return res; 184 | } 185 | 186 | //用对数时间复杂度加权随机抽取一个数组(需要预处理前缀和,否则复杂度是线性的) 187 | function choice_w(arr, wpref, wtotal, return_index = true) { 188 | let v = randrange(0, wtotal - 1e-5); 189 | 190 | let vi = lower_bound(wpref, v) - 1; //前缀和特性,下标减一 191 | // console.log(v, wpref, vi); 192 | return (return_index) ? vi : arr[vi]; 193 | } 194 | 195 | //用字典树大致模拟哈希表和优先级队列等内容,尽量实现对数或常数级时间复杂度的查询 196 | // function trie(tid){ 197 | // this.id = 198 | // this.next = {}; 199 | // } 200 | 201 | //字符串哈希函数 202 | function hash(str) { 203 | str = '' + str; //要求v是字符串 204 | let h = 0; 205 | for (let i = str.length - 1; i >= 0; --i) { 206 | h ^= ((h << 5) + str.charCodeAt(i) + (h >> 2)); 207 | } 208 | return (h & 0x7fffffff); 209 | } 210 | 211 | //手写哈希表(对应C++的unordered_map) 未使用开放寻址法等避免冲突的办法 以后改进 212 | function unordered_map() { 213 | this.map = []; 214 | this.ori = []; 215 | this.find = function(v) { 216 | let h = hash(v); 217 | return this.map[h]; //可能是undefined 218 | } 219 | this.insert = function(i, v) { 220 | let h = hash(i); 221 | this.map[h] = v; 222 | this.ori[h] = i; 223 | } 224 | this.add = function(i, v) { 225 | let h = hash(i); 226 | this.map[h] += v; 227 | } 228 | this.fix = function(i, v) { //insert与add的结合体 229 | let h = hash(i); 230 | if (!this.map[h]) { 231 | this.map[h] = 0; 232 | this.ori[h] = i; 233 | } 234 | this.map[h] += v; 235 | } 236 | this.to_array = function() { 237 | let res = [] 238 | for (let i in this.map) { //看样子js数组内置了哈希…… 239 | // console.log(this.map[i], this.ori[i]); 240 | res.push([this.ori[i], this.map[i]]); 241 | } 242 | return res; 243 | } 244 | } 245 | 246 | // //快速排序,降低时间复杂度 看样子不需要,突然发现浏览器内置的排序本身不是平方复杂度的 247 | // function quicksort(arr, st, lst) { 248 | // if (st >= lst) { 249 | // return; 250 | // } 251 | // } 252 | 253 | //这个是降序排列pair 254 | function sort_pair() { 255 | return function(a, b) { 256 | return b[1] - a[1]; 257 | } 258 | } 259 | 260 | //这个是升序 261 | function sort_num() { 262 | return function(a, b) { 263 | return a - b; 264 | } 265 | } 266 | 267 | //检测浏览器排序的时间复杂度 268 | // let k = []; 269 | // for (let i = 0; i < 1000000; ++i) { 270 | // k.push(randint(1, 580000000)); 271 | // } 272 | // k.sort(sort_num()); 273 | 274 | //将id为text的textarea或input(text/number)的内容复制到剪贴板,并更新id为button的按钮 275 | function clip(button, text) { 276 | let objtext = document.getElementById(text); 277 | objtext.select(); 278 | document.execCommand('Copy'); 279 | objtext.blur(); 280 | let objbut = $('#' + button); 281 | objbut.val('复制文本成功'); 282 | setTimeout(() => { 283 | objbut.val('复制到剪贴板'); 284 | }, 1500); 285 | } 286 | 287 | //将_txt字符串保存到本地,需要用到一个id为createInvote的html标签,其download属性为文件名 288 | function save(_txt) { 289 | let isIE = (navigator.userAgent.indexOf('MSIE') >= 0); 290 | if (isIE) { 291 | let strHTML = _txt; 292 | let winSave = window.open(); 293 | winSave.document.open("text", "utf-8"); 294 | winSave.document.write(strHTML); 295 | winSave.document.execCommand("SaveAs", true, "code.txt"); 296 | winSave.close(); 297 | } else { 298 | let elHtml = _txt; 299 | let mimeType = 'text/plain'; 300 | $('#createInvote').attr('href', 'data:' + mimeType + ';charset=utf-8,' + encodeURIComponent(elHtml)); 301 | document.getElementById('createInvote').click(); 302 | } 303 | } 304 | 305 | //bid是帮助按钮id,默认名字是收起帮助 306 | function help_click(bid = "help") { 307 | let obj = $('#' + bid); 308 | if (obj.val() == '收起帮助') { 309 | obj.val('展开帮助'); 310 | $('.tool_help').slideUp(500); 311 | } else { 312 | obj.val('收起帮助'); 313 | $('.tool_help').slideDown(500); 314 | } 315 | setTimeout(() => { 316 | set_footer_position(); 317 | }, 501); 318 | } 319 | 320 | function len(x) { 321 | if (!x) { 322 | return 0; 323 | } 324 | if (!x.length) { 325 | return 0; 326 | } 327 | return x.length; 328 | } 329 | 330 | //使用了之后就不能参与DOM了 331 | // onmessage = function(msg) { 332 | // console.log(msg); 333 | // this.postMessage('gggg'); 334 | // }; -------------------------------------------------------------------------------- /js/tools.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | $(() => { 3 | // console.log('qwq!'); 4 | $('.tool_board').fadeIn(300); 5 | $('.tool_board').bind('click', function(e) { 6 | let tid = parseInt($(this).attr('id').match(/tool(\d*)/i)[1]); 7 | // console.log(tid);//, e.target.id 8 | goto_tool(tid); 9 | }); 10 | $(window).scroll(toolpage_height).resize(toolpage_height); 11 | toolpage_height(); 12 | // set_footer_position(); 13 | // set_footer_position(); 14 | }); 15 | 16 | function goto_tool(tid) { 17 | // let slash_pos = Math.max(0, location.href.lastIndexOf('/')); 18 | // let new_href = location.href.substr(0, slash_pos); 19 | // let new_href = location.origin + '/tool' + tid + '.html'; 非live会炸 20 | let hp = Math.max(location.href.lastIndexOf('/'), 0); 21 | let ori = location.href.substr(0, hp); 22 | let new_href = ori + '/tool' + tid + '.html'; 23 | location.href = new_href; 24 | } 25 | 26 | function toolpage_height() { 27 | if (document.documentElement.clientWidth < 1024) { 28 | $('.tool_frame').css('height', '680px'); 29 | } else { 30 | $('.tool_frame').css('height', '400px'); 31 | } 32 | set_footer_position(); 33 | } -------------------------------------------------------------------------------- /nav.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 导航栏页面(用于框架) 9 | 10 | 11 | 12 | 13 | 14 | 15 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /post0.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |
    22 |
    23 |
    24 | 在看这篇文章的时,我相信你已经掌握了“快速幂”算法。众所周知,快速幂是一种利用倍增思想将求幂运算的复杂度从O(n)降低到O(logn)的经典算法,其大致代码如下所示: 25 |
    26 | 27 |
      28 |
      29 | 对于一般的求幂,这个算法已经非常优了。然而如果碰上了要求的指数非常大,以致于超过long long,达到了高精度,比如有上万位的时候,快速幂也显得无能为力了。 30 |
      31 |
      32 | 不过通常来说,求快速幂都会进行取模操作。如果模一个素数p的话,我们可以把复杂度进一步降低。 33 |
      34 |
      35 | 为此,我们首先需要引入欧拉定理和拓展欧拉定理: 36 |
      37 |
      38 | 欧拉定理 39 |
      40 |
      41 | 拓展欧拉定理 42 |
      43 |
      44 | 这两个定理的证明需要用到数论相关的理论,且证明步骤较为复杂,在这里略去。有兴趣的可以参考oi wiki。 45 |
      46 |
      47 | 上式的φ(m)是欧拉函数,返回一个整数,代表在整数区间[1,m]中与m互质的整数数目,求一个数的欧拉函数可以用如下的代码: 48 |
      49 |
        50 |
        51 | 接下来,我们只需要直接套用快速幂和欧拉函数代码进行组合,即可用拓展欧拉定理求幂,由于指数变成了(b mod φ(m))+φ(m),所以代码时间复杂度是O(log((b mod φ(m))+φ(m))),b较大时,比O(log(b))大为优化。整体代码如下: 52 |
        53 |
          54 |
          55 | 希望这篇帖子能够对读者有所帮助~ 56 |
          57 |
          58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /post1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |
          22 |
          23 |
          24 | 如果你学习的第一门语言就是C语言,那么我想你一定因为输入数据的问题而困扰过吧……C语言的输入方式是如此的庞多且繁杂,有诸如printf, getchar, gets, fgets, getch, fread, freopen等大量与输入有关的函数,而又因为许多特殊字符,从一般的空格、换行符到庞多的占位符、其他转义符的存在,足以让初学者眼花缭乱,从而在Hello world面前便望而却步……所以现在我便分享一下我个人对C语言输入相关的浅薄的见解。 25 |
          26 |
          27 | 注:因篇幅有限,本篇内容只针对较为难理解的输入流部分的内容,而对占位符、转义符等相对简单的内容不做讨论,并且只讨论从标准输入流(stdin),即标准输入设备,一般是键盘输入内容,而不讨论文件读写。下面仅以printf,getchar和gets三种最常用的输入函数为例。并且为了通俗起见,下文内容可能可能会有不严谨的地方,严谨的表述请以 28 | C/C++标准 为准。 29 |
          30 |
          31 | 本帖大致会从以下两个方面对输入流读入机制进行简单的分析: 32 | 输入流简单介绍 、 33 | 激活和获取输入流 。 34 | 36 |
          37 |
          38 | 什么是输入流? 39 |
          40 |
          41 | 一个程序的 输入流 是使用程序的用户从程序启动开始在程序内输入的字符序列队列。 队列 是一种线性数据结构,可以大致理解成是一个长度灵活变化的数组,并且遵循里面的元素是先进先出的原则。这个数组的第一个元素叫做 队首,最后一个元素叫做 队尾 。先进先出指的是每次从输入流获取一个元素,能且仅能获取队首,并且获取完毕之后,队首元素会被移除出队,下一个元素成为新的队首,这个过程称为 42 | 出队;并且,每次新插入队的元素一定是放置在原本队尾的后面成为新的队尾的,这个过程称为 入队。此外,如果一个队列没有元素,称为 43 | 队空。 44 |
          45 |
          46 | 输入流是一种队列。运行程序时,在一些时机(下文会具体分析是什么时机)下,用户从键盘输入的内容会依据输入时间的先后,依次入队输入流,在这里我们称之为 激活输入流。而输入函数(如printf, getchar, gets)则会从输入流中获取队首元素并让队首出队,这个过程会执行若干次,不同的输入函数有不同的执行机制,这个过程在这里我们称之为 获取输入流。 47 |
          48 |
          49 | 下面举一个熟知的例子先粗略理解一下上述的文字,假设我们有一样的一段代码: 50 |
          51 |
            52 |
            53 | 对上面的代码,假设我们输入了“hello world and everything!”,那么程序的运行如下图所示: 54 |
            55 |
            56 | 程序运行结果 57 |
            58 |
            59 | 在上面的例子中,当我们输入回车(无论是按下回车还是粘贴的内容出现了回车的粘贴中还未完毕的那一刻)的时候,激活了输入流。激活之后,输入流可以粗略看成是一个长为28个的字符队列,队首是h,队尾是换行符\n(注意,队尾不是感叹号)。 60 |
            61 |
            62 | 注:准确来说,按下回车并不必然意味着输入的是\n,只不过在多数操作系统是如此。在一些其他操作系统下,按下回车实际上输入的可能是\r,或者是\r\n等。 63 |
            64 |
            65 | 这时候程序的scanf语句获取输入流,根据%s占位符规则(下文会详细介绍),连续出队了五个char字符元素,按照时间先后分别是'h','e','l','l','o',这五个字符存进了char数组变量x中;由于还有另外一个%s,所以随后出队' ',它没有存进任何变量中;接下来,再次连续出队五个char字符元素'w','o','r','l','d',存进了变量y中,此时,停止获取输入流。所以当scanf语句结束后,此刻的输入流队首是第二个空格,第二个元素是'a',输入流长度是27-11=16。 66 |
            67 |
            68 | 有了一个简单的例子作了铺垫,接下来可以详细分析一下激活输入流和获取输入流的详细机制了。 69 |
            70 |
            71 | 激活和获取输入流 72 |
            73 |
            74 | 本篇仅介绍scanf及其常用参数(包括一般字符和占位符) 、 75 | getchar和gets 的最基本的激活输入流规则。 76 |
            77 |
            78 | scanf的激活和获取输入流规则 79 |
            80 |
            81 | scanf的激活输入流的规则是:如果执行到scanf语句的时候,输入流不为队空状态,那么直接获取输入流。如果获取输入流尚未结束时触发了队空,那么激活输入流,继续获取,如此往复,直到获取输入流结束,则scanf语句执行完毕。用伪代码表示流程如下: 82 |
            83 |
              84 |
              85 | 接下来介绍scanf占位符(主要包括%c,%d(%lld),%f(%lf),%s四种)和一般字符获取输入流规则。首先介绍单个占位符的scanf语句机制: 86 |
              87 |
              88 | %c(或%*c)的获取输入流机制为:直接取一次队首赋值给对应变量,接着队首出队,然后结束获取输入流。伪代码如图所示: 89 |
              90 |
                91 |
                92 | %d(或%lld,%o,%u,%hd,%x,%2d等所有整数占位符)的获取输入流机制为:首先预处理,如果队首是空白字符(主要是空格和回车,即isspace函数返回值是1),清除空白字符,出队,如果不是空白字符,结束预处理;如果队首是数字(即isdigit函数返回值是1)或正负号,那么继续读取,并让队首出队;否则(如读到回车)队首不出队,且结束获取输入流,将已经读到的所有内容赋值给对应变量。 93 |
                94 |
                95 | 空白字符包括空格' ',回车'\n','\r',制表符'\t','\v'等。 96 |
                97 |
                98 | 正负号能且只能读取一个,读取到第二个直接结束获取输入流,如输入若干空格和回车的组合之后输入+-3只读取到+,然后结束获取输入流,输入流为"+-3",scanf结束后,输入流为"-3\n";而输入-500后读取到-500,然后因为回车字符结束获取输入流,scanf结束后,输入流为"\n"。 99 |
                100 |
                101 | 伪代码如下: 102 |
                103 |
                  104 |
                  105 | %f(或%lf,%Lf等所有浮点数占位符)的获取输入流机制为:首先进行同上的预处理,然后如果读取到正负号和小数点规则也是一次原则,如果读取到指数符号一次,那么后面还可以跟一次正负号和数字(或什么也不跟,但不能再跟小数点),上述读取成功后,队首出队,继续读取;其他情况下队首不出队,赋值变量,结束获取输入流。 106 |
                  107 |
                  108 | 注意小数点可以省略前导零或后导零的其中一个,如3.代表3.0,.7代表0.7,此时输入流均为"\n";而单独一个.结束获取输入流,此时输入流为"\n" 109 |
                  110 |
                  111 | 伪代码如下: 112 |
                  113 |
                    114 |
                    115 | %s的获取输入流机制为:首先进行同上的预处理,然后如果读到第一个非空白字符,预处理结束,队首出队,继续处理,直到再次读到了一个空白字符,队首不出队,赋值变量,结束获取输入流。伪代码如下: 116 |
                    117 |
                      118 |
                      119 | 对于一般的单个字符,获取输入流机制如下:如果队首就是这个字符,直接出队,结束获取输入流;否则不出队,直接结束获取输入流。伪代码如下: 120 |
                      121 |
                        122 |
                        123 | 对于多个占位符和一般字符的组合参数,对参数从左往右执行上述的规则,执行过程中如果任何一个单一参数处结束了输入流,则直接结束该scanf语句,即使后面还有未被处理的参数也不予处理,伪代码如下: 124 |
                        125 |
                          126 |
                          127 | 下面举例对上述机制进行阐述,对于下列程序: 128 |
                          129 |
                            130 |
                            131 | 输入文本如下: 132 |
                            133 |
                              134 |
                              135 | 程序输出如下: 136 |
                              137 |
                                138 |
                                139 | 详细过程解析如下: 140 |
                                141 |
                                142 | 程序开始运行,并且运行到第8行的scanf,程序暂时中止,等待用户输入。 143 |
                                144 |
                                145 | 用户输入到第一行末尾的回车的时候(如果是亲手输入,那就是按下回车那一刻,如果是粘贴全部文本,那就是粘贴过程中刚好粘贴到第一个回车的时候马上暂时中止粘贴,然后激活)激活输入流,此时,输入流是第一行文本,即"+-5.3e-1.2\n",此时开始运行第八行代码。 146 |
                                147 |
                                148 | 执行第八行代码scanf("%d", &i1),读取了第一个正号,由于正负号只能出现一次,所以到负号时停止,没有对i1进行任何赋值,获取输入流结束,此时输入流为"-5.3e-1.2\n",第八行代码执行结束。 149 |
                                150 |
                                151 | 执行第九行代码scanf("%c", &c1),由于输入流不是队空,所以继续获取,将'-'赋值给c1,获取输入流结束,此时输入流为"5.3e-1.2\n",第八行代码执行结束。 152 |
                                153 |
                                154 | 执行第十行代码scanf("%lf", &f1),由于输入流不是队空,所以继续获取,将5.3e-1赋值给f1,由于指数部分出现了'.',所以获取输入流结束,f2=5.3e-1即5.3乘以10的-1次方,即f2=0.53,此时输入流为".2\n",第十行代码执行结束。 155 |
                                156 |
                                157 | 执行第十一行代码scanf("%lf", &f2),由于输入流不是队空,所以继续获取,将.2赋值给f2,由于之后读取到了换行符,所以获取输入流结束,f2=.2=0.2,此时输入流为"\n",第十一行代码执行结束。 158 |
                                159 |
                                160 | 执行第十二行代码scanf("%lf", &f3),发现空白字符,进行预处理,预处理后输入流队空,所以等待用户继续输入;用户输入第二行,是回车,还是空白字符,处理后队空,所以继续等待,第三行同理,然后读入了第四行,此时输入流为" 5.gc lr580 53c d56 e\n",预处理掉前三个空格,然后读取走"5.",遇到了g,获取输入流结束,f3=5.=5.0,此时输入流为"gc lr580 53c d56 e\n",第十二行代码执行结束。 161 |
                                162 |
                                163 | 执行第十三行代码scanf("g"),要读取到的恰好是g,直接出队(如果不是那么不对出队,且获取输入流结束),获取输入流结束,此时输入流为"c lr580 53c d56 e\n",第十三行代码执行结束。 164 |
                                165 |
                                166 | 执行第十四行代码scanf("%c", &c2),将'c'赋值给c2,获取输入流结束,此时输入流为" lr580 53c d56 e\n",第十四行代码执行结束。 167 |
                                168 |
                                169 | 执行第十五行代码scanf("%s", s),预处理掉一个空格,然后读取到"lr580"赋值给s,然后遇到空白字符' ',获取输入流结束,此时输入流为" 53c d56 e\n",第十五行代码执行结束。 170 |
                                171 |
                                172 | 执行第十六行代码scanf("%d%c", &i3, &c3),预处理掉一个空格,然后读取到53赋值给i3,然后遇到字符'c',赋值给c3,获取输入流结束,此时输入流为" d56 e\n",第十六行代码执行结束。 173 |
                                174 |
                                175 | 执行第十七行代码scanf("%d%c", &i4, &c4),预处理掉一个空格,然后读取到'd',不进行赋值,因为第一个占位符不满足条件,获取输入流结束,i4,c4都未被赋值,此时输入流为"d56 e\n",第十七行代码执行结束。 176 |
                                177 |
                                178 | 执行第十八行代码scanf("%c", &c5),将'd'赋值给c5,获取输入流结束,此时输入流为"56 e\n",第十八行代码执行结束。 179 |
                                180 |
                                181 | 接下来输入各变量值,程序运行结束。如果后面还有scanf,那么会首先从第十八行的输入流开始获取,直到输入流队空才会再次程序暂时中止等待用户输入。 182 |
                                183 |
                                184 | putchar和gets的激活和获取输入流规则 185 |
                                186 |
                                187 | 事实上,getchar和gets可以用scanf来表示,所以getchar和gets可以视为scanf的延伸,具有scanf的性质。仅用scanf和普通C语言代码实现getchar,然后可以用getchar和普通C语言代码实现gets,分别展示如下: 188 |
                                189 |
                                  190 |
                                    191 |
                                    192 | 得知getchar和gets的代码实现,就可以很方便地陈述它们的激活和获取输入规则了。显然,getchar的规则等同于scanf的%c规则,只是参数和返回值不一样。而gets的规则是:如果队首是换行符(回车),那么队首出队,结束获取输入流;否则,队首进行赋值然后队首出队,继续获取输入流。 193 |
                                    194 |
                                    195 | 篇幅略长,感谢读者能够耐心读到这里。希望这篇帖子能够对读者有所帮助~ 196 |
                                    197 | 200 |
                                    201 | 202 | 203 | 204 | -------------------------------------------------------------------------------- /post2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |
                                    22 |
                                    23 | 26 |
                                    什么是高阶函数?
                                    27 |
                                    使用一个或多个函数作为参数的函数称为 高阶函数。我们熟知的使用了函数作为参数的函数有min/max(使用了默认参数key,是一个函数)。例如:
                                    28 |
                                      29 |
                                      当然我们也可以自己定义一个使用参数作为参数的函数,例如下面的示例代码定义了一个高阶函数:
                                      30 |
                                        31 |
                                        在上面的例子中,f是一个高阶函数,第二个参数是一个函数,函数f根据函数参数的不同,调用不同的函数来对2x和x+1进行处理,h是一系列函数的抽象,g1和g2是具体的h函数。
                                        32 |
                                        在Python标准库和内建函数里,提供了几个非常实用的高阶函数: 33 | map 、 34 | reduce 、 35 | filter 、 36 | sorted ,本贴会详细分析一下这四个高阶函数。 37 |
                                        38 |
                                        map
                                        39 |
                                        map是内建函数。map是一个有两个参数的函数,第一个参数是函数参数func,第二个参数是可迭代数据类型。可迭代数据类型 ,即Iterable,是一切可以使用for进行迭代的数据类型,例如我们熟知的列表、字典、集合都是可迭代数据类型,它们都可以作为该函数的第二个参数。
                                        40 |
                                        map函数的作用是对可迭代数据类型的每一个元素x分别执行func(x),将执行后的返回值依次放进一个新的可迭代数据类型然后返回一个map实例,对该实例进行相应的类型转换可以得到可迭代数据类型。执行map函数之后,传入的可迭代数据类型参数本身不会被改变。简单地说,就是返回对可迭代数据类型的每个元素进行func操作后的结果。来看一些例子:
                                        41 |
                                          42 |
                                          事实上,我们还可以用 匿名函数 对代码进行简化,匿名函数一般适用于只使用一次的函数,对于这样的函数,可以不定义具体的函数名,而直接用匿名函数表达式lambda定义其具体的操作,语法如下:
                                          43 |
                                            44 |
                                            它等效于下面的语句:
                                            45 |
                                              46 |
                                              lambda表达式果然非常地简单,对比之下,它将函数定义(等价语句的前两行)和调用函数参数(等价语句的第三行)直接合成了一行!我们可以用匿名函数简化上面的代码:
                                              47 |
                                                48 |
                                                当然了,匿名函数可以传入的参数不仅仅是一个,也可以是0到任意多个,返回的值也跟一般的函数一样没有限制。所以,lambda函数是单行函数作函数参数的极佳替代品。来看更多例子:
                                                49 |
                                                  50 |
                                                  上面的例子展示了匿名函数有零个参数(用了全局变量)和两个参数的例子。我们接着往下看。
                                                  51 |
                                                  reduce
                                                  52 |
                                                  reduce不是内建函数,而是标准库函数,它来自标准库functools,这意味着,你在使用之前需要使用import语句加载它。它的参数列表和返回值与map一致,同样iterable自身不会被该函数改变,但它作用的机理不同,它作用的方式是:首先对前两个元素执行func,接着将结果作为func的左参数,第三个元素作为右参数继续执行,之后对第四、第五个……同样操作,全部共执行len(iterable)-1次func。
                                                  53 |
                                                  例如,对于一个四元素iterable执行reduce(f, [x1,x2,x3,x4]),效果等效于f(f(f(x1,x2),x3),x4)。
                                                  54 |
                                                  由于它作用机理的缘故,map的函数参数是一元函数,而reduce的函数参数必须是二元函数。这点需要特别注意。并且由于reduce的机制特性,它特别适合用于处理字符串,我们来看几个例子:
                                                  55 |
                                                    56 |
                                                    可以从中看到代码量相较使用for而言简便了不少,这也体现了Python简洁的语法特性。
                                                    57 |
                                                    filter
                                                    58 |
                                                    filter是内建函数。参数和返回值同map,同样不会改变iterable自身。要求func是一元的返回布尔值的函数,当布尔值为真时,该元素会出现按原来的相对顺序在返回值里,否则该元素将会被过滤掉,不会出现在返回值里。这个函数非常好理解,来看几个例子便可:
                                                    59 |
                                                    注意filter是单词filt(过滤)的合成词,不要拼写错误成fliter。
                                                    60 |
                                                      61 |
                                                      sorted
                                                      62 |
                                                      sorted也是内建函数,虽然它不会改变传入的iterable,但它的参数、返回值与上面三个高阶函数不再一样。sorted第一个参数是iterable,第二个参数是默认参数key,传入函数参数func,可以不传,那么默认升序排序(数值或ASCII码顺序),第三个参数是默认参数reverse,是布尔值,代表是否排序完毕后进行逆序,为true进行。默认是false。函数返回值类型是列表。来看几个例子:
                                                      63 |
                                                        64 |
                                                        以上就是本篇帖子的全部内容了,希望能够对读者理解和使用Python的高阶函数有所帮助。如有错误,欢迎指出~
                                                        65 |
                                                        66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /post3.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |
                                                        22 |
                                                        23 |
                                                        git是一款强大的版本管理工具。使用git,我们可以高效实现管理对若干文件(和文件夹)的修改状态的管理,实现版本回退、分支存储,还可以实现远程管理、多人协作这样的强悍功能。这篇帖子简要地总结了git的常用指令集合,当读者忘记了其中一些指令的时候,可以快速查阅回忆。
                                                        24 |
                                                        本帖主要分为以下四个部分: 25 | 全局设置 、 26 | 27 | 版本库 、 28 | 远程仓库 、 29 | 分支 。 30 | 31 |
                                                        32 |
                                                        全局设置
                                                        33 |
                                                        查看用户姓名和邮箱:
                                                        34 |
                                                          35 |
                                                        • git config user.name
                                                        • 36 |
                                                        • git config user.email
                                                        • 37 |
                                                        38 |
                                                        修改用户姓名和邮箱:
                                                        39 |
                                                          40 |
                                                        • git config --global user.name "名字"
                                                        • 41 |
                                                        • git config --global user.email "邮箱"
                                                        • 42 |
                                                        43 |
                                                        生成SSH:
                                                        44 |
                                                          45 |
                                                        • ssh-keygen -t rsa -C "邮箱"
                                                        • 46 |
                                                          之后一路回车
                                                          47 |
                                                        48 | 49 |
                                                        版本库
                                                        50 |
                                                        初始化:
                                                        51 |
                                                          52 |
                                                        • git init
                                                        • 53 |
                                                          将当前目录变成git仓库
                                                          54 |
                                                        55 |
                                                        更新:(新建的或修改的文件或文件夹,需要确认更新,从工作区放到暂存区)
                                                        56 |
                                                          57 | 58 |
                                                        • git add 文件(夹)名 #可以多个参数
                                                        • 59 |
                                                          一次修改后add,如果继续修改,然后commit,继续修改的内容不会被提交。
                                                          60 |
                                                        • git add .
                                                        • 61 |
                                                          上面命令会更新当前目录下的全部内容
                                                          62 |
                                                        63 |
                                                        删除:
                                                        64 |
                                                          65 |
                                                        • git rm 文件名
                                                        • 66 |
                                                          从暂存区删除文件
                                                          67 |
                                                        68 |
                                                        提交:
                                                        69 |
                                                          70 |
                                                        • git commit -m "版本信息"
                                                        • 71 |
                                                          将所有暂存区的提交正式保存
                                                          72 |
                                                        73 |
                                                        撤销:
                                                        74 |
                                                          75 |
                                                        • git checkout -- 文件名
                                                        • 76 |
                                                          工作区的修改全部撤销。暂存区的不会被撤销。工作区被修改意味着你当前所做的内容被自动覆盖为暂存区内容了。
                                                          77 |
                                                        • git reset HEAD 文件名
                                                        • 78 |
                                                          把暂存区的修改撤销掉。工作区不变,意味着你现在做的内容不会被覆盖。如果已经commit但未提交版本库,用版本回退。如果已经提交远程库,无力回天。
                                                          79 |
                                                        80 |
                                                        查询:
                                                        81 |
                                                          82 |
                                                        • git status
                                                        • 83 |
                                                          查看有哪些文件被修改过,与commit版本不同
                                                          84 |
                                                        • git lg
                                                        • 85 |
                                                          从近到远查看commit日志
                                                          86 |
                                                        • git diff 文件名
                                                        • 87 |
                                                          查看与已add相比,当下的异同
                                                          88 |
                                                        • git diff 版本号1 版本号2 文件(夹)
                                                        • 89 |
                                                          版本2为新,版本1为旧,查看更新。在分支里特别有用。记得按enter继续显示,按q退出显示
                                                          90 |
                                                        91 |
                                                        远程仓库
                                                        92 |
                                                        查询:
                                                        93 |
                                                          94 |
                                                        • git remote
                                                        • 95 |
                                                          查看所在目录的git有多少个远程仓库
                                                          96 |
                                                        • git remote -v
                                                        • 97 |
                                                          查看详细push,fetch权限
                                                          98 |
                                                        99 |
                                                        新建:
                                                        100 |
                                                          101 |
                                                        • git remote add 远程仓库名 git@github.com:github用户名/git仓库名(.git)
                                                        • 102 |
                                                          如git remote add origin git@github.com:michaelliao/learngit.git
                                                          103 |
                                                        • git checkout -b 本地分支名 远程仓库名/远程分支名
                                                        • 104 |
                                                          对分支而言的新建
                                                          105 |
                                                        106 |
                                                        删除:
                                                        107 |
                                                          108 |
                                                        • git remote rm 远程仓库名
                                                        • 109 |
                                                        110 |
                                                        推送:
                                                        111 |
                                                          112 |
                                                        • git push 远程仓库名 本地分支名
                                                        • 113 |
                                                          如果是第一次推送,加-u(则以后可以简写git push)
                                                          114 |
                                                          在初始化后,需要通过add,commit后才能进行push,否则会报错
                                                          115 |
                                                          第一次在github推送,会有一个警告验证key,输入yes即可
                                                          116 |
                                                        117 |
                                                        获取:
                                                        118 |
                                                          119 |
                                                        • git pull 远程仓库名 本地分支名
                                                        • 120 |
                                                          如果获取失败,要指定本地分支和远程分支的链接,用下面二者之一:
                                                          121 |
                                                            122 |
                                                          • git branch --set-upstream-to=远程仓库名/远程分支 本地分支
                                                          • 123 |
                                                          • git fetch --all
                                                          • 124 |
                                                            git pull 远程仓库名 本地分支名
                                                            125 |
                                                          126 |
                                                        127 |
                                                        克隆:
                                                        128 |
                                                          129 |
                                                        • git clone git@github.com:用户名/git仓库名
                                                        • 130 |
                                                          点fork,在自己的账号下克隆了一个仓库,之后使用。会新建文件夹的,之后要cd之后才会进入
                                                          131 |
                                                        132 |
                                                        分支
                                                        133 |
                                                        查询:
                                                        134 |
                                                          135 |
                                                        • git branch
                                                        • 136 |
                                                          带星号是当前分支
                                                          137 |
                                                        138 |
                                                        创建:
                                                        139 |
                                                          140 |
                                                        • git checkout -b 分支名
                                                        • 141 |
                                                        • git switch -c 分支名
                                                        • 142 |
                                                          创建并切换到新分支
                                                          143 |
                                                        • git branch 分支名
                                                        • 144 |
                                                          创建但不切换
                                                          145 |
                                                        146 |
                                                        合并:
                                                        147 |
                                                          148 |
                                                        • git merge 分支名
                                                        • 149 |
                                                          把某个分支合并到当前分支,如果出现冲突,必须手动解决,合并分支时一般会用fast forward模式,删除分支后丢失分支信息;如果关闭,则历史上可以看到分支信息:
                                                          150 |
                                                            151 |
                                                          • git merge --no-ff -m "新commit描述" 分支名
                                                          • 152 |
                                                          153 |
                                                        154 |
                                                        删除:
                                                        155 |
                                                          156 |
                                                        • git branch -d 分支名
                                                        • 157 |
                                                          删除已合并的分支。如果要删除未合并(会丢失修改)的分支,使用-D
                                                          158 |
                                                        159 |
                                                        切换:
                                                        160 |
                                                          161 |
                                                        • git checkout 分支名
                                                        • 162 |
                                                        • git switch 分支名
                                                        • 163 |
                                                        164 | 165 |
                                                        166 | 167 | 168 | 169 | -------------------------------------------------------------------------------- /post4.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |
                                                        22 |
                                                        23 |
                                                        对于区间上的数据查询和修改问题,我们似乎有非常多的选择。当涉及到的区间是静态区间(初始化后只查询不修改)时,我们可以根据题目性质的不同,直接使用n维前缀和/差分、ST表(稀疏表)、单调栈/单调队列得以较为简便地解决这类问题。然而,如果题目涉及了整个区间的修改操作,诸如区间每个元素加上固定值、修改为固定值、翻倍等操作时,上面的数据结构的时间复杂度便有些难堪了,我们需要一种以线性复杂度以下的复杂度进行区间修改的数据结构,没错,这便是我们今天的主角:线段树树状数组块状数组
                                                        24 |
                                                        篇幅有限,下面的示例主要例题:针对区间各元素加上常数加法操作和区间求和查询,假设题目要求每次修改和查询的时间复杂度不能是线性的时间复杂度,且空间复杂度要求为线性的。
                                                        25 |
                                                        线段树
                                                        26 |
                                                        本篇帖子是总结类的文章,所以不会涉及较多的概念引入和解释,也不会涉及基本操作证明、解析,只会给出粗略的代码,并总结相关异同特性。
                                                        27 |
                                                        线段树是二叉搜索树。叶节点代表点,其余节点代表区间。
                                                        28 |
                                                        以区间[1,4]为的四节点为例,第一层为单个节点1~4,第二层两个节点为1~2,3~4,第三层四个节点为1,2,3,4。
                                                        29 |
                                                        线段树一般用于维护大数据量、经常发生修改(一般只加,当然别的操作可以灵活变型)的数组的前缀和,以及由前缀和可以计算的任何其他值(符合结合律的,如max,min,xor),如前缀积。还可以用于模拟、DP等。而且空间经过离散化以后也可以相对压缩,所以适用范围线段树更加广一些。显然时间复杂度是nlogn。一种相似的结构,树状数组能够更好地实现该目标。
                                                        30 |
                                                        以例题为例,代码如下(相关解释见代码):
                                                        31 |
                                                          32 |
                                                          从线段树引申出来的,还有高级的线段树,如主席树(可持久化线段树)、zwk线段树、珂朵莉树,乃至于树套树等数据结构,且线段树除了可以做成二叉树之外,还可以做成三叉树等结构,在这里不做详细介绍。
                                                          33 |
                                                          树状数组
                                                          34 |
                                                          树状数组跟线段树的时间复杂度类似,但常数上时空复杂度都更优。但是相对地,代价是能维护的东西屈指可数,常见能维护的操作有:前缀和查询和单点修改、区间修改和单点查询(差分树状数组)、单点修改和区间最值、数组中位数。
                                                          35 |
                                                          特别注意,树状数组事实上并用要求的复杂度解决例题。其仅能解决例题的二者之一,即仅区间查询或仅区间修改。将其放在一起讨论仅仅是为了总结三者的异同。本题并不能使用。下面放一段解决前缀和查询和单点修改的实例代码:
                                                          36 |
                                                            37 |
                                                            块状数组
                                                            38 |
                                                            分块是一种思维,而利用这种思维可以构造出块状数组这一数据结构。将一个整体划分为若干个小块,整块整体处理,零散块单独处理。将长度为n的数组划分为a块,每块长度是n/a的下取整,区间边缘零散块单独暴力处理。根据均值不等式可以证明,a为根号n时,整块不会太少,零散块不会太多,相对最优,总体时间复杂度是根号n,是根号复杂度。
                                                            39 |
                                                            对比之下,线段树和树状数组是对数复杂度,所以分块并不会比它们更优。分块数组可以看成是高度为3的数,全体是第一层,块是第二层,元素是第三层。但是,优点在于,块状数组维护的信息不需要满足结合律,也不需要层层之间传递标记。很重要的一个补充是,同树状数组一样,块状数组更易于理解,且代码量更短,写起来相对简单。
                                                            40 |
                                                            用块状数组解决例题如下:
                                                            41 |
                                                              42 |
                                                              以上便是对线段树、树状数组和块状数组三者的简单总结。感谢读者的阅读~
                                                              43 | 44 |
                                                              45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /post5.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |
                                                              22 |
                                                              23 |
                                                              个人所用环境为:双系统Window10, Ubuntu20.10,使用联想拯救者电脑游戏本。自己也是一个Linux系统初学者,对这方面没有造诣,如有错误和不严谨之处,还望读者指教和海涵。
                                                              24 |
                                                              25 | 问题1:无法在C盘和D盘进行写操作 26 |
                                                              27 |
                                                              解决办法:尝试关闭window的快速启动,在window下操作,具体方法每台计算机都不一样,百度
                                                              28 |
                                                              29 | 问题2:没有ubuntu启动项 30 |
                                                              31 |
                                                              window自动更新后产生的问题
                                                              32 |
                                                              解决办法:启动bios(本系统开机时FN+F2),然后看到按钮,中间那个,选到ubuntu,然后关闭bios重启电脑即可
                                                              33 |
                                                              34 | 问题3:微信无法启动 35 |
                                                              36 |
                                                              注:Linux没有微信软件,微信是使用wine安装的
                                                              37 |
                                                              解决办法:让隐藏文件可见,用户文件夹(~)下,找到Wechat字样和.开头的文件夹,搬走,启动,(再搬回去)(不搬回去也行,影响不大),后来再次初始化的时候选一样的路径即可
                                                              38 |
                                                              39 | 问题4:typora没有菜单栏 40 |
                                                              41 |
                                                              注:typora是使用snap安装的
                                                              42 |
                                                              解决办法:这是snap的天然缺陷。不要使用snap安装,使用apt重新安装即可
                                                              43 |
                                                              44 | 问题5:typora的ctrl+5快捷键失效 45 |
                                                              46 |
                                                              注:ubuntu安装了fcitx
                                                              47 |
                                                              与fcitx快捷键冲突,点击fcitx,配置-全局配置-显示高级选项-快捷键,找到重新载入配置,换掉或删掉即可
                                                              48 |
                                                              49 | 问题6:右击菜单没有新建文本文档txt 50 |
                                                              51 |
                                                              直接在用户文件夹(路径`~`)里的模板(有的不叫这个名字,叫template)文件夹处加即可,可能需要管理员权限
                                                              52 |
                                                              53 | 问题7:vscode无法使用background-cover插件 54 |
                                                              55 |
                                                              输入下列指令即可:
                                                              56 |
                                                                57 |
                                                              • sudo chown -R $(whoami) /usr/share/code
                                                              • 58 |
                                                              59 |
                                                               
                                                              60 |
                                                              本文仅用于记录个人学习和使用linux系统的心得体会,欢迎交流~
                                                              61 |
                                                              62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /post6.html: -------------------------------------------------------------------------------- 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 | 牛客网 推荐理由:国内非常权威的算法题网站,且是大多正规比赛的线上赛平台。可以查看他人的代码,基本上都有题解。有很多权威的比赛题目,如ACM(ICPC)真题。并且也有面试相关的算法题。 32 |
                                                              33 |
                                                              34 | CodeForces 简称CF。推荐理由:经常举办比赛,适合跟着打比赛(虽然都是大晚上的比赛),难度比较适合,思维类题目较多,对有意向参加ACM的人有很大帮助。 35 |
                                                              36 |
                                                              37 | Leetcode 又称力扣。推荐理由:算法题目多与工作面试题相关,适合准备面试的人准备。 38 |
                                                              39 |
                                                              40 | 知识汇总网站 41 |
                                                              42 |
                                                              43 | oi-wiki 推荐理由:汇集了非常全面的算法知识的百科网站。里面能够找到大量算法知识。适合系统学习算法知识参考,也适合当作百科词条查阅。 44 |
                                                              45 |
                                                              46 | 菜鸟教程 推荐理由:主要是前端和后端知识汇总,与Web相关,有HTML、CSS、JS等大量知识,非常详细,适合初学者翻看,也适合跟着系统学习。 47 |
                                                              48 |
                                                              49 | 交流网站 50 |
                                                              51 |
                                                              52 | stackoverflow 推荐理由:编程问题有求必应(虽然是英文社区,需要英文功底),只要检索/提问能力较强,再偏僻、刁钻、细节的问题也有可能有人可以解答。 53 |
                                                              54 |
                                                               
                                                              55 |
                                                              希望上述网站能够在读者遇到问题时帮到读者,如果有别的精彩的网站也欢迎交流分享~
                                                              56 |
                                                              57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /posts.html: -------------------------------------------------------------------------------- 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 | 51 |
                                                              52 | 53 | 54 | 55 |
                                                              56 | 57 |
                                                              58 |
                                                              59 |
                                                              60 |
                                                              61 |
                                                              62 |
                                                              63 | 64 |
                                                              65 |
                                                              66 |
                                                              67 |
                                                              68 |
                                                              69 |
                                                              70 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /tool0.html: -------------------------------------------------------------------------------- 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 | 36 |
                                                              为了能够进行更加复杂的计算,例如循环、判断乃至递归,本计算器将待计算的内容视为JS脚本处理,使用JS语法执行用户输入的脚本,可以灵活执行所有JS语句,例如四则运算、Math库函数。除此之外,考虑到复杂的计算时如果输出每一步的计算结果,结果文本将会时分冗余,所以本计算器提供内置函数print(具体见提供的函数接口),专门用于输出内容到结果框。
                                                              37 |
                                                              由于支持JS所有语法,所以本计算器自带所有简单或复杂的算数和逻辑运算,包括四则运算、位运算、三角函数计算、随机数等。此外,本计算器还内置了一些常用的与算法等相关的函数提供调用。包括求最大公因数、排列组合、卡特兰数、逆元等。具体使用方法见下方列表。点击列表项后会在处理脚本尾部处添加一段示例使用代码。
                                                              38 |
                                                              由于JS自身的限制,所有计算过程的绝对值取值范围不得大于2147483647。 39 | 40 |
                                                              41 |
                                                              42 | 提供函数: 43 |
                                                              44 |
                                                              45 | 46 | 47 | 48 | 49 | 50 |
                                                              函数名接口描述
                                                              51 |
                                                              52 |
                                                              53 |
                                                              处理脚本:
                                                              54 | 55 |
                                                              56 | 处理结果: 57 | 58 | 59 |
                                                              60 | 61 |
                                                              62 | cal 63 |
                                                              64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /tool1.html: -------------------------------------------------------------------------------- 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 | 33 | 34 | 35 | 36 | 37 | 38 | 42 | 43 | 44 | 45 | 46 | 49 | 50 | 51 | 52 | 53 |
                                                              匹配模式:目标内容:
                                                              搜索模式:替换为:
                                                              47 | 48 |
                                                              54 |
                                                              如果是搜索,搜索目标内容的结果均会在处理结果栏显示,结果的第一行会统计结果的数目,常规搜索结果用<结果>表示。如果是替换,那么结果栏会显示替换后的文本。替换的内容只能是普通文本,不能作为正则表达式。
                                                              55 |
                                                              如果使用正则表达式搜索,请确保目标内容一定是合法的完整JS正则表达式,即以/开头的完整内容,如/./,如果需要属性参数,写在最后面,如/./igm。可以参考下面的正则表达式列表的格式。
                                                              56 |
                                                              普通统计会统计字数、单词数、分句数、句子数和段落数。详细统计会在普通统计的基础上统计每个字符出现的数目以及每个单词出现的数目并降序输出。
                                                              57 |
                                                              58 | 常用正则表达式列表:(点击即可复制到搜索文本框) 59 |
                                                              60 |
                                                              61 | 62 | 63 | 64 | 65 | 66 |
                                                              正则表达式功能描述
                                                              67 |
                                                              68 |
                                                              69 |
                                                              待处理文本:
                                                              70 | 71 |
                                                              72 | 处理结果: 73 | 74 | 75 |
                                                              76 | 77 |
                                                              78 | text 79 |
                                                              80 | 81 | 82 | 83 | -------------------------------------------------------------------------------- /tool2.html: -------------------------------------------------------------------------------- 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 | 33 | 34 | 38 | 39 | 40 | 41 | 42 | 43 | 47 | 48 | 49 | 50 | 51 | 52 | 53 |
                                                              随机方式:是否允许重复:
                                                              抽取次数:是否折叠结果:
                                                              54 |
                                                              可以直接在下方抽取项目列表直接添加或编辑要抽取的内容,也可以通过文本导入,导入的文本仅支持纯文本格式。常规模式下,每一行代表一个待抽取项目(不统计空行)。加权模式下每一行以最后一个空格分开两部分,前半部分是待抽取项目,后半部分是权重(数字)。如果没有后半部分,默认权重为1。
                                                              55 |
                                                              抽取项目列表中的权重仅在随机方式为加权时起作用,如果随机方式为常规,那么权重全部都会认为是1,而不是抽取项目列表里的具体值。
                                                              56 |
                                                              当允许重复时,多次抽取的内容可能会出现重复;否则,抽取的内容会保证互不重复。不允许重复时,抽取次数必须不大于项目数目。
                                                              57 |
                                                              允许重复时,如果选择折叠结果,那么所有相同的项目会合并显示并按降序显示;否则会按照抽取到的时间先后显示。
                                                              58 |
                                                              59 | 抽取项目列表: 60 |
                                                              61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 72 | 73 |
                                                              序号项目名称权重 70 |
                                                              添加一项
                                                              71 |
                                                              74 | 79 |
                                                              80 |
                                                              81 | 处理结果: 82 | 83 | 84 | 85 |
                                                              86 | 87 |
                                                              88 | random 89 |
                                                              90 | 91 | 92 | 93 | -------------------------------------------------------------------------------- /tool3.html: -------------------------------------------------------------------------------- 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 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 52 | 55 | 56 | 57 | 58 |
                                                              乱数假文语言:汉字数量:
                                                              段落数:单词最大长度:
                                                              句子最短长度:句子最长长度:
                                                                50 | 51 | 53 | 54 |
                                                              59 |
                                                              60 |
                                                              生成结果:
                                                              61 | 62 |
                                                              63 | 64 | 72 | lorem 73 |
                                                              74 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /tools.html: -------------------------------------------------------------------------------- 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 |
                                                              这个在线工具可以生成一篇随机文本,文本内容支持中英双语,弥补了Emmet语法只可以生成lorem英文乱数假文的不足。支持自定义文本长度、文本内容、句子和段落长度。支持结果文本导出。 44 |
                                                              45 |
                                                              46 | 50 |
                                                              51 | 52 | 53 | 54 | --------------------------------------------------------------------------------