powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (PHP) Разминка для мозгов
25 сообщений из 271, страница 8 из 11
(PHP) Разминка для мозгов
    #37123572
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возвращаясь к регулярке. у меня короче этого не получается.

Код: plaintext
/^((( 0 [ 1 - 9 ]|[ 12 ]\d)\.( 0 [ 1 - 9 ]| 1 [ 012 ]))|( 30 \.( 0 [ 469 ]| 11 ))|( 31 \.( 0 [ 13578 ]| 1 [ 02 ])))\.( 19 | 20 )\d\d$/
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37127716
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задачка:
Перевести число из шестнадцатеричной системы счисления в десятичную с пом. SQL запроса.
Диалект любой: Mysql,Oracle,Postgress.
Нельзя использовать готовые функции преобразования или пользоваться расширенными возможностями - типа своих функций, триггеров, пакетов и т.д.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37127845
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

в смысле надо реализовать, чтобы во всех трех диалектах работало или в любом?
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37127900
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nymr u,

в смысле надо реализовать, чтобы во всех трех диалектах работало или в любом?
в любом из перечисленных, одном.
но если удастся сделать универсальное решение - то будет просто мега респект)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37127931
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

А циклы while можно? Это не везде работает.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37127956
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShSerger u,

А циклы while можно? Это не везде работает.
циклы внутри SQL запроса? - да можно

ps чувствую варианты решений будут интересные
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37128027
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

в Оракле элементарно делается через иерархические запросы, но думаю, это не то что вам нужно? Какая цель этой задачи?
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37128034
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В MySQL область входных (и соответственно выходных) значений будет ограничена.
Про Postgres сходу сказать не могу, но по моему там не будет ограничения.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37128054
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nymr u,

в Оракле элементарно делается через иерархические запросы, но думаю, это не то что вам нужно? Какая цель этой задачи?
да почему не то? ) решение есть решение.
цель в том - чтобы научиться решить на SQL задачи отличающиеся от выборки по ключу или джойнов. подобные выкрутасы в обычной жизни бывают нужны редко - но иногда полезны, особенно когда нужно одним запросом получить сразу много всякой информации да еще и обработать по максимуму значения на стороне БД.

задача конечно не очень сложная, но требует знаний некоторых особенностей, которые значительно упрощают(уменьшают) решение и его код.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37128134
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

преобразовывать числа > BIGINT нужно?
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37128158
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nymr u,

преобразовывать числа > BIGINT нужно?
нет. работа со сверхбольшими числами - это отдельная история)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37128162
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SELECT t.hex in_hex, t.result in_result, @result out_result
FROM (
    SELECT BENCHMARK(
        CHAR_LENGTH(i.hex), 
        (
          SELECT LEAST(@result := @result + 
              CASE MID(i.hex, CHAR_LENGTH(i.hex) - @rownum,  1 )
                WHEN 'f' THEN  15 
                WHEN 'e' THEN  14 
                WHEN 'd' THEN  13 
                WHEN 'c' THEN  12 
                WHEN 'b' THEN  11 
                WHEN 'a' THEN  10 
                         ELSE MID(i.hex, CHAR_LENGTH(i.hex) - @rownum,  1 ) +  0 
              END * POW( 16 , @rownum),
              @rownum := @rownum +  1 
            )
        )
      ), i.result, i.hex
    FROM (SELECT @rownum :=  0  rownum, @result :=  0  result) v,
      (SELECT HEX( 2174861921 ) hex, CONV(HEX( 2174861921 ),  16 ,  10 ) result) i
  ) t;
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37128168
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для чисел произвольного размера надо реализовать сложение в столбик. :D
Для преобразования более одного числа за раз придется извращаться с переменными, но тоже возможно.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37128206
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nym,

да подобное решение я и имел в виду) у меня правда немного отличается но идея таже)

для Оракла я такое смог родить
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SELECT h hexval, SUM(d) decval FROM(
 SELECT h
  ,decode(ch,'A', 10 
   ,decode(ch,'B', 11 
    ,decode(ch,'C', 12 
     ,decode(ch,'D', 13 
      ,decode(ch,'E', 14 
       ,decode(ch,'F', 15 
        ,to_number(ch)
  ))))))*power( 16 ,exp) d 
 FROM(
  SELECT h, length(h)-level exp, substr(h,level, 1 ) ch
  FROM (SELECT 'DEADBEAF' h FROM dual)
  CONNECT BY rownum<=LENGTH(h)
 ) 
) GROUP BY h
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37128223
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

у меня вот так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT SUM(CASE SUBSTR(i.hex, LENGTH(i.hex) - LEVEL +  1 ,  1 ) 
    WHEN 'F' THEN  15 
    WHEN 'E' THEN  14 
    WHEN 'D' THEN  13 
    WHEN 'C' THEN  12 
    WHEN 'B' THEN  11 
    WHEN 'A' THEN  10 
             ELSE SUBSTR(i.hex, LENGTH(i.hex) - LEVEL +  1 ,  1 ) +  0 
  END * POWER( 16 , LEVEL -  1 )) result
FROM (SELECT '81A1C261' hex,  2174861921  result FROM dual) i
CONNECT BY LEVEL <= LENGTH(i.hex);
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37128250
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это не интересно преобразовать 16-ричную строчку в число (а вовсе не в десятичную строку). Работайте, товарищи, работайте.
То же самое на MS SQL, но с произвольным основанием, заданным строкой символов:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
DECLARE @v varchar( 255 ),@numbers varchar( 16 ),@i int,@num int
SELECT @numbers='0123456789ABCDEF',@v=REVERSE('123ABC'),@i= 0 ,@num= 0 
WHILE LEN(@v)> 0  BEGIN
	SELECT @num=@num+(CHARINDEX(SUBSTRING(@v, 1 , 1 ),@numbers)- 1 )*POWER( 16 ,@i)
	SELECT @v=SUBSTRING(@v, 2 ,LEN(@v)- 1 ),@i=@i+ 1 
END
SELECT @num
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37128285
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShSerge,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT t.input i_input, t.output i_output, @result output
FROM (
    SELECT BENCHMARK(
        CHAR_LENGTH(i.input), 
        (
          SELECT GREATEST(@result := @result + 
              (INSTR(i.abc, MID(i.input, CHAR_LENGTH(i.input) - @rownum,  1 )) -  1 ) * POW(CHAR_LENGTH(i.abc), @rownum),
              LEAST( 0 , @rownum := @rownum +  1 )
            )
        )
      ), i.output, i.input
    FROM (SELECT @rownum :=  0  rownum, @result :=  0  result) v,
      (SELECT HEX( 2174861921 ) input, '0123456789abcdef' abc, CONV(HEX( 2174861921 ),  16 ,  10 ) output) i
  ) t;
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37129529
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShSerge,

хотя ваш вариант подходит под условие задачи, всеже более интересны решения не использующие такие алгоритмические высокоуровневые возможности как цикоы, функции и т.д.
а так можно и на PL\SQL было написать, и вообще без запросов)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37195364
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предлагаю всем решить задачку http://habrahabr.ru/blogs/php/116686/, не смотря в комментарии.

Своё решение выложу после нескольких ответов, у меня уже готово.
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37195367
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правильная ссылка http://habrahabr.ru/blogs/php/116686/
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37195536
Фотография vladgrig
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подумалось
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 private   function  addKey( $value, $keys, &$array )
    {
        $max =  count ( $keys );

         for  ( $i =  0 ; $i < $max; $i++ )
        {
             if  ( $i ==  0  )
                $a = & $array[ $keys[ $i ] ];
             else 
                $a = & $a[ $keys[ $i ] ];
        }
        $a = $value;
    }
Вызов
Код: plaintext
1.
2.
3.
4.
5.
6.
$array =  array ( );

//нужно считывать по строкам и парсить по '=' - т.к. было не интересно - код не привожу!
$this->addKey( <значение после '=' в подстроке>, \ explode ( '.', <значение до '=' в подстроке> ), $array );

\ var_dump ( $array );
вообще было интересно
- как раз думал над этим вопросом недавно - немог решить, плюнул - и тут, вдруг, вышло! ;)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37195712
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladgrig
Код: plaintext
1.
//нужно считывать по строкам и парсить по '=' - т.к. было не интересно - код не привожу!

Это как раз самое интересное. :)
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37195794
AraGnom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
r u,

3 массива + строка + rand()
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37195811
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для затравки
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
an0nym's implementation returns right result: 0 3632 0 688 2.2
Ackrite@habr's implementation returns right result:  0   2248   0   0   2 . 96 
Ference@habr's implementation returns right result: 0 0 0 0 5.98
0lympian@habr's implementation returns right result:  0   0   0   0   2 . 42 
iSage@habr's implementation does not return right result
MaxHero@habr's implementation returns right result:  0   0   0   0   3 . 26 
yadeveloper@habr's implementation returns right result: 0 0 0 0 3.83
alexxz@habr's implementation returns right result:  0   0   0   0   2 . 73 
panandy@habr's implementation returns right result: 0 0 0 0 2.11
bogus92@habr's implementation returns right result:  0   192   0   0   4 . 16 
Zayaz@habr's implementation returns right result: 0 0 0 0 3.03
sectronix@habr's implementation returns right result:  0   632   0   0   3 . 26 
Azilot@habr's implementation does not return right result
mcdb@habr's implementation returns right result:  112459776   60092016   112459776   60091960   3 . 92 
mcdb@habr: 2 's implementation returns right result: 0 14336 0 6008 3.8
tzlom@habr's implementation returns right result:  0   88   0   0   2 . 58 
nik1550@habr's implementation returns right result: 0 80 0 0 3.23
BVadim@habr's implementation returns right result:  0   0   0   0   2 . 72 
(части пришлось исправить помарки в реализации; там, где до сих пор does not return right result - не помарки, а полноценные ошибки, надо полностью переписывать).

Был сильно удивлен, что реализация panandy обгоняет мою. :) Кто-нибудь сможет обогнать его?

как были сгенерированы результаты
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
error_reporting(- 1 );
ini_set("display_errors", true);
$input = "config.txt";
$output_right = array(
    "id" => "www",
    "session" => array(
        "timeout" => "120",
        "server" => array(
             0  => array(
                "host" => "127.0.0.1",
                "port" => "1111",
                "id" => "session1"
            ),
             1  => array(
                "host" => "127.0.0.1",
                "port" => "1111",
                "id" => "session2"
            )
        )
    ),
    "image" => array(
        "width" => "640",
        "height" => "480",
        "watermark" => array(
            "small" => "wsmall.png",
            "normal" => "wnormal.png"
        )
    )
);

/* Здесь реализация функций разными людьми. */

foreach ($implementations as $implementator => $implementation) {
    $output = $implementation($input);
    if ($output == $output_right) {
        list($memory_peak_real_before, $memory_peak_before, $memory_real_before, $memory_before)
            = array(memory_get_peak_usage(true), memory_get_peak_usage(), memory_get_usage(true), memory_get_usage());
        $start = microtime(true);
        for ($i =  0 , $n = $argv[ 1 ]; $i < $n; ++$i)
            $output = $implementation($input);
        $end = microtime(true);
        list($memory_peak_real_after, $memory_peak_after, $memory_real_after, $memory_after)
            = array(memory_get_peak_usage(true), memory_get_peak_usage(), memory_get_usage(true), memory_get_usage());

        echo $implementator, "'s implementation returns right result: ",
            $memory_peak_real_after - $memory_peak_real_before, " ",
            $memory_peak_after - $memory_peak_before, " ",
            $memory_real_after - $memory_real_before, " ",
            $memory_after - $memory_before, " ",
            round($end - $start, 2), "\r\n";
    } else
        echo $implementator, "'s implementation does not return right result\r\n";
}
...
Рейтинг: 0 / 0
(PHP) Разминка для мозгов
    #37195985
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nym ,

А прогони еще такие варианты:
- разбор регуляркой,
- создание
а) eval-ом,
б) код panandy.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
<?php

 function  read_conf_a($file_name)
{
	$matches =  null ;
	 if (($size =  preg_match_all ('/^([^=]+)=(.*)$/m',  file_get_contents ($file_name), $matches)) ===  false )  return   array ();

	$result =  array ();
	$var =  null ;
	 for ($i =  0 ; $i < $size; ++$i)
	{
		 eval ('$var = &$result[\''.preg_replace('/\./', '\'][\'', $matches[1][$i]).'\'];');
		$var = $matches[ 2 ][$i];
	}

	 return  $result;
}

 function  read_conf_b($file_name)
{
	$matches =  null ;
	 if (($size =  preg_match_all ('/^([^=]+)=(.*)$/m',  file_get_contents ($file_name), $matches)) ===  false )  return   array ();

	$result =  array ();
	 for ($i =  0 ; $i < $size; ++$i)
	{
		$path =  explode ('.', $matches[ 1 ][$i]);
		$r = &$result;
		 foreach ($path  as  $key)
		{
			$r = &$r[$key];
		}
		$r = $matches[ 2 ][$i];
	}

	 return  $result;
}

$res = read_conf_b('config.txt');
 echo  '<pre>';
 var_dump ($res);
 echo  '</pre>';

?>
...
Рейтинг: 0 / 0
25 сообщений из 271, страница 8 из 11
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (PHP) Разминка для мозгов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]