Programmeren IK 2019 Jelle van Assema Vorige week Jupyter - - PowerPoint PPT Presentation

programmeren ik 2019
SMART_READER_LITE
LIVE PREVIEW

Programmeren IK 2019 Jelle van Assema Vorige week Jupyter - - PowerPoint PPT Presentation

Programmeren IK 2019 Jelle van Assema Vorige week Jupyter Notebook Comprehensions File IO Deze week Oefenen met alles Python Constructieve zoekalgoritmes Recursie Wachtwoord kraken 10 x 10 x 26 x 26 x 26 x 10


slide-1
SLIDE 1

Programmeren IK 2019

Jelle van Assema

slide-2
SLIDE 2

Vorige week

  • Jupyter Notebook
  • Comprehensions
  • File IO
slide-3
SLIDE 3

Deze week

  • Oefenen met alles Python
  • Constructieve zoekalgoritmes
  • Recursie
slide-4
SLIDE 4

Wachtwoord kraken

slide-5
SLIDE 5
slide-6
SLIDE 6

10 x 10 x 26 x 26 x 26 x 10 17,576,000

slide-7
SLIDE 7

Een wachtwoord van 10 tekens, bestaande uit:

  • Letters (groot en klein)
  • Cijfers
  • De tekens: ! , .
slide-8
SLIDE 8

Een wachtwoord van 10 tekens, bestaande uit:

  • Letters (groot en klein)
  • Cijfers
  • De tekens: ! , .

(26 + 26 + 10 + 3)10 1.3462743 * 1018

slide-9
SLIDE 9

Een wachtwoord van 10 tekens kraken?

Bij 1 miljard wachtwoorden per seconde: (1.3462743 * 1018) / 109 = 1.3462743 * 109 seconden 373965 uur 42.69 jaar

slide-10
SLIDE 10

Een wachtwoord van 10 tekens kraken?

Wachtwoorden zijn vaak niet willekeurig. In praktijk:

  • Patronen
  • Dictionary attacks
  • 0000
slide-11
SLIDE 11
slide-12
SLIDE 12

Sudoku’s

Een bord van 9 x 9, met elk op vakje 9 mogelijkheden

981 1.9662705 * 1077

slide-13
SLIDE 13

1.9662705 * 1077 It is estimated that there are between 1078 to 1082 atoms in the known,

  • bservable universe.
slide-14
SLIDE 14

1.9662705 * 1077 6,670,903,752,021,072,936,9 60 / (2.9475324 * 1055)

slide-15
SLIDE 15

Sudoku’s oplossen

Probleemgrootte is maar een fractie van:

6,670,903,752,021,072,936,960

slide-16
SLIDE 16
slide-17
SLIDE 17

Sudoku’s oplossen

  • 51 lege vakjes
  • 951 mogelijkheden toch?
  • Dat zijn 6.9531773 * 1026 keer zoveel mogelijkheden

dan er sudoku’s bestaan

slide-18
SLIDE 18

Sudoku’s oplossen

  • 51 lege vakjes
  • Naïeve manier van oplossen
  • Manier voor doorzoeken met enkel geldige sudoku’s.
slide-19
SLIDE 19

Constructief oplossen

  • Een opbouwende manier van

gestructureerd zoeken

  • Naïeve manier van oplossen
  • Manier voor doorzoeken met enkel geldige sudoku’s.
slide-20
SLIDE 20

Constructief oplossen

  • Een opbouwende manier van

gestructureerd zoeken

  • Naïeve manier van oplossen
  • Manier voor doorzoeken met enkel geldige sudoku’s.
slide-21
SLIDE 21
slide-22
SLIDE 22

1

slide-23
SLIDE 23

Breadth-First Search (BFS)

1 2 4

slide-24
SLIDE 24

Breadth-First Search (BFS)

1 2 4 1 2 4 1 2 4

slide-25
SLIDE 25

Breadth-First Search (BFS)

1 2 4 1 2 4 1 2 4 1 2 4 1 2 4 1 2 4 1 2 4 1 2 4 1 2 4

slide-26
SLIDE 26

Depth-First Search (DFS)

1 2 4

slide-27
SLIDE 27

Depth-First Search (DFS)

1 2 4 1 2 4 1 2 4

slide-28
SLIDE 28

DFS BFS

slide-29
SLIDE 29

Wachtwoord kraken

slide-30
SLIDE 30

DFS algoritme

1 function DFS(V) 2 let S be a stack 3 S.push(V) 4 while S is not empty 5 V = S.pop() 6 for all candidates C from V do 7 let W be a copy of V 8 apply C to W 9 if W is a solution do 10 return W 11 S.push(W)

slide-31
SLIDE 31

DFS algoritme

1 function DFS(V) 2 let S be a stack 3 S.push(V) 4 while S is not empty 5 V = S.pop() 6 for all candidates C from V do 7 let W be a copy of V 8 apply C to W 9 if W is a solution do 10 return W 11 S.push(W)

V

slide-32
SLIDE 32

DFS algoritme

1 function DFS(V) 2 let S be a stack 3 S.push(V) 4 while S is not empty 5 V = S.pop() 6 for all candidates C from V do 7 let W be a copy of V 8 apply C to W 9 if W is a solution do 10 return W 11 S.push(W)

S V

slide-33
SLIDE 33

DFS algoritme

1 function DFS(V) 2 let S be a stack 3 S.push(V) 4 while S is not empty 5 V = S.pop() 6 for all candidates C from V do 7 let W be a copy of V 8 apply C to W 9 if W is a solution do 10 return W 11 S.push(W)

S V

slide-34
SLIDE 34

DFS algoritme

1 function DFS(V) 2 let S be a stack 3 S.push(V) 4 while S is not empty 5 V = S.pop() 6 for all candidates C from V do 7 let W be a copy of V 8 apply C to W 9 if W is a solution do 10 return W 11 S.push(W)

S V

slide-35
SLIDE 35

DFS algoritme

1 function DFS(V) 2 let S be a stack 3 S.push(V) 4 while S is not empty 5 V = S.pop() 6 for all candidates C from V do 7 let W be a copy of V 8 apply C to W 9 if W is a solution do 10 return W 11 S.push(W)

S V

slide-36
SLIDE 36

DFS algoritme

1 function DFS(V) 2 let S be a stack 3 S.push(V) 4 while S is not empty 5 V = S.pop() 6 for all candidates C from V do 7 let W be a copy of V 8 apply C to W 9 if W is a solution do 10 return W 11 S.push(W)

S V C 1

slide-37
SLIDE 37

DFS algoritme

1 function DFS(V) 2 let S be a stack 3 S.push(V) 4 while S is not empty 5 V = S.pop() 6 for all candidates C from V do 7 let W be a copy of V 8 apply C to W 9 if W is a solution do 10 return W 11 S.push(W)

S V C 1 W

slide-38
SLIDE 38

DFS algoritme

1 function DFS(V) 2 let S be a stack 3 S.push(V) 4 while S is not empty 5 V = S.pop() 6 for all candidates C from V do 7 let W be a copy of V 8 apply C to W 9 if W is a solution do 10 return W 11 S.push(W)

S V C 1 W

1

slide-39
SLIDE 39

DFS algoritme

1 function DFS(V) 2 let S be a stack 3 S.push(V) 4 while S is not empty 5 V = S.pop() 6 for all candidates C from V do 7 let W be a copy of V 8 apply C to W 9 if W is a solution do 10 return W 11 S.push(W)

S V C 1 W

1

slide-40
SLIDE 40

DFS algoritme

1 function DFS(V) 2 let S be a stack 3 S.push(V) 4 while S is not empty 5 V = S.pop() 6 for all candidates C from V do 7 let W be a copy of V 8 apply C to W 9 if W is a solution do 10 return W 11 S.push(W)

S V C 1 W

1 1

slide-41
SLIDE 41

DFS algoritme

1 function DFS(V) 2 let S be a stack 3 S.push(V) 4 while S is not empty 5 V = S.pop() 6 for all candidates C from V do 7 let W be a copy of V 8 apply C to W 9 if W is a solution do 10 return W 11 S.push(W)

S V C 2 W

1 1

slide-42
SLIDE 42

DFS algoritme

1 function DFS(V) 2 let S be a stack 3 S.push(V) 4 while S is not empty 5 V = S.pop() 6 for all candidates C from V do 7 let W be a copy of V 8 apply C to W 9 if W is a solution do 10 return W 11 S.push(W)

S V C 2 W

1

slide-43
SLIDE 43

DFS algoritme

1 function DFS(V) 2 let S be a stack 3 S.push(V) 4 while S is not empty 5 V = S.pop() 6 for all candidates C from V do 7 let W be a copy of V 8 apply C to W 9 if W is a solution do 10 return W 11 S.push(W)

S V C 2 W

1 2

slide-44
SLIDE 44

DFS algoritme

1 function DFS(V) 2 let S be a stack 3 S.push(V) 4 while S is not empty 5 V = S.pop() 6 for all candidates C from V do 7 let W be a copy of V 8 apply C to W 9 if W is a solution do 10 return W 11 S.push(W)

S V C 2 W

1 2

slide-45
SLIDE 45

DFS algoritme

1 function DFS(V) 2 let S be a stack 3 S.push(V) 4 while S is not empty 5 V = S.pop() 6 for all candidates C from V do 7 let W be a copy of V 8 apply C to W 9 if W is a solution do 10 return W 11 S.push(W)

S V C 2 W

1 2 2

slide-46
SLIDE 46

DFS algoritme

1 function DFS(V) 2 let S be a stack 3 S.push(V) 4 while S is not empty 5 V = S.pop() 6 for all candidates C from V do 7 let W be a copy of V 8 apply C to W 9 if W is a solution do 10 return W 11 S.push(W)

S V C 4 W

1 2 2

slide-47
SLIDE 47

DFS algoritme

1 function DFS(V) 2 let S be a stack 3 S.push(V) 4 while S is not empty 5 V = S.pop() 6 for all candidates C from V do 7 let W be a copy of V 8 apply C to W 9 if W is a solution do 10 return W 11 S.push(W)

S V C 4 W

1 2

slide-48
SLIDE 48

DFS algoritme

1 function DFS(V) 2 let S be a stack 3 S.push(V) 4 while S is not empty 5 V = S.pop() 6 for all candidates C from V do 7 let W be a copy of V 8 apply C to W 9 if W is a solution do 10 return W 11 S.push(W)

S V C 4 W

1 2 4

slide-49
SLIDE 49

DFS algoritme

1 function DFS(V) 2 let S be a stack 3 S.push(V) 4 while S is not empty 5 V = S.pop() 6 for all candidates C from V do 7 let W be a copy of V 8 apply C to W 9 if W is a solution do 10 return W 11 S.push(W)

S V C 4 W

1 2 4

slide-50
SLIDE 50

DFS algoritme

1 function DFS(V) 2 let S be a stack 3 S.push(V) 4 while S is not empty 5 V = S.pop() 6 for all candidates C from V do 7 let W be a copy of V 8 apply C to W 9 if W is a solution do 10 return W 11 S.push(W)

S V C 4 W

1 2 4 4

slide-51
SLIDE 51

DFS algoritme

1 function DFS(V) 2 let S be a stack 3 S.push(V) 4 while S is not empty 5 V = S.pop() 6 for all candidates C from V do 7 let W be a copy of V 8 apply C to W 9 if W is a solution do 10 return W 11 S.push(W)

S V C 4 W

1 2 4 4

slide-52
SLIDE 52

DFS algoritme

1 function DFS(V) 2 let S be a stack 3 S.push(V) 4 while S is not empty 5 V = S.pop() 6 for all candidates C from V do 7 let W be a copy of V 8 apply C to W 9 if W is a solution do 10 return W 11 S.push(W)

S V C 4 W

1 2 4 4

slide-53
SLIDE 53

DFS algoritme

1 function DFS(V) 2 let S be a stack 3 S.push(V) 4 while S is not empty 5 V = S.pop() 6 for all candidates C from V do 7 let W be a copy of V 8 apply C to W 9 if W is a solution do 10 return W 11 S.push(W)

S V C 7 W

1 2 47 4 43 7 4

slide-54
SLIDE 54

DFS algoritme

1 function DFS(V) 2 let S be a stack 3 S.push(V) 4 while S is not empty 5 V = S.pop() 6 for all candidates C from V do 7 let W be a copy of V 8 apply C to W 9 if W is a solution do 10 return W 11 S.push(W)

S V C 7 W

1 2 47 47 43

slide-55
SLIDE 55

DFS algoritme

1 function DFS(V) 2 let S be a stack 3 S.push(V) 4 while S is not empty 5 V = S.pop() 6 for all candidates C from V do 7 let W be a copy of V 8 apply C to W 9 if W is a solution do 10 return W 11 S.push(W)

S V C 7 W

1 2 47 47 43

slide-56
SLIDE 56

DFS algoritme

1 function DFS(V) 2 let S be a stack 3 S.push(V) 4 while S is not empty 5 V = S.pop() 6 for all candidates C from V do 7 let W be a copy of V 8 apply C to W 9 if W is a solution do 10 return W 11 S.push(W)

S V C 7 W

1 2 47 43

slide-57
SLIDE 57

DFS algoritme

1 function DFS(V) 2 let S be a stack 3 S.push(V) 4 while S is not empty 5 V = S.pop() 6 for all candidates C from V do 7 let W be a copy of V 8 apply C to W 9 if W is a solution do 10 return W 11 S.push(W)

S V C 7 W

1 2 47 43

slide-58
SLIDE 58

DFS algoritme

1 function DFS(V) 2 let S be a stack 3 S.push(V) 4 while S is not empty 5 V = S.pop() 6 for all candidates C from V do 7 let W be a copy of V 8 apply C to W 9 if W is a solution do 10 return W 11 S.push(W)

S V C 7 W

1 47 2

slide-59
SLIDE 59

DFS algoritme

  • Eerst de diepte in
  • Kom je niet verder, backtracken!
slide-60
SLIDE 60

Recursie

  • Een functie die zichzelf aanroept

def forever(): print(“hello”) forever()

slide-61
SLIDE 61

Recursie

  • Basecase
  • Reductiestap
slide-62
SLIDE 62

Is een getal even?

slide-63
SLIDE 63

Is een getal even?

0 is een even getal => true 1 is een oneven getal => false

slide-64
SLIDE 64

Is een getal even?

0 is een even getal => true 1 is een oneven getal => false is_even(n) = is_even(n - 2)

slide-65
SLIDE 65

Recursie, is een getal even?

def even(n): if n == 0: return True if n == 1: return False return even(n - 2)

slide-66
SLIDE 66

Recursie, binary search

slide-67
SLIDE 67

Recursie, binary search

naald gevonden => true niks meer te doorzoeken => false

slide-68
SLIDE 68

Recursie, binary search

naald gevonden => true niks meer te doorzoeken => false needle < midden? doorzoek linkerhelft needle > midden? Doorzoek rechterhelft

slide-69
SLIDE 69

Recursie, binary search

def binary_search(numbers, n): if len(numbers) == 0: return False mid = len(numbers) // 2 if numbers[mid] == n: return True ...

slide-70
SLIDE 70

Recursie, binary search

def binary_search(numbers, n): if len(numbers) == 0: return False mid = len(numbers) // 2 if numbers[mid] == n: return True if numbers[mid] > n: return binary_search(numbers[:n]) else: return binary_search(numbers[n + 1:])

slide-71
SLIDE 71

Recursie, wachtwoord kraken

slide-72
SLIDE 72

Recursie, wachtwoord kraken

guess is gelijk aan wachtwoord? => True lengte van gok is max_lengte? => False

slide-73
SLIDE 73

Recursie, wachtwoord kraken

guess is gelijk aan wachtwoord? => True lengte van gok is max_lengte? => False voor elke optie: crack(guess + optie)

slide-74
SLIDE 74

Recursie, sudoku

slide-75
SLIDE 75

Recursie, sudoku

Alles ingevuld => opgelost Geen optie meer te verkennen => onopgelost

slide-76
SLIDE 76

Recursie, sudoku

Alles ingevuld => opgelost Geen optie meer te verkennen => onopgelost Vul een vakje in

  • Ga van een sudoku met n lege vakjes, naar n - 1

lege vakjes

slide-77
SLIDE 77

DFS recursief

1 function DFS-recursive(V) 2 if V is solved 3 return V 4 5 for all candidates C from V do 6 apply C to V 7 DFS-recursive(V) 8 if V is solved 9 return V 10 undo C to V

slide-78
SLIDE 78

DFS recursief

1 function DFS-recursive(V) 2 if V is solved 3 return V 4 5 for all candidates C from V do 6 apply C to V 7 DFS-recursive(V) 8 if V is solved 9 return V 10 undo C to V Callstack

DFSrec ( )

slide-79
SLIDE 79

DFS recursief

1 function DFS-recursive(V) 2 if V is solved 3 return V 4 5 for all candidates C from V do 6 apply C to V 7 DFS-recursive(V) 8 if V is solved 9 return V 10 undo C to V Callstack

V DFSrec ( )

slide-80
SLIDE 80

DFS recursief

1 function DFS-recursive(V) 2 if V is solved 3 return V 4 5 for all candidates C from V do 6 apply C to V 7 DFS-recursive(V) 8 if V is solved 9 return V 10 undo C to V Callstack

V DFSrec ( )

slide-81
SLIDE 81

DFS recursief

1 function DFS-recursive(V) 2 if V is solved 3 return V 4 5 for all candidates C from V do 6 apply C to V 7 DFS-recursive(V) 8 if V is solved 9 return V 10 undo C to V Callstack

V C 1 DFSrec ( )

slide-82
SLIDE 82

DFS recursief

1 function DFS-recursive(V) 2 if V is solved 3 return V 4 5 for all candidates C from V do 6 apply C to V 7 DFS-recursive(V) 8 if V is solved 9 return V 10 undo C to V Callstack

V C 1

1

DFSrec ( )

1

slide-83
SLIDE 83

DFS recursief

1 function DFS-recursive(V) 2 if V is solved 3 return V 4 5 for all candidates C from V do 6 apply C to V 7 DFS-recursive(V) 8 if V is solved 9 return V 10 undo C to V Callstack

V C 1

1

DFSrec ( ) DFSrec ( )

1 1

slide-84
SLIDE 84

DFS recursief

1 function DFS-recursive(V) 2 if V is solved 3 return V 4 5 for all candidates C from V do 6 apply C to V 7 DFS-recursive(V) 8 if V is solved 9 return V 10 undo C to V Callstack

V

1

DFSrec ( ) DFSrec ( )

1 1

slide-85
SLIDE 85

DFS recursief

1 function DFS-recursive(V) 2 if V is solved 3 return V 4 5 for all candidates C from V do 6 apply C to V 7 DFS-recursive(V) 8 if V is solved 9 return V 10 undo C to V Callstack

V

1

DFSrec ( ) DFSrec ( )

1 1

slide-86
SLIDE 86

DFS recursief

1 function DFS-recursive(V) 2 if V is solved 3 return V 4 5 for all candidates C from V do 6 apply C to V 7 DFS-recursive(V) 8 if V is solved 9 return V 10 undo C to V Callstack

V C 3

1

DFSrec ( ) DFSrec ( )

1 1

slide-87
SLIDE 87

DFS recursief

1 function DFS-recursive(V) 2 if V is solved 3 return V 4 5 for all candidates C from V do 6 apply C to V 7 DFS-recursive(V) 8 if V is solved 9 return V 10 undo C to V Callstack

V C 3

13

DFSrec ( ) DFSrec ( )

13 13

slide-88
SLIDE 88

DFS recursief

1 function DFS-recursive(V) 2 if V is solved 3 return V 4 5 for all candidates C from V do 6 apply C to V 7 DFS-recursive(V) 8 if V is solved 9 return V 10 undo C to V Callstack

V C 3

13

DFSrec ( ) DFSrec ( )

13 13

DFSrec ( )

13

slide-89
SLIDE 89

DFS recursief

1 function DFS-recursive(V) 2 if V is solved 3 return V 4 5 for all candidates C from V do 6 apply C to V 7 DFS-recursive(V) 8 if V is solved 9 return V 10 undo C to V Callstack

V

13

DFSrec ( ) DFSrec ( )

13 13

DFSrec ( )

13

slide-90
SLIDE 90

DFS recursief

1 function DFS-recursive(V) 2 if V is solved 3 return V 4 5 for all candidates C from V do 6 apply C to V 7 DFS-recursive(V) 8 if V is solved 9 return V 10 undo C to V Callstack

V

13

DFSrec ( ) DFSrec ( )

13 13

DFSrec ( )

13

slide-91
SLIDE 91

DFS recursief

1 function DFS-recursive(V) 2 if V is solved 3 return V 4 5 for all candidates C from V do 6 apply C to V 7 DFS-recursive(V) 8 if V is solved 9 return V 10 undo C to V Callstack

V

13

DFSrec ( ) DFSrec ( )

13 13

DFSrec ( )

13

slide-92
SLIDE 92

DFS recursief

1 function DFS-recursive(V) 2 if V is solved 3 return V 4 5 for all candidates C from V do 6 apply C to V 7 DFS-recursive(V) 8 if V is solved 9 return V 10 undo C to V Callstack

V

13

DFSrec ( ) DFSrec ( )

13 13

C 3

slide-93
SLIDE 93

DFS recursief

1 function DFS-recursive(V) 2 if V is solved 3 return V 4 5 for all candidates C from V do 6 apply C to V 7 DFS-recursive(V) 8 if V is solved 9 return V 10 undo C to V Callstack

V

1

DFSrec ( ) DFSrec ( )

1 1

C 3

slide-94
SLIDE 94

DFS recursief

1 function DFS-recursive(V) 2 if V is solved 3 return V 4 5 for all candidates C from V do 6 apply C to V 7 DFS-recursive(V) 8 if V is solved 9 return V 10 undo C to V Callstack

V

1

DFSrec ( ) DFSrec ( )

1 1

C 7

slide-95
SLIDE 95

DFS recursief

1 function DFS-recursive(V) 2 if V is solved 3 return V 4 5 for all candidates C from V do 6 apply C to V 7 DFS-recursive(V) 8 if V is solved 9 return V 10 undo C to V Callstack

V

17

DFSrec ( ) DFSrec ( )

17 17

C 7

slide-96
SLIDE 96

DFS recursief

1 function DFS-recursive(V) 2 if V is solved 3 return V 4 5 for all candidates C from V do 6 apply C to V 7 DFS-recursive(V) 8 if V is solved 9 return V 10 undo C to V Callstack

V

17

DFSrec ( ) DFSrec ( )

17 17

C 7 DFSrec ( )

17

slide-97
SLIDE 97

DFS algoritme

  • Verschillende implementaties mogelijk
  • Hacker editie: iteratief DFS met generators
slide-98
SLIDE 98

Deeltentamen 2