Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Liczenie zer i jedynek w ciągu
Forum PHP.pl > Forum > PHP
rav1989
Witam
Mam za zadanie stworzyć skrypt który policzy i wyświetli ile zer i jedynek jest w ciągu ale w taki sposób

ciąg: 10011000111100 (będzie wczytywany z pliku tekstowego)
wynik: 11 20 21 30 41 20 (koniecznie muszą być spacje lub inny separator, żeby potem można było za pomocą explode wpisać wyniki do tablicy)
w ciągu będą tylko zera i jedynki, jeżeli zdarzy się, że jest np. 10 zer to niech zapisze to jako 90 10 itd. (12 zer - 90 30) to samo z jedynkami.

OK. udało mi się stworzyć tą funkcję tylko pozostał jeden błąd
przy ciągu: 01001100011111001000000000000 wyświetla 10|11|20|21|30|51|20|11|120| zamiast 10|11|20|21|30|51|20|11|90|30|

  1. <?php
  2. function skroc_ciag($string){
  3. $bufor="";
  4. $koniec=strlen($string);
  5. for($i=0;$i<$koniec;$i++){
  6.        $a=$i+1;
  7.    if($string[$i]==1){
  8.        $z=0;
  9.        $j++;
  10.        if($string[$a]!=1){$bufor.=$j.'1|';}
  11.    }
  12.    if($string[$i]==0){
  13.        $j=0;
  14.        $z++;
  15.        if($string[$a]!=0){$bufor.=$z.'0|';}
  16.  
  17.    }
  18.    
  19. }
  20. if($string[$koniec]==0){
  21.        $bufor.=$z.'0|';
  22.  
  23.    }
  24.  
  25. return $bufor;
  26. }
  27. ?>



Pozdrawiam
dr_bonzo
Oczywiscie kolega "bardzo ladnie przedstawil algorytm uzyskiwania wyniku" (czyt: musialem sie domyslic)

  1. <pre><?php
  2. function __( $x )
  3. {
  4.    print( $x . "\n" );
  5. }
  6. $input = "01001100011111001000000000000";
  7.  
  8. $expected = explode( "|", "10|11|20|21|30|51|20|11|90|30" );
  9.  
  10. $max = 9;
  11. $last = 'X';
  12. $counter = 0;
  13. $result = array();
  14. for ( $i = 0; $i < strlen( $input ); $i++ )
  15. {
  16.    $c = $input{$i};
  17.    if ( $c != $last )
  18.    {
  19.        // zmiana znaku
  20.        if ( $i > 0 )
  21.        {
  22.            // rozbij na < 10tki
  23.            while ( $counter >= $max )
  24.            {
  25.                $counter -= $max;
  26.                $result[] = $max . $last;
  27.            }
  28.            $result[] = $counter . $last;
  29.        }
  30.        $counter = 1;
  31.        $last = $c;
  32.    }
  33.    else
  34.    {
  35.        // ten sam znak
  36.        $counter++;
  37.    }
  38.    
  39.    
  40. }
  41.  
  42. // zapisac ostatni ciag, bo petla tego nie zalatwi
  43. while ( $counter >= $max )
  44. {
  45.    $counter -= $max;
  46.    $result[] = $max . $last;
  47. }
  48. $result[] = $counter . $last;
  49.  
  50. if ( $result == $expected )
  51. {
  52.    print( "OKEEEJ" );
  53. }
  54. else
  55. {
  56.    print( "ZLE\n" );
  57.    print( join( "|", $expected ) . "\n" );
  58.    print( join( "|", $result ) . "\n" );        
  59. }
  60. ?>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.