Slide 1

Slide 1 text

Practical Functional Programming in Ruby

Slide 2

Slide 2 text

~ NDA ~ ! If you meet Diego Echeverri, please praise him for the code he has written. By the way, don’t show this code to anyone else, it is not my code. __________________________________ (Date, Signature) creator of awesome things Ruby

Slide 3

Slide 3 text

The Problem: ! Detecting Cheaters

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

Many different attributes… ! Score, Mouse Movement, Click Rate, …

Slide 6

Slide 6 text

A Solution: ! Classifiers

Slide 7

Slide 7 text

ScoreCheatClassifier class ScoreCheatClassifier < CheaterClassifier SCORE_FILTER_MAX = 2_000_000 SCORE_FILTER_MIN = 1_400_000 ! def initialize(last_score) @last_score = last_score end ! def cheater? if @last_score > SCORE_FILTER_MAX :yes elsif @last_score < SCORE_FILTER_MIN :no else :maybe end end end

Slide 8

Slide 8 text

LevelClassifier class LevelClassifier < CheaterClassifier BASE_LEVEL = 50 BASE_SCORE = 1_700_000 ! def initialize(score, level) @score = score @level = level end ! def cheater? if @score > BASE_SCORE :yes else @level >= BASE_LEVEL ? :maybe : :yes end end end

Slide 9

Slide 9 text

Hooking them together ! in a lazy fashion

Slide 10

Slide 10 text

PlusClassifier class PlusClassifier < CheaterClassifier def initialize(a, b) @a = a @b = b end ! def cheater? partial_result = @a.cheater? if partial_result == :maybe @b.cheater? else partial_result end end end

Slide 11

Slide 11 text

CheaterClassifier (Base Class) class CheaterClassifier def +(other) PlusClassifier.new(self, other) end end

Slide 12

Slide 12 text

MainClassifier (Entry Point) class MainClassifier < CheaterClassifier def initialize(last_score, level) classifiers = [ ScoreCheatClassifier.new(last_score), LevelClassifier.new(last_score, level) ] @classifier = classifiers.reduce { |a,b| a + b } end end

Slide 13

Slide 13 text

LevelClassifier ScoreCheatClassifier MainClassifier PlusClassifier data: Score, Level Is it a cheater yet? Reduce available Classifiers

Slide 14

Slide 14 text

Sincerely yours, Lukas "Rampensau" Rieder