ðŸŽ‰ Exercism Research is now launched. Help Exercism, help science and have some fun at research.exercism.io ðŸŽ‰

# remcopeereboom's solution

## to Flatten Array in the Ruby Track

Published at Aug 17 2018 · 0 comments
Instructions
Test suite
Solution

#### Note:

This exercise has changed since this solution was written.

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.

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

## Submitting Incomplete Solutions

It's possible to submit an incomplete solution so you can see how others have completed the exercise.

### flatten_array_test.rb

``````require 'minitest/autorun'
require_relative 'flatten_array'

# Common test data version: 1.1.0 d7a3c09
class FlattenArrayTest < Minitest::Test
def test_no_nesting
# skip
fa = FlattenArray.flatten([0, 1, 2])
assert_equal [0, 1, 2], fa
end

def test_flattens_array_with_just_integers_present
skip
fa = FlattenArray.flatten([1, [2, 3, 4, 5, 6, 7], 8])
assert_equal [1, 2, 3, 4, 5, 6, 7, 8], fa
end

def test_5_level_nesting
skip
fa = FlattenArray.flatten([0, 2, [[2, 3], 8, 100, 4, [[[50]]]], -2])
assert_equal [0, 2, 2, 3, 8, 100, 4, 50, -2], fa
end

def test_6_level_nesting
skip
fa = FlattenArray.flatten([1, [2, [[3]], [4, [[5]]], 6, 7], 8])
assert_equal [1, 2, 3, 4, 5, 6, 7, 8], fa
end

def test_6_level_nest_list_with_null_values
skip
fa = FlattenArray.flatten([0, 2, [[2, 3], 8, [[100]], nil, [[nil]]], -2])
assert_equal [0, 2, 2, 3, 8, 100, -2], fa
end

def test_all_values_in_nested_list_are_null
skip
fa = FlattenArray.flatten([nil, [[[nil]]], nil, nil, [[nil, nil], nil], nil])
assert_equal [], fa
end

# Problems in exercism evolve over time, as we find better ways to ask
# questions.
# The version number refers to the version of the problem you solved,
#
# Define a constant named VERSION inside of the top level BookKeeping
# module, which may be placed near the end of your file.
#
# In your file, it will look like this:
#
# module BookKeeping
#   VERSION = 1 # Where the version number matches the one in the test.
# end
#
# http://ruby-doc.org/docs/ruby-doc-bundle/UsersGuide/rg/constants.html

def test_bookkeeping
skip
assert_equal 1, BookKeeping::VERSION
end
end``````
``````# FlattenArray
#
# Namespace for the .flatten method.
module FlattenArray
# Recursively flattens and compacts the array.
# @param array [Array]
# @return [Array] A new array.
def self.flatten(array)
acc = []

array.each do |x|
case x
when Array then acc += flatten(x)
when nil then acc
else acc << x
end
end

acc
end
end

# BookKeeping for exercism test versions.
module BookKeeping
VERSION = 1 # Test version
end``````