TLENS » 2011.11.23 17:09

Предлагаю здесь собирать всякие полезные функции.
Есть много функций которые писал и после ненадобности просто удалял или терял.

POFIGISST » 2011.11.23 17:25

Полезная тема,а эксклюзивные скрипты сюда можно выкладывать?)

TLENS » 2011.11.23 17:29

Ну и пару свежо-написанных.
Вчера полазил по гуглу, не нашел функции для преобразования с двоичной системы в десятичную и наоборот.
Вот решил написать. Плюс моя функция вычитания числа в степень используя рекурсию.
Если есть погрешности прошу кинуть в меня камнем.

Код:

1
span style="color: #0000BB"><?php/** * @autor TLENS * @return int * @description "вычитания числа в степень"**/function power ($b, $n, $t = 1) { if($n > 0) return power($b, --$n, $t * $b); return $t;}/** * @autor TLENS * @return int * @description "перевод с двоичного исчисления в десятичное"**/function bin_to_dec($a) { $r = 0; $a = (string)$a; $c = strlen($a) - 1; for ($i = 0; $c >= 0; $c --) $r += (($a[$i++]) ? 1 : 0) * 2 << ($i - 1); return $r;}/** * @autor TLENS * @return string * @description "перевод с десятичного исчисления в двоичное"**/function dec_to_bin($int) { $r = ''; do { $r = $r . $int % 2; } while (($int >>= 1) >= 1); return $r;}$i = 101;echo $i . '&nbsp;' . bin_to_dec($i) . '<br />'; // 101 5
Gemorroj » 2011.11.23 21:02

Код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<xsl:template name="split">
<xsl:param name="value"/>
<xsl:param name="index" select="1"/>
<xsl:param name="maxLen" select="512"/>
<xsl:param name="maxNodes" select="5"/>
<xsl:if test="string-length($value) &gt; 0 and $index &lt;= $maxNodes">
<E4440>
<xsl:value-of select="substring($value, 1, $maxLen)"/>
</E4440>
<xsl:call-template name="split">
<xsl:with-param name="value" select="substring($value, $maxLen)"/>
<xsl:with-param name="index" select="$index + 1"/>
</xsl:call-template>
</xsl:if>
</xsl:template>

)))

tipsun » 2011.11.23 21:19

TLENS, я извиняюсь, а стандартной функцией pow(), для возведения числа в степень, почему не воспользовался?
Или я не понял сути.

Код:

1
span style="color: #0000BB"><?php/** * @autor TLENS * @return int * @description "вычитания числа в степень"**/function power ($b, $n, $t = 1) { if($n > 0) return power($b, --$n, $t * $b); return $t;}?>
TLENS » 2011.11.23 21:22

Ну это мое домашнее задание на Си. Просто интересный пример, можно взять как шаблон для вычета платежей по кредиту.

tipsun » 2011.11.23 21:32

TLENS, а вообще умно придуманно :)
Рекурсивно вызывается до тех пор, пока n не нарушит условие.

TLENS » 2011.11.23 22:10

Gemorroj Что это? Я в xsl еще не влазил.

Gemorroj » 2011.11.23 22:19

TLENS, что-то вроде str_split

TLENS » 2011.11.24 03:39

tipsun пытаюсь толком вникнуть в биты (рою всевозможные статьи по поводу). Смотри замену.

Код:

1
span style="color: #0000BB"><?phpfunction power ($b, $n) { return $b << ($n - 1);}

Считаю это самая быстрая функция так как просто происходит сдвиг бита.
for ($i = 0; $i < 10; $i ++)
    power (1272, 73739);
Разница 0.3536 и 0.0001

tipsun » 2011.11.24 10:11

ppc :)
Как за комп сяду посмотрю чеэта.

DarkRiDDeR » 2011.11.24 14:22

Код:

1
span style="color: #0000BB"><?php//Функция "Удаления каталога с файлами" function delete_dir($dir){ if($scandir = scandir($dir = $dir . '/')){$x = 0; foreach($scandir as $value){ if($x > 1){$value = $dir . $value;if(is_dir($value)) delete_dir($value);else unlink($value); }++$x; } }return rmdir($dir); }

?>
Добавлено спустя   3 минуты  41 секунду:

Код:

1
span style="color: #0000BB"><?php/*Функция SpiderDetect - принимает $_SERVER['HTTP_USER_AGENT'] и возвращает имя кравлера поисковой системы или false.*//*База ботов - http://www.user-agents.org/Кому охото могут всех записать, но это уже будет наверно перебор :)*/ function SpiderDetect($USER_AGENT){$engines = array(array('Aport', 'Aport robot'),array('Google', 'Google'),array('msnbot', 'MSN'),array('Rambler', 'Rambler'),array('Yahoo', 'Yahoo'),array('AbachoBOT', 'AbachoBOT'),array('accoona', 'Accoona'),array('AcoiRobot', 'AcoiRobot'),array('ASPSeek', 'ASPSeek'),array('CrocCrawler', 'CrocCrawler'),array('Dumbot', 'Dumbot'),array('FAST-WebCrawler', 'FAST-WebCrawler'),array('GeonaBot', 'GeonaBot'),array('Gigabot', 'Gigabot'),array('Lycos', 'Lycos spider'),array('MSRBOT', 'MSRBOT'),array('Scooter', 'Altavista robot'),array('AltaVista', 'Altavista robot'),array('WebAlta', 'WebAlta'),array('IDBot', 'ID-Search Bot'),array('eStyle', 'eStyle Bot'),array('Mail.Ru', 'Mail.Ru Bot'),array('Scrubby', 'Scrubby robot'),array('Yandex', 'Yandex'),array('YaDirectBot', 'Yandex Direct')); foreach ($engines as $engine){if(strpos($USER_AGENT, $engine[0]) !== false) return($engine[1]); }return (false); }?>
tipsun » 2011.11.24 19:17

TLENS написал:

tipsun пытаюсь толком вникнуть в биты (рою всевозможные статьи по поводу). Смотри замену.

Код:

1
span style="color: #0000BB"><?phpfunction power ($b, $n) { return $b << ($n - 1);}

Считаю это самая быстрая функция так как просто происходит сдвиг бита.
for ($i = 0; $i < 10; $i ++)
    power (1272, 73739);
Разница 0.3536 и 0.0001

Она у тебя в степень возводит или что?

TLENS » 2011.11.24 19:18

Ну да!
Добавлено спустя   1 минуту  34 секунды:
добавить один ноль с права в двоичной системе тоже самое что перемножить число на 2 (два нуля на четыре).

tipsun » 2011.11.24 19:21

Код:

1
span style="color: #0000BB"><?phpfunction power($b, $n) { return $b << ($n - 1); }echo power(5, 3);//20//а должно 125 = 5*5*5?>
TLENS » 2011.11.24 19:21

Сейчас проветю в чем дело

tipsun » 2011.11.24 19:22

Ок.

TLENS » 2011.11.24 19:42

Тьфу блин. Надо хоть иногда ложится поспать. Чета затупил. A <<= N ровняется A * 2 в N степени.
Ну собственно то что и надо было в функции переведения типов. А тестировал на двойке. Что и дало мне нужный результат.

tipsun » 2011.11.24 19:50

TLENS, ниче не понял :)

Код:

1
span style="color: #0000BB"><?phpecho '<pre>';echo 2 ^ 1; echo PHP_EOL; //3 bitsecho 25 ^ 5; echo PHP_EOL; //28 bitsecho 125 ^ 5; echo PHP_EOL; //120 bitsecho 125 ^ 25; echo PHP_EOL; //100 bitsecho '</pre>';/*The above example will output: --------- --------- -- --------- result value op test --------- --------- -- --------- Bitwise AND( 0 = 0000) = ( 0 = 0000) & ( 5 = 0101)( 1 = 0001) = ( 1 = 0001) & ( 5 = 0101)( 0 = 0000) = ( 2 = 0010) & ( 5 = 0101)( 4 = 0100) = ( 4 = 0100) & ( 5 = 0101)( 0 = 0000) = ( 8 = 1000) & ( 5 = 0101) Bitwise Inclusive OR( 5 = 0101) = ( 0 = 0000) | ( 5 = 0101)( 5 = 0101) = ( 1 = 0001) | ( 5 = 0101)( 7 = 0111) = ( 2 = 0010) | ( 5 = 0101)( 5 = 0101) = ( 4 = 0100) | ( 5 = 0101)(13 = 1101) = ( 8 = 1000) | ( 5 = 0101) Bitwise Exclusive OR (XOR)( 5 = 0101) = ( 0 = 0000) ^ ( 5 = 0101)( 4 = 0100) = ( 1 = 0001) ^ ( 5 = 0101)( 7 = 0111) = ( 2 = 0010) ^ ( 5 = 0101)( 1 = 0001) = ( 4 = 0100) ^ ( 5 = 0101)(13 = 1101) = ( 8 = 1000) ^ ( 5 = 0101)*/?>
TLENS » 2011.11.26 20:12

Brian W. Kernighan, Dennis M. Ritchie
Упражнение 3.3. Напишите функцию expand(s1,s2), заменяющую сокращенную запись наподобие a-z в строке s1 эквивалентной полной записью аbс...хуz в s2. В s1 допускаются буквы (прописные и строчные) и цифры. Следует уметь справляться с такими случаями, как a-b-c, a-z0-9 и -a-b. Считайте знак - в начале или в конце s1 обычным символом минус.

Код:

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
//C
#include <stdio.h>
#define EOF '\n'
#define MAXLENGTH 1000
void expand(int a[], int b[]);
 
int main ()
{
int a[MAXLENGTH], b[MAXLENGTH], c, i;
for (i = 0; i < MAXLENGTH; i++)
a[i] = b[i] = '\0';
while (1)
{
printf("In: ");
for (i = 0; (c = getchar()) != EOF; i ++)
if (i < MAXLENGTH) a[i] = c;
if (++i < MAXLENGTH) a[i] = '\0';
expand(a, b);
for (i = 0; i < MAXLENGTH && b[i] != '\0'; i++)
putchar(b[i]);
putchar('\n');
for (i = 0; i < MAXLENGTH; i++)
a[i] = b[i] = '\0';
}
 
getchar();
}
void expand (int a[], int b[])
{
int i, j;
for (i = j = 0; i < MAXLENGTH && a[i] != EOF && a[i] != '\0'; i ++, j)
{
if (b[j] != '\0' || j > MAXLENGTH) break;
if (a[i] == '-')
{
if (((a[i - 1] >= 'a' && a[i - 1] <= 'z') && (a[i + 1] >= 'a' && a[i + 1] <= 'z')) || ((a[i - 1] >= 'A' && a[i - 1] <= 'Z') && (a[i + 1] >= 'A' && a[i + 1] <= 'Z')))
{
if (a[i+1] > a[i-1])
for (int l = a[i-1] + 1; l < a[i+1]; l++)
{
if (b[j] != '\0' || j > MAXLENGTH) break;
b[j++] = l;
}
else b[j++] = '-';
}
else if ((a[i - 1] >= 'a' && a[i - 1] <= 'z') && (a[i + 1] >= 'A' && a[i + 1] <= 'Z'))
{
for (int l = a[i-1] + 1; l != a[i+1]; l++)
{
if (b[j] != '\0' || j > MAXLENGTH) break;
b[j++] = l;
if (l == 'z')
l = 'A' - 1;
}
 
}
else if (a[i-1] >= '0' && a[i+1] <='9')
{
if (a[i+1] > a[i-1])
for (int l = a[i-1] + 1; l < a[i+1]; l++)
{
if (b[j] != '\0' || j > MAXLENGTH) break;
b[j++] = l;
}
else b[j++] = '-';
}
else
b[j++] = '-';
 
}
else
b[j++] = a[i];
}
b[j++] = '\0';
return;
}

ps. Бонус справляется с такой записью как a-Z