Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Для профи > Нетривиальные решения.


Автор: soloweb 30.11.2007, 13:39
Прошу написать каки нибудь красивые нетривиальные решения которые вам пришлось реализовывать.
Очень хочется набратся опыта посмотреть на разных профи и их решения каких-то алгоритмов smile
Можно писать как кодом так и словами (документированно) smile

Вот пример: 
Задача: Нужно реализовать обмен значениями 2-х перменных (есть $a = 10 и $b = 20 ) надо чтобы $a=20 а $b=10 и при этом без участия сторонних переменных. smile Красивая задача. Что вы можете предложить? smile

Вот что-то на подобии. Прошу идеи в студию smile

Заранее спасибо.

Автор: SamDark 30.11.2007, 14:16
soloweb, 
Это просто задачи. Никакого отношения к реальному коду они не имеют.

p.s. по задаче:
Код

$a = 10;
$b = 20;
$a = $a-$b;
$b = $b + $a;
$a = $b - $a;

Автор: soloweb 30.11.2007, 14:25
Цитата

Это просто задачи. Никакого отношения к реальному коду они не имеют.

Хорошо а если вместо 10 и 20 возмем $a="k" а $b="p" то тогда что ? smile 

Автор: SamDark 30.11.2007, 14:34
soloweb, 
Тогда
http://ru2.php.net/manual/ru/function.ord.php
и
http://ru2.php.net/manual/ru/function.chr.php

Автор: skyboy 30.11.2007, 14:35
soloweb, добавятся функции преобразования символа - в код символа и обратно. и все.
со строками - сложнее, так как для строк нет обратимых операций(для чисел таких немало - "+" и "-", "*" и "/", "^" и "ln", исключающее "ИЛИ" ). только с промежуточной переменной.

Автор: soloweb 30.11.2007, 14:44
Код
            
$a^=$b;
$b^=$a;
$a^=$b;


smile Правда работает тольок с целыми числами
Да прошу не забывать, то что символы по коду в ASCII тоже целые числа smile

Автор: WolfON 30.11.2007, 15:35
Код

list($b, $a) = array($a, $b);

Автор: SamDark 30.11.2007, 16:00
Из той же оперы:
1. Дано целое число. Узнать является ли оно целой степенью двойки.
2. Дана 32-битная переменная. Обратить в ней порядок бит.

А вот уже более практическая:
Обойти дерево без рекурсии.

Автор: CyClon 1.12.2007, 17:58
Если интересуют задачи, вот, большой сборник: http://g6prog.narod.ru

Был на олимпиаде, так и не фтыкнул, как решать две задачи, нада будет потом запостить, интересно все-таки smile

Автор: Timok 2.12.2007, 01:21
Цитата(SamDark)
1. Дано целое число. Узнать является ли оно целой степенью двойки.

Код
function powerOf2($number)
{
    for ($i = 0; $i < 32; ++$i)
        if ($number == 2 << $i)
            return true;
    return false;
}


Цитата(SamDark)
2. Дана 32-битная переменная. Обратить в ней порядок бит.


Код
<?php
$var = bindec('0010111');
print str_pad(decbin($var), 32, '0', STR_PAD_LEFT) . '<br />';

for ($i = 0; $i < 32; ++$i)
    print ($var & pow(2, $i)) ? 1 : 0;
?>


---
издвините, погнал  smile 

Автор: Glip 3.12.2007, 17:50
Цитата(SamDark @  30.11.2007,  16:00 Найти цитируемый пост)
А вот уже более практическая:Обойти дерево без рекурсии.

http://http://www.refactoring.com/catalog/replaceRecursionWithIteration.html ???

Автор: SamDark 3.12.2007, 19:40
Glip, 
Почти. См. обход в ширину.

Автор: soloweb 4.12.2007, 18:31
по поводу обхода! Можно ссылку на подробную инструкцию желательно на русском smile 

Автор: Anarki 8.12.2007, 08:42
Цитата(soloweb @  30.11.2007,  16:39 Найти цитируемый пост)
Задача: Нужно реализовать обмен значениями 2-х перменных (есть $a = 10 и $b = 20 ) надо чтобы $a=20 а $b=10 и при этом без участия сторонних переменных.  Красивая задача. Что вы можете предложить? 

Код

<?php
$a =10;
$b = 20;
echo '$a='.$a,' $b='.$b,"<br>\n";
sscanf($a.' '.$b,'%s %s',$b,$a);
echo '$a='.$a,' $b='.$b;


Автор: SelenIT 9.12.2007, 01:49
Цитата(SamDark @  30.11.2007,  16:00 Найти цитируемый пост)
1. Дано целое число. Узнать является ли оно целой степенью двойки.

Извратное однострочное решение smile:
Код

function powerOf2($number) {  return preg_match('/^10*$/', decbin($number)); }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)