Class: Oulipo
- Inherits:
-
Object
- Object
- Oulipo
- Defined in:
- lib/oulipo.rb
Constant Summary collapse
- ALPHABET =
'a'..'z'
- VOWELS =
%w{ a e i o u }
Class Method Summary collapse
- .absent_letters(work) ⇒ Object
-
.chaterism?(poem) ⇒ Boolean
In a chaterism, each successive word is larger than the last or vice versa.
-
.lipogram?(work) ⇒ Boolean
A lipogram has missing letters.
- .palindrome?(phrase) ⇒ Boolean
-
.pangram?(work) ⇒ Boolean
A pangram uses all letters.
- .snowball?(poem) ⇒ Boolean
- .univocalism?(poem) ⇒ Boolean
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
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
17 18 19 |
# File 'lib/oulipo.rb', line 17 def self.lipogram?(work) !self.pangram?(work) end |
.palindrome?(phrase) ⇒ 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
12 13 14 |
# File 'lib/oulipo.rb', line 12 def self.pangram?(work) self.absent_letters(work).nil? end |
.snowball?(poem) ⇒ 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
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 |