From 2cda4f2af97076db4269693b01168eae674467c6 Mon Sep 17 00:00:00 2001 From: Erin Pintozzi Date: Thu, 16 Feb 2017 13:21:37 -0700 Subject: [PATCH 1/3] write a basic pattern generator --- pattern_generator/lib/generator.rb | 21 +++++++++++ pattern_generator/readme | 14 ++++++++ pattern_generator/test/generator_test.rb | 46 ++++++++++++++++++++++++ 3 files changed, 81 insertions(+) create mode 100644 pattern_generator/lib/generator.rb create mode 100644 pattern_generator/readme create mode 100644 pattern_generator/test/generator_test.rb diff --git a/pattern_generator/lib/generator.rb b/pattern_generator/lib/generator.rb new file mode 100644 index 0000000..c011d77 --- /dev/null +++ b/pattern_generator/lib/generator.rb @@ -0,0 +1,21 @@ +class Generator + + + def random_letters(pattern) + letters = Array('A'..'Z') + numbers = Array(0..9) + serial_number = [] + + pattern.each_char do |char| + if char == "X" + letter = letters.sample + serial_number << letter + elsif char == "N" + number = numbers.sample + serial_number << number + end + end + serial_number.join + 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..47cb988 --- /dev/null +++ b/pattern_generator/test/generator_test.rb @@ -0,0 +1,46 @@ +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 + +end From f0fb0d33f3abf9672969d4de4eedf1d70aac1220 Mon Sep 17 00:00:00 2001 From: Erin Pintozzi Date: Thu, 16 Feb 2017 14:14:15 -0700 Subject: [PATCH 2/3] begin to write pattern counter --- pattern_generator/lib/generator.rb | 36 +++++++++--- pattern_generator/test/generator_test.rb | 72 ++++++++++++++++++++++++ 2 files changed, 100 insertions(+), 8 deletions(-) diff --git a/pattern_generator/lib/generator.rb b/pattern_generator/lib/generator.rb index c011d77..476244a 100644 --- a/pattern_generator/lib/generator.rb +++ b/pattern_generator/lib/generator.rb @@ -1,21 +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) - letters = Array('A'..'Z') - numbers = Array(0..9) - serial_number = [] pattern.each_char do |char| if char == "X" - letter = letters.sample - serial_number << letter + letter = LETTERS.sample + pattern_counter(26) + @serial_number << letter elsif char == "N" - number = numbers.sample - serial_number << number + number = NUMBERS.sample + pattern_counter(10) + @serial_number << number end end - serial_number.join + @serial_number + end + + def pattern_counter(multiplier) + @pattern_count = @pattern_count*multiplier + end + + def all_combinations(pattern) + combos = LETTERS.repeated_permutation(pattern.length).to_a + end + + def combination_count(pattern) + random_letters(pattern) + @pattern_count end end diff --git a/pattern_generator/test/generator_test.rb b/pattern_generator/test/generator_test.rb index 47cb988..8076c71 100644 --- a/pattern_generator/test/generator_test.rb +++ b/pattern_generator/test/generator_test.rb @@ -7,11 +7,13 @@ class GeneratorTest < Minitest::Test def test_it_exists + skip g = Generator.new assert g end def test_it_generates_a_single_letter + skip g = Generator.new code = g.random_letters("X") @@ -20,6 +22,7 @@ def test_it_generates_a_single_letter end def test_it_generates_five_letters + skip g = Generator.new code = g.random_letters("XXXXX") @@ -28,6 +31,7 @@ def test_it_generates_five_letters end def test_it_generates_a_letter_and_number + skip g = Generator.new code = g.random_letters("XN") @@ -36,6 +40,7 @@ def test_it_generates_a_letter_and_number end def test_it_generates_a_letter_number_combo + skip g = Generator.new code = g.random_letters("XNXXN") @@ -43,4 +48,71 @@ def test_it_generates_a_letter_number_combo assert_equal String, code.class end + def test_it_generates_all_combos_for_1_letter + skip + 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 +skip + 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 +skip + 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 + skip + g = Generator.new + pattern = "XN" + combos = g.combination_count(pattern) + + assert_equal 260, combos + end + + def test_it_generates_all_combos_for_5_letters + skip + 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 + skip + g = Generator.new + pattern = "XXXXX" + combos = g.combination_count(pattern) + + assert_equal 11881376, combos + end + end From 23c15c9d31e9d0d02f5d20c9bc5f62aef777ec9e Mon Sep 17 00:00:00 2001 From: Erin Pintozzi Date: Thu, 16 Feb 2017 14:34:53 -0700 Subject: [PATCH 3/3] more work on generator --- pattern_generator/lib/generator.rb | 2 +- pattern_generator/test/generator_test.rb | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/pattern_generator/lib/generator.rb b/pattern_generator/lib/generator.rb index 476244a..9f3af67 100644 --- a/pattern_generator/lib/generator.rb +++ b/pattern_generator/lib/generator.rb @@ -30,7 +30,7 @@ def pattern_counter(multiplier) end def all_combinations(pattern) - combos = LETTERS.repeated_permutation(pattern.length).to_a + LETTERS.repeated_permutation(pattern.length).to_a end def combination_count(pattern) diff --git a/pattern_generator/test/generator_test.rb b/pattern_generator/test/generator_test.rb index 8076c71..771da97 100644 --- a/pattern_generator/test/generator_test.rb +++ b/pattern_generator/test/generator_test.rb @@ -7,13 +7,13 @@ class GeneratorTest < Minitest::Test def test_it_exists - skip + g = Generator.new assert g end def test_it_generates_a_single_letter - skip + g = Generator.new code = g.random_letters("X") @@ -22,7 +22,7 @@ def test_it_generates_a_single_letter end def test_it_generates_five_letters - skip + g = Generator.new code = g.random_letters("XXXXX") @@ -31,7 +31,7 @@ def test_it_generates_five_letters end def test_it_generates_a_letter_and_number - skip + g = Generator.new code = g.random_letters("XN") @@ -40,7 +40,7 @@ def test_it_generates_a_letter_and_number end def test_it_generates_a_letter_number_combo - skip + g = Generator.new code = g.random_letters("XNXXN") @@ -49,7 +49,7 @@ def test_it_generates_a_letter_number_combo end def test_it_generates_all_combos_for_1_letter - skip + g = Generator.new pattern = "X" combos = g.all_combinations(pattern) @@ -59,7 +59,7 @@ def test_it_generates_all_combos_for_1_letter end def test_it_generates_all_combos_for_2_letters -skip + g = Generator.new pattern = "XX" combos = g.all_combinations(pattern) @@ -79,7 +79,7 @@ def test_it_generates_all_combos_for_1_letter_1_number end def test_it_counts_all_combos_for_2_letters -skip + g = Generator.new pattern = "XX" combos = g.combination_count(pattern) @@ -88,7 +88,7 @@ def test_it_counts_all_combos_for_2_letters end def test_it_counts_all_combos_for_1_letter_1_number - skip + g = Generator.new pattern = "XN" combos = g.combination_count(pattern) @@ -97,7 +97,7 @@ def test_it_counts_all_combos_for_1_letter_1_number end def test_it_generates_all_combos_for_5_letters - skip + g = Generator.new pattern = "XXXXX" combos = g.all_combinations(pattern) @@ -107,7 +107,7 @@ def test_it_generates_all_combos_for_5_letters end def test_it_count_total_combos_for_5_letters - skip + g = Generator.new pattern = "XXXXX" combos = g.combination_count(pattern)