1. PHP / Говнокод #561

    +153.5

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    <?php
    /*
        desc:
            Инкремент строки типа '000'
            Символы от '0' до 'z'
    */
    function levelIncrease($lvl)
    {
    	for($i = 2, $ng = 0; $i >= 0; $i--) {
    		$g = ord($lvl[$i]);
    		if($i == 2)
    			++$g;
    		$g += $ng;
    		$ng = 0;
    		if($g > 57 && $g < 97)
    			$g = 97;
    		else if($g > 122) {
    			$diff = $g - 122;
    			$g = 48 + $diff - 1;
    			$ng = ceil($diff / 36);
    		}
    		$lvl[$i] = chr($g);
    		if($ng == 0)
    			break;
    	}
    	return $lvl;
    }
    
    echo levelIncrease('aaa');   // aab

    Инкремент строки типа '000'
    Символы от '0' до 'z'

    Запостил: guest, 17 Февраля 2009

    Комментарии (18) RSS

    • А привести рабочее небыдлокод-решение слабо?
      Ответить
    • Говнокодер:
      Вот типа нормальный вариант:

      function increaseCommentLevel($level)
      {
      if(strlen($level) % 3 != 0)
      throw new Exception('ERROR: Comment level is corrupted');

      $scale = array(
      '0','1','2','3','4','5','6','7','8','9', 'a','b','c','d','e','f','g','h',
      'i','j','k','l','m','n','o','p','q','r', 's','t','u','v','w','x','y','z'
      );
      $increment = 1; // size of the increment

      $scSize = count($scale);
      $res = '';
      $nGrade = 0;
      for($i = strlen($level) - 1, $fst = 1; $i >= 0; $i--)
      {
      $dg = array_search($level[$i], $scale);
      if($fst) { $dg += $increment; $fst = 0; }
      $dg += $nGrade;
      $nGrade = floor($dg / $scSize);
      $dg = ($dg - $scSize * $nGrade);
      $res = $scale[$dg] . $res;
      }
      return $res;
      }
      Ответить
    • VoidEx:
      lvl = ['0'..'9'] ++ ['a'..'z']
      lvls = sequence $ replicate 3 lvl
      getNext e = maybe "000" ((lvls !!).(+1)) $ elemIndex e lvls
      Ответить
    • VoidEx:
      Точнее
      getNext e = maybe "000" ((lvls !!).(`mod` (length lvls)).(+1)) $ elemIndex e lvls
      Ответить
    • mykola:
      хуясе здесь математики собрались о_О
      Обязательно этот беcпредел с флурами, цейлами и тонной умножений? Первый код нихуя не понятен, но в втором каменте ваще какая то высшая математика..
      Ответить
    • mykola:
      ща я тоже загоню, падаждите :D
      Ответить
    • От, родил $)
      #!/usr/bin/php
      <?php
      
      
      function levelup($lvl) {
              if ( $lvl == "" ) return "0"; 
              $size = strlen($lvl)-1;
              $c = $lvl[$size] ; // last char
              $res= substr($lvl, 0, $size); 
              $inc = chr(ord($c)+1); 
              if ( $c == '9' ) $inc = 'a';
              if ( $c == 'z' ) { // fuck this system
                      $inc = '0';
                      $res = levelup($res);
              }
              return $res.$inc;
      }
      echo levelup( $argv[1]), "\r\n";
      ?>

      root@asterisksys:~# for x in aaa zzz bbb 099 a9z zaz ; do ./l.php $x  ; done
      aab
      0000
      bbc
      09a
      aa0
      zb0
      Ответить
    • Капитан Очевидность:
      Долбаебы
      <?php
      $str = 'ab0';
      
      echo ++$str;
      ?>
      Ответить
    • mykola:
      Рыдаю. Радует что я не один такой :)
      Ответить
    • falkor:
      lvls = sequence $ replicate 3 lvl
      что это???
      Ответить
    • Говнокодер:
      Капитан Очевидность, а у тебя бестолковка работает, молодец!
      Как в басне: ".. а ларчик просто открывался".

      В итоге решение такое:
      $str = '001';
      $str = sprintf('%03s', ++$str);
      echo $str;

      Индуский бог кодинга седня отдыхает :)))
      Ответить
    • Капитан Очевидность:
      Похоже какой-то кусок подписывается моим ником
      Ответить
    • $str = 'zzz';
      $str = sprintf('%03s', ++$str);
      echo $str; //aaaa
      Ответить
    • $str = 'zzz';
      $str = sprintf('%03s', ++$str);
      echo $str; //aaaa

      Ну и что? Возьми с полки пряник.
      Ответить
    • Сдаётся мне, КО и команда написали неговнокод, только неработающий, лол
      Ответить
    • Ну так и есть. К.О. - вы быдлокодер, поздравляю.

      http://ru.php.net/operators.increment

      Note that incrementing strings can give unpredictable results due to type changes. For example:

      <?php

      $i = '9C6';
      for($n=0; $n<10; $n++)
      echo ++$i . "\n";

      ?>

      Gives you:
      9C7
      9C8
      9C9
      9D0
      10
      11
      12
      ..etc.
      Ответить
    • Не надо верить всему, что пишут в комментах на ru.php.net, а головой надо думать и читать больше, если не знаешь. То что инкремент строки может привести к непредсказуемым результатам давно пофиксили.
      Ответить
    • А №14 набрехал, что после zzz идёт aaaa, а не 000?
      Или ему тоже не верить?
      Ответить

    Добавить комментарий