From 5991d1fab107de392b9ed847e7ae8cef284da08a Mon Sep 17 00:00:00 2001 From: James Walker Date: Sun, 16 Sep 2018 15:09:52 -0400 Subject: [PATCH] ruby - flatten-array --- ruby/flatten-array/README.md | 41 ++++++++++++++++++++++++ ruby/flatten-array/flatten_array.rb | 16 +++++++++ ruby/flatten-array/flatten_array_test.rb | 41 ++++++++++++++++++++++++ 3 files changed, 98 insertions(+) create mode 100644 ruby/flatten-array/README.md create mode 100644 ruby/flatten-array/flatten_array.rb create mode 100644 ruby/flatten-array/flatten_array_test.rb diff --git a/ruby/flatten-array/README.md b/ruby/flatten-array/README.md new file mode 100644 index 0000000..3187fd5 --- /dev/null +++ b/ruby/flatten-array/README.md @@ -0,0 +1,41 @@ +# Flatten Array + +Take a nested list and return a single flattened list with all values except nil/null. + +The challenge is to write a function that accepts an arbitrarily-deep nested list-like structure and returns a flattened structure without any nil/null values. + +For Example + +input: [1,[2,3,null,4],[null],5] + +output: [1,2,3,4,5] + +* * * * + +For installation and learning resources, refer to the +[exercism help page](http://exercism.io/languages/ruby). + +For running the tests provided, you will need the Minitest gem. Open a +terminal window and run the following command to install minitest: + + gem install minitest + +If you would like color output, you can `require 'minitest/pride'` in +the test file, or note the alternative instruction, below, for running +the test file. + +Run the tests from the exercise directory using the following command: + + ruby flatten_array_test.rb + +To include color from the command line: + + ruby -r minitest/pride flatten_array_test.rb + + +## Source + +Interview Question [https://reference.wolfram.com/language/ref/Flatten.html](https://reference.wolfram.com/language/ref/Flatten.html) + +## Submitting Incomplete Solutions +It's possible to submit an incomplete solution so you can see how others have completed the exercise. diff --git a/ruby/flatten-array/flatten_array.rb b/ruby/flatten-array/flatten_array.rb new file mode 100644 index 0000000..6af3960 --- /dev/null +++ b/ruby/flatten-array/flatten_array.rb @@ -0,0 +1,16 @@ +class FlattenArray + def self.flatten(array) + recursive_flatten(array) + end + + def self.recursive_flatten(array, result = []) + array.each do |a| + if a.is_a? Array + recursive_flatten(a, result) + else + result << a unless a.nil? + end + end + result + end +end diff --git a/ruby/flatten-array/flatten_array_test.rb b/ruby/flatten-array/flatten_array_test.rb new file mode 100644 index 0000000..47803a2 --- /dev/null +++ b/ruby/flatten-array/flatten_array_test.rb @@ -0,0 +1,41 @@ +require 'minitest/autorun' +require_relative 'flatten_array' + +# Common test data version: 1.2.0 0290376 +class FlattenArrayTest < Minitest::Test + def test_no_nesting + # skip + flat_array = FlattenArray.flatten([0, 1, 2]) + assert_equal [0, 1, 2], flat_array + end + + def test_flattens_array_with_just_integers_present + # skip + flat_array = FlattenArray.flatten([1, [2, 3, 4, 5, 6, 7], 8]) + assert_equal [1, 2, 3, 4, 5, 6, 7, 8], flat_array + end + + def test_5_level_nesting + # skip + flat_array = FlattenArray.flatten([0, 2, [[2, 3], 8, 100, 4, [[[50]]]], -2]) + assert_equal [0, 2, 2, 3, 8, 100, 4, 50, -2], flat_array + end + + def test_6_level_nesting + # skip + flat_array = FlattenArray.flatten([1, [2, [[3]], [4, [[5]]], 6, 7], 8]) + assert_equal [1, 2, 3, 4, 5, 6, 7, 8], flat_array + end + + def test_6_level_nest_list_with_nil_values + # skip + flat_array = FlattenArray.flatten([0, 2, [[2, 3], 8, [[100]], nil, [[nil]]], -2]) + assert_equal [0, 2, 2, 3, 8, 100, -2], flat_array + end + + def test_all_values_in_nested_list_are_nil + # skip + flat_array = FlattenArray.flatten([nil, [[[nil]]], nil, nil, [[nil, nil], nil], nil]) + assert_equal [], flat_array + end +end