diff --git a/darcycool/0000/add_digits.py b/darcycool/0000/add_digits.py
new file mode 100644
index 00000000..0964692f
--- /dev/null
+++ b/darcycool/0000/add_digits.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# 第 0000 题: 将你的 QQ 头像(或者微博头像)右上角加上红色的数字,类似于微信未读信息数量那种提示效果。 类似于图中效果
+
+from PIL import Image, ImageDraw, ImageFont
+
+dogIm = Image.open('photo.jpg')
+width, high = dogIm.size
+draw = ImageDraw.Draw(dogIm)
+draw.text((width - 10, 0), '4', fill='red', font=ImageFont.truetype('Avenir.ttc', 10))
+dogIm.save('dog.jpg')
diff --git a/darcycool/0000/dog.jpg b/darcycool/0000/dog.jpg
new file mode 100644
index 00000000..f899717d
Binary files /dev/null and b/darcycool/0000/dog.jpg differ
diff --git a/darcycool/0000/photo.jpg b/darcycool/0000/photo.jpg
new file mode 100644
index 00000000..2adb08f9
Binary files /dev/null and b/darcycool/0000/photo.jpg differ
diff --git a/darcycool/0001/generator_activation_code.py b/darcycool/0001/generator_activation_code.py
new file mode 100644
index 00000000..f27d2fdc
--- /dev/null
+++ b/darcycool/0001/generator_activation_code.py
@@ -0,0 +1,17 @@
+# -*- coding: utf-8 -*-
+# 第 0001 题: 做为 Apple Store App 独立开发者,你要搞限时促销,为你的应用生成激活码(或者优惠券),使用 Python 如何生成 200 个激活码(或者优惠券)?
+import string
+import random
+
+
+def id_generator(size=20, chars=string.ascii_uppercase + string.digits):
+ return ''.join(random.choice(chars) for _ in range(size))
+
+
+def get_activation_code(size=200):
+ activation_code = set()
+ for i in range(size):
+ activation_code.add(id_generator())
+ return activation_code
+
+print(get_activation_code())
diff --git a/darcycool/0002/store_into_mysql.py b/darcycool/0002/store_into_mysql.py
new file mode 100644
index 00000000..919c8bc9
--- /dev/null
+++ b/darcycool/0002/store_into_mysql.py
@@ -0,0 +1,35 @@
+# -*- coding: utf-8 -*-
+# 第 0002 题: 将 0001 题生成的 200 个激活码(或者优惠券)保存到 MySQL 关系型数据库中。
+import random
+import string
+
+import pymysql
+
+
+def id_generator(size=20, chars=string.ascii_uppercase + string.digits):
+ return ''.join(random.choice(chars) for _ in range(size))
+
+
+def get_activation_code(size=200, len=20):
+ activation_code = set()
+ for i in range(size):
+ activation_code.add(id_generator(len))
+ return activation_code
+
+
+conn = pymysql.connect(host='127.0.0.1',
+ port=3306,
+ user='root',
+ passwd='1234',
+ db='darcy')
+cursor = conn.cursor()
+sql = 'insert into activation_code (code) VALUE (%s)'
+
+try:
+ cursor.executemany(sql, get_activation_code())
+except Exception as e:
+ print('执行Mysql: %s时出错: % s' % (sql, e))
+finally:
+ cursor.close()
+ conn.commit()
+ conn.close()
diff --git a/darcycool/0003/store_into_redis.py b/darcycool/0003/store_into_redis.py
new file mode 100644
index 00000000..86513d06
--- /dev/null
+++ b/darcycool/0003/store_into_redis.py
@@ -0,0 +1,30 @@
+# -*- coding: utf-8 -*-
+# 第 0003 题: 将 0001 题生成的 200 个激活码(或者优惠券)保存到 Redis 非关系型数据库中。
+import random
+import string
+import redis
+
+
+def id_generator(size=20, chars=string.ascii_uppercase + string.digits):
+ return ''.join(random.choice(chars) for _ in range(size))
+
+
+def get_activation_code(size=200, len=20):
+ activation_code = set()
+ for i in range(size):
+ activation_code.add(id_generator(len))
+ return activation_code
+
+
+def save_codes(codes):
+ r = redis.Redis(host='127.0.0.1',
+ port=6379,
+ db=0)
+ pipeline = r.pipeline()
+ for c in codes:
+ pipeline.sadd('code', c)
+ pipeline.execute()
+ return r.scard('code')
+
+
+save_codes(get_activation_code(200, 20))
diff --git a/darcycool/0004/count_words.py b/darcycool/0004/count_words.py
new file mode 100644
index 00000000..00a2f338
--- /dev/null
+++ b/darcycool/0004/count_words.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# 第 0004 题: 任一个英文的纯文本文件,统计其中的单词出现的个数。
+import re
+
+file = open('words.txt', 'r')
+str = file.read()
+
+reObj = re.compile('\b?(\w+)\b?')
+words = reObj.findall(str)
+
+wordDict = dict()
+
+for word in words:
+ if word.lower() in wordDict:
+ wordDict[word.lower()] += 1
+ else:
+ wordDict[word.lower()] = 1
+
+for key, value in wordDict.items():
+ print('%s: %s' % (key, value))
diff --git a/darcycool/0004/words.txt b/darcycool/0004/words.txt
new file mode 100644
index 00000000..44e2c81c
--- /dev/null
+++ b/darcycool/0004/words.txt
@@ -0,0 +1 @@
+The amount of stupidity in this story warrants that this is going to be somewhat long, so I start at the end: as the title says, an 18 year old guy was arrested two days ago for 'hacking' the new Budapest public transport e-Ticket system a week before, even though he immediately reported the vulnerability he found.
diff --git a/darcycool/0005/change_images_size.py b/darcycool/0005/change_images_size.py
new file mode 100644
index 00000000..7f1f7cf1
--- /dev/null
+++ b/darcycool/0005/change_images_size.py
@@ -0,0 +1,49 @@
+# -*- coding: utf-8 -*-
+# 第 0005 题: 你有一个目录,装了很多照片,把它们的尺寸变成都不大于 iPhone5 分辨率的大小。
+import os
+
+from PIL import Image
+
+rootDir = 'imgs/'
+
+
+def judge_size(img):
+ imgSize = img.size
+ return max(imgSize) > 1136
+
+
+def return_size(img):
+ max, min = img.size
+ if max > min:
+ return max, min
+ else:
+ return min, max
+
+
+def change_size(img, max, min):
+ value = max / 1136
+ min = int(min / value)
+ newImg = img.resize((1136, min), Image.ANTIALIAS)
+ return newImg
+
+
+for parent, dirnames, filenames in os.walk(rootDir):
+ for filename in filenames:
+ fName = filename
+ print(filename)
+ filename = parent + os.sep + filename
+ fPostfix = os.path.splitext(filename)[1]
+ try:
+ img = Image.open(filename)
+ except:
+ print(filename)
+ continue
+ # img.load()
+ print(filename)
+ print(fPostfix)
+ if (fPostfix == '.jpg' or fPostfix == '.png' or fPostfix == '.JPG' or fPostfix != '.PNG'):
+ print(judge_size(img))
+ if (judge_size(img) == True):
+ max, min = return_size(img)
+ newimg = change_size(img, max, min)
+ newimg.save(rootDir + os.sep + fName)
diff --git a/darcycool/0005/imgs/photo.jpg b/darcycool/0005/imgs/photo.jpg
new file mode 100644
index 00000000..2adb08f9
Binary files /dev/null and b/darcycool/0005/imgs/photo.jpg differ
diff --git a/darcycool/0006/diary/01.txt b/darcycool/0006/diary/01.txt
new file mode 100644
index 00000000..298696ee
--- /dev/null
+++ b/darcycool/0006/diary/01.txt
@@ -0,0 +1,6 @@
+Our goal is to generate for you a complete and modern Web app or microservice architecture, unifying:
+
+A high-performance and robust Java stack on the server side with Spring Boot
+A sleek, modern, mobile-first front-end with Angular and Bootstrap
+A robust microservice architecture with JHipster Registry, Netflix OSS, ELK stack and Docker
+A powerful workflow to build your application with Yeoman, Webpack/Gulp and Maven/Gradle
diff --git a/darcycool/0006/diary/02.txt b/darcycool/0006/diary/02.txt
new file mode 100644
index 00000000..0f16ee12
--- /dev/null
+++ b/darcycool/0006/diary/02.txt
@@ -0,0 +1,8 @@
+You can checkout a sample generated AngularJS 1 application here.
+
+You can checkout a sample generated Angular 4 application here.
+
+JHipster is Open Source, and all development is done on GitHub
+
+If you want to code with us, feel free to join!
+If you like the project, please give us a star on GitHub
diff --git a/darcycool/0006/diary/03.txt b/darcycool/0006/diary/03.txt
new file mode 100644
index 00000000..3dbd3b72
--- /dev/null
+++ b/darcycool/0006/diary/03.txt
@@ -0,0 +1,9 @@
+Install JHipster yarn global add generator-jhipster
+
+Create a new directory and go into it mkdir myApp && cd myApp
+
+Run JHipster and follow instructions on screen jhipster
+
+Model your entities with JDL Studio and download the resulting jhipster-jdl.jh file
+
+Generate your entities with jhipster import-jdl jhipster-jdl.jh
diff --git a/darcycool/0006/important_word.py b/darcycool/0006/important_word.py
new file mode 100644
index 00000000..b92127a2
--- /dev/null
+++ b/darcycool/0006/important_word.py
@@ -0,0 +1,37 @@
+# -*- coding: utf-8 -*-
+# 第 0006 题: 你有一个目录,放了你一个月的日记,都是 txt,为了避免分词的问题,假设内容都是英文,请统计出你认为每篇日记最重要的词。
+import operator
+import os
+import re
+
+rootDir = 'diary/'
+
+
+def count_words(filename, words):
+ wordDict = dict()
+ for word in words:
+ if word.lower() in wordDict:
+ wordDict[word.lower()] += 1
+ else:
+ wordDict[word.lower()] = 1
+ print('%s word:%s' % (filename, max(wordDict.items(), key=operator.itemgetter(1))[0]))
+
+
+for top, dirnames, filenames in os.walk(rootDir):
+ for filename in filenames:
+ file = open(rootDir + filename, 'r')
+ str = file.read()
+ reObj = re.compile('\b?(\w+)\b?')
+ words = reObj.findall(str)
+ count_words(filename, words)
+
+from collections import Counter
+
+for top, dirnames, filenames in os.walk(rootDir):
+ for filename in filenames:
+ file = open(rootDir + filename, 'r')
+ str = file.read()
+ reObj = re.compile('\b?(\w+)\b?')
+ words = reObj.findall(str)
+ words = map(lambda w: w.lower(), words)
+ print(filename, Counter(words).most_common(1))
diff --git a/darcycool/0007/analysis_file.py b/darcycool/0007/analysis_file.py
new file mode 100644
index 00000000..b35fc55e
--- /dev/null
+++ b/darcycool/0007/analysis_file.py
@@ -0,0 +1,17 @@
+# -*- coding: utf-8 -*-
+# 第 0007 题: 有个目录,里面是你自己写过的程序,统计一下你写过多少行代码。包括空行和注释,但是要分别列出来。
+import linecache
+
+file = open('source/change_images_size.py', 'r')
+
+fileLines = len(file.readlines())
+
+print('代码行数:%s' % fileLines)
+
+blankLines = 0
+
+for line in range(fileLines):
+ if len((linecache.getline('source/change_images_size.py', line).split())) == 0:
+ blankLines += 1
+
+print(blankLines)
diff --git a/darcycool/0007/source/change_images_size.py b/darcycool/0007/source/change_images_size.py
new file mode 100644
index 00000000..7f1f7cf1
--- /dev/null
+++ b/darcycool/0007/source/change_images_size.py
@@ -0,0 +1,49 @@
+# -*- coding: utf-8 -*-
+# 第 0005 题: 你有一个目录,装了很多照片,把它们的尺寸变成都不大于 iPhone5 分辨率的大小。
+import os
+
+from PIL import Image
+
+rootDir = 'imgs/'
+
+
+def judge_size(img):
+ imgSize = img.size
+ return max(imgSize) > 1136
+
+
+def return_size(img):
+ max, min = img.size
+ if max > min:
+ return max, min
+ else:
+ return min, max
+
+
+def change_size(img, max, min):
+ value = max / 1136
+ min = int(min / value)
+ newImg = img.resize((1136, min), Image.ANTIALIAS)
+ return newImg
+
+
+for parent, dirnames, filenames in os.walk(rootDir):
+ for filename in filenames:
+ fName = filename
+ print(filename)
+ filename = parent + os.sep + filename
+ fPostfix = os.path.splitext(filename)[1]
+ try:
+ img = Image.open(filename)
+ except:
+ print(filename)
+ continue
+ # img.load()
+ print(filename)
+ print(fPostfix)
+ if (fPostfix == '.jpg' or fPostfix == '.png' or fPostfix == '.JPG' or fPostfix != '.PNG'):
+ print(judge_size(img))
+ if (judge_size(img) == True):
+ max, min = return_size(img)
+ newimg = change_size(img, max, min)
+ newimg.save(rootDir + os.sep + fName)
diff --git a/darcycool/0008/find_html_body.py b/darcycool/0008/find_html_body.py
new file mode 100644
index 00000000..e2ea0733
--- /dev/null
+++ b/darcycool/0008/find_html_body.py
@@ -0,0 +1,11 @@
+# -*- coding: utf-8 -*-
+# 第 0008 题: 一个HTML文件,找出里面的正文。
+import requests
+from bs4 import BeautifulSoup
+
+r = 'https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html'
+headers = {
+ 'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}
+url = requests.get(r, headers=headers)
+soup = BeautifulSoup(url.text, 'html.parser')
+print(soup.get_text())
diff --git a/darcycool/0009/find_link.py b/darcycool/0009/find_link.py
new file mode 100644
index 00000000..ba1790bf
--- /dev/null
+++ b/darcycool/0009/find_link.py
@@ -0,0 +1,11 @@
+# -*- coding: utf-8 -*-
+# 第 0009 题: 一个HTML文件,找出里面的链接。
+
+import requests
+from bs4 import BeautifulSoup
+
+url = r'https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html'
+response = requests.get(url)
+soup = BeautifulSoup(response.text)
+for link in soup.find_all('a'):
+ print(link.get('href'))
diff --git a/darcycool/0010/generator_verification_code.py b/darcycool/0010/generator_verification_code.py
new file mode 100644
index 00000000..d9c9a97f
--- /dev/null
+++ b/darcycool/0010/generator_verification_code.py
@@ -0,0 +1,44 @@
+# -*- coding: utf-8 -*-
+# 第 0010 题: 使用 Python 生成类似于下图中的字母验证码图片
+import random
+import string
+
+from PIL import ImageDraw, Image, ImageFont, ImageFilter
+
+
+def get_code():
+ return [random.choice(string.ascii_letters) for _ in range(4)]
+
+
+def get_point_color():
+ return (random.randint(65, 90), random.randint(65, 90), random.randint(65, 90))
+
+
+def get_color():
+ return (random.randint(32, 127), random.randint(32, 127), random.randint(32, 127))
+
+
+def get_picture():
+ width = 230
+ height = 60
+ # 画布
+ im = Image.new('RGB', (width, height), (255, 255, 255))
+ font = ImageFont.truetype('Avenir.ttc', 40)
+ draw = ImageDraw.Draw(im)
+ code = get_code()
+
+ for t in range(4):
+ draw.text((60 * t + 10, 0), code[t], font=font, fill=get_color())
+
+ # 噪点
+ for _ in range(random.randint(2000, 3000)):
+ draw.point((random.randint(0, width), random.randint(0, height)), fill=get_point_color())
+
+ # 模糊
+ im = im.filter(ImageFilter.BLUR)
+
+ im.save("".join(code) + '.jpg', 'jpeg')
+
+
+if __name__ == '__main__':
+ get_picture()
diff --git a/darcycool/0011/filter_words.py b/darcycool/0011/filter_words.py
new file mode 100644
index 00000000..2614fc89
--- /dev/null
+++ b/darcycool/0011/filter_words.py
@@ -0,0 +1,71 @@
+# -*- coding: utf-8 -*-
+# 第 0011 题: 敏感词文本文件 filtered_words.txt,里面的内容为以下内容,当用户输入敏感词语时,则打印出 Freedom,否则打印出 Human Rights。
+
+
+class DFAFilter:
+ def __init__(self):
+ self.keyword_chains = {}
+ self.delimit = '\x00'
+
+ def add(self, keyword):
+ keyword = keyword.lower()
+ chars = keyword.strip()
+ if not chars:
+ return
+ level = self.keyword_chains
+ for i in range(len(chars)):
+ if chars[i] in level:
+ level = level[chars[i]]
+ else:
+ if not isinstance(level, dict):
+ break
+ for j in range(i, len(chars)):
+ level[chars[j]] = {}
+ last_level, last_char = level, chars[j]
+ level = level[chars[j]]
+ last_level[last_char] = {self.delimit: 0}
+ break
+ if i == len(chars) - 1:
+ level[self.delimit] = 0
+
+ def parse(self, path):
+ with open(path) as f:
+ for keyword in f:
+ self.add(keyword.strip())
+
+ def filter(self, message, repl="*"):
+ message = message.lower()
+ ret = []
+ start = 0
+ while start < len(message):
+ level = self.keyword_chains
+ step_ins = 0
+ for char in message[start:]:
+ if char in level:
+ step_ins += 1
+ if self.delimit not in level[char]:
+ level = level[char]
+ else:
+ print('Freedom')
+ return
+ else:
+ ret.append(message[start])
+ break
+ else:
+ ret.append(message[start])
+ start += 1
+
+ print('Human Rights')
+ return
+
+
+if __name__ == "__main__":
+
+ dfa = DFAFilter()
+
+ file = open('filtered_words.txt', 'r')
+ for w in file.readlines():
+ dfa.add(w)
+
+ dfa.filter("你好北京北京京")
+ dfa.filter("你好")
diff --git a/darcycool/0011/filtered_words.txt b/darcycool/0011/filtered_words.txt
new file mode 100644
index 00000000..1b4f2244
--- /dev/null
+++ b/darcycool/0011/filtered_words.txt
@@ -0,0 +1,11 @@
+北京
+程序员
+公务员
+领导
+牛比
+牛逼
+你娘
+你妈
+love
+sex
+jiangge
diff --git a/darcycool/0012/filter_words.py b/darcycool/0012/filter_words.py
new file mode 100644
index 00000000..ed14cd66
--- /dev/null
+++ b/darcycool/0012/filter_words.py
@@ -0,0 +1,69 @@
+# -*- coding: utf-8 -*-
+# 第 0012 题: 敏感词文本文件 filtered_words.txt,里面的内容 和 0011题一样,当用户输入敏感词语,则用 星号 * 替换,例如当用户输入「北京是个好城市」,则变成「**是个好城市」。
+
+
+class DFAFilter:
+ def __init__(self):
+ self.keyword_chains = {}
+ self.delimit = '\x00'
+
+ def add(self, keyword):
+ keyword = keyword.lower()
+ chars = keyword.strip()
+ if not chars:
+ return
+ level = self.keyword_chains
+ for i in range(len(chars)):
+ if chars[i] in level:
+ level = level[chars[i]]
+ else:
+ if not isinstance(level, dict):
+ break
+ for j in range(i, len(chars)):
+ level[chars[j]] = {}
+ last_level, last_char = level, chars[j]
+ level = level[chars[j]]
+ last_level[last_char] = {self.delimit: 0}
+ break
+ if i == len(chars) - 1:
+ level[self.delimit] = 0
+
+ def parse(self, path):
+ with open(path) as f:
+ for keyword in f:
+ self.add(keyword.strip())
+
+ def filter(self, message, repl="*"):
+ message = message.lower()
+ ret = []
+ start = 0
+ while start < len(message):
+ level = self.keyword_chains
+ step_ins = 0
+ for char in message[start:]:
+ if char in level:
+ step_ins += 1
+ if self.delimit not in level[char]:
+ level = level[char]
+ else:
+ ret.append(repl * step_ins)
+ start += step_ins - 1
+ break
+ else:
+ ret.append(message[start])
+ break
+ else:
+ ret.append(message[start])
+ start += 1
+
+ return ''.join(ret)
+
+if __name__ == "__main__":
+
+ dfa = DFAFilter()
+
+ file = open('filtered_words.txt', 'r')
+ for w in file.readlines():
+ dfa.add(w)
+
+ print(dfa.filter("你好北京北京京"))
diff --git a/darcycool/0012/filtered_words.txt b/darcycool/0012/filtered_words.txt
new file mode 100644
index 00000000..1b4f2244
--- /dev/null
+++ b/darcycool/0012/filtered_words.txt
@@ -0,0 +1,11 @@
+北京
+程序员
+公务员
+领导
+牛比
+牛逼
+你娘
+你妈
+love
+sex
+jiangge
diff --git a/darcycool/0014/student.txt b/darcycool/0014/student.txt
new file mode 100644
index 00000000..6851d593
--- /dev/null
+++ b/darcycool/0014/student.txt
@@ -0,0 +1,5 @@
+{
+ "1":["张三",150,120,100],
+ "2":["李四",90,99,95],
+ "3":["王五",60,66,68]
+}
diff --git a/darcycool/0014/write_into_excel.py b/darcycool/0014/write_into_excel.py
new file mode 100644
index 00000000..8a87f5ca
--- /dev/null
+++ b/darcycool/0014/write_into_excel.py
@@ -0,0 +1,21 @@
+# -*- coding: utf-8 -*-
+# 第 0014 题: 纯文本文件 student.txt为学生信息,请将上述内容写到 student.xls 文件中
+
+import json
+from collections import OrderedDict
+
+import xlwt
+
+file = open('student.txt', 'r')
+
+students = json.loads(file.read(), object_pairs_hook=OrderedDict)
+
+wb = xlwt.Workbook()
+ws = wb.add_sheet('学生信息')
+
+for index, items in enumerate(students.items()):
+ ws.write(index, 0, items[0])
+ for j, v in enumerate(items[1]):
+ ws.write(index, j + 1, v)
+
+wb.save('学生信息.xls')
diff --git "a/darcycool/0014/\345\255\246\347\224\237\344\277\241\346\201\257.xls" "b/darcycool/0014/\345\255\246\347\224\237\344\277\241\346\201\257.xls"
new file mode 100644
index 00000000..96d1f5e0
Binary files /dev/null and "b/darcycool/0014/\345\255\246\347\224\237\344\277\241\346\201\257.xls" differ
diff --git a/darcycool/0015/city.txt b/darcycool/0015/city.txt
new file mode 100644
index 00000000..b5a6874d
--- /dev/null
+++ b/darcycool/0015/city.txt
@@ -0,0 +1,5 @@
+{
+ "1" : "上海",
+ "2" : "北京",
+ "3" : "成都"
+}
diff --git a/darcycool/0015/city.xls b/darcycool/0015/city.xls
new file mode 100644
index 00000000..b020435b
Binary files /dev/null and b/darcycool/0015/city.xls differ
diff --git a/darcycool/0015/write_into_excel.py b/darcycool/0015/write_into_excel.py
new file mode 100644
index 00000000..3eda8ff6
--- /dev/null
+++ b/darcycool/0015/write_into_excel.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+# 第 0015 题: 纯文本文件 city.txt为城市信息, 里面的内容(包括花括号),请将上述内容写到 city.xls 文件中
+import collections
+import json
+
+import xlwt
+
+wb = xlwt.Workbook()
+ws = wb.add_sheet('city')
+
+file = open('city.txt', 'r')
+city = json.load(file)
+print(city)
+
+city = collections.OrderedDict(sorted(city.items()))
+
+for index, (key, value) in enumerate(city.items()):
+ print(index, key, value)
+ ws.write(index, 0, key)
+ ws.write(index, 1, value)
+
+wb.save('city.xls')
+file.close()
diff --git a/darcycool/0016/numbers.txt b/darcycool/0016/numbers.txt
new file mode 100644
index 00000000..6b378693
--- /dev/null
+++ b/darcycool/0016/numbers.txt
@@ -0,0 +1,5 @@
+[
+ [1, 82, 65535],
+ [20, 90, 13],
+ [26, 809, 1024]
+]
diff --git a/darcycool/0016/numbers.xls b/darcycool/0016/numbers.xls
new file mode 100644
index 00000000..0c199c0f
Binary files /dev/null and b/darcycool/0016/numbers.xls differ
diff --git a/darcycool/0016/write_into_excel.py b/darcycool/0016/write_into_excel.py
new file mode 100644
index 00000000..f16c9971
--- /dev/null
+++ b/darcycool/0016/write_into_excel.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# 第 0016 题: 纯文本文件 numbers.txt, 里面的内容(包括方括号),请将上述内容写到 numbers.xls 文件中
+import collections
+import json
+
+import xlwt
+
+with open('numbers.txt', 'r') as f:
+ data = json.load(f)
+ print(data)
+
+wb = xlwt.Workbook()
+ws = wb.add_sheet('number')
+
+for index, item in enumerate(data):
+ for j, value in enumerate(item):
+ print(index, j, value)
+ ws.write(index, j, value)
+
+wb.save('numbers.xls')
diff --git a/darcycool/0017/excel2xml.py b/darcycool/0017/excel2xml.py
new file mode 100644
index 00000000..22387c3d
--- /dev/null
+++ b/darcycool/0017/excel2xml.py
@@ -0,0 +1,35 @@
+# -*- coding: utf-8 -*-
+# 第 0017 题: 将 第 0014 题中的 student.xls 文件中的内容写到 student.xml 文件中
+import json
+import xml.etree.cElementTree as ET
+from collections import OrderedDict
+from xml.dom import minidom
+
+import xlrd
+
+root = ET.Element("root")
+student = ET.SubElement(root, "students")
+
+wb = xlrd.open_workbook('student.xls')
+sheet = wb.sheet_by_index(0)
+number_of_rows = sheet.nrows
+number_of_columns = sheet.ncols
+
+student_dict = OrderedDict()
+
+for row in range(number_of_rows):
+ items = [sheet.cell(row, col).value for col in range(1, number_of_columns)]
+ student_dict[sheet.cell(row, 0).value] = items
+print(student_dict)
+
+json_str = json.dumps(student_dict, ensure_ascii=False, indent=4)
+print(json_str)
+
+student.text = json_str
+
+tree = ET.ElementTree(root)
+tree.write('student.xml', encoding='utf-8', xml_declaration=True)
+
+xmlstr = minidom.parseString(ET.tostring(root)).toprettyxml()
+with open('student1.xml', 'w') as f:
+ f.write(xmlstr)
diff --git a/NKUCodingCat/0017/student.xls b/darcycool/0017/student.xls
similarity index 83%
rename from NKUCodingCat/0017/student.xls
rename to darcycool/0017/student.xls
index 8329865c..ea1fc44e 100644
Binary files a/NKUCodingCat/0017/student.xls and b/darcycool/0017/student.xls differ
diff --git a/darcycool/0017/student.xml b/darcycool/0017/student.xml
new file mode 100644
index 00000000..6bdca54e
--- /dev/null
+++ b/darcycool/0017/student.xml
@@ -0,0 +1,21 @@
+
+{
+ "1": [
+ "张三",
+ 150.0,
+ 120.0,
+ 100.0
+ ],
+ "2": [
+ "李四",
+ 90.0,
+ 99.0,
+ 95.0
+ ],
+ "3": [
+ "王五",
+ 60.0,
+ 66.0,
+ 68.0
+ ]
+}
\ No newline at end of file
diff --git a/darcycool/0017/student1.xml b/darcycool/0017/student1.xml
new file mode 100644
index 00000000..2042335a
--- /dev/null
+++ b/darcycool/0017/student1.xml
@@ -0,0 +1,23 @@
+
+
+ {
+ "1": [
+ "张三",
+ 150.0,
+ 120.0,
+ 100.0
+ ],
+ "2": [
+ "李四",
+ 90.0,
+ 99.0,
+ 95.0
+ ],
+ "3": [
+ "王五",
+ 60.0,
+ 66.0,
+ 68.0
+ ]
+}
+
diff --git a/darcycool/0018/city.xls b/darcycool/0018/city.xls
new file mode 100644
index 00000000..157d37d6
Binary files /dev/null and b/darcycool/0018/city.xls differ
diff --git a/darcycool/0018/city.xml b/darcycool/0018/city.xml
new file mode 100644
index 00000000..05b4ac3d
--- /dev/null
+++ b/darcycool/0018/city.xml
@@ -0,0 +1,6 @@
+
+{
+ "1": "上海",
+ "2": "北京",
+ "3": "成都"
+}
\ No newline at end of file
diff --git a/darcycool/0018/excel2xml.py b/darcycool/0018/excel2xml.py
new file mode 100644
index 00000000..ae39bb81
--- /dev/null
+++ b/darcycool/0018/excel2xml.py
@@ -0,0 +1,29 @@
+# -*- coding: utf-8 -*-
+# 第 0018 题: 将 第 0015 题中的 city.xls 文件中的内容写到 city.xml 文件中
+import xlrd
+from collections import OrderedDict
+import json
+
+import xml.etree.cElementTree as ET
+
+wb = xlrd.open_workbook('city.xls')
+sheet = wb.sheet_by_index(0)
+number_of_row = sheet.nrows
+number_of_col = sheet.ncols
+
+city = OrderedDict()
+
+for row in range(number_of_row):
+ city[sheet.cell(row, 0).value] = sheet.cell(row, 1).value
+
+print(city)
+json_str = json.dumps(city, ensure_ascii=False, indent=4)
+print(json_str)
+
+root = ET.Element('root')
+cities = ET.SubElement(root, 'citys')
+
+cities.text = json_str
+
+tree = ET.ElementTree(root)
+tree.write('city.xml', encoding='utf8', xml_declaration=True)
diff --git a/darcycool/0019/numbers.xls b/darcycool/0019/numbers.xls
new file mode 100644
index 00000000..3e606af7
Binary files /dev/null and b/darcycool/0019/numbers.xls differ
diff --git a/darcycool/0019/numbers.xml b/darcycool/0019/numbers.xml
new file mode 100644
index 00000000..56a909a0
--- /dev/null
+++ b/darcycool/0019/numbers.xml
@@ -0,0 +1,2 @@
+
+[[1.0, 82.0, 65535.0], [20.0, 90.0, 13.0], [26.0, 809.0, 1024.0]]
\ No newline at end of file
diff --git a/darcycool/0019/xls2xml.py b/darcycool/0019/xls2xml.py
new file mode 100644
index 00000000..d7dc04a5
--- /dev/null
+++ b/darcycool/0019/xls2xml.py
@@ -0,0 +1,24 @@
+# -*- coding: utf-8 -*-
+# 第 0019 题: 将 第 0016 题中的 numbers.xls 文件中的内容写到 numbers.xml 文件中
+import xlrd
+import xml.etree.cElementTree as ET
+
+wb = xlrd.open_workbook('numbers.xls')
+sheet = wb.sheet_by_index(0)
+number_of_row = sheet.nrows
+number_of_col = sheet.ncols
+
+numbers = []
+
+for row in range(number_of_row):
+ number = [sheet.cell(row, col).value for col in range(number_of_col)]
+ numbers.append(number)
+
+print(numbers)
+print(isinstance(numbers, list))
+root = ET.Element('root')
+numbers_element = ET.SubElement(root, 'numbers')
+numbers_element.text = str(numbers)
+
+tree = ET.ElementTree(root)
+tree.write('numbers.xml', xml_declaration=True, encoding='utf-8')
diff --git a/darcycool/0021/hashpassword.py b/darcycool/0021/hashpassword.py
new file mode 100644
index 00000000..7c5912a8
--- /dev/null
+++ b/darcycool/0021/hashpassword.py
@@ -0,0 +1,16 @@
+import uuid
+from hashlib import sha256
+
+
+def encrypt_password(password, salt=None):
+ if salt is None:
+ salt = uuid.uuid4().hex
+
+ return sha256(salt.encode() + password.encode()).hexdigest() + ':' + salt
+
+
+def check_password(hashed_password, user_password):
+ password, salt = hashed_password.split(':')
+ return password == sha256(salt.encode() + user_password.encode()).hexdigest()
+
+print(encrypt_password('123456', '666'))