Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]6673[/thread]

an geringsten wert heranpirschen: in einem Array



<< >> 4 Einträge, 1 Seite
mordur
 2005-01-28 17:48
#51412 #51412
User since
2003-09-25
182 Artikel
BenutzerIn
[Homepage] [default_avatar]
moins,

ich habe ein Array mit verschieden Zahlen. Gleichzeitig habe ich eine fest vorgegebene Zahl. Jetzt möchte ich mir aus dem Array die Elemente ausgeben lassen, die meiner vorgegebenen Zahl am nächsten kommt. Existieren zwei oder mehr davon im Array sollen auch alle ausgegeben werden. Bisher hab ich diesen Code, doch das reicht irgendwie nicht.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
my @ar=(4,1,0,9,6,7,4,0,2);

my $count=0;
my $spanne=0;
my $take=0;
my $vorgabe=3;
my @ar2;


foreach (@ar)
{


if ($_ <= $vorgabe-$spanne)
{
$take = $count;
$spanne = $_;
push(@ar2,$_);

}
$count++;

}
print $_."\n" foreach @ar2;

So bekomme ich aber nur die kleinsten Elemente . Brauchen würde ich aber die Elemente mit den Werten 4 und 2, da sie je 1 von der Vorgabe entfernt sind. Hat da jemand eine Idee?
lichtkind
 2005-01-28 17:52
#51413 #51413
User since
2004-03-22
5681 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
der clou bei solchen sachen ist ja beim hinzufügen einer neuen zahl dies gleich mit weniger aufwand einzusortieren das man zum zeitpunkt der suche auch sehr schnell und einfach das ergebnis bekommt.

eine minimallösung könnte sein die liste zu sortieren und dann linear durchzugehen, was den aufwand verringert. falls die reihenfolge heilig ist kannst auch eine kopie sortieren.\n\n

<!--EDIT|lichtkind|1106928114-->
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
renee
 2005-01-28 18:04
#51414 #51414
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#! /usr/bin/perl

use strict;
use warnings;

my $vorgegeben = $ARGV[0];

my @ar=(4,1,0,9,6,7,4,0,2);
my %hash;
foreach my $i(@ar){
push(@{$hash{abs(($vorgegeben - $i))}},$i);
}
my $key = (sort{$a <=> $b}keys(%hash))[0];
print $_,"\n" for(@{$hash{$key}});
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Crian
 2005-01-28 18:13
#51415 #51415
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Code: (dl )
1
2
3
my @array = (4, 1, 0, 9, 6, 7, 4, 0, 2);
my $v = 5;
print grep {abs($_-$v) == abs((sort {abs($a-$v) <=> abs($b-$v)} @array)[0]-$v)} @array;


absolut unoptimiert =)

Edit: Repariert (und getestet)\n\n

<!--EDIT|Crian|1106929576-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< >> 4 Einträge, 1 Seite



View all threads created 2005-01-28 17:48.