Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions pattern_generator/lib/generator.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
class Generator
attr_accessor :pattern_count

LETTERS = Array('A'..'Z')
NUMBERS = Array(0..9)

def initialize
@pattern_count = 1
@serial_number = ''
end

def random_letters(pattern)

pattern.each_char do |char|
if char == "X"
letter = LETTERS.sample
pattern_counter(26)
@serial_number << letter
elsif char == "N"
number = NUMBERS.sample
pattern_counter(10)
@serial_number << number
end
end
@serial_number
end

def pattern_counter(multiplier)
@pattern_count = @pattern_count*multiplier
end

def all_combinations(pattern)
LETTERS.repeated_permutation(pattern.length).to_a
end

def combination_count(pattern)
random_letters(pattern)
@pattern_count
end

end
14 changes: 14 additions & 0 deletions pattern_generator/readme
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Pattern Generator

We want to generate serial numbers for our products as they roll off the manufacturing line. Patterns for the
numbers are five characters like `XXNXN` where `X` stands for an uppercase letter A-Z and `N` stands for a digit 0-9.

Write a program which, given a pattern like `XXNXN`, can both:

* generate all possible serial numbers for that pattern
* report out how many numbers were generated.

## Extensions

* Can you also support patterns of any length?
* Customers often confuse `0` and `O`, `I` and `1`. Let's omit all four of those symbols from the generator.
118 changes: 118 additions & 0 deletions pattern_generator/test/generator_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
gem 'minitest', '>= 5.0.0'
require 'minitest/pride'
require 'minitest/autorun'
require './lib/generator'
require 'pry'

class GeneratorTest < Minitest::Test

def test_it_exists

g = Generator.new
assert g
end

def test_it_generates_a_single_letter

g = Generator.new
code = g.random_letters("X")

assert_equal 1, code.length
assert_equal String, code.class
end

def test_it_generates_five_letters

g = Generator.new
code = g.random_letters("XXXXX")

assert_equal 5, code.length
assert_equal String, code.class
end

def test_it_generates_a_letter_and_number

g = Generator.new
code = g.random_letters("XN")

assert_equal 2, code.length
assert_equal String, code.class
end

def test_it_generates_a_letter_number_combo

g = Generator.new
code = g.random_letters("XNXXN")

assert_equal 5, code.length
assert_equal String, code.class
end

def test_it_generates_all_combos_for_1_letter

g = Generator.new
pattern = "X"
combos = g.all_combinations(pattern)

assert_equal 26, combos.count
assert_equal Array, combos.class
end

def test_it_generates_all_combos_for_2_letters

g = Generator.new
pattern = "XX"
combos = g.all_combinations(pattern)

assert_equal 676, combos.count
assert_equal Array, combos.class
end

def test_it_generates_all_combos_for_1_letter_1_number

g = Generator.new
pattern = "XN"
combos = g.all_combinations(pattern)

assert_equal 260, combos.count
assert_equal Array, combos.class
end

def test_it_counts_all_combos_for_2_letters

g = Generator.new
pattern = "XX"
combos = g.combination_count(pattern)

assert_equal 676, combos
end

def test_it_counts_all_combos_for_1_letter_1_number

g = Generator.new
pattern = "XN"
combos = g.combination_count(pattern)

assert_equal 260, combos
end

def test_it_generates_all_combos_for_5_letters

g = Generator.new
pattern = "XXXXX"
combos = g.all_combinations(pattern)

assert_equal 11881376, combos.count
assert_equal Array, combos.class
end

def test_it_count_total_combos_for_5_letters

g = Generator.new
pattern = "XXXXX"
combos = g.combination_count(pattern)

assert_equal 11881376, combos
end

end