Hi Sapna,

This is a fun exercise to do and also to do some refactoring after I got to
understand what you are aiming to do.

First of all, your code is not optimal yet. Let's look at the output of the
example you gave:

{"1"=>"( true ) || ( false ) || ( true )", "2"=>"( true && false ) || (
true && true ) || ( false && true ) || ( false && true ) || ( true && true
) || ( true && false )", "3"=>"( true && false && true ) || ( true && true
&& false ) || ( false && true && true ) || ( false && true && true ) || (
true && true && false ) || ( true && false && true )"}

The combination of 2 and 3 have duplicated information. For example: (true
&& false && true) are the same as (true && true && false). I have provided
a solution for what I understood from your problem below with some comments.

I am considering that you need to solve this in one method, otherwise, I
would split in many different methods to make the code more clear. I am
also being very cheeky here to introduce many features of the language that
would make your life easier and your code much more understandable.

I hope this helps.

# Evaluate the combinations of conditions.
#
# step_conditions_labels - The Array of conditions.
#
# Examples
#
# conditions_combination(%w[true false true])
# # => {1=>true, 2=>true, 3=>false}
#
# conditions_combination(%w[true false true false true])
# # => {1=>true, 2=>true, 3=>true, 4=>false, 5=>false}
#
# Returns a hash of the evaluation of respective combinations.
def conditions_combination(step_conditions_labels)
  # Reduce the Array to the result Hash.
  step_conditions_labels.each_with_index.reduce({}) do |hash, (_, index)|
    # Update each of the Hash keys with the evalutation of the combination.
    hash.update(
      index + 1 =>
        # Eval is the way to go here as Tales mentioned, but it's a very
        # dangerous method. Be careful!
        eval(
          # Array#combination is what does the trick for you. Check it out:
          # https://ruby-doc.org/core-2.6.1/Array.html#method-i-combination
          # The other lines just help on building the condition String.
          step_conditions_labels
            .combination(index + 1)
            .map { |combination| "(#{combination.join(' && ')})" }
            .join(' || ')
        )
    )
  end
end
conditions_combination(%w[true false true])

Best regards,
/ Marco

On Fri, Feb 22, 2019 at 6:56 PM Hassan Schroeder <hassan.schroe...@gmail.com>
wrote:

> On Fri, Feb 22, 2019 at 4:36 AM Sapna Mishra <sapna.spa...@gmail.com>
> wrote:
>
> > Issue is now I am not able use this combination to check whether it
> satisfies the condition as it is consider as string class.
>
> If I saw something like that in a PR I would reject it in ~2 seconds.
>
> What actual problem are you trying to solve?
>
> --
> Hassan Schroeder ------------------------ hassan.schroe...@gmail.com
> twitter: @hassan
> Consulting Availability : Silicon Valley or remote
>
> --
> You received this message because you are subscribed to the Google Groups
> "Ruby on Rails: Talk" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to rubyonrails-talk+unsubscr...@googlegroups.com.
> To post to this group, send email to rubyonrails-talk@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/rubyonrails-talk/CACmC4yCg%2Bm9gv5%3DuESBmdzYOSYCV%3DCspNdbkhB3hucVEXgbFcQ%40mail.gmail.com
> .
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to rubyonrails-talk+unsubscr...@googlegroups.com.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/rubyonrails-talk/CACMkcE5HWvKpa8%3D8YWgdnVgwYW03OCbBw3%2BCetMPrH-9Xj31yQ%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to