diff --git a/pattern_generator/lib/generator.rb b/pattern_generator/lib/generator.rb new file mode 100644 index 0000000..9f3af67 --- /dev/null +++ b/pattern_generator/lib/generator.rb @@ -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 diff --git a/pattern_generator/readme b/pattern_generator/readme new file mode 100644 index 0000000..bc73d6e --- /dev/null +++ b/pattern_generator/readme @@ -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. diff --git a/pattern_generator/test/generator_test.rb b/pattern_generator/test/generator_test.rb new file mode 100644 index 0000000..771da97 --- /dev/null +++ b/pattern_generator/test/generator_test.rb @@ -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