Class: Oulipo

Inherits:
Object
  • Object
show all
Defined in:
lib/oulipo.rb

Constant Summary collapse

ALPHABET =
'a'..'z'
VOWELS =
%w{ a e i o u }

Class Method Summary collapse

Class Method Details

.absent_letters(work) ⇒ Object



5
6
7
8
9
# File 'lib/oulipo.rb', line 5

def self.absent_letters(work)
  present_letters = work.downcase.split('').uniq
  missing_letters = ALPHABET.to_a - present_letters
  missing_letters.empty? ? nil : missing_letters
end

.chaterism?(poem) ⇒ Boolean

In a chaterism, each successive word is larger than the last or vice versa

Returns:

  • (Boolean)


22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/oulipo.rb', line 22

def self.chaterism?(poem)
  # Discard the punctuation, split into words
  words = poem.gsub(/[^a-z\s]/i, '').split
  
  # Find the direction we're traveling
  flen, llen = words.first.length, words.last.length
  direction = flen > llen ? :downto : :upto
  
  # "The tree sings".map(&:length) # => [3, 4, 5] 
  # [3, 4, 5] == 3.upto(5).to_a # => true
  words.map(&:length) == flen.send(direction, llen).to_a
end

.lipogram?(work) ⇒ Boolean

A lipogram has missing letters

Returns:

  • (Boolean)


17
18
19
# File 'lib/oulipo.rb', line 17

def self.lipogram?(work)
  !self.pangram?(work)
end

.palindrome?(phrase) ⇒ Boolean

Returns:

  • (Boolean)


45
46
47
48
# File 'lib/oulipo.rb', line 45

def self.palindrome?(phrase)
  sequence = phrase.downcase.gsub(/[^a-z]/, '')
  sequence.reverse == sequence
end

.pangram?(work) ⇒ Boolean

A pangram uses all letters

Returns:

  • (Boolean)


12
13
14
# File 'lib/oulipo.rb', line 12

def self.pangram?(work)
  self.absent_letters(work).nil?
end

.snowball?(poem) ⇒ Boolean

Returns:

  • (Boolean)


40
41
42
43
# File 'lib/oulipo.rb', line 40

def self.snowball?(poem)
  words = poem.split
  self.chaterism?(poem) && words.first.length < words.last.length
end

.univocalism?(poem) ⇒ Boolean

Returns:

  • (Boolean)


35
36
37
38
# File 'lib/oulipo.rb', line 35

def self.univocalism?(poem)
  present_letters = poem.downcase.split('').uniq
  (VOWELS - present_letters).length == 4
end