Endija Lisovska pieraksti

Par Web 2.0, programmēšanu, Google, Linux, kā arī blogošanu

Atkal uzdevumiņš PHP programmētājiem

Šodien rakstot kārtējo kodu gabalu nonācu līdz situācijai, kad bija jāsakārto masīvu, vadoties pēc kādas noteiktas tā vērtības. Pirmajā minūtē pat nevarēju iedomāties kā lai to izdara. Protams, pēc vēl minūtes apjukums bija pazudis un kods uztapa. Secināju, ka vajadzētu atkārtot klasiskos algoritmus. Ievadu esmu devis. Tagad pats uzdevums. Jums arī piedāvāju uzrakstīt sortēšanas kodu. Lai būtu interesantāk - visas atbildes tiks turētas moderēšanas režīmā 2 dienas. Tas tā - lai citi nešpiko. Pēc šī laika atbildes aktivizēšu. Interesanti būtu redzēt - vai citi izmantotu to pašu algoritmu kuru es - vai pavisam kaut ko citu. Protams, savus variantus var rakstīt arī tie, kas programmē citās valodās, jo uzsvars ir nevis uz konkrētu valodu, bet algoritmu. Un jā - nav arī jēgas tagad atvērt kādu manuāli un uzrakstīt algoritmu. Rakstiet tā kā varat izdomāt.

Tātad uzdevums. Ir dots masīvs ar nenoteiktu skaitu elementu. Indeksi ir no 0 līdz X, pieaugot pa 1. Vērtības ir masīvi. Šiem vērtību masīviem viens no indeksiem ir ‘value’, savukārt vērtība pie attiecīgā indeksa ir Y. Y ir kaut kāds pozitīvs skaitlis.
Piemērs diviem no iespējamajiem veidojumiem:

$data[0]['value'] = 12;
$data[0]['title'] = ‘Some title’;
$data[1]['value'] = 43.3;
$data[1]['title'] = ‘Some title2′;

Masīvu ir jāsakārto tā, lai ['value'] lauki būtu dilstošā secībā. Tātad piemērā $data[0] vērtība ir jāapmaina vietām ar $data[1] vērtību. Pēc sortēšanas nedrīkst būt pazuduši kādi no masīva uzbūves noteikumos iekļautajiem ierobežojumiem. Piemēram, $data masīva indeksiem joprojām jābūt no 0 un pieaugošiem pa 1.

Ja gadījumā galīgi nav skaidrs uzdevums - sakiet par to komentāros - mēģināšu paskaidrot.

Padalies ar citiem:
  • Digg
  • del.icio.us
  • Google
  • Reddit
  • TwitThis
  • blogmarks
  • E-mail this story to a friend!
  • Pownce
  • Print this article!

18 komentāri ierakstam “Atkal uzdevumiņš PHP programmētājiem”

  1. cu

    Pitons, jo php nav pa rokai un nav arī simts gadus lietots.
    x = [ {"value": 12, "title":"Some title"}, {"value": 43.3, "title":"Some title2"} ]
    x.sort(lambda a, b: (a["value"] < b["value"]) - (b["value"] < a["value"]))

    Iekš php laikam sākumā izveidotu asociatīvu masīvu, kur atslēgas ir tie “value”, tad ksort un gatavs.

    Ja vien neesi pašreizējs CS students, tad riteni izgudrot nav sevišķi prātīgi, labāk lietot vides jau piedāvātās iespējas.

  2. bubu

    Easy. Tur pat nekādu algoritmu nevajag:
    usort($data, create_function(’$a,$b’, ‘return $b["value"] - $a["value"];’));

  3. kristaps

    Uzdevumu atrisināju, izmantojot uasort funkciju
    http://paste.php.lv/7145?lang=php

  4. kristaps

    Uzdevumu atrisināju vēlreiz, šoreiz ar quicksort algoritma palīdzību
    http://paste.php.lv/7146?lang=php

  5. kristaps

    Piemirsu vistriviālāko variantu - ar bubble sort algoritma palīdzību
    http://paste.php.lv/7147?lang=php

  6. piu

    rakstu bez koda - loģikā, uz sitiena nav, kur notestēt + baigais lauziens.

    Kā darītu es.

    1. ietu cauri masīvam pie viena izveidojot jaunu masīvu, kura key būtu value vērtība, bet saturs - jau iepriekš minētais masīvs ar value un title.

    aptuveni šitā:
    $newArray['43,3'] [1]['value'] = 43,3;
    $newArray['43,3'] [1]['title'] = ’some title 2′;
    $newArray[12][0][value]=12;
    ……

    tad $newArray sakārtotu pēc atslēgām un beigu beigās atgrieztu veco masīvu.

    Tas tā, ja sapratu pareizi uzdevumu.

  7. andrisp

    Ja es pareizi sapratu, tad iekš PHP pietiktu vienkārši ar http://lv2.php.net/usort funkciju. :) Example #2 ir gandrīz kā tavs uzdevums. :)

  8. koko

    Elementārs burbuļsorts :D Es pat necentīšos te atklāt jaunu pasauli :D
    http://en.wikipedia.org/wiki/Bubble_sort

    koko savā blogā raksta par: Stoned.lv - portāls par psihoaktīvām vielām

  9. Peteris Krumins

    Sis tacu ir pavisam trivials uzdevums.

    Kas ir

    $data[0]['value'] = 12;
    $data[0]['title'] = ‘Some title’;

    Tas ir

    $data = Array(0 => Array('value' => 12, 'title' => 'Some title'))

    Tad nu trivialais atrisinajums, izmantojot usort():

    function trivial_sort($a, $b) {
    $aa = $a['value'];
    $bb = $b['value'];
    if ($aa > $bb) return -1;
    else if ($aa < $bb) return 1;
    else return 0;
    }

    usort($data, ‘trivial_sort’);

    Peteris Krumins savā blogā raksta par: Analyzing Keyword Activity on Coding Horror

  10. Endijs Lisovskis

    Pirmkārt - prieks, ka bija tik daudzas atbildes.
    Pats es attiecīgo uzdevumu atrisināju ar bublesort. Par usort kaut kā niedomājos, bet tas būtu prātīgāks risinājums.

  11. Tomy

    Vah, nokavēju :D sort($data); :)

  12. bubu

    Jebkurš variants, kas neizmanto iebūvētās php funkcijas (XXXsort) ir slikts. Jo tas ir lēns un neefektīvs. php iebūvētās kārtošanas funkcijas ir rakstīts C valodā, turpretī visi jūsu burbuļ/quick/insert/whatever-sorti būs lēnāki, jo būs php baitkods.

    Ir jāzin savas programmēšanas vides standartbiblotēku! Citādi taps slikts kods - gan tādā ziņā, ka ir iespējas ielaist vairāk kļūdas (nekā vienkārši izsaucot iebūvētu funkciju), kā arī tādā ziņā, ka citiem darba kolēģiem tu sagādā vairāk darba (viņiem tā vietā lai izlasītu iebūvētas funkcijas izsaukumu, ir jāvelta laiks un jāiebrauc svešā kodā).

  13. Endijs Lisovskis

    Protams, bubu tev ir 100% taisnība. Pats arī sajutos mazs dumjš iesācējs, kad lasot komentārus pamanīju usort(). It kā agrāk biju attiecīgo lietu izmantojis, bet tā kā jau stipri sen neko tādu nevajadzēja darīt, tad nebija pirmais kas ienāca prātā. Tā ir, ka brīžiem kodēšanas uzdevumi panesās stipri vienveidīgi un primitīvi. Persona sāk ierūsēt.

  14. cu

    ja kļūst garlaicīgi, tad tu tur kaut ko haltūrē. Programmēšanas sāls jau ir tas, ka tu noprogrammē vienreiz, lai nebūtu kaut kas ar rociņām jādara vēlreiz. Varbūt jāskatās kādu framework-u un bibliotēku virzienā..

  15. Endijs Lisovskis

    2 cu: man pēdējā laikā nākas labot dažādus sen paša, kā arī citu rakstītus kodus. Kuri strukturāli ir ļoti vienkārši: datu atlase, datu izvade, datu ievietošana. Nekas tāds, kur vajadzētu ļoti saspringt domājot kā to panākt. Savukārt veco lietu labošanā izmantot freimworkus ir nereāli. Taču paralēli dažādiem elementārajiem darbiem tagad cītīgi apgūstu Zend Framework. Nākamo projektu, kuru taisīšu no 0 noteikti taisīšu uz ZF.

  16. mārtiņč

    Pirmais, kas ienāca prātā arī bija usort, vienīgais, ka nāktos atvērt manuāli, lai sev atgādinātu, kā funkciju pielietot.

  17. maa

    Lietojot ZF tu netaisi no 0.

  18. Endijs Lisovskis

    Ar “taisīt no 0″ nebiju domājis “taisīt neizmantojot citu rakstītas lietas”. Bet jauna projekta izveidi nevis kāda veca labošanu.

Atstājiet komentāru

Meklēšana: