# -*- coding: utf-8 -*- from myutil import consolePrintWithLineNumber as c # 파이썬이 자동으로 제공해주는 print 함수 대신 사용한다. ''' Created on 2015. 8. 11. @author: Administrator ''' ''' 1p Chapter 1 함수 1.1 집합 중괄호 무한집합 유한집합 1.2 카테시안 곱 2p 1.3 함수 출력 : 입력의 상(image) 입력 : 출력의 원상(pre-image) 3p f : 정의역 -> 공역(치역) 공역 : 함수값이 선택되는 집합(가능한 출력의 집합) 치역 : 모든 정의역 원소들에 대한 함수값들의 집합(실제로 함수값이 되는 공역 원소들의 집합) <번역오류?> Example 1.3.5 하지만 정의역의 어떤 원소도 소수로 매핑되지 않기 때문에 -> 하지만 치역의 어떤 원소도 소수로 매핑되지 않기 때문에 4p 함수 프로시저 계산문제 5p 항등함수 7p 역함수 전사함수(onto) : 공역 = 치역 8p 단사함수(one-to-one) : 정의역과 공역이 서로 각각 매칭됨.(중복되지 않음) 가역함수 : 역함수가 존재하는 함수 가역함수 <=> 단사함수 + 전사함수 ''' # 16p c(100 // 5.1) c(100 / 5.1) c(6 / 11) # 파이썬2.x에서는 결과값이 0이지만 파이썬3.x에서는 0.5454545454이다. c(44 + 11 * 4 - 6 / 11) c(44 + 11 * 4) c(1 * 60 * 24 * 7) c(2304811 % 47) c(2304811 // 47) c(2304811 - (2304811 // 47) * 47) # 17p c(1e16 + 1) c('문자') c("문자'") c("문자\"") c('''문자"''') c(5 == 4) c(4 == 4) c((673 + 909) % 3 == 0) # 18p x = -9 y = 1 / 2 c(2 ** (y + 1 / 2) if x + 10 < 0 else 2 ** (y - 1 / 2)) # 19p # 집합(Set) : 순서없음, 중복없음, 중괄호{}, 집합 포함 불가능(변경 불가능한 자료형) c({1 + 2, 3, "a"}) c(sum({1, 2, 3}, 10)) S = {1, 2, 3} c(2 in S) c(4 not in S) # 20p c({1, 2, 4} | {2, 3, 4}) c({1, 2, 4} & {2, 3, 4}) S = {1, 2, 3} S.add(4) S.remove(2) c(S) S.update({4, 5, 6}) c(S) S.intersection_update({5, 6, 7, 8, 9}) c(S) T = S T.remove(5) c(S) # 21p U = S.copy() U.add(5) c(S) c({2 * x for x in {1, 2, 3}}) c({x ** 2 for x in {1, 2, 3, 4, 5}}) c({2 ** x for x in {0, 1, 2, 3, 4}}) c(S) c({x * x for x in S | {5, 7}}) c({x * x for x in S | {5, 7} if x > 2}) # 22p c({x * y for x in {1, 2, 3} for y in {2, 3, 4}}) # Task1.5.7 c({x * y for x in {1, 2, 3} for y in {12, 13, 14}}) c({x * y for x in {1, 2, 3} for y in {2, 3, 4} if x != y}) # Task1.5.8 ???? 문제가 이해가 안됨. # Task1.5.9 S = {1, 2, 3, 4} T = {3, 4, 5, 6} c({x for x in S if x > 2 and x < 5}) # Remarks # c({{1, 2}, 3}) # 에러메시지 - TypeError: unhashable type: 'set' # unhashable이란 뜻은 hash값을 만들어 낼 수 없다는 뜻이다. '변경불가능한 집합' 과 이것이 어떤 관련이 있는지 모르겠다. # 23p # 리스트(List) : 순서있음, 중복있음, 대괄호[], 집합 또는 다른 리스트 포함 가능(변경가능한 자료형) c([1, 1 + 1, 3, 2, 3]) c([[1, 1 + 1], {2, 3, 4, 2}, 'yo']) c(len([[1, 1 + 1], {2, 3, 4, 2}, 'yo'])) c(sum([1, 2, 0, 1, 0, 3])) c(sum([1, 2, 0, 1, 0, 3], -2)) c(sum([20, 10, 15, 75]) / 4) c([1, 2, 3] + ["my", 'word']) mylist = [4, 8, 12] c(mylist + ['m', 'y']) c(mylist) # 24p # sum은 집합<숫자>이나 리스트<숫자>에 대해서는 숫자 합산 기능. # 리스트<리스트>인 경우는 리스트를 합치는 기능을 한다. 두번째 자리에 [] 필수 # TypeError: unsupported operand type(s) for +: 'int' and 'list' # sum의 두번째 인수는 default로 숫자 자리인가 보다. 그런데 리스트를 합칠때 두번째 자리를 비워두면, 리스트와 단순한 숫자를 합치게 되므로 오류!!! 그래서 그 자리에 빈 리스트[] c(sum([[1, 2, 3], [4, 5, 6], ['y']], [])) c([2 * x for x in {2, 1, 3, 4, 5}]) # 집합(순서없음) c([2 * x for x in [2, 1, 3, 4, 5]]) # 리스트(순서유지) c([x * y for x in [1, 2, 3] for y in [10, 20, 30]]) c([[x, y] for x in ['A', 'B', 'C'] for y in [1, 2, 3]]) # Task1.5.12 LofL = [[1, 2, 3, 4]] c(sum(x) for x in LofL) # 왜?? 이렇게 나오지?? c([sum(x) for x in LofL]) # [10] LofL = [[1, 2, 3, 4], [4, 4, 4, 4]] c([sum(x) for x in LofL]) # [10, 16] c(sum([sum(x) for x in LofL])) # 26 LofL = [[.25, .75, .1], [-1, 0], [4, 4, 4, 4]] c(sum([sum(x) for x in LofL])) # 16.1 # 25p c(mylist[0]) # c(['in', 'the', 'CIT'][9]) # 에러 IndexError: list index out of range c(['in', 'the', 'CIT'][1]) L = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90] c(L) # [0, 10, 20, 30, 40, 50, 60, 70, 80, 90] # 인덱싱 [a:b]는 a <= x < b c(L[:]) # [0, 10, 20, 30, 40, 50, 60, 70, 80, 90] # c(L[0.5]) # 에러 TypeError: list indices must be integers, not float c(L[1]) # 10 c(L[:5]) # [0, 10, 20, 30, 40] c(L[5:]) # [50, 60, 70, 80, 90] # 불연속 인덱싱 [a:b:c]는 a <= x < b and (x-a) % c == 0 , c>0 (a를 차감한 상대적인index부터 시작해서) c(L[::]) # [0, 10, 20, 30, 40, 50, 60, 70, 80, 90] c(L[::2]) # [0, 20, 40, 60, 80] c(L[::3]) # [0, 30, 60, 90] c(L[::-3]) # [90, 60, 30, 0] 예외적인 상황인듯 c(L[0:10:-3]) # [] 위와 같은 표현같은데 왜 결과가 없을까? c(L[0::-3]) # [0] 그냥 c>0으로 사용하자 -_-;; # c(L[0::0]) #에러 ValueError: slice step cannot be zero # c(L[::-0.5]) #에러 TypeError: slice indices must be integers or None or have an __index__ method c(L[2::2]) # [20, 40, 60, 80] c(L[2:10:3]) # [20, 30, 40] # 26p # 언패킹 [x, y, z] = [4 * 1, 4 * 2, 4 * 3] c(x, y, z) x, y, z = [4 * 1, 4 * 2, 4 * 3] # 위와 같은데?? c(x, y, z) # [x,y] = [4 * 1, 4 * 2, 4 * 3] #에러 ValueError: too many values to unpack (expected 2) # [x, y, z] = [4 * 1, 4 * 2] # 에러 ValueError: need more than 2 values to unpack listoflists = [[1, 1], [2, 4], [3, 9]] c([y for [x, y] in listoflists]) # listoflists = [[1], [2], [3]] # c([y for [x, y] in listoflists]) #에러 ValueError: need more than 1 value to unpack mylist = [30, 20, 10] mylist[1] = 0 c(mylist) # [30, 0, 10] # mylist[0:1] = 1 #에러 TypeError: can only assign an iterable # 튜플(Tuple) : 순서 있음, 변경불가, 집합의 원소가능, 괄호() # 보통 파이썬 한국어 용어로 터플보단 튜플을 많이 사용하는 듯. c((1, 1 + 3, 2)) c({0, (1, 2)} | {(3, 4, 5)}) # p27 mytuple = ('all', 'my', 'books') c(mytuple[1]) c((1, {'a', 'b'}, 3.14)[2]) (a, b) = (1, 5 - 3) c(a) a, b = (1, 2) c(b) a, b = 1, 5 - 3 c(a, b) c([y for (x, y) in [(1, 'a'), (2, 'b'), (3, 'c')]]) c((y for (x, y) in [(1, 'a'), (2, 'b'), (3, 'c')])) # 출력 generator object ... # Task1.5.14 S = {-4, -2, 1, 2, 5, 0} c([(i, j, k) for i in S for j in S for k in S if i + j + k == 0]) # Task1.5.15 c([(i, j, k) for i in S for j in S for k in S if i + j + k == 0 and (i, j, k) != (0, 0, 0)]) # Task1.5.16 c([(i, j, k) for i in S for j in S for k in S if i + j + k == 0 and (i, j, k) != (0, 0, 0)][0]) # S의 원소 중 합이 영이 되는 100-원소 터플이 있는지 결정하기를 원한다고 해 보자. # S를 구성하는 정수가 아주 많을 경우에도 빠르고 확실하게 문제를 해결할 수 있는 방법이 있는가?(만약 있다면, 그 방법으로 Ph.D를 받을 수 있을 것이다.) # > 헐~~~ 박사학위가...;;;;;; # 28p # 컬렉션 생성 및 변환 c(range(10)) # range(0, 10) c(set(range(10))) c(set({1, 2, 3})) c(set([1, 2, 3])) c(set((1, 2, 3))) c(list({1, 2, 3})) c(list([1, 2, 3])) c(list((1, 2, 3))) # 1.5.17 L = [1, 2, 3, 4, 5, 1, 2] # 중복값이 있는 경우 c(len(L)) # 7 c(len(list(set(L)))) # 5 ''' 아직 잘 이해안됨 집합,리스트,튜플의 변경 가능, 변경 불가능에 대해서, - 실제로는 다 되는 것 같은데,,, 메모리 할당의 차이인가? 누구는 원소로 가능하고, 원소로 불가능한 이유....??? >> 정리: 변경불가능 : 집합, 튜플 변경가능 : 리스트 일반객체 : 숫자, 문자 집합의 원소 : 객체, 튜플 튜플의 원소 : 객체, 튜플, 집합, 리스트 리스트의 원소 : 객체, 튜플, 집합, 리스트 ''' # 제너레이터 c([i for i in range(10)]) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] c({i for i in range(10)}) # {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} c((i for i in range(10))) # 출력 generator object... 왜 튜플만,,,??? c(tuple(i for i in range(10))) # (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) # Range c(sum({i * i for i in range(10)})) c({i for i in range(100) if i % 2 == 1}) # 29p # range(a,b) : a <= x < b c(list(range(1, 6))) # [1, 2, 3, 4, 5] # range(a,b,c) : a <= x < b and (x-a) % c == 0 c(list(range(1, 6, 2))) # [1, 3, 5] # zip > 튜플생성 c(zip([1, 2, 3], [2, 4, 6])) # zip object... c(list(zip([1, 2, 3], [2, 4, 6]))) # [(1, 2), (2, 4), (3, 6)] c(set(zip([1, 2, 3], [2, 4, 6]))) # {(1, 2), (2, 4), (3, 6)} characters = ['Neo', 'Morpheus', 'Trinity'] actors = ['Keanu', 'Laurence', 'Carrie-Anne'] c(set(zip(characters, actors))) c([character + ' is played by ' + actor for (character, actor) in zip(characters, actors)]) # Taskask 1.5.19 L = ['A', 'B', 'C', 'D', 'E'] c(list(zip(list(range(5)), L))) # Task.1.5.20 c([x + y for (x, y) in list(zip([10, 25, 40], [1, 15, 20]))]) # reversed c([x * x for x in reversed([4, 5, 10])]) # 30p # 딕셔너리, 순서없음, 중괄호{}, 집합에서 KEY:VALUE의 쌍으로 존재, KEY는 변경 불가능(KEY로 집합, 리스트, 딕셔너리 사용 불가) c({2 + 1:'thr' + 'ee', 2 * 2:'fo' + 'ur'}) c({2 + 1:'thr' + 'ee', 2 + 1:'fo' + 'ur'}) # KEY 중복 불가 c({4:'four', 3:'three'}[4]) mydict = {'Neo':'Keanu', 'Morpheus':'Laurence'} c(mydict['Neo']) # c(mydict['Neo1']) # KeyError: 'Neo1' # 31p c('Oracle' in mydict) # False c('Neo' in mydict) # True c(1 in range(10)) # True c(11 in range(10)) # False c(mydict['Neo'] if 'Neo' in mydict else 'Not') # 이건 필터 if 가 아니다. # Task1.5.21 dlist = [{'James':'Sean', 'director':'Terence'}, {'James':'AA', 'director':'BB'}, {'James':'CC', 'director':'DD'}] k = 'James' c([x[k] for x in dlist]) # Task1.5.22 dlist = [{'Bilbo':'Ian', 'Frodo':'Elijah'}, {'Bilbo':'mar', 'Thorin':'Rich'}] k = 'Frodo' c([x[k] if k in x else 'NOT PRESENT' for x in dlist]) mydict['Agent Smith'] = 'Hugo' mydict['Neo'] = 'Philip' c(mydict) # 32p c({k for (k, v) in [(3, 2), (4, 0), (100, 1)]}) c({k:v for (k, v) in [(3, 2), (4, 0), (100, 1)]}) c({(x, y) : x * y for x in [1, 2, 3] for y in [1, 2, 3]}) # Task1.5.23 c({k:k * k for k in range(100)}) # Task1.5.24 항등함수 D = {'red', 'white', 'blue'} c({k:k for k in D}) # {'blue': 'blue', 'red': 'red', 'white': 'white'} 이게 맞나? # Task1.5.25 좀... 어렵네;; > VALUE를 숫자조합으로 먼저 구해서, VALUE 로 KEY 를 만들어서 조합하자. # 이걸 Java로 해야한다면,,, 많이 복잡하겠군;;; base = 10 # 0 < base <= 10, 알파벳은 좀 무리다... digits = set(range(base)) c([[x, y, z] for x in digits for y in digits for z in digits]) c({x * base ** 2 + y * base ** 1 + z : [x, y, z] for x in digits for y in digits for z in digits}) c(list(mydict.keys())) c(set(mydict.values())) # 33p c([m for m in mydict.items()]) c([k + " is " + v for (k, v) in mydict.items()]) # Task1.5.26 문제 이해가 안됨;; id2salary = {0:1000.0, 3:990, 1:1200.50} names = ['Larry', 'Curly', '', 'Moe'] c([names[k] for (k, v) in id2salary.items()]) c({names[k]:id2salary[k] for (k, v) in id2salary.items()}) def twice(z): return 2 * z c(twice(12)) # 24 c(twice([3, 4])) # [3, 4, 3, 4] c(twice('abc12')) # abc12abc12 # 34p def nextInts(L): return [k + 1 for k in L] c(nextInts([1, 5, 7])) def cubes(L): return [k ** 3 for k in L] c(cubes([1, 2, 3])) def dict2list(dct, keylist): return [dct[i] for i in keylist] c(dict2list({'a':'A', 'b':'B', 'c':'C'}, ['b', 'c', 'a'])) def list2dict(L, keylist): return {k:v for (k, v) in zip(keylist, L)} c(list2dict(['A', 'B', 'C'], ['a', 'b', 'c'])) def all_3_digit_numbers(base, digits): return {x * base ** 2 + y * base + z for x in digits for y in digits for z in digits} c(all_3_digit_numbers(3, {0, 1, 2})) # end
콘솔 결과
47 > 19.0 48 > 19.607843137254903 49 > 0.5454545454545454 50 > 87.45454545454545 51 > 88 53 > 10080 54 > 25 55 > 49038 56 > 25 59 > 1e+16 61 > 문자 62 > 문자' 63 > 문자" 64 > 문자" 66 > False 67 > True 68 > False 73 > 1.0 77 > {'a', 3} 78 > 16 80 > True 81 > True 84 > {1, 2, 3, 4} 85 > {2, 4} 90 > {1, 3, 4} 92 > {1, 3, 4, 5, 6} 94 > {5, 6} 97 > {6} 102 > {6} 104 > {2, 4, 6} 105 > {16, 1, 9, 25, 4} 107 > {8, 1, 2, 16, 4} 108 > {6} 109 > {25, 49, 36} 110 > {25, 49, 36} 113 > {2, 3, 4, 6, 8, 9, 12} 115 > {36, 39, 42, 12, 13, 14, 24, 26, 28} 116 > {2, 3, 4, 6, 8, 12} 122 > {3, 4} 131 > [1, 2, 3, 2, 3] 132 > [[1, 2], {2, 3, 4}, 'yo'] 133 > 3 134 > 7 135 > 5 137 > 30.0 139 > [1, 2, 3, 'my', 'word'] 141 > [4, 8, 12, 'm', 'y'] 142 > [4, 8, 12] 149 > [1, 2, 3, 4, 5, 6, 'y'] 151 > [2, 4, 6, 8, 10] 152 > [4, 2, 6, 8, 10] 154 > [10, 20, 30, 20, 40, 60, 30, 60, 90] 156 > [['A', 1], ['A', 2], ['A', 3], ['B', 1], ['B', 2], ['B', 3], ['C', 1], ['C', 2], ['C', 3]] 160 >at 0x027A4508> 161 > [10] 163 > [10, 16] 164 > 26 166 > 16.1 169 > 4 171 > the 174 > [0, 10, 20, 30, 40, 50, 60, 70, 80, 90] 177 > [0, 10, 20, 30, 40, 50, 60, 70, 80, 90] 179 > 10 180 > [0, 10, 20, 30, 40] 181 > [50, 60, 70, 80, 90] 184 > [0, 10, 20, 30, 40, 50, 60, 70, 80, 90] 185 > [0, 20, 40, 60, 80] 186 > [0, 30, 60, 90] 187 > [90, 60, 30, 0] 188 > [] 189 > [0] 192 > [20, 40, 60, 80] 193 > [20, 50, 80] 198 > (4, 8, 12) 200 > (4, 8, 12) 206 > [1, 4, 9] 213 > [30, 0, 10] 218 > (1, 4, 2) 219 > {(1, 2), 0, (3, 4, 5)} 223 > my 224 > 3.14 227 > 1 229 > 2 232 > (1, 2) 234 > ['a', 'b', 'c'] 235 > at 0x027A44E0> 239 > [(0, 0, 0), (0, 2, -2), (0, -2, 2), (1, 1, -2), (1, -2, 1), (2, 0, -2), (2, 2, -4), (2, -4, 2), (2, -2, 0), (-4, 2, 2), (-2, 0, 2), (-2, 1, 1), (-2, 2, 0)] 241 > [(0, 2, -2), (0, -2, 2), (1, 1, -2), (1, -2, 1), (2, 0, -2), (2, 2, -4), (2, -4, 2), (2, -2, 0), (-4, 2, 2), (-2, 0, 2), (-2, 1, 1), (-2, 2, 0)] 243 > (0, 2, -2) 251 > range(0, 10) 252 > {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} 253 > {1, 2, 3} 254 > {1, 2, 3} 255 > {1, 2, 3} 256 > [1, 2, 3] 257 > [1, 2, 3] 258 > [1, 2, 3] 262 > 7 263 > 5 283 > [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 284 > {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} 285 > at 0x027FE968> 286 > (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) 289 > 285 290 > {1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99} 294 > [1, 2, 3, 4, 5] 296 > [1, 3, 5] 299 > 300 > [(1, 2), (2, 4), (3, 6)] 301 > {(1, 2), (2, 4), (3, 6)} 305 > {('Morpheus', 'Laurence'), ('Neo', 'Keanu'), ('Trinity', 'Carrie-Anne')} 306 > ['Neo is played by Keanu', 'Morpheus is played by Laurence', 'Trinity is played by Carrie-Anne'] 310 > [(0, 'A'), (1, 'B'), (2, 'C'), (3, 'D'), (4, 'E')] 313 > [11, 40, 60] 316 > [100, 25, 16] 321 > {3: 'three', 4: 'four'} 322 > {3: 'four'} 325 > four 327 > Keanu 331 > False 332 > True 334 > True 335 > False 336 > Keanu 340 > ['Sean', 'AA', 'CC'] 345 > ['Elijah', 'NOT PRESENT'] 349 > {'Neo': 'Philip', 'Morpheus': 'Laurence', 'Agent Smith': 'Hugo'} 352 > {3, 4, 100} 353 > {100: 1, 3: 2, 4: 0} 354 > {(1, 2): 2, (3, 2): 6, (1, 3): 3, (2, 3): 6, (3, 3): 9, (2, 2): 4, (3, 1): 3, (1, 1): 1, (2, 1): 2} 357 > {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81, 10: 100, 11: 121, 12: 144, 13: 169, 14: 196, 15: 225,,,,,,, 92: 8464, 93: 8649, 94: 8836, 95: 9025, 96: 9216, 97: 9409, 98: 9604, 99: 9801} 361 > {'red': 'red', 'blue': 'blue', 'white': 'white'} 367 > [[0, 0, 0], [0, 0, 1], [0, 0, 2], [0, 0, 3], [0, 0, 4], [0, 0, 5], [0, 0, 6], [0, 0, 7], [0, 0, 8], ,,,,,, [9, 9, 2], [9, 9, 3], [9, 9, 4], [9, 9, 5], [9, 9, 6], [9, 9, 7], [9, 9, 8], [9, 9, 9]] 368 > {0: [0, 0, 0], 1: [0, 0, 1], 2: [0, 0, 2], 3: [0, 0, 3], 4: [0, 0, 4], 5: [0, 0, 5], 6: [0, 0, 6],,,,, 995: [9, 9, 5], 996: [9, 9, 6], 997: [9, 9, 7], 998: [9, 9, 8], 999: [9, 9, 9]} 370 > ['Neo', 'Morpheus', 'Agent Smith'] 371 > {'Philip', 'Hugo', 'Laurence'} 374 > [('Neo', 'Philip'), ('Morpheus', 'Laurence'), ('Agent Smith', 'Hugo')] 375 > ['Neo is Philip', 'Morpheus is Laurence', 'Agent Smith is Hugo'] 380 > ['Larry', 'Curly', 'Moe'] 381 > {'Curly': 1200.5, 'Larry': 1000.0, 'Moe': 990} 384 > 24 385 > [3, 4, 3, 4] 386 > abc12abc12 390 > [2, 6, 8] 393 > [1, 8, 27] 396 > ['B', 'C', 'A'] 399 > {'a': 'A', 'c': 'C', 'b': 'B'} 402 > {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26}
'python 및 머신러닝 > Coding The Matrix' 카테고리의 다른 글
[Coding The Matrix] 코딩 더 매트릭스 - Chapter 3 벡터 (0) | 2015.08.18 |
---|---|
파이썬을 사용하면서 발생한 이슈 (0) | 2015.08.17 |
[Coding The Matrix] 코딩 더 매트릭스 - Chapter 2 필드 (0) | 2015.08.13 |
[Coding The Matrix] 코딩 더 매트릭스 - Chapter 1.6 역 인덱스 (0) | 2015.08.13 |
[Coding The Matrix] 코딩 더 매트릭스 - 준비 (0) | 2015.08.13 |