Просмотр полной версии : Помогите сгенерировать на PHP
Vlad&slav
01.06.2010, 13:02
нужно задать функцию перевода в систему счисления со своими символами
типа я задаю символы "q 6 f 8"
тогда число 3 будет выглядеть как "f" а 4 как "8"
типа кудато сюда копать
function gen($a)
{
$alf = 'A B C D E F G H I K L M N O P Q R S T V X Y Z';
$malf = explode(' ', $alf);
$count = count($malf);
while(пока не поделим всё число){
$div = $a / $count;
$div = substr($div, 0, strrpos($div, ','));
$mod = $a % $count;
вышитываем символ...
{
}
echo gen(3255);
или может есть другой путь?
Vlad&slav четче сформулируйте задание. О каких числах идет речь? Требуется сделать простую замену всех цифр на некторый набор символов? То есть на входе например "1331" А на выходе будет "acca"?
Тогда читайте про функцию strtr:
$val = 1331;
echo strtr((str) $val, '0123456789', 'abcdefghij');
// Или если требуется заменять только некоторые символы:
echo strtr((str) $val, array('1' => 'a'));
Он имеет ввиду в 16-ой системе 0-9A-F, в 17-ой 0-9A-G и так далее
http://www.cyberforum.ru/cpp-beginners/thread65570.html
решение на си сойдет?)
wildshaman
01.06.2010, 13:51
Гифтс, не
К примеру, в двоичной системе набор такой: "0 1"
В восьмиричной: "0 1 2 3 4 5 6 7"
В шестнадцатиричной: "0 1 2 3 4 5 6 7 8 9 A B C D E F"
ТСу надо задавать такой набор своими символами и переводить в свою такую систему.
Вообще, код там прост, но писать так влом :(
То как говорит Chaak: echo base_convert((int) $val, 10, 36);
Как говорит wildshaman
function some_trash($val, $from=10 ,$base=-1, $replacement='ABCDEFGHIKLMNOPQRSTVXYZ!"№;%:?*()')
{
$base = $base <= 0 ? count($replacement) : $base;
if (strlen($replacement)<$base) return false;
$tr_from = substr('0123456789ABCDEFGHIKLMNOPQRSTVXYZ', 0, $base);
return strtr((string) base_convert($val, $from, $base), $tr_from, $replacement);
}
echo some_trash(50, 10, 16);
Возьми код какого-нибудь укорачивателя ссылок, они по схожей системе работают...
Возьми код какого-нибудь укорачивателя ссылок, они по схожей системе работают...
Мне почему-то кажется, что это тут вообще ниочем:)
То как говорит Chaak: echo base_convert((int) $val, 10, 36);
Как говорит wildshaman
function some_trash($val, $from=10 ,$base=-1, $replacement='ABCDEFGHIKLMNOPQRSTVXYZ!"№;%:?*()')
{
$base = $base <= 0 ? count($replacement) : $base;
if (strlen($replacement)<$base) return false;
$tr_from = substr('0123456789ABCDEFGHIKLMNOPQRSTVXYZ', 0, $base);
return strtr((string) base_convert($val, $from, $base), $tr_from, $replacement);
}
echo some_trash(50, 10, 16);
Ну, перевести в другую систему счисления используя свой алфавит
Vlad&slav
01.06.2010, 19:28
Задача была как сказал шаман,
объясните пожалуйста алгаритм
Vlad&slav с помощью base_convert переменная преобразуется к нужной системе счисления. Дальше командой strtr символы полученного числа преобразуются соответственно со строкой замены ($replacement).
Например $replacement = 'abcdefghijklm' тогда 0 будет заменен на а, 1 на b и так далее
Vlad&slav
01.06.2010, 23:36
Vlad&slav с помощью base_convert переменная преобразуется к нужной системе счисления. Дальше командой strtr символы полученного числа преобразуются соответственно со строкой замены ($replacement).
Например $replacement = 'abcdefghijklm' тогда 0 будет заменен на а, 1 на b и так далее
А если я задам ряд символов для создания системы счисления больше чем strlen(0123456789ABCDEFGHIKLMNOPQRSTVXYZ)
тогда твой код вроде как работать не будет ?
возмождно ли реализовать через while?
Vlad&slav второй раз - сформулируйте задание и с какой целью оно вам надо
Vlad&slav
02.06.2010, 10:03
Vlad&slav второй раз - сформулируйте задание и с какой целью оно вам надо
Формулирую.
Каждая сис.счисления задаётся какимто набором символов(строк), например двоичная 0 и 1
Мне нужна функция для получения n-ного члена системы счисления набор символов которой я задам сам (задам массивом).
Функция принимает 2 параметра: n и массив набора символов(строк)(любого количества).
Нужная система счисления будет образовываться из элементов массива и основанием = количеству элементов массива.
Функция вернёт n-ный член этой системы счисл.
function (array('a', '[g]', '[!]', '5', '}', '+', '[v]', '[ab]'), '10744')
{
......
return // функция по идеи должна вернуть [!]}[ab][ab]a
}
С целью криптографии
Эта задача называется nth permutation и у нее есть стандартное решение. К криптографии это имеет весьма опосредованное отношение.
Vlad&slav
03.06.2010, 15:20
а?
roxblnfk
03.06.2010, 16:33
а в чём проблема?
function dec2hz($Ahz,$Dec){
for($hz=count($Ahz),$i=1;$Dec>=pow($hz,$i);$i++){/*© ROX ®*/}
for($i--,$dc=abs($Dec),$ы='';$i>=0;$i--){
$sl=pow($hz,$i);
$kk=floor($dc/$sl);
$dc-=$kk*$sl;
$ы.=$Ahz[$kk];
}
return $ы;
}
echo dec2hz(array('a', '[g]', '[!]', '5', '}', '+', '[v]', '[ab]'),10744);
конечно, всё можно сделать куда проще бональным делением... но это слишком просто :)
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot