Slide 1

Slide 1 text

RubyConf 2015 - Lito Nicolai - @lito_nico Botany Bytes with Lito Nicolai

Slide 2

Slide 2 text

RubyConf 2015 - Lito Nicolai - @lito_nico This talk uses graphics! $ gem install --pre graphics

Slide 3

Slide 3 text

RubyConf 2015 - Lito Nicolai - @lito_nico Imagine you’re algae…

Slide 4

Slide 4 text

RubyConf 2015 - Lito Nicolai - @lito_nico An alga (you)

Slide 5

Slide 5 text

RubyConf 2015 - Lito Nicolai - @lito_nico

Slide 6

Slide 6 text

RubyConf 2015 - Lito Nicolai - @lito_nico

Slide 7

Slide 7 text

RubyConf 2015 - Lito Nicolai - @lito_nico

Slide 8

Slide 8 text

RubyConf 2015 - Lito Nicolai - @lito_nico

Slide 9

Slide 9 text

RubyConf 2015 - Lito Nicolai - @lito_nico

Slide 10

Slide 10 text

RubyConf 2015 - Lito Nicolai - @lito_nico

Slide 11

Slide 11 text

RubyConf 2015 - Lito Nicolai - @lito_nico A A B A B A A B A A B A B A A B A B A A B A A B A B A A B A A B incidentally, Fibonacci

Slide 12

Slide 12 text

RubyConf 2015 - Lito Nicolai - @lito_nico Aristid Lindenmayer Genus Species

Slide 13

Slide 13 text

RubyConf 2015 - Lito Nicolai - @lito_nico Aristid Lindenmayer Genus Species

Slide 14

Slide 14 text

RubyConf 2015 - Lito Nicolai - @lito_nico “L-Systems” Start: A Rules: A ! AB B ! A

Slide 15

Slide 15 text

RubyConf 2015 - Lito Nicolai - @lito_nico

Slide 16

Slide 16 text

RubyConf 2015 - Lito Nicolai - @lito_nico Rewriting Systems String Line Grid A AB ABA ABAAB ABAABABA

Slide 17

Slide 17 text

RubyConf 2015 - Lito Nicolai - @lito_nico This is a grammar!

Slide 18

Slide 18 text

RubyConf 2015 - Lito Nicolai - @lito_nico What’s a grammar?

Slide 19

Slide 19 text

RubyConf 2015 - Lito Nicolai - @lito_nico What strings can you make with rules? Montana State University Mathematics (grids, lines… things) A ! AB B ! A

Slide 20

Slide 20 text

RubyConf 2015 - Lito Nicolai - @lito_nico What strings can you match with these rules? -?(\d+(\.\d+)?|\.\d+)([eE][+-]?\d+)?

Slide 21

Slide 21 text

RubyConf 2015 - Lito Nicolai - @lito_nico Where do L-Systems fit in here?

Slide 22

Slide 22 text

RubyConf 2015 - Lito Nicolai - @lito_nico Organizing Grammars RegEx Lindenmayer & Prusinkiewicz (needs a DFA) (using computers)

Slide 23

Slide 23 text

RubyConf 2015 - Lito Nicolai - @lito_nico (let’s ignore finite grammars) RegEx Lindenmayer & Prusinkiewicz

Slide 24

Slide 24 text

RubyConf 2015 - Lito Nicolai - @lito_nico RegEx HTML Lindenmayer & Prusinkiewicz Chomsky Hierarchy (needs a stack)

Slide 25

Slide 25 text

RubyConf 2015 - Lito Nicolai - @lito_nico RegEx HTML Lindenmayer & Prusinkiewicz C++ Chomsky Hierarchy (needs RAM)

Slide 26

Slide 26 text

RubyConf 2015 - Lito Nicolai - @lito_nico RegEx HTML Lindenmayer & Prusinkiewicz Chomsky Hierarchy C++

Slide 27

Slide 27 text

RubyConf 2015 - Lito Nicolai - @lito_nico Ruby? RegEx HTML Lindenmayer & Prusinkiewicz Chomsky Hierarchy C++

Slide 28

Slide 28 text

RubyConf 2015 - Lito Nicolai - @lito_nico Chomsky Hierarchy Ruby? RegEx HTML Perl Lindenmayer & Prusinkiewicz C++

Slide 29

Slide 29 text

RubyConf 2015 - Lito Nicolai - @lito_nico Chomsky Hierarchy RegEx HTML Perl Lindenmayer & Prusinkiewicz Ruby? C++

Slide 30

Slide 30 text

RubyConf 2015 - Lito Nicolai - @lito_nico Chomsky Hierarchy RegEx HTML Perl Lindenmayer & Prusinkiewicz Ruby? C++

Slide 31

Slide 31 text

RubyConf 2015 - Lito Nicolai - @lito_nico L-Systems are a strange slice of other grammars!

Slide 32

Slide 32 text

RubyConf 2015 - Lito Nicolai - @lito_nico ((((((X)))))) Can match this ^ (regex can’t match either) Nested Balanced Parens ((((((())))))) But not this ^

Slide 33

Slide 33 text

RubyConf 2015 - Lito Nicolai - @lito_nico class LSystem attr_reader :state def initialize state, rules @state = state @rules = rules end def step @state = @state.split("") .map {|s| @rules[s] } .join self end end

Slide 34

Slide 34 text

RubyConf 2015 - Lito Nicolai - @lito_nico class LSystem attr_reader :state def initialize state, rules @state = state @rules = rules end def step @state = @state.split("") .map {|s| @rules[s] } .join self end end

Slide 35

Slide 35 text

RubyConf 2015 - Lito Nicolai - @lito_nico @state = @state.split("") .map {|s| @rules[s] } .join "AB" "A" "B" "AB" "A" "ABA" split apply rules join

Slide 36

Slide 36 text

RubyConf 2015 - Lito Nicolai - @lito_nico > l = LSystem.new "A", "A" => "AB", "B" => "A" > l.step => "AB" > l.step => "ABA" > l.step => "ABAAB" > l.step => "ABAABABA"

Slide 37

Slide 37 text

RubyConf 2015 - Lito Nicolai - @lito_nico All in a line

Slide 38

Slide 38 text

RubyConf 2015 - Lito Nicolai - @lito_nico More Dimensions!

Slide 39

Slide 39 text

RubyConf 2015 - Lito Nicolai - @lito_nico Leaf ! Stem LeftLeaf RightLeaf Stem ! Stem Stem Sprout

Slide 40

Slide 40 text

RubyConf 2015 - Lito Nicolai - @lito_nico Turtle Graphics

Slide 41

Slide 41 text

RubyConf 2015 - Lito Nicolai - @lito_nico

Slide 42

Slide 42 text

RubyConf 2015 - Lito Nicolai - @lito_nico turtle.forward

Slide 43

Slide 43 text

RubyConf 2015 - Lito Nicolai - @lito_nico turtle.push

Slide 44

Slide 44 text

RubyConf 2015 - Lito Nicolai - @lito_nico turtle.left 90

Slide 45

Slide 45 text

RubyConf 2015 - Lito Nicolai - @lito_nico turtle.forward

Slide 46

Slide 46 text

RubyConf 2015 - Lito Nicolai - @lito_nico turtle.pop

Slide 47

Slide 47 text

RubyConf 2015 - Lito Nicolai - @lito_nico Turtle Evaluation

Slide 48

Slide 48 text

RubyConf 2015 - Lito Nicolai - @lito_nico > turtle = Turtle.new “S[S", "S" => :forward, "L" => :forward, "[" => [:left, 60], "]" => [:right, 60], "." => :push, "," => :pop

Slide 49

Slide 49 text

RubyConf 2015 - Lito Nicolai - @lito_nico > turtle = Turtle.new “S[S", "S" => :forward, "L" => :forward, "[" => [:left, 60], "]" => [:right, 60], "." => :push, "," => :pop

Slide 50

Slide 50 text

RubyConf 2015 - Lito Nicolai - @lito_nico > turtle = Turtle.new “S[S", "S" => :forward, "L" => :forward, "[" => [:left, 60], "]" => [:right, 60], "." => :push, "," => :pop

Slide 51

Slide 51 text

RubyConf 2015 - Lito Nicolai - @lito_nico > turtle = Turtle.new “S[S", "S" => :forward, "L" => :forward, "[" => [:left, 60], "]" => [:right, 60], "." => :push, "," => :pop

Slide 52

Slide 52 text

RubyConf 2015 - Lito Nicolai - @lito_nico Leaf ! Stem LeftLeaf RightLeaf Stem ! Stem Stem Sprout

Slide 53

Slide 53 text

RubyConf 2015 - Lito Nicolai - @lito_nico “LeftLeaf” SaveState TurnLeft Leaf . [ L “RightLeaf” RestoreState TurnRight Leaf , ] L At the end of a stem…

Slide 54

Slide 54 text

RubyConf 2015 - Lito Nicolai - @lito_nico > turtle = Turtle.new sprout.state, "S" => :forward, "L" => :forward, "[" => [:left, 60], "]" => [:right, 60], "." => :push, "," => :pop > sprout = LSystem.new "L", "L" => “S.[L,]L", "S" => “SS”, "[" => "[", "]" => "]", "." => ".", "," => ","

Slide 55

Slide 55 text

RubyConf 2015 - Lito Nicolai - @lito_nico First Generation

Slide 56

Slide 56 text

RubyConf 2015 - Lito Nicolai - @lito_nico L

Slide 57

Slide 57 text

RubyConf 2015 - Lito Nicolai - @lito_nico Second Generation

Slide 58

Slide 58 text

RubyConf 2015 - Lito Nicolai - @lito_nico S.[L,]L

Slide 59

Slide 59 text

RubyConf 2015 - Lito Nicolai - @lito_nico Next Generation

Slide 60

Slide 60 text

RubyConf 2015 - Lito Nicolai - @lito_nico SS.[S.[L,]L,]S.[L,]L

Slide 61

Slide 61 text

RubyConf 2015 - Lito Nicolai - @lito_nico SS.[S.[L,]L,]S.[L,]L

Slide 62

Slide 62 text

RubyConf 2015 - Lito Nicolai - @lito_nico SS.[S.[L,]L,]S.[L,]L

Slide 63

Slide 63 text

RubyConf 2015 - Lito Nicolai - @lito_nico SS.[S.[L,]L,]S.[L,]L

Slide 64

Slide 64 text

RubyConf 2015 - Lito Nicolai - @lito_nico SS.[S.[L,]L,]S.[L,]L

Slide 65

Slide 65 text

RubyConf 2015 - Lito Nicolai - @lito_nico SS.[S.[L,]L,]S.[L,]L

Slide 66

Slide 66 text

RubyConf 2015 - Lito Nicolai - @lito_nico SS.[S.[L,]L,]S.[L,]L

Slide 67

Slide 67 text

RubyConf 2015 - Lito Nicolai - @lito_nico SS.[S.[L,]L,]S.[L,]L

Slide 68

Slide 68 text

RubyConf 2015 - Lito Nicolai - @lito_nico SS.[S.[L,]L,]S.[L,]L

Slide 69

Slide 69 text

RubyConf 2015 - Lito Nicolai - @lito_nico SS.[S.[L,]L,]S.[L,]L

Slide 70

Slide 70 text

RubyConf 2015 - Lito Nicolai - @lito_nico SS.[S.[L,]L,]S.[L,]L

Slide 71

Slide 71 text

RubyConf 2015 - Lito Nicolai - @lito_nico SS.[S.[L,]L,]S.[L,]L

Slide 72

Slide 72 text

RubyConf 2015 - Lito Nicolai - @lito_nico SS.[S.[L,]L,]S.[L,]L

Slide 73

Slide 73 text

RubyConf 2015 - Lito Nicolai - @lito_nico SS.[S.[L,]L,]S.[L,]L

Slide 74

Slide 74 text

RubyConf 2015 - Lito Nicolai - @lito_nico SS.[S.[L,]L,]S.[L,]L

Slide 75

Slide 75 text

RubyConf 2015 - Lito Nicolai - @lito_nico SS.[S.[L,]L,]S.[L,]L

Slide 76

Slide 76 text

RubyConf 2015 - Lito Nicolai - @lito_nico SS.[S.[L,]L,]S.[L,]L

Slide 77

Slide 77 text

RubyConf 2015 - Lito Nicolai - @lito_nico SS.[S.[L,]L,]S.[L,]L

Slide 78

Slide 78 text

RubyConf 2015 - Lito Nicolai - @lito_nico SS.[S.[L,]L,]S.[L,]L

Slide 79

Slide 79 text

RubyConf 2015 - Lito Nicolai - @lito_nico SS.[S.[L,]L,]S.[L,]L

Slide 80

Slide 80 text

RubyConf 2015 - Lito Nicolai - @lito_nico Trees don’t look like this

Slide 81

Slide 81 text

RubyConf 2015 - Lito Nicolai - @lito_nico (is what I used to say) Yes, they really look like this! Drosera Binata var. Multifida

Slide 82

Slide 82 text

RubyConf 2015 - Lito Nicolai - @lito_nico Juniper Branch Start: T Rules: T ! T.[T,T.]T,.T,

Slide 83

Slide 83 text

RubyConf 2015 - Lito Nicolai - @lito_nico Juniper Branch

Slide 84

Slide 84 text

RubyConf 2015 - Lito Nicolai - @lito_nico Juniper Branch

Slide 85

Slide 85 text

RubyConf 2015 - Lito Nicolai - @lito_nico Juniper Branch

Slide 86

Slide 86 text

RubyConf 2015 - Lito Nicolai - @lito_nico Plants are computing as they grow! That’s super neato!

Slide 87

Slide 87 text

RubyConf 2015 - Lito Nicolai - @lito_nico L-System Weird Stuff Start: A Rules: A ! B[A[B B ! A]B]A

Slide 88

Slide 88 text

RubyConf 2015 - Lito Nicolai - @lito_nico Weird Stuff (there be dragons)

Slide 89

Slide 89 text

RubyConf 2015 - Lito Nicolai - @lito_nico A different view (top-down)

Slide 90

Slide 90 text

RubyConf 2015 - Lito Nicolai - @lito_nico

Slide 91

Slide 91 text

RubyConf 2015 - Lito Nicolai - @lito_nico Plant growth hormone

Slide 92

Slide 92 text

RubyConf 2015 - Lito Nicolai - @lito_nico

Slide 93

Slide 93 text

RubyConf 2015 - Lito Nicolai - @lito_nico

Slide 94

Slide 94 text

RubyConf 2015 - Lito Nicolai - @lito_nico (Paraphrased from Vi Hart)

Slide 95

Slide 95 text

RubyConf 2015 - Lito Nicolai - @lito_nico O(lots) Time complexity:

Slide 96

Slide 96 text

RubyConf 2015 - Lito Nicolai - @lito_nico (discovered at cambridge) The very first model: charged particles

Slide 97

Slide 97 text

RubyConf 2015 - Lito Nicolai - @lito_nico Douady & Couder

Slide 98

Slide 98 text

RubyConf 2015 - Lito Nicolai - @lito_nico

Slide 99

Slide 99 text

RubyConf 2015 - Lito Nicolai - @lito_nico O(n²) Time complexity:

Slide 100

Slide 100 text

RubyConf 2015 - Lito Nicolai - @lito_nico btw, Alan Turing Hypothesis of General Phyllotaxis (…and later, even deeper work)

Slide 101

Slide 101 text

RubyConf 2015 - Lito Nicolai - @lito_nico Turing’s drawing

Slide 102

Slide 102 text

RubyConf 2015 - Lito Nicolai - @lito_nico

Slide 103

Slide 103 text

RubyConf 2015 - Lito Nicolai - @lito_nico

Slide 104

Slide 104 text

RubyConf 2015 - Lito Nicolai - @lito_nico

Slide 105

Slide 105 text

RubyConf 2015 - Lito Nicolai - @lito_nico 137.5

Slide 106

Slide 106 text

RubyConf 2015 - Lito Nicolai - @lito_nico 360 - (360/φ)

Slide 107

Slide 107 text

RubyConf 2015 - Lito Nicolai - @lito_nico Start: Stem Rules: Stem ! Stem Rotate Leaf Leaf ! BiggerLeaf Use an L-System!

Slide 108

Slide 108 text

RubyConf 2015 - Lito Nicolai - @lito_nico Start: Stem Rules: Stem ! Stem Rotate Leaf Leaf ! BiggerLeaf

Slide 109

Slide 109 text

RubyConf 2015 - Lito Nicolai - @lito_nico O(much better!) Time complexity:

Slide 110

Slide 110 text

RubyConf 2015 - Lito Nicolai - @lito_nico Back to algae (in 3D!)

Slide 111

Slide 111 text

RubyConf 2015 - Lito Nicolai - @lito_nico (you again)

Slide 112

Slide 112 text

RubyConf 2015 - Lito Nicolai - @lito_nico

Slide 113

Slide 113 text

RubyConf 2015 - Lito Nicolai - @lito_nico

Slide 114

Slide 114 text

RubyConf 2015 - Lito Nicolai - @lito_nico

Slide 115

Slide 115 text

RubyConf 2015 - Lito Nicolai - @lito_nico

Slide 116

Slide 116 text

RubyConf 2015 - Lito Nicolai - @lito_nico Not actually getting smaller

Slide 117

Slide 117 text

RubyConf 2015 - Lito Nicolai - @lito_nico Aside: Representing Cells stackoverflow.com

Slide 118

Slide 118 text

RubyConf 2015 - Lito Nicolai - @lito_nico …and how they connect

Slide 119

Slide 119 text

RubyConf 2015 - Lito Nicolai - @lito_nico

Slide 120

Slide 120 text

RubyConf 2015 - Lito Nicolai - @lito_nico

Slide 121

Slide 121 text

RubyConf 2015 - Lito Nicolai - @lito_nico

Slide 122

Slide 122 text

RubyConf 2015 - Lito Nicolai - @lito_nico Demo

Slide 123

Slide 123 text

RubyConf 2015 - Lito Nicolai - @lito_nico Kinds of Surfaces Flat No Curvature

Slide 124

Slide 124 text

RubyConf 2015 - Lito Nicolai - @lito_nico Kinds of Surfaces Spherical Positive Curvature Flat No Curvature

Slide 125

Slide 125 text

RubyConf 2015 - Lito Nicolai - @lito_nico Kinds of Surfaces Spherical Positive Curvature Flat No Curvature Hyperbolic Negative Curvature

Slide 126

Slide 126 text

RubyConf 2015 - Lito Nicolai - @lito_nico Kinds of Surfaces Spherical Positive Curvature Flat No Curvature Hyperbolic Negative Curvature Plants!

Slide 127

Slide 127 text

RubyConf 2015 - Lito Nicolai - @lito_nico How many unique parallel lines? None One Lots!

Slide 128

Slide 128 text

RubyConf 2015 - Lito Nicolai - @lito_nico How many unique parallel lines? None One Lots!

Slide 129

Slide 129 text

RubyConf 2015 - Lito Nicolai - @lito_nico How many unique parallel lines? None One Lots!

Slide 130

Slide 130 text

RubyConf 2015 - Lito Nicolai - @lito_nico How many unique parallel lines? None One Lots!

Slide 131

Slide 131 text

RubyConf 2015 - Lito Nicolai - @lito_nico How many unique parallel lines? None One Lots!

Slide 132

Slide 132 text

RubyConf 2015 - Lito Nicolai - @lito_nico How many unique parallel lines? None One Lots!

Slide 133

Slide 133 text

RubyConf 2015 - Lito Nicolai - @lito_nico

Slide 134

Slide 134 text

RubyConf 2015 - Lito Nicolai - @lito_nico Thank You!

Slide 135

Slide 135 text

RubyConf 2015 - Lito Nicolai - @lito_nico I KNEW you would ask about Perl…

Slide 136

Slide 136 text

RubyConf 2015 - Lito Nicolai - @lito_nico Lito:~$ perl -E 'sub dunno() { 3 } say dunno + 4'

Slide 137

Slide 137 text

RubyConf 2015 - Lito Nicolai - @lito_nico Lito:~$ perl -E 'sub dunno() { 3 } say dunno + 4' 7 Lito:~$ _

Slide 138

Slide 138 text

RubyConf 2015 - Lito Nicolai - @lito_nico Lito:~$ perl -E 'sub dunno() { 3 } say dunno + 4' 7 Lito:~$ perl -E 'sub dunno { 3 } say dunno + 4'

Slide 139

Slide 139 text

RubyConf 2015 - Lito Nicolai - @lito_nico Lito:~$ perl -E 'sub dunno() { 3 } say dunno + 4' 7 Lito:~$ perl -E 'sub dunno { 3 } say dunno + 4’ 3 Lito:~$ _

Slide 140

Slide 140 text

RubyConf 2015 - Lito Nicolai - @lito_nico Lito:~$ perl -E 'sub dunno() { 3 } say dunno + 4' 7 Lito:~$ perl -E 'sub dunno { 3 } say dunno + 4’ 3 Lito:~$ _ no args (‘nullary’) some args

Slide 141

Slide 141 text

RubyConf 2015 - Lito Nicolai - @lito_nico perl -E 'BEGIN { *dunno = sub() { 3 } } say dunno + 4'

Slide 142

Slide 142 text

RubyConf 2015 - Lito Nicolai - @lito_nico perl -E 'BEGIN { *dunno = sub() { 3 } } say dunno + 4' BEGIN { *dunno = sub { 3 } } say dunno + 4

Slide 143

Slide 143 text

RubyConf 2015 - Lito Nicolai - @lito_nico perl -E 'BEGIN { *dunno = sub() { 3 } } say dunno + 4' BEGIN { *dunno = sub { 3 } } say dunno + 4 BEGIN { if # SOME_CONDITION *dunno = sub { 3 } else { *dunno = sub() { 3 } } } say dunno + 4 any code!