Crossin的编程教室

标题: 新人報到 [打印本页]

作者: manhong2112    时间: 2016-1-17 12:07
标题: 新人報到
本帖最后由 manhong2112 于 2016-1-17 12:08 编辑

在這裡把寫過的程式記錄下來,順便把那些題目做完,差不多就是這樣吧!

第一個程式當然少不了Hello World啦
  1. print("Hello World!")
复制代码

作者: manhong2112    时间: 2016-1-17 12:25
本帖最后由 manhong2112 于 2016-1-17 13:52 编辑

第二題,兩數相加
  1. a = int(input()) #讀取輸入
  2. b = int(input()) #讀取輸入
  3. print(a+b) #print出a + b
复制代码

作者: manhong2112    时间: 2016-1-17 12:27
第三題,輸出1到100
  1. for i in range(1,101):
  2.   print(i)
复制代码

作者: manhong2112    时间: 2016-1-17 12:29
本帖最后由 manhong2112 于 2016-1-17 13:53 编辑

第四題,1至100的和
  1. a = 0
  2. for i in range(1,101):
  3.   a += i # 將目前的數加至總數
  4. print(a)
复制代码
  1. print((1+100)*100/2) # 公式解
复制代码

作者: manhong2112    时间: 2016-1-17 12:32
本帖最后由 manhong2112 于 2016-1-17 13:56 编辑

第5題,等比數列
  1. a = int(input())
  2. b = 1
  3. for i in range(1, 11):
  4.     print(b)
  5.     b *= a
复制代码
  1. from math import pow #導入次方函數
  2. a = int(input())
  3. for i in range(0, 10):
  4.     print(pow(a, i)) #調用函數, a^i
复制代码

作者: manhong2112    时间: 2016-1-17 12:50
本帖最后由 manhong2112 于 2016-1-17 14:05 编辑

第6題,斐波納契數列
  1. j = int(input())
  2. x, y = 1, 0 # 元組賦值,相等於 x = 1,y = 0

  3. for i in range(1, j + 1):
  4.     x, y = y, x + y # 同樣是元組賦值,相等於 x = y,y = x + y
  5.     print(y)
复制代码
  1. j = int(input())
  2. def f1(n): # 定義函數
  3.     if n <= 2:
  4.         return 1
  5.     return f1(n - 1) + f1(n - 2) # 調用自己,遞迴(遞歸)
  6. # f1(5)
  7. # f1(4) + f1(3)
  8. # (f1(3) + f1(2)) + (f1(2) + f1(1))
  9. # (f1(2) + f1(1) + 1)) + (1 + 1)
  10. # (1 + 1 + 1) + (1 + 1)
  11. # 5

  12. for i in range(1, j + 1):
  13.     print(f1(i)) # 印出 1 ~ j 的數
复制代码
  1. j = int(input())
  2. f = (lambda n: 1 if n <= 2 else f(n-1) + f(n-2))  # 同樣是遞迴(遞歸),不過用lambda
  3. for i in range(1, j + 1):
  4.     print(f(i))
复制代码

作者: manhong2112    时间: 2016-1-17 12:52
本帖最后由 manhong2112 于 2016-1-17 14:06 编辑

第7題,三角形
  1. i = int(input())
  2. for j in range(1, i + 1):
  3.     print(" " * (i - j) + "* " * j) # " " * ( i - j) 是 i - j 個" ","* " * j 就是j個 "* "
复制代码

作者: manhong2112    时间: 2016-1-17 12:59
本帖最后由 manhong2112 于 2016-1-17 14:13 编辑

第八題,1~9乘法表
  1. for i in range(1, 10): # 印出 i 由1~9 的 (j 由1~9的 i * j)
  2.     for j in range(1, 10): # 印出 j 由1~9的 i * j
  3.         print(i, "*", j, '=', i * j) # 印出 i * j = i * j的答案
复制代码
附加,方形乘法表
  1. print(end="\t")
  2. # 印出橫向 1 - 10,裝飾用
  3. for i in range(1, 10):
  4.     print(i, end="\t")
  5. print()
  6. # 印9次9格乘法表
  7. for i in range(1, 10):
  8.     print(i, end="\t")
  9.     # 印橫向9格乘法表
  10.     for j in range(1, 10):
  11.         print(i * j, end="\t")
  12.     print()
复制代码

作者: manhong2112    时间: 2016-1-17 13:08
本帖最后由 manhong2112 于 2016-1-17 14:22 编辑

第9題,求最大值
  1. j = 0 # 儲存目前最大的數值
  2. a = int(input()) # 第1次輸入,第1個數值
  3. if a > j:
  4.     j = a # 若 a 比 j 大,將最大的數值改為a
  5. a = int(input())# 第2次輸入,第2個數值
  6. if a > j:
  7.     j = a #同上
  8. a = int(input())# 第3次輸入,第3個數值
  9. if a > j:
  10.     j = a #同上
  11. print(j)
复制代码
  1. j = 0
  2. for i in range(0, 3): # 將3次輸入合併
  3.     k = int(input())
  4.     j = k if k > j else j
  5. print(j)
复制代码
  1. j = 0
  2. f = (lambda x, y: x if x > y else y) #用lambda + 三目運算式 (python中還是這樣叫嗎?) 判斷,若 x 比 y 大,返回 x 否則
  3. for i in range(0, 3):
  4.     k = int(input())
  5.     j = f(j,k) # 向lambda傳入參數
  6. print(j)
复制代码
  1. def f2(*x): #全塞在一起,沒甚麼解釋的,if 'y' in locals()判斷y有沒有宣告
  2.     for i in x: y = y if (y if 'y' in locals() else 0) > i else i
  3.     return y
  4. print(f2(int(input()), int(input()), int(input())))
复制代码

作者: manhong2112    时间: 2016-1-17 13:42
本帖最后由 manhong2112 于 2016-1-17 14:30 编辑

第10題,1000以內被3,5,7除餘數皆為2
  1. for i in range(1, 1001): #1 ~ 1000 的迴圈
  2.     if i % 3 == 2: #判斷 i / 3是否餘2
  3.         if i % 5 == 2:  #判斷 i / 5是否餘2
  4.             if i % 7 == 2:  #判斷 i / 7是否餘2
  5.                 print(i)
复制代码
  1. for i in range(1, 1001): print("", end=str(i) + "\n" if i % 3 == 2 and i % 5 == 2 and i % 7 == 2 else "")
  2. #三目運算式+邏輯運算符,若i % 3 == 2,i % 5 == 2,i % 7 == 2 旨成立,返回 i,否則返回空白,再輸出 i 或空白
复制代码
  1. print('\n'.join(str(i) for i in range(1, 1001) if i % 3 == 2 and i % 5 == 2 and i % 7 == 2))
  2. # 三目運算式+邏輯運算符+列表生成式,生成1~1000的數字,將符合判斷式的數字 (為了讓join肯動,要轉成字串) 加入列表,再由join將列表轉換成字串
复制代码

作者: manhong2112    时间: 2016-1-17 13:51
本帖最后由 manhong2112 于 2016-1-17 14:36 编辑

第11題,200內平方數是回文數的數字
  1. for i in range(1, 201):
  2.     print("", end=str(i) + "\n" if str(i * i) == str(i * i)[::-1] else "")
  3.     #str[::-1]是反轉的意思(str[start:stop:step],從start退到stop ,並沒有甚麼不對2333),若 i * i == 反轉後的i * i,輸出i,否則空白
复制代码
  1. for i in range(1, 201):
  2.     a = list(str(i * i)) # i * i 轉成字串,再轉成列表
  3.     b = list(str(i * i)) # 為了公平比較 ,一起轉
  4.     a.reverse() # 反轉
  5.     if a == b: # 若反轉前反相同,輸出
  6.         print(i)
复制代码
  1. print("\n".join(str(i) for i in range(1, 201) if str(i * i) == str(i * i)[::-1])) # 列表生成式, 跟10同理
复制代码

作者: manhong2112    时间: 2016-1-17 14:41
第12題,抽出文件中英文的詞語,並寫入
  1. import re # 導入regex(叫正則表示式甚麼的)

  2. file = open("from.txt", encoding='utf8').read() # 讀取檔案
  3. output = open("to.txt", "w") # 生成寫入檔

  4. fromList = re.findall(r"[a-zA-z]+", file) # 找出文檔中符合pattern的字,1 個或以上 a-z和A-Z
  5. fromList.sort() # 排序
  6. output.write("\n".join(fromList)) #寫入
复制代码

作者: manhong2112    时间: 2016-1-17 14:45
猜密码游戏
  1. import random

  2. pwd = ""

  3. for i in range(0, 4): pwd += str(random.randint(0, 9))

  4. print("Guess a number: ")
  5. print("(", pwd, ")")
  6. while True:
  7.     guess = input()
  8.     if len(guess) != 4:
  9.         continue
  10.     A, B = 0, 0
  11.     for i in range(0, 4):
  12.         B += guess[i] in pwd[i:4]
  13.         A += guess[i] == pwd[i]

  14.     print(A, "A", (B - A), "B", sep="")
  15.     if A == 4:
  16.         break

  17. print("You Win!")
复制代码

作者: manhong2112    时间: 2016-1-17 14:48
每日一坑 1 随机取数
http://crossin.me/forum.php?mod=viewthread&tid=854
  1. import random
  2. import sys

  3. o = []
  4. m, n = int(input("m = ")), int(input("n = "))
  5. if 1 <= m <= n:
  6.     sys.exit(1)
  7. while len(o) < n:
  8.     a = random.choice(range(1, m + 1))
  9.     if a in o:
  10.         continue
  11.     o.append(a)

  12. o.sort()
  13. print(o)
复制代码

作者: manhong2112    时间: 2016-1-17 14:50
本帖最后由 manhong2112 于 2016-1-17 14:53 编辑

每日一坑 2 去除重复
  1. o = [1, 1, 2, 2, 3, 4, 5, 5, 6, 7]
  2. o2 = []
  3. for i in o:
  4.     if i in o2:
  5.         continue
  6.     o2.append(i)

  7. o2.sort()
  8. print(o2)
复制代码
  1. o = [1, 1, 2, 2, 3, 4, 5, 5, 6, 7]
  2. sorted(set(o))
复制代码

作者: manhong2112    时间: 2016-1-17 14:53
每日一坑 3 找数字
  1. import re
  2. o = "aAsmr3idd4bgs7Dlsf9eAF"
  3. print(''.join(re.findall("\d", o)))
复制代码

作者: manhong2112    时间: 2016-1-17 14:55
本帖最后由 manhong2112 于 2016-1-17 14:58 编辑

每日一坑 4 查找文件import re
  1. import re
  2. import os


  3. def check(dir):
  4.     for i in os.listdir(dir):
  5.         if os.path.isdir(i):
  6.             check(dir + "/" + i)
  7.         print(str(i) + "\n" if re.search(r'.*\.txt', i) else "", end="")


  8. check(os.getcwd())
复制代码

作者: crossin先生    时间: 2016-1-17 15:00
支持一下!
欢迎在这里记录学习过程
作者: manhong2112    时间: 2016-1-17 15:01
每日一坑 5 文字竖排
  1. # -*- coding:utf8 -*-
  2. poem = "\
  3. 静夜思 李白\n\
  4. 床前明月光,\n\
  5. 疑似地上霜。\n\
  6. 举头望明月,\n\
  7. 低头思故乡。".split('\n')

  8. poem = poem[::-1]

  9. poemLength = 0
  10. for i in poem:
  11.     poemLength = len(i) if poemLength < len(i) else poemLength
  12. poemWidth = len(poem)

  13. for i in range(0, poemLength):
  14.     for j in range(0, poemWidth):
  15.         try:
  16.             print(poem[j][i] if poem[j][i] != " " else "  ", end="|")
  17.         except IndexError:
  18.             print(end="  |")
  19.     print()
复制代码

作者: manhong2112    时间: 2016-1-17 15:02
每日一坑 6 查找文件内容
  1. import re
  2. import os


  3. def check(dir, text):
  4.     for i in os.listdir(dir):
  5.         if os.path.isdir(i):
  6.             check(dir + "/" + i, text)
  7.         if re.search(r'.*\.txt', i):
  8.             file = open(dir + "/" + i, encoding="utf8").read()
  9.             print(str(i) + "\n" if re.search(text, file) else "", end="")


  10. check(os.getcwd(), "hello world")
复制代码

作者: manhong2112    时间: 2016-1-17 15:08
【每周一坑】3道题
  1. def ex1(text):
  2.     i = {}
  3.     for j in text:
  4.         if j in i:
  5.             i[j] += 1
  6.         else:
  7.             i[j] = 1
  8.     return sorted(i.items(), key=lambda i: i[1], reverse=True)


  9. print(ex1("History is his story."))
复制代码
  1. def ex2():
  2.     from random import randint
  3.     from sys import exit

  4.     class Game:
  5.         thrownNumber = 0
  6.         gameRound = 0

  7.         def start_game(self):
  8.             self.gameRound += 1
  9.             print("New Game start, Round", self.gameRound)
  10.             self.thrownNumber = randint(3, 18)

  11.         def end_game(self, *players):
  12.             for i in players:
  13.                 player_score = 0
  14.                 player_score += i.bet.get("big", 0) * 2 if self.thrownNumber >= 11 else 0
  15.                 player_score += i.bet.get("small", 0) * 2 if self.thrownNumber < 11 else 0
  16.                 player_score += i.bet.get(str(self.thrownNumber), 0) * 10
  17.                 i.score += player_score
  18.                 i.bet = {}

  19.     class Player:
  20.         def __init__(self, player_id, score=100):
  21.             self.player_id = player_id
  22.             self.score = score
  23.             self.bet = {}

  24.         def add_bet(self, bet_type, bet_score):
  25.             if self.score - bet_score < 0:
  26.                 raise ValueError()
  27.             self.bet[bet_type] = self.bet.get(bet_type, 0) + bet_score
  28.             self.score -= bet_score

  29.     class Computer(Player):
  30.         def __init__(self, player_id, score=100):
  31.             super().__init__(player_id, score)

  32.         def add_bet(self):
  33.             for i in range(randint(1, 5)):
  34.                 try:
  35.                     bet_score = randint(1, int(self.score / randint(1, 5)) + 1)
  36.                     if randint(0, 1):
  37.                         super().add_bet("big" if randint(0, 1) else "small", bet_score)
  38.                     else:
  39.                         super().add_bet(str(randint(3, 18)), bet_score)
  40.                     pass
  41.                 except ValueError:
  42.                     break

  43.     comp = Computer("Computer")
  44.     player = Player(input("Input Your Name: \n> "))
  45.     game = Game()

  46.     # game main body
  47.     while True:
  48.         game.start_game()
  49.         # print(game.thrownNumber)

  50.         # read input
  51.         print("Input 'quit' to end game, input 'end' or leave blank to end input, input as '<type/number> <bet>' to bet")
  52.         while True:
  53.             tmp = input("> ")
  54.             if tmp == "end" or tmp == "": break
  55.             if tmp == "quit": exit(0)
  56.             tmp = tmp.split(" ")
  57.             try:
  58.                 player.add_bet(tmp[0], int(tmp[1]))
  59.             except ValueError:
  60.                 print("Over your existing score")
  61.             except IndexError:
  62.                 print("Wrong input, try again")

  63.         comp.add_bet()
  64.         print(comp.player_id, " bet ", comp.bet, sep="")
  65.         print(player.player_id, " bet ", player.bet, sep="")

  66.         game.end_game(player, comp)
  67.         print("Number is", game.thrownNumber)

  68.         print(comp.player_id, "'s score: ", comp.score, sep="")
  69.         print(player.player_id, "'s score: ", player.score, sep="")

  70.         print("=" * 24, sep="")


  71. ex2()
复制代码

作者: manhong2112    时间: 2016-1-17 15:10
每周一坑 記帳本
  1. # coding: utf-8
  2. import pickle
  3. from datetime import datetime
  4. from sys import exit

  5. now = datetime.now()


  6. class Account:
  7.     def __init__(self, user_id=""):
  8.         self.account = {}
  9.         self.count = 0
  10.         self.user_id = user_id
  11.         with open('account.db', 'rb') as db:
  12.             try:
  13.                 self.user_id = pickle.load(db)
  14.                 self.account = pickle.load(db)
  15.                 self.count = pickle.load(db)
  16.             except EOFError:
  17.                 pass

  18.     def add_account(self, item, money):
  19.         int(money)
  20.         self.count += 1
  21.         self.account[self.count] = str(now.date()) + "|" + money + "|" + item

  22.     def check_money(self):
  23.         total = 0
  24.         for record_id in range(1, len(self.account) + 1):
  25.             total += int(self.account[record_id].split("|")[1])

  26.         print("== You have", total, "==")

  27.     def list_account(self):
  28.         print("Date\t\t$\t\tItem")
  29.         for record_id in range(1, len(self.account) + 1):
  30.             print(self.account[record_id].replace('|', "\t\t"))

  31.     def close_account(self):
  32.         with open('account.db', 'wb') as db:
  33.             pickle.dump(self.user_id, db)
  34.             pickle.dump(self.account, db)
  35.             pickle.dump(self.count, db)
  36.         print("Good Bye!")
  37.         exit(0)


  38. f = {"0": lambda x: x.close_account(),
  39.      "1": lambda x: x.add_account(input("Item > "), input("Money > ")),
  40.      "2": lambda x: x.check_money(),
  41.      "3": lambda x: x.list_account()}

  42. account = Account()

  43. while True:
  44.     print("What do you want? ")
  45.     print("  Add record to account, input 1")
  46.     print("  Check your money, input 2")
  47.     print("  List the log of your account, input 3")
  48.     print("  If you want to exit, input 0")
  49.     try:
  50.         f[input("> ")](account)
  51.     except KeyError:
  52.         print("Wrong Input")
  53.     except ValueError:
  54.         print("Wrong Value")
复制代码

作者: manhong2112    时间: 2016-1-17 15:21
重命名目錄下資料夾外的所有檔案,不包括子目錄
會先重命名為md5 hash碼,若重複直接刪除
再順號碼重命名一次
  1. import os
  2. import hashlib


  3. def md5(file):
  4.     hash = hashlib.md5()
  5.     with open(file, "rb") as f:
  6.         for chunk in iter(lambda: f.read(8192), b""):
  7.             hash.update(chunk)
  8.     return hash.hexdigest()


  9. def rename(old, new, state):
  10.     new += '.' + old.split('.')[-1]
  11.     if not (state or old == new):
  12.         try:
  13.             os.remove(new)
  14.         except WindowsError:
  15.             {}
  16.     os.rename(old, new)


  17. def main():
  18.     for state in [0, 1]:
  19.         i = 1
  20.         for file in os.listdir('.'):
  21.             if file == 'rename.py' or os.path.isdir(file):
  22.                 continue
  23.             rename(file, str(i) if state else md5(file), state)
  24.             i += 1
  25.             # os.remove('rename.py')

  26. main()
复制代码

作者: manhong2112    时间: 2016-1-17 19:26
本帖最后由 manhong2112 于 2016-1-23 19:45 编辑

B站視頻解析
把以前用js寫的插件 (雖然並沒有寫完) 功能用Python實現
輸入av號,輸出up主,硬幣數,收藏數,tag,視頻真實地址,彈幕地址等等等等..
  1. import urllib.request as urllib
  2. import json
  3. import html
  4. import sys

  5. api_1 = "http://api.bilibili.com"
  6. api_2 = "http://interface.bilibili.com"
  7. api_3 = "http://comment.bilibili.com"
  8.    
  9. bilibilijj = "http://www.bilibilijj.com"
  10. api_key = "8e9fc618fbd41e28"

  11. def get_json(url):
  12.     return json.loads(urllib.urlopen(url).read().decode("unicode-escape").replace('\r\n', ''))

  13. def printf(str, *obj):
  14.     print(str.format(*obj))

  15. def get_info(aid):
  16.     video_info = [get_json("{0}/view?type=json&appkey={1}&id={2}".format(api_1, api_key, aid))]
  17.     pages_num = video_info[0]['pages']
  18.     if pages_num > 2:
  19.         for i in range(1, a + 1):
  20.             video_info.append(get_json("{0}/view?type=json&appkey={1}&id={2}&page={3}".format(api_1, api_key, aid, i)))
  21.     return video_info

  22.    
  23. def print_info(video_info):
  24.     cid = video_info['cid']
  25.     link_info = get_json('{0}/playurl?type=mp4&otype=json&quality=4&appkey={1}&cid={2}'.format(api_2, api_key, cid))

  26.     try:
  27.         printf(">> cid: {0}", cid)
  28.         printf(">> Title: {0} Author: {1} Upload Time: {2}", html.unescape(video_info['title']), video_info['author'], video_info['created_at'])
  29.         printf(">> Play: {0} Coins: {1} Fav: {2} Pages: {3}", video_info['play'], video_info['coins'], video_info['favorites'], video_info['pages'])
  30.         printf(">> Type: {0} Tag: {1}", video_info['typename'], video_info['tag'].split(','))
  31.         printf(">> Description: {0}", html.unescape(video_info['description']))
  32.         printf(">> Danmu file link at: {0}/{1}.xml", api_3, cid)
  33.         printf(">> Video link at bilibilijj: {0}/freedown/spare/{1}.mp4", bilibilijj, cid)
  34.         try:
  35.             printf(">> Video link at: {0}", link_info['durl'][0]['url'])
  36.         except KeyError:
  37.             printf("E> Failed to get Video Link: {0}", link_info)
  38.             return
  39.     except KeyError:
  40.         print("E> Video not found")
  41.         printf("D> {0}", video_info)
  42.         return

  43. def main():
  44.     aid = input("aid of video \n> av")
  45.     video_info = []

  46.     try:
  47.         int(aid)
  48.     except ValueError:
  49.         print("Value Error")
  50.         return

  51.     try:
  52.         video_info = get_info(aid)
  53.     except KeyError:
  54.         printf("E> Video not found")
  55.         return

  56.     i = 0
  57.     for video_info in video_info:
  58.         i += 1
  59.         printf("\n>> ====== Page {0} ======", i)
  60.         print_info(video_info)

  61. main()
复制代码
EDIT: 新增多P支持...
作者: manhong2112    时间: 2016-1-20 20:18
本帖最后由 manhong2112 于 2016-1-20 21:08 编辑

2048 bj4
  1. import random
  2. from copy import deepcopy as copy


  3. def print2048(block):
  4.     for i in range(len(block)):
  5.         print(str(block[i]).replace(", ", "]["))


  6. def get(block, x, y):
  7.     a = copy(block)
  8.     return a[y][x]


  9. def set(block, x, y, value):
  10.     a = copy(block)
  11.     a[y][x] = value
  12.     return a


  13. def add(block, x, y, value):
  14.     a = copy(block)
  15.     a[y][x] += value
  16.     return a


  17. def up(block):
  18.     a = copy(block)
  19.     for i in range(0, 4):
  20.         for x in range(0, 4)[::-1]:
  21.             for y in range(0, 3):
  22.                 if get(a, x, y + 1) == get(a, x, y) or get(a, x, y) == 0:
  23.                     a = add(a, x, y, get(a, x, y + 1))
  24.                     a = set(a, x, y + 1, 0)
  25.     return a


  26. def down(block):
  27.     a = copy(block)
  28.     for i in range(0, 4):
  29.         for x in range(0, 4):
  30.             for y in range(1, 4):
  31.                 if get(a, x, y - 1) == get(a, x, y) or get(a, x, y) == 0:
  32.                     a = add(a, x, y, get(a, x, y - 1))
  33.                     a = set(a, x, y - 1, 0)
  34.     return a


  35. def left(block):
  36.     a = copy(block)
  37.     for i in range(0, 4):
  38.         for x in range(0, 3):
  39.             for y in range(0, 4)[::-1]:
  40.                 if get(a, x + 1, y) == get(a, x, y) or get(a, x, y) == 0:
  41.                     a = add(a, x, y, get(a, x + 1, y))
  42.                     a = set(a, x + 1, y, 0)
  43.     return a


  44. def right(block):
  45.     a = copy(block)
  46.     for i in range(0, 4):
  47.         for x in range(1, 4):
  48.             for y in range(0, 4):
  49.                 if get(a, x - 1, y) == get(a, x, y) or get(a, x, y) == 0:
  50.                     a = add(a, x, y, get(a, x - 1, y))
  51.                     a = set(a, x - 1, y, 0)
  52.     return a


  53. def reset():
  54.     a = ([0, 0, 0, 0],
  55.          [0, 0, 0, 0],
  56.          [0, 0, 0, 0],
  57.          [0, 0, 0, 0])

  58.     return set(a, random.randrange(0,4), random.randrange(0,4), random.choice([2, 4]))


  59. def add_number(block):
  60.     a = copy(block)
  61.     b = []
  62.     for i in range(0, 4):
  63.         for j in range(0, 4):
  64.             if get(a, i, j) == 0:
  65.                 b.append((i, j))
  66.     if (not b) and right(a) == left(a) == up(a) == down(a):
  67.         print2048(a)
  68.         print("You lose")
  69.         exit()
  70.     if (not b) or right(a) == left(a) == up(a) == down(a):
  71.         return a

  72.     c = random.choice(b)
  73.     return set(block, c[0], c[1], random.choice([2, 4]))


  74. f = {"w": up,
  75.      "a": left,
  76.      "s": down,
  77.      "d": right}

  78. block2048 = reset()

  79. while 1:
  80.     block2048 = add_number(block2048)
  81.     print2048(block2048)
  82.     while 1:
  83.         try:
  84.             block2048 = f[input("Choose Direction (w a s d) > ")](block2048)
  85.         except KeyError:
  86.             print("E> Value Error")
  87.             continue
  88.         break
复制代码

作者: crossin先生    时间: 2016-1-21 11:20
manhong2112 发表于 2016-1-20 20:18
2048 bj4

有意思。你可以用pygame把它做出来
作者: manhong2112    时间: 2016-1-29 23:05
2048 again, 讓它更符合2048的規則, 修改了好多就不放一起了
  1. import random
  2. from copy import deepcopy as copy


  3. class Game(object):
  4.     vector = {"w": (0, 1),
  5.               "s": (0, -1),
  6.               "a": (1, 0),
  7.               "d": (-1, 0)}

  8.     def __init__(self):
  9.         self.block = ([0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0])
  10.         self.recently_block = copy(self.block)
  11.         self.block[random.randint(0, 3)][random.randint(0, 3)] = random.choice((2, 4))
  12.         pass

  13.     def next(self):
  14.         loc_list = []
  15.         for x in range(4):
  16.             for y in range(4):
  17.                 if not self.block[x][y]:
  18.                     loc_list.append((x, y))

  19.         if loc_list:
  20.             if self.recently_block == self.block:
  21.                 return
  22.         else:
  23.             return self.movable()

  24.         loc = random.choice(loc_list)
  25.         self.block[loc[0]][loc[1]] = random.choice((2, 4))
  26.         pass

  27.     def end(self):
  28.         self.print()
  29.         print("# END #")
  30.         print("# Your Score is: {0} #".format(self.score()))
  31.         input("Enter to continue...")
  32.         exit()
  33.         pass

  34.     def move(self, direction, is_check=False):
  35.         cache = copy(self.block)
  36.         dx, dy = self.vector[direction]
  37.         i = ()
  38.         while i != cache:
  39.             i = copy(cache)
  40.             for x in (3, 2, 1, 0):
  41.                 for y in (3, 2, 1, 0):
  42.                     _x, _y = x - dx, y - dy
  43.                     if not (0 <= _x < 4 and 0 <= _y < 4):
  44.                         continue
  45.                     if cache[y][x] and (not cache[_y][_x] or cache[y][x] == cache[_y][_x]):
  46.                         cache[_y][_x] += cache[y][x]
  47.                         cache[y][x] = 0
  48.         if is_check:
  49.             return cache != self.block

  50.         self.recently_block = copy(self.block)
  51.         self.block = cache
  52.         pass

  53.     def movable(self):
  54.         for i in ('w', 'a', 's', 'd'):
  55.             if self.move(i, True):
  56.                 return True
  57.         self.end()
  58.         pass

  59.     def print(self):
  60.         for x in range(4):
  61.             for y in range(4):
  62.                 print(self.block[x][y], end=' ')
  63.             print()
  64.         pass

  65.     def score(self):
  66.         def _f(val, score=0):
  67.             for i in val:
  68.                 score += _f(i) if type(i) == list else i
  69.             return score
  70.         return _f(self.block)


  71. def main():
  72.     game = Game()
  73.     while True:
  74.         game.print()
  75.         print(game.score())
  76.         d = input("Choose Direction> ")
  77.         try:
  78.             game.move(d)
  79.         except KeyError:
  80.             continue
  81.         game.next()


  82. if __name__ == "__main__":
  83.     main()
复制代码

作者: manhong2112    时间: 2016-1-29 23:10
crossin先生 发表于 2016-1-21 11:20
有意思。你可以用pygame把它做出来

現在我用的版本是Python 3.5 64bit, 但網上好像並沒有這版本
作者: crossin先生    时间: 2016-1-30 12:12
manhong2112 发表于 2016-1-29 23:10
現在我用的版本是Python 3.5 64bit, 但網上好像並沒有這版本

这个版本官方好像没有,你搜搜看有没有其他人做的版本。比较常见的是2.7 32位版本
作者: mjjPython    时间: 2016-2-19 23:13
javascriptnload=alert('123')
作者: manhong2112    时间: 2016-3-8 23:06
有空寫代碼了, 而且在官網找到了3.5版的pygame, 所以把Pygame版的2048做出來了
  1. import random
  2. from copy import deepcopy as copy

  3. import pygame


  4. def calc_color(i):
  5.     return 255 - (i ** 2 % 255)


  6. class Game(object):
  7.     vector = {pygame.K_w: (0, 1),
  8.               pygame.K_s: (0, -1),
  9.               pygame.K_a: (1, 0),
  10.               pygame.K_d: (-1, 0)}

  11.     def __init__(self):
  12.         self.block = ([0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0])
  13.         self.recently_block = copy(self.block)
  14.         self.block[random.randint(0, 3)][random.randint(0, 3)] = random.choice((2, 2, 4))
  15.         pass

  16.     def next(self):
  17.         loc_list = []
  18.         for x in range(4):
  19.             for y in range(4):
  20.                 if not self.block[x][y]:
  21.                     loc_list.append((x, y))

  22.         if loc_list:
  23.             if self.recently_block == self.block:
  24.                 return True
  25.         else:
  26.             return self.movable()

  27.         loc = random.choice(loc_list)
  28.         self.block[loc[0]][loc[1]] = random.choice((2, 2, 4))
  29.         return True
  30.         pass

  31.     def end(self):
  32.         self.print()
  33.         print("# END #")
  34.         print("# Your Score is: {0} #".format(self.score()))
  35.         input("Enter to continue...")
  36.         exit()
  37.         pass

  38.     def move(self, direction, is_check=False):
  39.         cache = copy(self.block)
  40.         dx, dy = self.vector[direction]
  41.         i = ()
  42.         while i != cache:
  43.             i = copy(cache)
  44.             for x in range(3, -1, -1):
  45.                 for y in range(3, -1, -1):
  46.                     _x, _y = x - dx, y - dy
  47.                     if not (0 <= _x < 4 and 0 <= _y < 4):
  48.                         continue
  49.                     if cache[y][x] and (not cache[_y][_x] or cache[y][x] == cache[_y][_x]):
  50.                         cache[_y][_x] += cache[y][x]
  51.                         cache[y][x] = 0
  52.         if is_check:
  53.             return cache != self.block

  54.         self.recently_block = copy(self.block)
  55.         self.block = cache
  56.         pass

  57.     def movable(self):
  58.         for i in (pygame.K_w, pygame.K_a, pygame.K_s, pygame.K_d):
  59.             if self.move(i, True):
  60.                 return True
  61.         return False
  62.         pass

  63.     def print(self, display=None, _font=None):
  64.         if display is None or _font is None:
  65.             for x in range(4):
  66.                 for y in range(4):
  67.                     print(self.block[x][y], end=' ')
  68.                 print()
  69.         else:
  70.             for x in range(4):
  71.                 for y in range(4):
  72.                     v = self.block[x][y]
  73.                     pygame.draw.rect(
  74.                             display,
  75.                             (calc_color(v ** 2), calc_color(v ** 3), calc_color(v ** 5)),  # color
  76.                             (120 * y, 120 * x, 120, 120))  # x, y ,width, height
  77.                     display.blit(
  78.                             _font.render(
  79.                                     str(v) if v != 0 else "",
  80.                                     1,
  81.                                     (30, 30, 30)
  82.                             ),
  83.                             (120 * y + 54, 120 * x + 54))
  84.         pass

  85.     def score(self):
  86.         def _f(val, score=0):
  87.             for i in val:
  88.                 score += _f(i) if type(i) == list else i
  89.             return score

  90.         return _f(self.block)


  91. pygame.init()
  92. screen = pygame.display.set_mode((480, 480), 0, 32)
  93. pygame.display.set_caption("2048")

  94. font = pygame.font.SysFont("arial", 20)

  95. game = Game()
  96. game.print(screen, font)

  97. k = ""
  98. finish = False

  99. while True:
  100.     for event in pygame.event.get():
  101.         if event.type == pygame.QUIT:
  102.             pygame.quit()
  103.             exit()
  104.         if event.type == pygame.KEYDOWN:
  105.             if event.key == pygame.K_ESCAPE:
  106.                 pygame.quit()
  107.                 exit()

  108.             if event.key == pygame.K_r:
  109.                 game.print(screen, font)
  110.                 game = Game()
  111.                 finish = False

  112.             if finish:
  113.                 game.print(screen, font)
  114.                 screen.blit(font.render(
  115.                                 "You lose, total score is {}".format(game.score()),
  116.                                 1,
  117.                                 (30, 30, 30)
  118.                             ), (120, 240))
  119.                 screen.blit(font.render(
  120.                                 "press ESC to leave",
  121.                                 1,
  122.                                 (30, 30, 30)
  123.                             ), (128, 260))
  124.                 screen.blit(font.render(
  125.                                 "press R to restart",
  126.                                 1,
  127.                                 (30, 30, 30)
  128.                             ), (128, 280))

  129.                 pygame.display.update()
  130.                 continue

  131.             k = event.key
  132.             try:
  133.                 game.move(k)
  134.                 finish = not game.next()
  135.             except KeyError:
  136.                 continue
  137.             finally:
  138.                 game.print(screen, font)
  139.                 k = ""

  140.     pygame.display.update()
复制代码

作者: crossin先生    时间: 2016-3-9 14:55
manhong2112 发表于 2016-3-8 23:06
有空寫代碼了, 而且在官網找到了3.5版的pygame, 所以把Pygame版的2048做出來了

这个不错
作者: manhong2112    时间: 2016-4-5 21:04
本帖最后由 manhong2112 于 2016-4-5 22:59 编辑

Y算子 + 部分邱奇碼, 弄出來後只感覺lambda真強大...
  1. Y = (lambda F: ((lambda u: u(u))(lambda f: F(lambda v: f(f)(v)))))
  2. Y(lambda f: (lambda x: 1 if x <= 2 else f(x - 1) + f(x - 2)))(5)
  3. Y(lambda f: (lambda x: 1 if x == 0 else x * f(x - 1)))(5)

  4. TRUE = lambda t,f: t
  5. FALSE = lambda t,f: f
  6. IF = lambda b,t,f: b(t,f)
  7. AND = lambda b1, b2: IF(b1, b2, FALSE)
  8. OR = lambda b1, b2: IF(b1, TRUE, b2)
  9. NOT = lambda b: IF(b, FALSE, TRUE)
复制代码

作者: crossin先生    时间: 2016-4-6 10:40
manhong2112 发表于 2016-4-5 21:04
Y算子 + 部分邱奇碼, 弄出來後只感覺lambda真強大...


作者: manhong2112    时间: 2016-4-7 19:01
本帖最后由 manhong2112 于 2016-12-17 23:38 编辑

簡單的lisp解釋器...

  1. from copy import copy

  2. def pick(k, e):
  3.     try:
  4.         return e[k]
  5.     except Exception:
  6.         return k

  7. def put(k, v, e):
  8.     e[k] = v
  9.     return e

  10. def put_rec(pair, e):
  11.     for k, v in pair:
  12.         e[k] = interp(v, e)
  13.     return e


  14. class Closure:
  15.     def __str__(self):
  16.         return "<Closure exp({}), env({})>".format(self.exp, self.env)
  17.         pass

  18.     def __init__(self, exp, env):
  19.         self.exp = exp
  20.         self.env = env


  21. class quote:
  22.     def __str__(self):
  23.         return "<quote %s>".format(self.lst)

  24.     def __init__(self, lst):
  25.         self.lst = lst
  26.         pass

  27.     def cons(x, _quote):
  28.         l = copy(_quote.lst[::-1])
  29.         l.append(str(x))
  30.         return quote(l[::-1])

  31.     def car(_quote):
  32.         return _quote.lst[0]

  33.     def cdr(_quote):
  34.         return quote(_quote.lst[1:])

  35.     def pick(i, _quote):
  36.         return _quote.lst[i + 1]

  37.     def put(i, v, _quote):
  38.         l = copy(_quote.lst[:])
  39.         l[i] = v
  40.         return quote(l)


  41. def interp(scheme, env={}):
  42.     if isinstance(scheme, str):
  43.         if (scheme[0] == "-" and scheme[1:].isdigit()) or scheme.isdigit():
  44.             return eval(scheme)
  45.         if scheme == "True" or scheme == "False":
  46.             return eval(scheme)
  47.         return pick(scheme, env)

  48.     if isinstance(scheme, list):
  49.         v0 = interp(scheme[0], env)
  50.         if isinstance(v0, Closure):
  51.             return interp(v0.exp[2], put(v0.exp[1][0], interp(scheme[1], env), v0.env))

  52.         if v0 in ("if", "lambda", "let"):
  53.             return {
  54.                 "if": lambda: interp(scheme[2 if interp(scheme[1], env) else 3], env),
  55.                 "lambda": lambda: Closure(scheme, copy(env)),
  56.                 "let": lambda: interp(scheme[2], put_rec(scheme[1], env))
  57.             }[v0]()

  58.         v1 = interp(scheme[1], env)
  59.         if v0 in ("car", "cdr"):
  60.             return {
  61.                 "car": lambda: quote.car(v1),
  62.                 "cdr": lambda: quote.cdr(v1)
  63.             }[v0]()

  64.         v2 = interp(scheme[2], env)
  65.         if v0 in ("pick", "cons", "+", "-", "*", "/", "^", "=", ">", "<", "<=", ">="):
  66.             return {
  67.                 "pick": lambda: quote.pick(v1, v2),
  68.                 "cons": lambda: quote.cons(v1, v2),
  69.                 "+": lambda: v1 + v2,
  70.                 "-": lambda: v1 - v2,
  71.                 "*": lambda: v1 * v2,
  72.                 "/": lambda: v1 / v2,
  73.                 "^": lambda: v1 ** v2,
  74.                 "=": lambda: v1 == v2,
  75.                 ">": lambda: v1 > v2,
  76.                 "<": lambda: v1 < v2,
  77.                 "<=": lambda: v1 <= v2,
  78.                 ">=": lambda: v1 >= v2
  79.             }[v0]()


  80. # (lambda arg exp) => Closure((lambda arg exp) env)
  81. # (Closure(lambda env) arg)
  82. # (quote (lst))
  83. # (if b t f)
  84. # (op e1 e2)
  85. # (let ((k1 exp1) .. (kn expn)) exp)

  86. # parser str to list
  87. def parser(s):
  88.     def _f(index):
  89.         result = []
  90.         t = ""
  91.         while True:
  92.             if s[index] == "(":
  93.                 x, index = _f(index + 1)
  94.                 result.append(x)
  95.             c = s[index]
  96.             if c == ")":
  97.                 if t != "":
  98.                     result.append(t)
  99.                 return result, index + 1
  100.             elif c == " ":
  101.                 if t != "":
  102.                     result.append(t)
  103.                     t = ""
  104.             else:
  105.                 t += c
  106.             index += 1
  107.     return _f(1)[0]


  108. print(interp(parser("(let ((abs (lambda (n) (if (< n 0) (- 0 n) n)))) (abs -5))")))
复制代码

作者: manhong2112    时间: 2016-4-8 17:35
本帖最后由 manhong2112 于 2016-8-14 16:14 编辑

infix 轉成 postfix
  1. priority = {
  2.     "+": 0,
  3.     "-": 0,
  4.     "*": 1,
  5.     "/": 1
  6. }


  7. def to_postfix(expr, start=0):
  8.     stack = []
  9.     result = []
  10.     buffer = ""
  11.     i = start
  12.     while i < len(expr):
  13.         if expr[i].isalpha() or expr[i].isdigit():
  14.             if expr[i].isdigit():
  15.                 buffer += expr[i]
  16.             else:
  17.                 result.append(expr[i])
  18.             i += 1
  19.             continue
  20.         if buffer != "":
  21.             result.append(buffer)
  22.             buffer = ""
  23.         if(expr[i] == "("):
  24.             x = to_postfix(expr, i + 1)
  25.             result += x[0]
  26.             i = x[1]
  27.         elif(expr[i] == ")"):
  28.             result += "".join(stack[::-1])
  29.             return result, i
  30.         else:
  31.             if len(stack) != 0 and priority[expr[i]] < priority[stack[-1]]:
  32.                 result += stack.pop()
  33.             stack.append(expr[i])
  34.         i += 1
  35.     result.extend(stack[::-1])
  36.     return result, i
复制代码

作者: manhong2112    时间: 2016-4-9 13:11
本帖最后由 manhong2112 于 2016-12-8 21:44 编辑

之前寫的一堆排序算法...
  1. import random
  2. import timeit


  3. def printf(string, *obj):
  4.     return print(string.format(*obj))


  5. def bubble_sort(arr):
  6.     arr = arr[:]
  7.     for i in range(len(arr) - 1, 0, -1):
  8.         for j in range(i):
  9.             if arr[j] > arr[j + 1]:
  10.                 arr[j], arr[j + 1] = arr[j + 1], arr[j]
  11.     return arr


  12. def quick_sort(arr):
  13.     if len(arr) <= 1:
  14.         return arr
  15.     a = arr[0]
  16.     b = []
  17.     c = []
  18.     for i in arr[1:]:
  19.         (b if i < a else c).append(i)
  20.     return quick_sort(b) + [a] + quick_sort(c)


  21. def swap(arr, x, y):
  22.     arr[x], arr[y] = arr[y], arr[x]

  23. def quicksort_inplace_iter(arr):
  24.     stack = [(0, len(arr))]
  25.     while stack:
  26.         s, e = stack.pop()
  27.         s1, e1 = s, e
  28.         if s >= e:
  29.             continue
  30.         i = s
  31.         x = arr[e-1]
  32.         while s+1 < e1:
  33.             if arr[s] > x:
  34.                 swap(arr, s, e1 - 1)
  35.                 e1 -= 1
  36.             else:
  37.                 swap(arr, s, s1)
  38.                 s1 += 1
  39.             s += 1
  40.         stack.append((i, s))
  41.         stack.append((s+1, e))

  42. def random_arr(length):
  43.     arr = []
  44.     for i in range(length):
  45.         arr.append(random.randint(0, length ** 2))
  46.     return arr


  47. def merge_sort(arr):
  48.     def merge(arr1, arr2):
  49.         result = []
  50.         i = 0
  51.         j = 0
  52.         while True:
  53.             if i == len(arr1):
  54.                 result.extend(arr2[j:])
  55.                 break
  56.             if j == len(arr2):
  57.                 result.extend(arr1[i:])
  58.                 break
  59.             if arr1[i] < arr2[j]:
  60.                 result.append(arr1[i])
  61.                 i += 1
  62.             else:
  63.                 result.append(arr2[j])
  64.                 j += 1
  65.         return result

  66.     length = len(arr)
  67.     if length <= 1:
  68.         return arr
  69.     return arr if length <= 1 else merge(
  70.         merge_sort(arr[:int(length / 2)]),
  71.         merge_sort(arr[int(length / 2):]))


  72. def select_sort(arr):
  73.     for i in range(len(arr)):
  74.         for j in range(i, len(arr)):
  75.             if arr[j] < arr[i]:
  76.                 arr[i], arr[j] = arr[j], arr[i]
  77.     return arr


  78. def time(fun, *arr):
  79.     s = timeit.default_timer()
  80.     fun(*arr)
  81.     e = timeit.default_timer()
  82.     return((e - s) * 1000)
复制代码

作者: manhong2112    时间: 2016-6-26 19:38
筆記本
  1. import os
  2. import math
  3. import pickle
  4. sum = lambda x: 0 if len(x) == 0 else x[0] + sum(x[1:])


  5. class Reader(object):

  6.     def __init__(self, path=None):
  7.         self.Note = NoteManager.get_note(path)
  8.         self.Note.load()
  9.         pass

  10.     def read(self):
  11.         return self.Note.Context

  12.     def write(self, context):
  13.         self.Note.Context = context
  14.         pass

  15.     def write_line(self, context):
  16.         self.Note.Context += context
  17.         self.Note.Context += "\n"
  18.         pass

  19.     def append(self, context):
  20.         self.Note.Context += context
  21.         pass

  22.     def save(self):
  23.         with open(self.Note.nPath, "wb+") as f:
  24.             pickle.dump((self.Note.Context, self.Note.Type), f)


  25. class Note(object):
  26.     storageLoc = "./note"

  27.     def __init__(self, path, name, file_type="Text"):
  28.         assert type(name) is str
  29.         assert type(path) is str
  30.         assert type(file_type) is str
  31.         self.Name = name
  32.         self.Type = file_type
  33.         self.id = path
  34.         self.nPath = os.path.join(self.storageLoc, path)
  35.         self.Context = ""

  36.     def load(self):
  37.         os.makedirs(os.path.dirname(self.nPath), exist_ok=True)
  38.         if not os.path.isfile(self.nPath):
  39.             with open(self.nPath, "wb+") as f:
  40.                 pickle.dump(("", self.Type), f)
  41.         with open(self.nPath, "rb+") as f:
  42.             self.Context, self.Type = pickle.load(f)


  43. class NoteManager(object):
  44.     note_pool_loc = "./NoteList.db"
  45.     __note_pool = {}

  46.     @staticmethod
  47.     def get_note(path):
  48.         pool, name = NoteManager.parse_path(path)
  49.         return pool[name]["Note"]
  50.         pass

  51.     @staticmethod
  52.     def new_note(path, name, file_type="Text"):
  53.         n = Note(path, name, file_type)
  54.         NoteManager.add_note(path, n)
  55.         pass

  56.     @staticmethod
  57.     def filter(dir, f):
  58.         assert type(dir) is str
  59.         result = []
  60.         pool, name = NoteManager.parse_path(dir)
  61.         for i in pool:
  62.             if i[-1] == "/":
  63.                 result.extend(NoteManager.filter(dir + i, f))
  64.             elif (pool[i]["Tag"] & f) == f:
  65.                 result.append(dir + i)
  66.         return sorted(result)
  67.         pass

  68.     @staticmethod
  69.     def save():
  70.         tmp = {}

  71.         def _f(path, pool):
  72.             for p in pool:
  73.                 if p[-1] == "/":
  74.                     _f(path + p, pool[p])
  75.                 else:
  76.                     x = pool[p]
  77.                     tmp[p] = {"Tag": x["Tag"], "Name": x["Note"].Name}
  78.         _f("", NoteManager.__note_pool)
  79.         with open(NoteManager.note_pool_loc, "wb+") as f:
  80.             pickle.dump(tmp, f)
  81.         pass

  82.     @staticmethod
  83.     def add_note(path, note):
  84.         pool, name = NoteManager.parse_path(path)
  85.         pool[name] = {"Tag": 0, "Note": note}
  86.         pass

  87.     @staticmethod
  88.     def del_note(path):
  89.         os.remove(os.path.join(Note.storageLoc, path))
  90.         pool, name = NoteManager.parse_path(path)
  91.         pool.remove(name)
  92.         pass

  93.     @staticmethod
  94.     def add_tag(path, *tag):
  95.         pool, name = NoteManager.parse_path(path)
  96.         t = sum(tag)
  97.         if (pool[name]["Tag"] & t) != t:
  98.             pool[name]["Tag"] += t

  99.     @staticmethod
  100.     def del_tag(path, *tag):
  101.         pool, name = NoteManager.parse_path(path)
  102.         t = sum(tag)
  103.         if (pool[name]["Tag"] & t) == t:
  104.             pool[name]["Tag"] -= t

  105.     @staticmethod
  106.     def get_tag(path):
  107.         pool, name = NoteManager.parse_path(path)
  108.         t = pool[name]["Tag"]
  109.         tag = set({})
  110.         while t != 0:
  111.             x = int(math.log(t, 2))
  112.             t -= x
  113.             tag.add(TagManager.tag(x))
  114.             pass
  115.         return tag

  116.     @staticmethod
  117.     def parse_path(path):
  118.         x = path.split("/")
  119.         pool = NoteManager.__note_pool
  120.         for i in x[:-1]:
  121.             if i + "/" not in pool:
  122.                 pool[i + "/"] = {}
  123.             pool = pool[i + "/"]
  124.         return pool, x[-1]

  125.     if not os.path.isfile(note_pool_loc):
  126.         with open(note_pool_loc, "wb+") as f:
  127.             pickle.dump(__note_pool, f)
  128.     else:
  129.         with open(os.path.join(note_pool_loc), "rb+") as f:
  130.             tmp = pickle.load(f)
  131.         for i in tmp:
  132.             x = i.split("/")
  133.             pool = __note_pool
  134.             for i in x[:-1]:
  135.                 if i + "/" not in pool:
  136.                     pool[i + "/"] = {}
  137.                 pool = pool[i + "/"]
  138.             name = x[-1]
  139.             pool[name] = {"Tag": tmp[i]["Tag"],
  140.                           "Note": Note(i, tmp[i]["Name"])}


  141. class TagManager(object):
  142.     tag_pool_loc = "TagList.db"
  143.     __tag_pool = []

  144.     @staticmethod
  145.     def mk_filter(*tag):
  146.         return sum(tag)

  147.     @staticmethod
  148.     def new_tag(tag_name):
  149.         if tag_name not in TagManager.__tag_pool:
  150.             TagManager.__tag_pool.append(tag_name)
  151.         pass

  152.     @staticmethod
  153.     def tag(x):
  154.         if type(x) is str:
  155.             return 2**TagManager.__tag_pool.index(x)
  156.         elif type(x) is int:
  157.             return TagManager.__tag_pool[math.log(x, 2)]

  158.     @staticmethod
  159.     def save():
  160.         with open(os.path.join(TagManager.tag_pool_loc), "wb+") as f:
  161.             pickle.dump(TagManager.__tag_pool, f)
  162.         pass

  163.     if os.path.isfile(tag_pool_loc):
  164.         with open(os.path.join(tag_pool_loc), "rb+") as f:
  165.             __tag_pool = pickle.load(f)
  166.     else:
  167.         with open(os.path.join(tag_pool_loc), "wb+") as f:
  168.             pickle.dump(__tag_pool, f)

复制代码

作者: manhong2112    时间: 2016-8-15 20:25
本帖最后由 manhong2112 于 2016-8-25 18:34 编辑

Brainfuck 解釋器(+半個編譯器)

  1. import msvcrt


  2. def interp(expr):
  3.     ptr = 0
  4.     ram = dict()
  5.     loopStack = []
  6.     excapingLoop = 0
  7.     i = 0
  8.     while(i < len(expr)):
  9.         # print(ram, loopStack, excapingLoop)
  10.         x = expr[i]
  11.         if not (ptr in ram) or ram[ptr] > 127 or ram[ptr] < -128:
  12.             ram[ptr] = 0
  13.         if x == "[":
  14.             if excapingLoop > 0:
  15.                 excapingLoop += 1
  16.             elif ram[ptr] != 0:
  17.                 loopStack.append(i)
  18.             else:
  19.                 excapingLoop = 1
  20.         elif x == "]":
  21.             if excapingLoop > 0:
  22.                 excapingLoop -= 1
  23.             elif ram[ptr] != 0:
  24.                 i = loopStack[-1]
  25.             else:
  26.                 loopStack.pop()
  27.         elif excapingLoop > 0:
  28.             pass
  29.         elif x == "+":
  30.             ram[ptr] += 1
  31.         elif x == "-":
  32.             ram[ptr] -= 1
  33.         elif x == ">":
  34.             ptr += 1
  35.         elif x == "<":
  36.             ptr -= 1
  37.         elif x == ".":
  38.             print(chr(ram[ptr]), end="")
  39.             pass
  40.         elif x == ",":
  41.             ram[ptr] = ord(msvcrt.getch())
  42.         i += 1

  43. version = 0x01
  44. header = [0x00, 0x10, 0x26, 0xBF, version, 0x00]
  45. # null, id, id, ver, id, mem_len


  46. class ID():
  47.     START_LOOP = 0
  48.     END_LOOP = 1
  49.     INC = 2
  50.     DEC = 3
  51.     NEXT = 4
  52.     BACK = 5
  53.     GETC = 6
  54.     PUTC = 7

  55.     ADD = 8
  56.     MOVE = 9


  57. def compile(expr):
  58.     result = header.copy()
  59.     state = 0
  60.     tmp = 0
  61.     memloc = 0
  62.     mmemloc = 0
  63.     loopStack = []
  64.     i = 0
  65.     while i <= len(expr):
  66.         # print(ram, loopStack, excapingLoop)
  67.         if memloc > mmemloc:
  68.             mmemloc = memloc
  69.         x = expr[i] if i != len(expr) else 0xFF
  70.         if state == 0:
  71.             if x == "[":
  72.                 loopStack.append(len(result))
  73.                 result.append(ID.START_LOOP)
  74.                 result.append(0)
  75.                 if memloc == 0:
  76.                     memloc = 1
  77.             elif x == "]":
  78.                 a = loopStack.pop()
  79.                 result[a + 1] = len(result) - a - 1
  80.                 result.append(ID.END_LOOP)
  81.                 result.append(len(result) - a + 1)
  82.             elif x == "+":
  83.                 state = ID.ADD
  84.                 tmp += 1
  85.             elif x == "-":
  86.                 state = ID.ADD
  87.                 tmp -= 1
  88.             elif x == ">":
  89.                 state = ID.MOVE
  90.                 tmp += 1
  91.             elif x == "<":
  92.                 state = ID.MOVE
  93.                 tmp -= 1
  94.             elif x == ".":
  95.                 result.append(ID.PUTC)
  96.             elif x == ",":
  97.                 result.append(ID.GETC)
  98.         elif state == ID.ADD:
  99.             if x in "+-":
  100.                 if x == "+":
  101.                     tmp += 1
  102.                 elif x == "-":
  103.                     tmp -= 1
  104.             else:
  105.                 if tmp == 0:
  106.                     pass
  107.                 elif tmp == 1:
  108.                     result.append(ID.INC)
  109.                 elif tmp == -1:
  110.                     result.append(ID.DEC)
  111.                 else:
  112.                     result.append(ID.ADD)
  113.                     result.append(tmp)
  114.                 state = 0
  115.                 i -= 1
  116.                 tmp = 0
  117.         elif state == ID.MOVE:
  118.             if x in "><":
  119.                 if x == ">":
  120.                     tmp += 1
  121.                 elif x == "<":
  122.                     tmp -= 1
  123.             else:
  124.                 if tmp == 0:
  125.                     pass
  126.                 elif tmp == 1:
  127.                     result.append(ID.NEXT)
  128.                     memloc += 1
  129.                 elif tmp == -1:
  130.                     result.append(ID.BACK)
  131.                     memloc -= 1
  132.                 else:
  133.                     result.append(ID.MOVE)
  134.                     result.append(tmp)
  135.                     memloc += tmp
  136.                 i -= 1
  137.                 state = 0
  138.                 tmp = 0
  139.         i += 1
  140.     result[5] = mmemloc
  141.     result.append(0xFF)
  142.     return result


  143. class Env(object):
  144.     def __init__(self, mem_len):
  145.         self.data = [0] * (mem_len + 1)
  146.         self.ptr = 0

  147.     def move(self, val):
  148.         self.ptr += val

  149.     def read(self):
  150.         return self.data[self.ptr]

  151.     def write(self, val):
  152.         self.data[self.ptr] = val if -128 <= val <= 127 else 0


  153. def execute(compiledExpr):
  154.     expr = compiledExpr
  155.     i = len(header)
  156.     env = Env(expr[5])
  157.     while i < len(expr) - 1:
  158.         x = expr[i]
  159.         if x == ID.INC:
  160.             env.write(env.read() + 1)
  161.         elif x == ID.DEC:
  162.             env.write(env.read() - 1)
  163.         elif x == ID.NEXT:
  164.             env.move(1)
  165.         elif x == ID.BACK:
  166.             env.move(-1)
  167.         elif x == ID.PUTC:
  168.             print(chr(env.read()), end="")
  169.         elif x == ID.GETC:
  170.             env.write(ord(msvcrt.getch()))
  171.         else:
  172.             if x == ID.START_LOOP and env.read() == 0:
  173.                 i += expr[i + 1]
  174.             elif x == ID.END_LOOP and env.read() != 0:
  175.                 i -= expr[i + 1]
  176.             elif x == ID.ADD:
  177.                 env.write(env.read() + expr[i + 1])
  178.             elif x == ID.MOVE:
  179.                 env.move(expr[i + 1])
  180.             i += 1
  181.         i += 1

  182. import timeit


  183. def time(fun, *arr):
  184.     s = timeit.default_timer()
  185.     fun(*arr)
  186.     e = timeit.default_timer()
  187.     return((e - s) * 1000)

  188. expr = "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>."
  189. cexpr = compile(expr)

  190. x1, x2 = 0, 0
  191. for i in range(0, 100):
  192.     x1 += time(execute, cexpr)
  193. for i in range(0, 100):
  194.     x2 += time(interp, expr)

  195. print(x1 / 100)
  196. print(x2 / 100)
复制代码

作者: Skeel    时间: 2016-8-15 22:13
做的很好,不過請問代碼編輯器是怎麼弄出來。

   
作者: crossin先生    时间: 2016-8-16 14:50
Skeel 发表于 2016-8-15 22:13
做的很好,不過請問代碼編輯器是怎麼弄出來。

回帖里的代码编辑器?
有个 <> 图标的按钮
作者: manhong2112    时间: 2016-8-22 15:28
本帖最后由 manhong2112 于 2016-8-22 16:00 编辑

寫了一個爬蟲, 一開始用lxml總是報錯(貌似是網站的HTML有問題)...就轉用BeautifulSoup了...
雖然能用, 但總感覺哪裡不太對勁..
EDIT: 相對路徑沒被簡化, 組成了一個迴圈....
EDIT: 找到了urljoin這函數, 希望不再出bug

  1. # from lxml import etree
  2. from bs4 import BeautifulSoup
  3. import urllib as request
  4. from urlparse import urljoin
  5. import re
  6. import os


  7. def getHtml(url):
  8.     res = request.urlopen(url)
  9.     try:
  10.         return url, res.read().decode("utf-8")
  11.     except Exception:
  12.         return url, res.read().decode("big5")


  13. def extractLink(url, html):
  14.     soup = BeautifulSoup(html, "html.parser")
  15.     return set(map(lambda i: re.sub("#.*$", "", urljoin(url, i["href"])), soup.findAll('a')))
  16.     # return set(etree.HTML(html).xpath("//a/@href"))


  17. target = "http://example.com/" # 目標網站
  18. startAt = "http://example.com/index.html" # 起始網頁
  19. output = "output" # 輸出
  20. downloadedLink = set()
  21. toBeDownload = set()
  22. toBeDownload.add(startAt)
  23. p = re.compile("https?://.*?/(.*)")

  24. while len(toBeDownload) != 0:
  25.     try:
  26.         url = toBeDownload.pop()
  27.         downloadedLink.add(url)
  28.         if (url.startswith("http") or url.startswith("https")) and not url.startswith(target):
  29.             continue
  30.         print "Downloading " + url
  31.         _, content = getHtml(url)
  32.         m = re.match(p, url)
  33.         m = m.group(1)
  34.         path, file = os.path.split(m)
  35.         try:
  36.             os.makedirs(os.path.join(output, path))
  37.         except Exception:
  38.             pass
  39.         with open(os.path.join(output, m), "w") as f:
  40.             f.write(content.encode('utf8'))
  41.         newUrl = extractLink(url, content).difference(downloadedLink)
  42.         toBeDownload = toBeDownload.union(newUrl)
  43.     except Exception:
  44.         print "Failed to Download " + url
复制代码

作者: manhong2112    时间: 2016-10-10 21:00
本帖最后由 manhong2112 于 2016-10-21 17:32 编辑

原本想弄個筆記本, 然後架個站自用...然後寫着寫着寫成了vcs(算嗎?算吧)......
話說混亂到自己都看不太下去了XDDD
EDIT: 換成if-else...感覺不想再看到python的lambda了....
EDIT: 大改了一下, 和把index的rollback功能刪了
  1. import hashlib
  2. import os
  3. import json
  4. import datetime
  5. import time

  6. dataLoc = "data"

  7. class Enitiy(object):

  8.     def __init__(self, name, dtype, hashcode, history):
  9.         self.name = name
  10.         self.dtype = dtype
  11.         self.hashcode = hashcode
  12.         self.history = history

  13. class Index(Enitiy):

  14.     def __init__(self, name, jsons=None, hashcode=None):
  15.         self.name = name
  16.         self.index = dict()
  17.         if jsons is not None:
  18.             for i in jsons["index"]:
  19.                 if i["type"] == "Index":
  20.                     self.index[i["name"]] = Index(
  21.                         i["name"],
  22.                         json.loads(read(i["hashcode"])),
  23.                         i["hashcode"])
  24.                 else:
  25.                     self.index[i["name"]] = Enitiy(
  26.                         i["name"],
  27.                         i["type"],
  28.                         i["hashcode"],
  29.                         i["history"] if "history" in i else dict())

  30.         super().__init__(name, "Index", hashcode, None)

  31.     def __str__(self):
  32.         return str(self.index)

  33.     def __getitem__(self, k):
  34.         return self.index[k]

  35.     def __setitem__(self, k, v):
  36.         self.index[k] = v

  37.     def __contains__(self, item):
  38.         return item in self.index

  39.     def __len__(self):
  40.         return len(self.index)

  41.     def items(self):
  42.         return self.index.items()

  43.     def dumpJsons(self):
  44.         result = dict()
  45.         result["index"] = []
  46.         result["name"] = self.name
  47.         for k, v in self.index.items():
  48.             obj = dict()
  49.             obj["name"], obj["type"], obj["hashcode"], obj["history"] = v.name, v.dtype, v.hashcode, v.history
  50.             result["index"].append(obj)
  51.         return json.dumps(result)

  52. _open = open
  53. def open(hashcode, type="w+"):
  54.     path = getPath(hashcode)
  55.     os.makedirs(os.path.dirname(path), exist_ok=True)
  56.     if os.path.isfile(path):
  57.         type = "r+"
  58.     else:
  59.         type = "w"
  60.     return _open(path, type, encoding="UTF-8")

  61. def getPath(hashcode):
  62.     return os.path.join(dataLoc, hashcode[:2], hashcode)

  63. def hash(str):
  64.     return hashlib.sha1(str).hexdigest()

  65. def hashStr(str):
  66.     return hash(str.encode("utf-8"))

  67. def hashFile(name, content):
  68.     return hash((name + "|" + content).encode("utf-8"))

  69. def read(hashcode):
  70.     with open(hashcode) as f:
  71.         return f.read()

  72. def init():
  73.     root = None
  74.     path = getPath("root")

  75.     name = "/"

  76.     if not os.path.isfile(path):
  77.         root = Index(name)
  78.         root_json = root.dumpJsons()
  79.         hashcode = hashFile(name, root_json)
  80.         with open(hashcode) as f:
  81.             f.write(root_json)
  82.         with open("root") as f:
  83.             f.write(json.dumps({"hashcode": hashcode, "name": name, "type": "Index"}))
  84.     else:
  85.         with open("root") as f:
  86.             accessPt = json.loads(f.read())
  87.             hashcode = accessPt["hashcode"]
  88.             with open(hashcode) as f:
  89.                 root = Index(name, json.loads(f.read()), hashcode)
  90.     return [root]

  91. def end(indexStack):
  92.     root = indexStack[0]
  93.     date = datetime.datetime.now().strftime("%Y/%m/%d-%H:%M:%S")
  94.     name = "/"
  95.     content = root.dumpJsons()
  96.     hashcode = hashFile(name, content)
  97.     with open(hashcode) as f:
  98.         f.write(content)
  99.     with open("root") as f:
  100.         accessPt = json.loads(f.read())
  101.         f.seek(0)
  102.         accessPt["hashcode"] = hashcode
  103.         f.write(json.dumps(accessPt))
  104.         f.truncate()

  105. helpCmd = {
  106.     "update": ["Usage>> update <name> <type> <content>",
  107.                "Usage>> Update or create a file"],
  108.     "rollback": ["Usage>> rollback <name> <id>",
  109.                  "Usage>> Rollback to the specified id"],
  110.     "ls": ["Usage>> ls [name]",
  111.            "Usage>> list all file in current dir or specified dir"],
  112.     "cd": ["Usage>> cd <dir|'..'>",
  113.            "Usage>> cd to specified dir"],
  114.     "mkdir": ["Usage>> mkdir <dir>",
  115.               "Usage>> create a new dir at current dir"],
  116.     "read": ["Usage>> read <name>",
  117.              "Usage>> read the content of specified file"],
  118.     "history": ["Usage>> history <name>",
  119.                 "Usage>> List modifiy history of specified file"],
  120.     "help": ["Usage>> <cmd>", "Usage>> Print the usage of cmd",
  121.              "Usage>> all cmd[update, rollback, ls, cd, mkdir, read, history, help]"]
  122. }
  123. mainCmd = {"update", "rollback", "ls", "cd",
  124.            "mkdir", "read", "history", "help", }

  125. def update(indexStack, name, dtype, content):
  126.     index = indexStack[-1]
  127.     date = datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")
  128.     dateid = hashStr(date)[:6]
  129.     entity_hashcode = hashFile(name, content)

  130.     with open(entity_hashcode) as f:
  131.         f.write(content)

  132.     if name not in index:
  133.         if dtype == "Index":
  134.             index[name] = Index(name, hashcode=entity_hashcode)
  135.         else:
  136.             index[name] = Enitiy(name, dtype, entity_hashcode, dict())
  137.     else:
  138.         entity = index[name]
  139.         entity.history[dateid] = (date, entity.hashcode)
  140.         entity.hashcode = entity_hashcode

  141. def rollback(indexStack, name, datetimeid):
  142.     """
  143.     indexStack
  144.     name = file/dir name
  145.     datetimeid = date
  146.     """
  147.     index = indexStack[-1]
  148.     assert type(index[name]) is not Index
  149.     history = index[name].history
  150.     assert datetimeid in history
  151.     with open(history[datetimeid][1]) as f:
  152.         update(indexStack, name, index[name].dtype, f.read())

  153. def ls(indexStack, name=None):
  154.     if name is not None:
  155.         index = Index(name, json.loads(read(indexStack[-1][name].hashcode)))
  156.     else:
  157.         index = indexStack[-1]
  158.     assert type(index) is Index
  159.     return index.name, sorted([(e.name, e.dtype) for _, e in index.items()])
  160.    
  161. def cd(indexStack, name):
  162.     """
  163.     indexStack
  164.     name = file/dir name
  165.     """
  166.     assert type(indexStack) is list
  167.     assert type(name) is str
  168.     if name == "..":
  169.         indexStack.pop()
  170.     else:
  171.         index = indexStack[-1]
  172.         assert type(index[name]) is Index
  173.         indexStack.append(index[name])

  174. def getHistory(indexStack, name):
  175.     """
  176.     indexStack
  177.     name = file name
  178.     """
  179.     assert type(indexStack) is list
  180.     assert type(name) is str
  181.     index = indexStack[-1]
  182.     assert type(index[name]) is not Index
  183.     return index[name].history

  184. def mkdir(indexStack, name):
  185.     assert name not in indexStack[-1]
  186.     update(indexStack, name, "Index", Index(name).dumpJsons())

  187. if __name__ == '__main__':
  188.     indexStack = init()
  189.     try:
  190.         while True:
  191.             cmd = input("/".join([i.name for i in indexStack]) + ">> ").split(" ")
  192.             args = cmd[1:] if len(cmd) > 1 else []
  193.             if cmd[0] in mainCmd:
  194.                 if cmd[0] == "update":
  195.                     update(indexStack, *args)
  196.                 elif cmd[0] == "rollback":
  197.                     rollback(indexStack, args[0], args[1])
  198.                 elif cmd[0] == "ls":
  199.                     if len(args) == 1:
  200.                         i = ls(indexStack, *args)
  201.                     else:
  202.                         i = ls(indexStack)
  203.                     print(i[0] + " :"),
  204.                     print("\n".join(["\t" + n + " | " + t for n, t in i[1]]))
  205.                 elif cmd[0] == "cd":
  206.                     cd(indexStack, *args)
  207.                 elif cmd[0] == "mkdir":
  208.                     if len(args) != 1:
  209.                         print("E>")
  210.                     else:
  211.                         mkdir(indexStack, args[0])
  212.                 elif cmd[0] == "read":
  213.                     if len(args) != 1:
  214.                         print("E>")
  215.                     else:
  216.                         print(read(indexStack[-1][args[0]].hashcode)),
  217.                 elif cmd[0] == "history":
  218.                     if len(args) == 1:
  219.                         history = getHistory(indexStack, args[0])
  220.                         print(args[0] + " :")
  221.                         print("id\t|date")
  222.                         print("\n".join(
  223.                              ["{}\t|{}".format(x[0], x[1]) for x in
  224.                                sorted([(dateid, v[0]) for dateid, v in history.items()], key=lambda x: x[1])]))
  225.                     else:
  226.                         print("E>")
  227.                 elif cmd[0] == "help":
  228.                     exit = False
  229.                     while not exit:
  230.                         cmd = input("Help>> ")
  231.                         if cmd == "exit" or cmd == "quit":
  232.                             exit = True
  233.                         elif cmd in helpCmd:
  234.                             list(map(lambda x: print(x), helpCmd[cmd]))
  235.                         else:
  236.                             print("E> Invalid command")
  237.             elif cmd[0] == "exit" or cmd[0] == "quit":
  238.                 break
  239.             else:
  240.                 print("E> Invalid command")
  241.     except Exception:
  242.         raise
  243.     finally:
  244.         end(indexStack)
复制代码

作者: crossin先生    时间: 2016-10-11 09:54
manhong2112 发表于 2016-10-10 21:00
原本想弄個筆記本, 然後架個站自用...然後寫着寫着寫成了vcs(算嗎?算吧)......
話說混亂到自己都看不太下去 ...

你厉害的
作者: manhong2112    时间: 2016-10-14 19:58
和之前的筆記本一系列的, 用來抽取指定網址的內容!
目前只做了知乎, 以後再慢慢拓展
#註解掉的是md轉html的
  1. from bs4 import BeautifulSoup
  2. import urllib.request as urllib
  3. import re
  4. #import markdown


  5. def getContext(url):
  6.     data = parse(url, getRule(url))
  7.     md = """\
  8. {title}
  9. {author}
  10. {url}

  11. {content}\
  12. """.format(
  13.         title=("#" + data["title"]) if "title" in data else "",
  14.         author=("###" + data["author"]) if "author" in data else "",
  15.         url=("#####[Link](" + data["url"] + ")") if "url" in data else "",
  16.         content=("<hr><br>" + data["content"]) if "content" in data else "")
  17.     #return "<meta charset='UTF-8'>\n" + markdown.markdown(md, output_format="html5")
  18.     return md

  19. rule = [
  20.     (re.compile(r"https?://www.zhihu.com/question/\d*?/answer/\d*?#?.*"),
  21.      {"content": {"selector": "div#zh-question-answer-wrap .zm-editable-content"},
  22.       "title": {"selector": "div#zh-question-title > h2.zm-item-title > a"},
  23.       "author": {"selector": "span.author-link-line > a.author-link"},
  24.       "url": {"selector": "meta['http-equiv'='mobile-agent']", "attr": "content", "matching": re.compile(".*url=(.*)")}
  25.       })
  26. ]


  27. def getRule(url):
  28.     for k, v in rule:
  29.         if k.match(url):
  30.             return v


  31. def getHtml(url, encoding="utf-8"):
  32.     res = urllib.urlopen(url)
  33.     return res.read()


  34. def parse(url, rule):
  35.     result = dict()
  36.     soup = BeautifulSoup(getHtml(url), "html.parser")
  37.     for (k, v) in rule.items():
  38.         content = None
  39.         if "attr" in v:
  40.             content = str(soup.select(v["selector"])[0][v["attr"]]).strip(' \t\n\r')
  41.         else:
  42.             content = str(soup.select(v["selector"])[0].get_text()).strip(' \t\n\r')
  43.         if "matching" in v:
  44.             m = v["matching"].match(content)
  45.             if m:
  46.                 result[k] = m.group(1)
  47.         else:
  48.             result[k] = content
  49.     return result

  50. print(getContext("http://www.zhihu.com/question/51266789/answer/125952575"))
复制代码





欢迎光临 Crossin的编程教室 (https://bbs.crossincode.com/) Powered by Discuz! X2.5