[EMAIL PROTECTED] wrote:
> From: "Richard Lee" <[EMAIL PROTECTED]>
> To: <[EMAIL PROTECTED]>
> Cc: <beginners@perl.org>
> Sent: Sunday, May 04, 2008 3:17 AM
> Subject: Re: how to simplify this script
>
>> I don't have the solution yet but shouldn't the answer be
>> 1 6 7
>> and
>> 4 5 10 only ?
>> it's printing out 1 2 3 as well which is wrong?
>
> Thanks Richard.
> The output should include '1 2 3'.
> Therefore I want the output to be
> 1 2 3
> 1 6 7
> 4 5 10
>
> It should include '1 2 3' because '1 2 3', '1 2 4', '1 2 7', '1 2 8',
> '1 2 9' = '1 2'(the common number from the list) + anynumber.
>
> Thanks
>
>
>
>
>> [EMAIL PROTECTED] wrote:
>>> Hi,
>>> In the script below, I have an array @datas with its elements
>>> consisting of numbers like this :-
>>>
>>> my @datas = (
>>> '1 2 3', '1 2 4', '1 2 7', '1 2 8', '1 2 9', '1 6 7',
>>> '1 7 12', '2 6 7', '4 5 10', '4 5 15'
>>> );
>>>
>>> Out of the above list, I wish to generate a seperate array so that
>>> among their elements, there should not be any 2 numbers that can
>>> match and so the output should be :- 1 2 3
>>> 1 6 7
>>> 4 5 10
>>>
>>> I therefore have written the script below and have tested the script
>>> to be working. What is the easier way to write this script?
>>> Thanks
>>>
>>> ##### start of script ##############
>>> use strict;
>>> use warnings;
>>>
>>> my @datas = (
>>> '1 2 3', '1 2 4', '1 2 7', '1 2 8', '1 2 9', '1 6 7',
>>> '1 7 12', '2 6 7', '4 5 10', '4 5 15'
>>> );
>>> my $numbers_wanted = 2;
>>>
>>> my @datawanted = ();
>>> my $marker = scalar @datas;
>>> my $splice_counter = 0;
>>> my @datas_iterator = ();
>>>
>>> while ($marker) {
>>> $splice_counter = 0;
>>> push @datawanted, splice @datas, 0, 1;
>>> my @comparator1 = split / /, $datawanted[-1];
>>> my $temp_datas_iterator = scalar @datas - 1;
>>>
>>> foreach ( 0 .. $temp_datas_iterator ) {
>>> my $counter = 0;
>>> my @comparator2 = split / /, $datas[ $_ - $splice_counter ];
>>>
>>> foreach (@comparator2) {
>>> my $a = $_;
>>> foreach (@comparator1) {
>>> if ( $a == $_ ) {
>>> $counter++;
>>> }
>>> }
>>> }
>>> if ( $counter >= $numbers_wanted ) {
>>> splice @datas, $_ - $splice_counter, 1;
>>> $splice_counter++;
>>> }
>>> }
>>> $marker = scalar @datas;
>>> }
>>>
>>> foreach (@datawanted) {
>>> print "$_\n";
>>> }
>>>
>>>
>>>
>
>
I still don't understand

" It should include '1 2 3' because '1 2 3', '1 2 4', '1 2 7', '1 2 8',
'1 2 9' = '1 2'(the common number from the list) + anynumber. "
as any of them contains 1 and 2 and I don't understand why '1 2 3' was
picked.

Also can someone explain to me in detail what Gunnar Hjalmarsson's
solution is doing?

------------ code of Gunnar's ----------------

my $numbers_wanted = 2;
my ( @datawanted, @numbers );

LOOP: foreach ( @datas ) {
my @test = split;
foreach my $num ( @numbers ) {
next LOOP if grep( $num->{$_}, @test ) >= $numbers_wanted;
}
push @datawanted, $_;
push @numbers, { map { $_ => 1 } @test };
}

print "$_\n" for @datawanted;

---------------------------------------------------------

Where did the hash reference %{$num} come from? as in if grep(
$num->{$_} ???
I have difficult time understanding this type of algorithm centric
problems.......







-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/


Reply via email to