Виталий К.
55 сообщений
#14 лет назад
Требуется сделать сокращение чисел:

Например, из числа 2703165154265225 получить mTx2X .

В сокращении можно использовать латиницу (большие и малые буквы) и числа.

Подскажите как это можно сделать?

Спасибо.
Себастьян Ф.
584 сообщения
#14 лет назад
Точно так же как переводить число в 16ную систему:

25 000 000 = 17D7840

соответственно у Вас будет основание (кол-во букв + 10)
Максим Ф.
3195 сообщений
#14 лет назад
Start;

var input = 2703165154265225;
var output = mTx2X;

if ( $output = mTx2X ) then
print Преобразование input успешно. Полученное значение = $output.
end if

exit;
Виталий К.
55 сообщений
#14 лет назад
SField,
из числа в 16 цифр, получится только в 13 знаков.

Нужно больше сократить.


AlekartRu, вы еще и программировать умеете ?
Виталий К.
55 сообщений
#14 лет назад
SField,

понял.

т.е. получается перевести число в 62-ричную систему (26 англ. букв * 2 + 10 чисел) , а не в 16-ричную
Себастьян Ф.
584 сообщения
#14 лет назад
Ага, такая идея
Артем Л.
11416 сообщений
#14 лет назад
AlekartRu, как всегда 5+
Виталий Я.
659 сообщений
#14 лет назад
Я не понимаю зачем вам это ?
А вообще есть допустим 8битная кодировка , тогда переводим число в булев тип и читая за раз 8 бит в цикле ити до конца данных . Ну это метод жестокий , для мазохистов
Виталий К.
55 сообщений
#14 лет назад
Xazzzi,
для сокращения url.

Есть url такого вида: site.ru/d/1202703165154265225
его я сокращаю в такой
site.ru/d/eGk8z3NtjN
(это уже результат реализации алгоритма от SField)

т.е. сокращение урла на 9 символов
Виталий Я.
659 сообщений
#14 лет назад
Storier , тогда они метод для мазохистов не прокатит
Роман Беляев
16382 сообщения
#14 лет назад
storier, тогда уж и код давай уж больно хороша затея.
Виталий К.
55 сообщений
#14 лет назад
frig, держи

Для больших чисел сокращение не будет работать из-за ограничений функции decbin


<?php

function bEncode($str = '') {
$_keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=";
$bstr = decbin((int)$str);
$size = strlen($bstr);
$p = ceil($size / 6);
$bstr = str_pad($bstr, $p*6 , '0', STR_PAD_LEFT);

$rez = '';
for ( $i = 0; $i < $p; $i++ ) {
$t = (int) $i * 6;
$str = substr( $bstr, $t, 6);
$rez .= $_keyStr{bindec($str)};
}
return $rez;
}

function bDecode($rez) {
$_keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=";
$size = strlen($rez);
$bstr = '';
for($i=0; $i< $size; $i++) {
$t = $rez{$i};
$n = strpos($_keyStr, $t);
$bstr .= str_pad(decbin($n), 6, '0', STR_PAD_LEFT);
}
return bindec($bstr);
}

$val = 265225;
$rez = bEncode($val);
echo 'Сокращение числа: ' . $val . '<br>';
echo 'Сокращенный вариант: ' . $rez . '<br>';
echo 'Обратное преобразование: '. bDecode($rez);

?>


Результат:
Сокращение числа: 265225
Сокращенный вариант: BAwJ
Обратное преобразование: 265225
Роман Беляев
16382 сообщения
#14 лет назад
storier, спасибо. Авось пригодится.
Себастьян Ф.
584 сообщения
#14 лет назад

function smartDec($dec, $arr) {
$ret = '';
do {
$ret = $arr.$ret;
$dec /= count($arr);
} while( $dec >= 1 );
return $ret;
}

$chars = explode(' ','0 1 2 3 4 5 6 7 8 9 A B C D E F');

echo smartDec(15, $chars);
Виталий И.
5 сообщений
#14 лет назад
Да используйте весь Юникод))
Числа до 10000 - в 1 знак!
Виталий К.
55 сообщений
#14 лет назад
webinsid,
а через урл все эти знаки передаются?