in reply to Re^2: Ignore a range of numbers ina List
in thread Ignore a range of numbers ina List

Hi pr33,

Wow, your question certainly got the Monks working on lots of solutions!

I recommend understanding every single program in this thread... Understand exactly how they work.

I am curious if this was some sort of homework assignment or not?
I am also curious about what other languages you know?

I did not assume that this was homework for the simple reason that the beginner classes that I work with would not have even covered array indicies before an assignment like this would be given. You wouldn't be thinking in that direction because, the class wouldn't have even talked about it! Of course it could be that you are in a "bad class". In any case all the better to show some better ways!

None of the code presented (except yours) uses splice() and array index. I hope that sends you a clear message! Normally use the Perl array iterators which do not depend upon some [$i] index value. Of course indicies can and should be used in some situations, but they should not be your first thought.

My code perhaps appears at first glance to be "complicated" as compared to some of the more brief solutions. I will try to explain the thought process. Maybe other Monks can do that for their code also?

I rejected at first thought any idea of splice() and index as being too complicated. Also your code did not require me to modify the input array "in place" - that means to me that I can use extra memory for the "solution".

I started with a foreach loop over all of the input numbers. There are actually 4 conditions:

I worked on those parts (ran the code) and made decisions about not needing a $flag and that @stack could serve that function.

Then I coded:

There was some short back and forth to fine tune the singleton 7 idea, but there was a place for it within the 4 basic cases.

I recommend looking at Laurent_R's solution here. It is shorter but still has the basic 4 different situations.

Of course, "shorter, fewer lines" does not always mean "better" or even "faster". I tried to present some code for you that you could understand and modify if necessary to meet your needs.

Replies are listed 'Best First'.
Re^4: Ignore a range of numbers ina List
by Laurent_R (Canon) on Jun 25, 2017 at 22:52 UTC
    Thanks, Marshall for your recommendation.

    Well, as I said, I first thought that Marshall's idea of a solution was good, but since I felt that is was probably a bit complicated. I was hoping to make something simpler. As I said, I ended up doing independently something essentially similar (although written differently and using an additional $flag variable, which isn't really necessary, as Marshall has shown).

    Trying to simplify (or at least shorten) the code I tried to use a ternary conditional, something along these lines:

    push $flag ? @temp : @result, $num;
    But the compiler doesn't like this. Even adding parentheses does not seem to help.

    So that's why I next came to the idea of pushing the values to a variable containing a reference to either the @temp or the @result array, depending on whether we are in a 6..7 range or not. I think this is pretty clean and clear, and quite concise, but using references this way may be beyond the knowledge of a beginner (although the OP uses an array reference).

      It seems you need
      push @{ $flag ? \@temp : \@result }, $num;
      ($q=q:Sq=~/;[c](.)(.)/;chr(-||-|5+lengthSq)`"S|oS2"`map{chr |+ord }map{substrSq`S_+|`|}3E|-|`7**2-3:)=~y+S|`+$1,++print+eval$q,q,a,
        Hi choroba,

        thanks for your input. This certainly looks quite clever. I can't test right now on my mobile device, but certainly will as soon as possible.

        Update: I tried it now, and it works just fine.

Re^4: Ignore a range of numbers in a List
by shmem (Chancellor) on Jun 25, 2017 at 19:28 UTC
    Maybe other Monks can do that for their code also?

    Well, I have exposed why the OPs code failed, how to fix that, then steered towards a more perlish solution via something like Laurent_Rs solution (first one) arriving at tybalt89s version (with some decoration resembling the OP). Just trying to explain things a bit...

    perl -le'print map{pack c,($-++?1:13)+ord}split//,ESEL'