# Learning Coding [![hackmd-github-sync-badge](https://hackmd.io/x0zJ1OwURiS0J22uGZEt7Q/badge)](https://hackmd.io/x0zJ1OwURiS0J22uGZEt7Q) - 自學python筆記 與 程式紀錄 ###### tags: `Python` `E-Portfolio` # 第一周 複習python的基礎語法 * ## 複習內容: * 簡單 python的語法 * 輸入輸出(* input(), print()) * 簡單list用法 * 基礎遞迴概念 * ## 試做題目 (*註 由於時間不夠,並未完成): * ### Caidocraft的構造改革! https://zerojudge.tw/ShowProblem?problemid=f010 * ### 程式碼 ```python= x = 0 y = 0 health = 10 hunger = 10 totol_walk = 0 def Walk(dir,S,x,y): Pos = ["East","West","North","South"] dx = [1,-1,0,0] dy = [0,0,1,-1] for i in range(4): if dir == Pos[i]: x += dx[i] * S y += dy[i] * S totol_walk += S if totol_walk >= 50: break return(x,y) In = list(map(str, input().split())) com = In[0] #[com, mot, num] if com == "Print": pass elif com == 'Walk': x,y = Walk(In[1],int(In[2]),x,y) print(x,y) ``` # 第二周 Python list 用法 * ## 建立 list ```python= L = list() ``` 或 ```python= L = [] ``` * 其中 L 為變數,代表一個 list) * ## 指定 list 裡特定的项 ```python= L[n] ``` * (其中 n 為變數,代表 L 的项數) * ## 從 list 中取特定片段 ```python= L[a:b] ``` * (其中 a,b 為變數,代表從 L 的第 a 項取到第 b-1 項) * ## 尋找特定物件是否在 list 裡 ```python= object in L ``` * (其中 object 為變數,該指令的意義是在在 L 裡找 object 是否存在於 L 裡) * 若 L 裡有 object結果為 True ,若沒有則為 False * ## 從 list 後 插入 一項 ```python= L.append(x) ``` (其中 x 為變數,代表在 L 的最後一項後插入 x) * ## 在 list 的特定項前 插入 一項 ```python= L.insert(n,x) ``` * (其中 n,x 為變數,代表在 L 的第 n 項前插入 x) * ## 把 L 刪除特定項 ```pthon= L.pop(n) ``` * (其中 n 為變數,代表刪除 L 的第 p 項) * ## 排序 ```python= L.sort() ``` * 將 list 做排序 * ## 參考來源: * ## https://www.w3schools.com/python/python_lists.asp # 第三周 List題目練習 (*註 未完全通過) * ### 題目: 【記憶中】之記憶中的序列 https://zerojudge.tw/ShowProblem?problemid=b405 * ### 程式碼: ```python= n = int(input()) A = list(map(int,input().split())) q = int(input()) ans = 0 All = [A] for i in range(q): L = list(map(int,input().split())) if ans != 0: for i in range(len(L)): L[i] = L[i] ^ ans if L[0] == 0: A = All[L[1]] elif L[0] == 1: A.insert(L[1] ,L[2]) elif L[0] == 2: A.pop(L[1]-1) elif L[0] == 3: A[L[1]-1], A[L[2]-1] = A[L[2]-1] , A[L[1]-1] elif L[0] == 4: for i in range(L[1]-1,L[2]): A[i] += 10 # A = A + 10 elif L[0] == 5: ans = max(A[(L[1]-1):L[2]]) print(ans) elif L[0] == 6: ans = min(A[(L[1]-1):L[2]]) print(ans) elif L[0] == 7: ans =sum(A[L[1]-1:L[2]]) print(ans) All.append(A) ``` # 第四周 List APCS歷屆練習(1) * ### 題目: 2016 APCS 實作題第二題 矩陣翻轉 https://zerojudge.tw/ShowProblem?problemid=b266 * ### 程式碼: ```python= import sys for s in sys.stdin: r, c, m = map(int, s.split()) mylist = [] for i in range(r): inp = list(map(int, input().split())) mylist.append(inp) M_list = list(map(int, input().split())) def flip(mylist): copylist = [[-1 for i in range(len(mylist[j]))] for j in range(len(mylist))] for i in range(len(mylist)): for j in range(len(mylist[i])): copylist[i][j] = mylist[len(mylist) - i - 1][j] return(copylist) def turn(mylist): copylist = [[] for j in range(len(mylist[0]))] for j in range(len(mylist[0])): for i in range(len(mylist)): copylist[len(mylist[0])-j -1].append(mylist[i][j]) return(copylist) for i in range(len(M_list)-1,-1,-1): if M_list[i] == 1: mylist = flip(mylist) else: mylist = turn(mylist) print(len(mylist),len(mylist[0])) for i in range(len(mylist)): print(" ".join(map(str, mylist[i]))) ``` # 第五周 List APCS歷屆練習(2) * ### 題目: APCS 2017-0304-3 數字龍捲風 https://zerojudge.tw/ShowProblem?problemid=c292 * ### 程式碼: ```python= N = int(input()) d = int(input()) result = [] mylist = [] for i in range(N): inp = list(map(int, input().split())) mylist.append(inp) mylist.append([int(-1) for v in range(N)]) mylist.insert(0,[int(-1) for v in range(N)]) for i in range(len(mylist)): mylist[i].append(-1) mylist[i].insert(0,-1) m = N // 2 dx = [-1,0,1,0] dy = [0,-1,0,1] nowx = m + 1 nowy = m + 1 cnt = 0 if_turn = 1 lim = 2 def turn(d): if d == 3: d = 0 else: d += 1 return(d) result.append(mylist[nowy][nowx]) while (True): nowx += dx[d] nowy += dy[d] cnt += 1 if cnt == if_turn: d = turn(d) cnt = 0 lim += -1 if lim ==0: if_turn += 1 lim = 2 #print(cnt,if_turn,lim,d) if mylist[nowy][nowx] != -1: result.append(mylist[nowy][nowx]) else: break print("".join(map(str, result))) ``` # 第六周 Sort 重點整理 * ## Bubble Sort: 從陣列的最前面開始,一次比較陣列中兩兩相鄰的元素,然後根據大小將它們調換順序,大的移到後面。 當比較過所有元素一次後,可以確保數值最大的元素在最後面,接著扣掉陣列中的最後一個元素(因為已經確定它是最大的),接著重複上面的步 驟進行兩兩比較重複上述動作,直到排序完畢。假設這個陣列有 n 個元素一共需重複這個動作 n-1 次才能確保排序完畢。 * ## Insertion sort: 插入排序法會從序列最尾端開始往前判斷要插入的元素是否大於等於目前 判斷位置的元素,若是,則將元素放置於目前判斷位置的後一個的位置; 若不是,則將目前判斷位置的元素往後移一個位置,騰出空位以便讓其他 元素使用,接著再繼續往前判斷。 * ## Merge sort: 將數列對分成兩個子數列,並遞回對分, 對分至只有一個元素時,將元素回傳合併。 * ## Quick sort: Quick Sort 是一種「把大問題分成小問題處理」(Divide and Conquer) 的方法, 概念如下: * 1. 在數列中任意挑選一個數,稱為 pivot,然後調整數列,使得「所有 在 pivot 左邊的數,都比 pivot 還小」,而「在 pivot 右邊的數都比 pivot 大」。 * 2. 接著,將所有在 pivot 左邊的數視為「新的數列」,所有在 pivot 右 邊的數視為「另一個新的數列」,「分別」重複上述步驟(選 pivot、 調整數列),直到分不出「新的數列」為止。 * ## Radix sort Radix sort 基本特性如下: * 整數排序法:以整數作為排序的鍵值。 * 分配式排序法:不透過兩兩比較,而是分析鍵值分佈來排序。特定情況下可達線性執行時間。 * 穩定性:採用 LSD 的 Radix sort 屬穩定排序法(Stable sort);透過優化,採用 MSD 也可以是穩定排序法。 * ## 參考來源: * https://pjchender.blogspot.com/2017/09/bubble-sort.html * https://magiclen.org/insertion-sort/ * http://notepad.yehyeh.net/Content/Algorithm/Sort/Sort.php * https://alrightchiu.github.io/SecondRound/comparison-sort-quicksortkuai-su-pai-xu-fa.html * https://rust-algo.club/sorting/radix_sort/ # 第七周 Sort 題目練習(1) * ## 第一題 * ### 題目: 基礎排序 #1-1 ( 偶數排序 ) https://zerojudge.tw/ShowProblem?problemid=c531 * ### 程式碼: ```python= import sys for s in sys.stdin: mylist = list(map(int,s.split(","))) all_i = [] # 存項數 Even = [] #存偶數 #[1,8,9,2,7] #[1,3] #[8,2] ---> [2,8] for i in range(len(mylist)): if mylist[i] % 2 == 0: all_i.append(i) Even.append(mylist[i]) Even.sort() for i in range(len(all_i)): mylist[all_i[i]] = Even[i] print(",".join(map(str, mylist))) ``` * ## 第二題 * ### 題目: 基礎排序 #1-2 ( 位置排序 ) https://zerojudge.tw/ShowProblem?problemid=c635 * ### 程式碼: ```python= import sys for s in sys.stdin: mylist = list(map(int,s.split(","))) Even = [] #存偶數位置 Odd = [] k = 0 addi = 1 for i in range(len(mylist)): if k % 2 == 0: Even.append(mylist[i]) else: Odd.append(mylist[i]) k += 1 Even.sort() Odd.sort() for i in range(len(Odd)): Even.insert(i+addi,Odd[i]) addi += 1 print(",".join(map(str,Even))) ``` * ## 第三題 (*註 未完成) * ### 題目: * ### 程式碼: ```python= import sys S_list = [] sumP_list = [] for myinput in sys.stdin: S = str(myinput) S_list.append(S) num = "" i_list = [] P_list = [] def isPrime(P,mylist): for i in mylist: if P % i == 0: return(False) break else: return(True) for i in range(len(S)): if S[i] == "1" or S[i] == "2" or S[i] =="3" or S[i] =="4" or S[i] =="5" or S[i] == "6" or S[i] == "7" or S[i] == "8" or S[i] == "9" or S[i] == "0": num += S[i] i_list.append(i) num = int(num) nowP = 2 while nowP <= num: if num % nowP == 0: if nowP == []: P_list.append(nowP) elif isPrime(nowP,P_list): P_list.append(nowP) nowP += 1 sumP = sum(P_list) sumP_list,append(sumP) ``` # 第八周 Sort APCS 歷屆練習 * ### 題目: APCS (2016/03/05) 第 1 題 成績指標 https://zerojudge.tw/ShowProblem?problemid=b964 * ### 程式碼 ```python= n = int(input()) score = list(map(int, input().split())) score.sort() print(" ".join(map(str,score))) Pass = [] NoPass = [] for i in range(len(score)): if score[i] >= 60: Pass.append(score[i]) else: NoPass.append(score[i]) if NoPass == []: print("best case") else: print(max(NoPass)) if Pass == []: print("worst case") else: print(min(Pass)) ```