[PHP] ЗАДАНИЯ от Krist_ALL

Discussion in 'PHP' started by Krist_ALL, 20 Jun 2009.

  1. gisTy

    gisTy Elder - Старейшина

    Joined:
    24 May 2008
    Messages:
    432
    Likes Received:
    160
    Reputations:
    27
    наркоманы млять
    PHP:
    <?php
    function ch($num,$str){

    foreach(
    $num as $key => $value)
        
    $str[$value-1] = strtoupper($str[$value-1]);

    return 
    $str;
    }
    ?>
    39:
    Выведет 0
    Я не знаю почему так, но думаю из-за следующего.
    Все происходит из-за динамического определения типа переменной.
    ноль вначале свидетельствует что значение переменной - восьмеричное число, но так как после нуля идет 8, чего в восмеричном представлении быть не может, то число превращается в ноль.
    Еще раз повторю, что я не знаю почему так, но с другими системами счисления не получилось добиться такого результата. в десятично и шестнадцатиричном все время ругается так:
    А вообще я просто не знаю где об этом можно нормально почитать. Отсюда и все проблемы

    40:

    PHP:
    <?php
    $a
    [1]['a'] = 'lol';
    $a[1]['b'] = 'heh';
    $a[2]['a'] = 'gygy';
    $a[2]['b'] = 'smeh';

    $b = array();

    $i 0;

    foreach(
    $a as $val)
        foreach(
    $val as $value => $key)
            
    $b[$i++] = $key;

    print_r($b);
    ?> 
    хотя думаю можно как-нибудь и покороче сделать
     
    #161 gisTy, 18 Sep 2009
    Last edited: 19 Sep 2009
    1 person likes this.
  2. Van Bekannt

    Van Bekannt New Member

    Joined:
    15 Sep 2009
    Messages:
    1
    Likes Received:
    1
    Reputations:
    0
    Задание 40:
    PHP:
    <?php

    $a
    [1]['a'] = 'lol'
    $a[1]['b'] = 'heh'
    $a[2]['a'] = 'gygy'
    $a[2]['b'] = 'smeh'

    $result = array();

    slice_array$a );

    echo 
    '<pre>';

    print_r$result );

    function 
    slice_array$array = array() ) {
    global 
    $result;
        foreach( 
    $array as $value ) {
            if( 
    is_array$value ) ) slice_array$value );
            
            else 
    $result[] = $value;    
        }

    }

    ?>
    Эта функция "плющит" любой массив...
    Ну или если не хотите заморачиваться с глобальными переменными:
    PHP:
    function slice_array$array = array(), &$result ) {
        foreach( 
    $array as $value ) {
            if( 
    is_array$value ) ) slice_array$value$result );
            else 
    $result[] = $value;
        }
    }
    Первый аргумент - массив который надо плющить, а второй - куда все запишется ( передается указатель на массив, т.е. он должен быть заранее определен )

    Задача 39:
    восьмеричные числа имеют следующее правило:
    0[0-7]+
    ноль впереди и дальше числа от 0 до 7 ( не выше - на то они и восьмеричные числа ). все что выше == 0
    Поэтому эта программа выведет 0. Чтобы вывести 8 нужно написать: 010

    По поводу задачи 38 - думаю gisTy норм решение дал...
     
    #162 Van Bekannt, 19 Sep 2009
    Last edited: 19 Sep 2009
    1 person likes this.
  3. Grema

    Grema Elder - Старейшина

    Joined:
    29 Nov 2005
    Messages:
    109
    Likes Received:
    16
    Reputations:
    -4
    Задание 38
    Code:
    function ch($num,$str){
    foreach($num as $value)
    	if($value<strlen($str))
        	$str[$value-1] = strtoupper($str[$value-1]);
    return $str;
    }
    
    во первых там $key в foreach не нужен если на то уже пошло... и небольшой проверки на то что если значение в массиве больше чем букв в строке тоже как бы не мешало :)
     
  4. Grema

    Grema Elder - Старейшина

    Joined:
    29 Nov 2005
    Messages:
    109
    Likes Received:
    16
    Reputations:
    -4
    и сам же забыл поставить -1 в if-е :)
     
  5. Extremal

    Extremal Elder - Старейшина

    Joined:
    21 Jun 2006
    Messages:
    66
    Likes Received:
    85
    Reputations:
    10
    Задание 039
    Что выведет скрипт и почему.
    PHP:
    <?php
    $i 
    08;
    echo 
    $i;
    ?>
    Выведет 0 потому что,без кавычек считается что это числовое значение.
     
    1 person likes this.
  6. Krist_ALL

    Krist_ALL Banned

    Joined:
    14 Jan 2009
    Messages:
    436
    Likes Received:
    193
    Reputations:
    24
    2 новых задания ждут вас)
     
  7. SleepShadowWeb

    Joined:
    2 Feb 2006
    Messages:
    26
    Likes Received:
    15
    Reputations:
    0
    задание 41

    содержимое файла sort.php
    PHP:
    if(str_replace('\\''/'__FILE__) != $_SERVER['SCRIPT_FILENAME']) echo 'included'; else echo 'svoi';
     
    1 person likes this.
  8. Krist_ALL

    Krist_ALL Banned

    Joined:
    14 Jan 2009
    Messages:
    436
    Likes Received:
    193
    Reputations:
    24
    мона еще и подругому)
     
    1 person likes this.
  9. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    № 41
    PHP:
    <?php

         
    if ('/' $lamer != $_SERVER['PHP_SELF'])
         {
             die(
    'Hacking attempt!');
         }

    ?>
     
    2 people like this.
  10. gisTy

    gisTy Elder - Старейшина

    Joined:
    24 May 2008
    Messages:
    432
    Likes Received:
    160
    Reputations:
    27
    #41
    PHP:
    echo  (strpos(__FILE__,$_SERVER['PHP_SELF']) !== false) ? "all right\n" "include\n";
    как-то так
     
    1 person likes this.
  11. Andres

    Andres Elder - Старейшина

    Joined:
    4 Apr 2008
    Messages:
    320
    Likes Received:
    119
    Reputations:
    0
    PHP:
    <?php
    $i 
    08;
    echo 
    $i;
    ?>
    Только начал учить PHP, и понятно что логично было б подумать, что на экран выведит строку "08".
    Некоторые говорят что только 0, почему, кто пояснит?
     
    1 person likes this.
  12. gisTy

    gisTy Elder - Старейшина

    Joined:
    24 May 2008
    Messages:
    432
    Likes Received:
    160
    Reputations:
    27
    2 Andres
     
    1 person likes this.
  13. SleepShadowWeb

    Joined:
    2 Feb 2006
    Messages:
    26
    Likes Received:
    15
    Reputations:
    0
    задание 42

    PHP:
    $rez create(5);
    var_dump($rez);

    function &
    create($n)
    {
        eval(
    "\$b"str_repeat('[0]'$n) . " = 0;");
        return 
    $b;
    }
    PHP:
     function createArr($n) {
    $a = array();
    while(--
    $n) {
    $a = array($a);
    }
    return 
    $a;
    }
     
    #173 SleepShadowWeb, 7 Oct 2009
    Last edited: 8 Oct 2009
  14. d_x

    d_x Banned

    Joined:
    25 Mar 2008
    Messages:
    558
    Likes Received:
    650
    Reputations:
    210
    Новое задание от меня.

    Определить, что делает скрипт и описать это по шагам (несущих смысловую нагрузку в скрипте буквально 5-7 строк).

    Скрипт выводит некое число. Откуда оно берется? Почему оно такое? По шагам.


    Скачать скрипт:
    http://slil.ru/28081439
    http://dump.ru/file/3582271

    P.S. Мой обфускатор)
     
    #174 d_x, 14 Oct 2009
    Last edited: 15 Oct 2009
    1 person likes this.
  15. L I G A

    L I G A Banned

    Joined:
    27 Jul 2008
    Messages:
    482
    Likes Received:
    380
    Reputations:
    49
    1eval()//выполняет код
    2 возвращает оригинальные несжатые данные после gzcompress();
    3 base64_decode()//декодирует данные, закодированные base64_encode();
     
  16. d_x

    d_x Banned

    Joined:
    25 Mar 2008
    Messages:
    558
    Likes Received:
    650
    Reputations:
    210
    Я прошу рассказать, что скрыто под всем этим. Скрипт выводит некое число. Откуда оно берется? Почему оно такое? По шагам.
     
    #176 d_x, 15 Oct 2009
    Last edited: 15 Oct 2009
  17. The_HuliGun

    The_HuliGun Elder - Старейшина

    Joined:
    19 May 2007
    Messages:
    191
    Likes Received:
    84
    Reputations:
    11
    Если запись числа в пхп начинается с цифры 0, значит число записано в восьмеричной системе исчисления, а так как в восьмеричной системе используються цифры от 0 к 7, а цифра 8 не используется, то в результате интерпретатор виводит число 0.
     
  18. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    d_x,
    1. Назначает переменной $GLOBALS['_B_'] массив из 11 элементов, значение которых - base64_decode.
    2. Ф-ция B($i) возвращает декодированный base64 элемент массива $a, индекс которого находится в аргументе ф-ции, в котором находятся дважды кодированные base64 названия ф-ций, заголовков, протокола tcp:// и одной регулярки (мб там еще что-то есть, но я больше не копал).
    3. Назначает переменной $GLOBALS['_A_'] массив из 10 элементов
      Code:
          [_A_] => Array
              (
                  [0] => fsockopen
                  [1] => stream_set_timeout
                  [2] => fputs
                  [3] => fputs
                  [4] => feof
                  [5] => fgets
                  [6] => fclose
                  [7] => preg_match
                  [8] => str_replace
                  [9] => mt_rand
              )
    4. Ф-ция A возвращает декодированный base64 (название ф-ции берется из $GLOBALS['_B_'][10], а она (как было сказано выше) - base64_decode) элемент массива из массива $__, с индексом - аргументом этой ф-ции.
    5. Далее идёт соединение по tcp://www.yandex.ru и выводится ошибка создания сокета (если есть). Потом в цикле while() считывается полученный ответ. Дальше по регулярке
      Code:
      /<strong>([,\d]+)<\/strong><\/td><td>.{1,10}<\/td><\/tr><\/tbody><\/table>/Usi
      находит вхождение (это курс валют). Но ничего не находит, т.к. нету вхождений. Соответственно после проверки на isset() 0.0 (запятая заменена на точку str_replace) умножается на 100, к этому прибавляется... аааа... Вот это подстава :) И ради банального рандума я сидел более часа над этим кодом?
    Хех, спасибо, немного пошевелил мозгами :) Иногда полезно... Респект за задумку...
     
    2 people like this.
  19. d_x

    d_x Banned

    Joined:
    25 Mar 2008
    Messages:
    558
    Likes Received:
    650
    Reputations:
    210
    Отлично, +5 :)
    Вот исходный код:


    PHP:
    <?php
      $header
    ="Host: www.yandex.ru\r\n";
      
    $header.="User-Agent: MSIE 7.0 Win\r\n";
      
    $header.="Connection: close\r\n";
      
    $header.="\r\n";

      
    $addquery="GET / HTTP/1.0\r\n";
      
    $host='www.yandex.ru';
      
    $fp=fsockopen("tcp://".$host,80,$errno,$errstr,30);

      
    stream_set_timeout($fp,30);

      if(!
    $fp)
      {
        print 
    "<font color=red>Socket error: <i>$errstr ($errno)</i></font><br>";
        die();
      }

      
    fputs($fp,$addquery);
      
    fputs($fp,$header);
      
    $ret='';

      while(!
    feof($fp))
      {
        
    $ret.=fgets($fp128);
      }

      
    fclose($fp);

      
    preg_match("/<strong>([,\d]+)<\/strong><\/td><td>.{1,10}<\/td><\/tr><\/tbody><\/table>/Usi",$ret,$m);
      
    $m=isset($m[1]) ? $m[1] : '0,0';  //получаем курс нефти с яндекс.ру(если не удается, то 0.0)
      
    $m=str_replace(',','.',$m); //заменяем запятую на точку
      
    $m=(int)$m*100+mt_rand(1,99); //умножаем целую часть курса на 100 и прибавляем рандомное число от 1 до 99
      
    print $m//выводим
    ?>
     
  20. magnat_8

    magnat_8 New Member

    Joined:
    21 Oct 2009
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    Решение задания 001

    <?
    $str="11111 222222";
    preg_match("#(.*) (.*)#is",$str,$m);
    echo "$m[2] $m[1]";
    ?>
     
    #180 magnat_8, 24 Oct 2009
    Last edited: 24 Oct 2009