Bekijk Volledige Versie : [PHP] Rangorde bepalen
Maarten Wierda
11/03/05, 00:45
Zeer geachte lezers van n.i.w.s-s,
Ik kamp met een probleempje, en vroeg me af of er lezers van
deze nieuwsgroep zijn die weten hoe ik dit kan oplossen.
Van een array wil de rangorde van elk element bepalen. Deze
array heeft bijv. 5 elementen waarvan de waarden '100%',
'67%', '67%', '33%' en '33%' zijn (de array is reeds
gesorteerd). Nu wil deze waarden op het schermen toveren
maar dan wel met het rangnummer voor de waarde. Bijvoorbeeld:
1. 100%
3. 67%
3. 67%
5. 33%
5. 33%
Door de gelijke stand zijn er dus twee nummers 3 en tevens 2
nummers 5. Een ordered list (ol) is dus geen optie.
Heeft iemand een idee hoe ik dit kan aanpakken? Ik denk dat
ik een variabele $rank moet definieren en binnen de loop
moet controleren op de volgende waarden (percentages) en
vervolgens de waarde van $rank moet verhogen. Maar hoe ik
dit precies moet programmeren, weet ik (nog) niet.
Alvast bedankt.
--
Cheers,
Maarten Wierda
"Shit happens. Then you wipe."
Rene Pijlman
11/03/05, 01:05
Maarten Wierda:
>1. 100%
>3. 67%
>3. 67%
>5. 33%
>5. 33%
>Heeft iemand een idee hoe ik dit kan aanpakken? Ik denk dat
>ik een variabele $rank moet definieren en binnen de loop
>moet controleren op de volgende waarden (percentages) en
>vervolgens de waarde van $rank moet verhogen. Maar hoe ik
>dit precies moet programmeren, weet ik (nog) niet.
waarden = [100,67,67,33,33]
volgnummer, aantal, vorigeWaarde = 0, 0, None
for waarde in waarden:
if vorigeWaarde is not None and waarde < vorigeWaarde:
volgnummer += aantal
for i in range(aantal):
print volgnummer, vorigeWaarde
vorigeWaarde = waarde
aantal = 0
aantal += 1
vorigeWaarde = waarde
if aantal > 0:
volgnummer += aantal
for i in range(aantal):
print volgnummer, vorigeWaarde
(getest)
--
René Pijlman
Wat wil jij leren? http://www.leren.nl
Maarten Wierda
11/03/05, 01:15
Rene Pijlman wrote:
[hoe dergelijke rangnummers te bewerkstelligen..]
>> 1. 100% 3. 67% 3. 67% 5. 33% 5. 33%
<snip>
>
> waarden = [100,67,67,33,33]
<snip geteste code>
Dank je wel voor je snelle reactie, René. Het is al laat dus
ik ga morgen even kijken hoe ik dat kan omtoveren in PHP-code.
En nog even ter info m.b.t. je ploink-beleid, het kan zijn
dat ik 's avonds pas weer antwoord ;)
--
Cheers,
Maarten Wierda
"Shit happens. Then you wipe."
Rene Pijlman
11/03/05, 01:35
Maarten Wierda:
>Rene Pijlman:
><snip geteste code>
>
>Dank je wel voor je snelle reactie, René. Het is al laat dus
>ik ga morgen even kijken hoe ik dat kan omtoveren in PHP-code.
Ja, ik zag PHP pas in het subject toen ik al bijna klaar was. Maar los
daarvan, Python leest als pseudocode :-)
>En nog even ter info m.b.t. je ploink-beleid, het kan zijn
>dat ik 's avonds pas weer antwoord ;)
Je hebt al geantwoord! Je hebt zelfs dankjewel gezegd :-) Zie je wel, zo
doen beleefde mensen dat. Het is hier net als in het echte leven.
--
René Pijlman
Wat wil jij leren? http://www.leren.nl
Daniel Tryba
11/03/05, 01:35
Maarten Wierda <moart3nAT@chellodot.nl> wrote:
> 1. 100%
> 3. 67%
> 3. 67%
> 5. 33%
> 5. 33%
> Heeft iemand een idee hoe ik dit kan aanpakken? Ik denk dat
> ik een variabele $rank moet definieren en binnen de loop
> moet controleren op de volgende waarden (percentages) en
> vervolgens de waarde van $rank moet verhogen. Maar hoe ik
> dit precies moet programmeren, weet ik (nog) niet.
Loop: wat is het huidige getal? Is het het zelfde als het vorige dan zelfde
rang, maar volgende rang is wel +1 extra.
$inc=1;
$last=0;
$rang=0;
foreach($arr as $value)
{
if($value==$last)
{
$inc++;
}
else
{
$rang+=$inc;
$inc=1;
}
echo "$rang. $value\n";
$last=$value;
}
Voorwaarde is wel dat het array gesorteerd is:
function comparator($a,$b)
{
$a=str_pad($a,4,"0",STR_PAD_LEFT);
$b=str_pad($b,4,"0",STR_PAD_LEFT);
return -strcmp($a,$b);
}
usort($arr,comparator);
Op random arrays van 0,10:
1. 10%
2. 9%
2. 9%
2. 9%
5. 8%
5. 8%
7. 7%
8. 6%
9. 5%
10. 3%
John Bokma
11/03/05, 03:45
Maarten Wierda wrote:
> Zeer geachte lezers van n.i.w.s-s,
>
> Ik kamp met een probleempje, en vroeg me af of er lezers van
> deze nieuwsgroep zijn die weten hoe ik dit kan oplossen.
>
> Van een array wil de rangorde van elk element bepalen. Deze
> array heeft bijv. 5 elementen waarvan de waarden '100%',
> '67%', '67%', '33%' en '33%' zijn (de array is reeds
> gesorteerd). Nu wil deze waarden op het schermen toveren
> maar dan wel met het rangnummer voor de waarde. Bijvoorbeeld:
>
> 1. 100%
> 3. 67%
> 3. 67%
> 5. 33%
> 5. 33%
>
> Door de gelijke stand zijn er dus twee nummers 3 en tevens 2
> nummers 5. Een ordered list (ol) is dus geen optie.
ff denken, in gedachte start je met 0, en je telt het aantal voorkomens
van de huidige er bij op? (Of: de laatste positie van het element in de
rij?)
use strict;
use warnings;
my %count;
$count{ $_ }++ for qw( 100 67 67 33 33 );
my $rank;
for my $number (sort { $b <=> $a } keys %count ) {
$rank += $count{ $number };
print "$rank. $number%\n" x $count{ $number };
}
Op Daniel's input geeft het:
1. 10%
4. 9%
4. 9%
4. 9%
6. 8%
6. 8%
7. 7%
8. 6%
9. 5%
10. 3%
Geen idee of het klopt :-D.
--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html
John Bokma
11/03/05, 03:55
Rene Pijlman wrote:
> waarden = [100,67,67,33,33]
>
> volgnummer, aantal, vorigeWaarde = 0, 0, None
>
> for waarde in waarden:
> if vorigeWaarde is not None and waarde < vorigeWaarde:
> volgnummer += aantal
> for i in range(aantal):
> print volgnummer, vorigeWaarde
> vorigeWaarde = waarde
> aantal = 0
> aantal += 1
> vorigeWaarde = waarde
> if aantal > 0:
> volgnummer += aantal
> for i in range(aantal):
> print volgnummer, vorigeWaarde
Hmmm... geeft "dezelfde" uitvoer als mijn pareltje als ik Daniel's input
er in stopt :-D.
1 10
4 9
4 9
4 9
6 8
6 8
7 7
8 6
9 5
10 3
--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html
Daniel Tryba
11/03/05, 04:15
John Bokma <postmaster@castleamber.com> wrote:
> Op Daniel's input geeft het:
>
> 1. 10%
> 4. 9%
> 4. 9%
> 4. 9%
> 6. 8%
Crap, ik was helemaal overtuigt van
1.
2.
2.
2.
5.
> Geen idee of het klopt :-D.
Komt wel overeen met wat OP wil, maar IMHO is mijn output toch
"normaler". Als er 3 2de plekken zijn zijn die niet opeens 4de, en de
5de 6de. Ze zijn gewoon 2de en het 5de getal gewoon 5de.
Ik zou dit natuurlijk kunnen onderbouwen emt sport en EuroVisie
SongFestival uitslagen :)
Daniel Tryba
11/03/05, 04:45
Daniel Tryba <spam@tryba.invalid> wrote:
> Crap, ik was helemaal overtuigt van
alsnog de patch:
--- foo.php.orig 2005-03-11 04:19:56.195100003 +0100
+++ foo.php 2005-03-11 04:34:02.528211275 +0100
@@ -4,7 +4,7 @@
$a=str_pad($a,3,"0",STR_PAD_LEFT);
$b=str_pad($b,3,"0",STR_PAD_LEFT);
- return -strcmp($a,$b);
+ return strcmp($a,$b);
}
$arr=array();
@@ -18,6 +18,7 @@
$inc=1;
$last=0;
$rank=0;
+$count=count($arr)+1;
foreach($arr as $value)
{
@@ -31,8 +32,14 @@
$inc=1;
}
- echo "$rank. $value\n";
-
+ $output[]=str_pad($count-$rank,2," ",STR_PAD_LEFT).". $value\n";
+
$last=$value;
}
+
+foreach(array_reverse($output) as $value)
+{
+ echo $value;
+}
+
?>
John Bokma
11/03/05, 06:05
Daniel Tryba wrote:
> John Bokma <postmaster@castleamber.com> wrote:
>> Op Daniel's input geeft het:
>>
>> 1. 10%
>> 4. 9%
>> 4. 9%
>> 4. 9%
>> 6. 8%
>
> Crap, ik was helemaal overtuigt van
> 1.
> 2.
> 2.
> 2.
> 5.
>
>> Geen idee of het klopt :-D.
>
> Komt wel overeen met wat OP wil, maar IMHO is mijn output toch
> "normaler". Als er 3 2de plekken zijn zijn die niet opeens 4de, en de
> 5de 6de. Ze zijn gewoon 2de en het 5de getal gewoon 5de.
Ja, dan zou ik meer iets als:
1. 100%
2. 67%
2. 67%
3. 33%
3. 33%
verwachten, gedeelde 2e plaats, gedeelde 3e plaats.
Ff snelle gok, als de += $count{ $number } wordt += 1; werkt het
volgens die manier.
--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html
Warden Dave
11/03/05, 06:15
"Maarten Wierda" <moart3nAT@chelloDOT.nl> wrote:
> ik ga morgen even kijken hoe ik dat kan omtoveren in PHP-code.
Om in deze vrolijke nieuwsgroep alvast een meer PHP toegesneden simpel
voorbeeld te geven, bijv. ('$arr' is je array):
$i=0;
foreach (array_count_values($arr) as $v=>$n)
for ($i+=$n, $r=0; $r<$n; $r++) echo "$i. $v\n";
Als je i.p.v. '1,3,3,5,5' etc. '1,2,2,4,4' schrijven wilt dan begin je met
'$i=1' en verhoog je na de for-lus ($i+=$n).
WD
John Bokma
11/03/05, 07:25
Warden Dave wrote:
> "Maarten Wierda" <moart3nAT@chelloDOT.nl> wrote:
>
>> ik ga morgen even kijken hoe ik dat kan omtoveren in PHP-code.
>
> Om in deze vrolijke nieuwsgroep alvast een meer PHP toegesneden simpel
> voorbeeld te geven, bijv. ('$arr' is je array):
>
> $i=0;
> foreach (array_count_values($arr) as $v=>$n)
> for ($i+=$n, $r=0; $r<$n; $r++) echo "$i. $v\n";
Mooi kort, lijkt op een PHP versie van mijn Perl snippet, dus ik gok dat ik
op de goede weg qua wat de OP wilde (was voor mij niet 100% duidelijk)
--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html
John Bokma
11/03/05, 09:25
John Bokma wrote:
> Warden Dave wrote:
>
>> "Maarten Wierda" <moart3nAT@chelloDOT.nl> wrote:
>>
>>> ik ga morgen even kijken hoe ik dat kan omtoveren in PHP-code.
>>
>> Om in deze vrolijke nieuwsgroep alvast een meer PHP toegesneden
>> simpel voorbeeld te geven, bijv. ('$arr' is je array):
>>
>> $i=0;
>> foreach (array_count_values($arr) as $v=>$n)
>> for ($i+=$n, $r=0; $r<$n; $r++) echo "$i. $v\n";
>
> Mooi kort, lijkt op een PHP versie van mijn Perl snippet, dus ik gok
> dat ik op de goede weg qua wat de OP wilde (was voor mij niet 100%
> duidelijk)
my %cnt;
print 1 + $cnt{ $nrs[ $_ ] }, ". $nrs[ $_ ]\n"
for map $cnt{ $nrs[ $_ ] } = $_, 0 .. $#nrs;
nifty, en we schakelen nu over op Perl golf :-D.
--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html
Maarten Wierda
11/03/05, 10:25
Rene Pijlman wrote:
>> Dank je wel voor je snelle reactie, René. Het is al
>> laat dus ik ga morgen even kijken hoe ik dat kan
>> omtoveren in PHP-code.
>
> Ja, ik zag PHP pas in het subject toen ik al bijna klaar
> was. Maar los daarvan, Python leest als pseudocode :-)
En inmiddels zijn er al zat andere antwoorden gegeven. Maar
desondanks ga ik zeker even je code bestuderen straks.
>> En nog even ter info m.b.t. je ploink-beleid, het kan
>> zijn dat ik 's avonds pas weer antwoord ;)
>
> Je hebt al geantwoord! Je hebt zelfs dankjewel gezegd :-)
> Zie je wel, zo doen beleefde mensen dat. Het is hier net
> als in het echte leven.
Was het maar zo. In het echte leven zou zo'n kill filter
verdomde handig zijn!
--
Cheers,
Maarten Wierda
"Shit happens. Then you wipe."
Maarten Wierda
11/03/05, 10:35
Warden Dave wrote:
>> ik ga morgen even kijken hoe ik dat kan omtoveren in
>> PHP-code.
>
> Om in deze vrolijke nieuwsgroep alvast een meer PHP
> toegesneden simpel voorbeeld te geven, bijv. ('$arr' is
> je array):
Is het hier echt zo vrolijk?
> $i=0; foreach (array_count_values($arr) as $v=>$n) for
> ($i+=$n, $r=0; $r<$n; $r++) echo "$i. $v\n";
>
> Als je i.p.v. '1,3,3,5,5' etc. '1,2,2,4,4' schrijven wilt
> dan begin je met '$i=1' en verhoog je na de for-lus
> ($i+=$n).
Je hebt inderdaad gelijk dat ik eigenlijk twee nummers 2 heb
en twee nummers 4. Maar met onderstaande code bereik ik toch
niet het gewenste resultaat:
$arr = array("100%", "100%", "80%", "70%", "50%", "50%", "20%");
$i=0;
foreach (array_count_values($arr) as $v=>$n) {
for ($i+=$n, $r=0; $r<$n; $r++) {
echo "<p>$i. $v\n</p>";
$i+=$n;
}
}
Heb ik je opmerking verkeerd geinterpreteerd?
--
Cheers,
Maarten Wierda
"Shit happens. Then you wipe."
Rene Pijlman
11/03/05, 10:35
John Bokma:
>for my $number (sort { $b <=> $a } keys %count ) {
Het zal wel iets betekenen, maar geen idee wat :-)
Ik dacht nog, zal ik zo'n mooie magische Python-oneliner met map, filter,
reduce en lambda schrijven, maar nee... laat ik het maar triviaal houden.
Maarten wil het vast naar een andere programmeertaal overzetten.
--
René Pijlman
Wat wil jij leren? http://www.leren.nl
Maarten Wierda
11/03/05, 10:35
John Bokma wrote:
>> $i=0;
>> foreach (array_count_values($arr) as $v=>$n)
>> for ($i+=$n, $r=0; $r<$n; $r++) echo "$i. $v\n";
>
> Mooi kort, lijkt op een PHP versie van mijn Perl snippet, dus ik gok dat ik
> op de goede weg qua wat de OP wilde (was voor mij niet 100% duidelijk)
Voor mij is het dan wel handig om te weten *wat* ik niet
duidelijk uitlegde. Wellicht doel je op de rangnummers?
(Zoals in m'n reply op WD te lezen is, er zijn i.d.d. twee
nummers 2 i.p.v. 3)
--
Cheers,
Maarten Wierda
"Shit happens. Then you wipe."
Maarten Wierda
11/03/05, 10:35
Daniel Tryba wrote:
>> Geen idee of het klopt :-D.
Ja.
> Komt wel overeen met wat OP wil, maar IMHO is mijn output
> toch "normaler". Als er 3 2de plekken zijn zijn die niet
> opeens 4de, en de 5de 6de. Ze zijn gewoon 2de en het 5de
> getal gewoon 5de.
Je hebt gelijk hoor, die twee derde plaatsen was een vreemde
beredenatie van me. Ben benieuwd of die methode ergens wordt
gehanteerd.
Mijn methode was gebaseerd op Audioscrobbler
(<http://www.audioscrobbler.com/user/norecess/>). Maar nu
zie ik ook dat ik heel veel tweede plaatsen heb staan in m'n
Weekly Track Chart i.p.v. heel veel nummers 10.
> Ik zou dit natuurlijk kunnen onderbouwen emt sport en
> EuroVisie SongFestival uitslagen :)
Volg jij het Songfestival? :)
--
Cheers,
Maarten Wierda
"Shit happens. Then you wipe."
Maarten Wierda
11/03/05, 10:45
Rene Pijlman wrote:
>> for my $number (sort { $b <=> $a } keys %count ) {
>
> Het zal wel iets betekenen, maar geen idee wat :-)
John wil gewoon stoer doen. Dat is hem m.i. aardig gelukt :)
> Ik dacht nog, zal ik zo'n mooie magische Python-oneliner
> met map, filter, reduce en lambda schrijven, maar nee...
> laat ik het maar triviaal houden. Maarten wil het vast
> naar een andere programmeertaal overzetten.
Jouw code ga ik straks in de trein bekijken. Zelfde geldt
voor die van Daniel, alhoewel die al exact doet wat ik wil
(zelfs zonder dat ik aangaf dat ik *dat* wilde).
Trouwens, horen jullie (op John na) niet te slapen 's
nachts? Voor mijn programmeer-problemen hoef je echt niet
wakker te blijven hoor ;)
--
Cheers,
Maarten Wierda
"Shit happens. Then you wipe."
Rene Pijlman <reply.in.the.newsgroup@my.address.is.invalid>:
> John Bokma:
>>for my $number (sort { $b <=> $a } keys %count ) {
>
> Het zal wel iets betekenen, maar geen idee wat :-)
Tijd voor een cursus Perl?
--
robert
Rene Pijlman
11/03/05, 11:15
Maarten Wierda:
>Trouwens, horen jullie (op John na) niet te slapen 's
>nachts? Voor mijn programmeer-problemen hoef je echt niet
>wakker te blijven hoor ;)
Ik ben met een programmeerklus bezig en dan heeft het dagritme de neiging
ongeveer een uur per dag naar achteren te schuiven [1]. Een klus van 24
dagen (of een veelvoud daarvan) is ideaal, dan ben je aan het eind weer
helemaal aan de maatschappij aangepast :-)
[1] Uit onderzoek is gebleken dat mensen die niet de externe prikkels van
het dag/nachtgebeuren krijgen, dagen van ongeveer 25 uur gaan leven. Dat
zal wel geen toeval zijn.
--
René Pijlman
Wat wil jij leren? http://www.leren.nl
Jan Ehrhardt
11/03/05, 11:35
Rene Pijlman in nl.internet.www.server-side (Fri, 11 Mar 2005 11:14:47
+0100):
>[1] Uit onderzoek is gebleken dat mensen die niet de externe prikkels van
>het dag/nachtgebeuren krijgen, dagen van ongeveer 25 uur gaan leven. Dat
>zal wel geen toeval zijn.
Bij sommige ploegendiensten ga je elke week een ploeg eerder draaien.
Dan draai je feitelijk dagen van zo'n 23 uur. Ik heb dat nooit begrepen.
In de broodfabriek, waar mijn Pa nu zijn pensioen van trekt, draaiden ze
naar achteren door: dagen van zo'n 25 uur. Kijk, die snapten het.
Nadeel: eens in de 3 weken was je een dag kwijt. Weg weekend.
Jan
--
Look, Ma. No tables - http://enbio.steenbergen-stichting.nl/
Daniel Tryba
11/03/05, 11:45
Maarten Wierda <moart3nAT@chellodot.nl> wrote:
>> Ik zou dit natuurlijk kunnen onderbouwen emt sport en
>> EuroVisie SongFestival uitslagen :)
>
> Volg jij het Songfestival? :)
Tuurlijk niet, dat mag toch duidelijk zijn als ik het in 1 regel noem
met sport :)
Daniel Tryba
11/03/05, 11:45
Maarten Wierda <moart3nAT@chellodot.nl> wrote:
> Jouw code ga ik straks in de trein bekijken. Zelfde geldt
> voor die van Daniel, alhoewel die al exact doet wat ik wil
> (zelfs zonder dat ik aangaf dat ik *dat* wilde).
Dat is omdat ik specs slecht lees en maak wat ik denk dat goed is :)
> Trouwens, horen jullie (op John na) niet te slapen 's nachts? Voor
> mijn programmeer-problemen hoef je echt niet wakker te blijven hoor ;)
Mijn bioritme ligt rond de 30 uur, gemapped op 24 is lol :)
Rene Pijlman
11/03/05, 12:15
Rene Pijlman:
>Ik ben met een programmeerklus bezig en dan heeft het dagritme de neiging
>ongeveer een uur per dag naar achteren te schuiven [1]. Een klus van 24
>dagen (of een veelvoud daarvan) is ideaal, dan ben je aan het eind weer
>helemaal aan de maatschappij aangepast :-)
Ik bedoelde natuurlijk een klus van 25 dagen. Alleen slaap je dan maar 24
keer.
--
René Pijlman
Wat wil jij leren? http://www.leren.nl
Warden Dave
11/03/05, 14:25
"Maarten Wierda" <moart3nAT@chelloDOT.nl> wrote:
> Warden Dave wrote:
>> Als je i.p.v. '1,3,3,5,5' etc. '1,2,2,4,4' schrijven wilt
>> dan begin je met '$i=1' en verhoog je na de for-lus
>> ($i+=$n).
>
> Je hebt inderdaad gelijk dat ik eigenlijk twee nummers 2 heb
> en twee nummers 4. Maar met onderstaande code bereik ik toch
> niet het gewenste resultaat:
>
> $arr = array("100%", "100%", "80%", "70%", "50%", "50%", "20%");
>
> $i=0;
> foreach (array_count_values($arr) as $v=>$n) {
> for ($i+=$n, $r=0; $r<$n; $r++) {
> echo "<p>$i. $v\n</p>";
> $i+=$n;
> }
> }
>
> Heb ik je opmerking verkeerd geinterpreteerd?
Ehm, ja, inderdaad... De vrolijkheid raakt er zo wel vanaf. ;)
Logischerwijze had het dan moeten zijn:
$i=1;
foreach (array_count_values($arr) as $v=>$n) {
for ($r=0; $r<$n; $r++) echo "<p>$i. $v\n</p>";
$i+=$n;
}
groet,
WD
Maarten Wierda
11/03/05, 18:35
Daniel Tryba wrote:
>> Jouw code ga ik straks in de trein bekijken. Zelfde
>> geldt voor die van Daniel, alhoewel die al exact doet
>> wat ik wil (zelfs zonder dat ik aangaf dat ik *dat*
>> wilde).
>
> Dat is omdat ik specs slecht lees en maak wat ik denk dat
> goed is :)
Heel goed, opvoeden die klant* !
* Of mensen in n.i.w.-s met een probleem.
--
Cheers,
Maarten Wierda
"Shit happens. Then you wipe."
John Bokma
11/03/05, 19:05
Rene Pijlman wrote:
> John Bokma:
>>for my $number (sort { $b <=> $a } keys %count ) {
>
> Het zal wel iets betekenen, maar geen idee wat :-)
sorteer op de sleutels van de hash table met als vergelijkingsoperator
b <=> a
> Ik dacht nog, zal ik zo'n mooie magische Python-oneliner met map, filter,
> reduce en lambda schrijven, maar nee... laat ik het maar triviaal houden.
> Maarten wil het vast naar een andere programmeertaal overzetten.
:-D Oh, ben het met je eens dat een one-liner niet te lezen is.
--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html
John Bokma
11/03/05, 19:05
Rene Pijlman wrote:
> Maarten Wierda:
>>Trouwens, horen jullie (op John na) niet te slapen 's
>>nachts? Voor mijn programmeer-problemen hoef je echt niet
>>wakker te blijven hoor ;)
>
> Ik ben met een programmeerklus bezig en dan heeft het dagritme de neiging
> ongeveer een uur per dag naar achteren te schuiven [1]. Een klus van 24
> dagen (of een veelvoud daarvan) is ideaal, dan ben je aan het eind weer
> helemaal aan de maatschappij aangepast :-)
>
> [1] Uit onderzoek is gebleken dat mensen die niet de externe prikkels van
> het dag/nachtgebeuren krijgen, dagen van ongeveer 25 uur gaan leven. Dat
> zal wel geen toeval zijn.
Aha! Enige nadeel wat ik wel eens heb is dat ik heel soms extra lange dagen
kado krijg :-(
--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html
John Bokma
11/03/05, 19:35
Maarten Wierda wrote:
> John Bokma wrote:
>
>>> $i=0;
>>> foreach (array_count_values($arr) as $v=>$n)
>>> for ($i+=$n, $r=0; $r<$n; $r++) echo "$i. $v\n";
>>
>> Mooi kort, lijkt op een PHP versie van mijn Perl snippet, dus ik gok
>> dat ik op de goede weg qua wat de OP wilde (was voor mij niet 100%
>> duidelijk)
>
> Voor mij is het dan wel handig om te weten *wat* ik niet
> duidelijk uitlegde. Wellicht doel je op de rangnummers?
>
> (Zoals in m'n reply op WD te lezen is, er zijn i.d.d. twee
> nummers 2 i.p.v. 3)
Ja, ik schreef dat al ergens (op een reply aan Daniel IIRC), je eerste
probleem kon ik later terugbrengen tot:
vind de maximale positie van een element in een rij gesorteerde
elementen met de positie van het 1e element is 1. Toon vervolgens per
voorkomen van een element de maximale positie, en de waarde van het
element op een nieuwe regel.
Een andere omschrijving is: vind het aantal voorkomens van een element
in een rij gesorteerde elementen. Toon vervolgens per voorkomen van een
element de positie van de regel van het voorgaande element ongelijk aan
het huidige element met daarbij opgeteld het aantal voorkomens. De
eerste regel heeft postitie 1.
Mijn eerste oplossing werkte op die manier: ik bepaalde eerst het aantal
voorkomens middels een hash. Omdat ik de volgorde kwijt raakte (hash is
ongeordend) sorteer ik die hash op de sleutels ( = elementen), en
vervolgens druk ik per element het aantal voorkomens af.
Een erg onleesbare vorm van de 1e:
my %maxpos;
print "$maxpos{ $_ }. $_\n"
for map { $maxpos{ $nrs[ $_ ] } = $_ + 1 and $nrs[ $_ ] } 0..$#nrs;
Hier bewaar ik voor elk element in een hash table de index + 1 ( =
positie 1-based), omdat de elementen op volgorde doorlopen worden hou
ik uiteindelijk de maximale positie vast. Die and is een truuk om de
totale expressie het nummer met index $_ op te doen leveren.
De for krijgt in plaats van de 0 t/m aantal getallen - 1 zo de getallen
zelf voor de kiezen. In de print druk ik het de maximale positie af, en
het bijbehorende getal (dat nu in $_ zit).
Leesbaarder:
# bepaal de maximale positie van elk element in gesorteerd array $nrs.
# het 1e element in het array heeft een positie van 1
my %maxpos;
$maxpos{ $nrs[ $_ ] } = $_ + 1 for 0 .. $#nrs;
# druk af voor elk element in het gesorteerde array de maximale positie
# gevolgt door het element zelf, elk op een nieuwe regel
print "$maxpos{ $_ }. $_\n" for @nrs;
--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html
Maarten Wierda
12/03/05, 11:45
John Bokma wrote:
[probleem duidelijker uitleggen]
> Ja, ik schreef dat al ergens (op een reply aan Daniel
> IIRC), je eerste probleem kon ik later terugbrengen tot:
>
> vind de maximale positie van een element in een rij
> gesorteerde elementen met de positie van het 1e element
> is 1. Toon vervolgens per voorkomen van een element de
> maximale positie, en de waarde van het element op een
> nieuwe regel.
Jouw beschrijving is in ieder geval gespecificeerder, maar
voor mij niet bepaald duidelijker. Voor mij is het
makkelijker om mijn probleem vanuit een voorbeeld te
beschrijven zodat er eventueel door de lezers hier een
geheel andere oplossing kan worden voorgedragen. Als ik een
gespesificeerde beschrijving als die van jou zou gebruiken,
zou ik de lezers hier 'dwingen' om slechts voor dat probleem
een oplossing te zoeken.
> Een andere omschrijving is: vind het aantal voorkomens
> van een element in een rij gesorteerde elementen. Toon
> vervolgens per voorkomen van een element de positie van
> de regel van het voorgaande element ongelijk aan het
> huidige element met daarbij opgeteld het aantal
> voorkomens. De eerste regel heeft postitie 1.
Wilde ik dat echt?
--
Cheers,
Maarten Wierda
"Shit happens. Then you wipe."
John Bokma
12/03/05, 20:05
Maarten Wierda wrote:
> John Bokma wrote:
>
> [probleem duidelijker uitleggen]
>> Ja, ik schreef dat al ergens (op een reply aan Daniel
>> IIRC), je eerste probleem kon ik later terugbrengen tot:
>>
>> vind de maximale positie van een element in een rij
>> gesorteerde elementen met de positie van het 1e element
>> is 1. Toon vervolgens per voorkomen van een element de
>> maximale positie, en de waarde van het element op een
>> nieuwe regel.
>
> Jouw beschrijving is in ieder geval gespecificeerder, maar
> voor mij niet bepaald duidelijker.
Maar voor een programmeur weer wel :-D.
> Voor mij is het
> makkelijker om mijn probleem vanuit een voorbeeld te
> beschrijven zodat er eventueel door de lezers hier een
> geheel andere oplossing kan worden voorgedragen.
Ja, dat begrijp ik, maar als het probleem onduidelijk is krijg je een
berg oplossingen (of erger: een berg klachten over de
probleemomschrijving)
> Als ik een
> gespesificeerde beschrijving als die van jou zou gebruiken,
> zou ik de lezers hier 'dwingen' om slechts voor dat probleem
> een oplossing te zoeken.
Oh, maar je kan prima er boven (of erna) neerzetten waarvoor je het wil
gebruiken, en dan krijg je reakties a la: dat doe je zo, maar...
> Wilde ik dat echt?
In je OP wel, beide omschrijvingen geven nl. het rijtje wat je gaf. Het
is alleen wat formeler. En het geeft de 2 mogelijke oplossingen om dat
rijtje te maken zoals jij dat gaf.
Het is in iedergeval hoe ik het oplos :-D (Dwz, hey, het is tellen, en
dan de positie van de voorganger er bij: tellen = hash table, en dat
andere kan met een lusje, of: hey het is de maximale positie vinden van
elk uniek element -> max positie is over de lijst, en de positie bewaren
in een hash).
--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html
Maarten Wierda
12/03/05, 20:25
John Bokma wrote:
>> Jouw beschrijving is in ieder geval gespecificeerder,
>> maar voor mij niet bepaald duidelijker.
>
> Maar voor een programmeur weer wel :-D.
Het is dan ook geen briefing, maar een formele beschrijving
van mijn (inmiddels opgeloste) probleem ;)
<snip>
> Oh, maar je kan prima er boven (of erna) neerzetten
> waarvoor je het wil gebruiken, en dan krijg je reakties a
> la: dat doe je zo, maar...
Weet je, ik ga er gewoon rekening mee houden in het vervolg ;]
>> Wilde ik dat echt?
>
> In je OP wel, beide omschrijvingen geven nl. het rijtje
> wat je gaf. Het is alleen wat formeler. En het geeft de 2
> mogelijke oplossingen om dat rijtje te maken zoals jij
> dat gaf.
>
[wat ik eigenlijk wilde]
Ik geloof je :)
OT: Nog leuke bandjes ontdekt daar aan de andere kant?
--
Cheers,
Maarten Wierda
"Shit happens. Then you wipe."