@t38c3j

Есть ли формула для этого?

Здравствуйте. Имеется не большая задачка от основного задания которую я решил но хотелось бы элегантней.

Имееться функция на вход которой подается ID и длина строки, которая в зависимости от ID возвращает определенной длины строку из символов.
Например: у нас используется только a-z и длина строки должна быть 3 символа, то есть у нас это 26*26*26=17576 уникальных строк.
Например если подать ID 2 то это 1,1,2 или например ID 555 то это 1,23,9 (1,23,9 это порядковые номера букв).

Я это всё делаю рекурсией, есть ли математическая формула чтоб можно было вычислить порядковые номера букв на основе ID?
  • Вопрос задан
  • 337 просмотров
Решения вопроса 3
Это называется "перевод в 26-ричную систему счисления".
Классический алгоритм: в цикле пока число больше 0 делите на 26, остаток - это порядковый номер очередной буквы, а частное подаете на вход следующего прохода цикла.
Универсальной формулы нет, т.к. она будет задействовать остатки от деления на степени числа 26, и будет работать медленнее, чем алгоритм описанный выше.
Ответ написан
Комментировать
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
S=[c]*26^2+[b]*26^1+[a]*26^0 (S - это как бы и есть ID)
также в обратном порядке:
[c]=floor(S/26^2)
[b]=floor((S-[c]*26^2)/26)
[a]=floor(S-[c]*26^2-[b]*26)
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Вообще-то это стандартный перевод из одной систему счисления, в данном случае десятичной, в другую, с основанием равным длине нового алфавита.
function myEncode($value, $alphabet, $length) {
  $base = strlen($alphabet);
  $encoded = '';
  while ($length > 0 && $value > 0) {
    $encoded = $alphabet[$value % $base].$encoded;
    $value = ($value - $value % $base) /$base; 
    $length--;
  }
  while ($length > 0) {
    $encoded = $alphabet[0].$encoded;
    $length--;
  }
  return $encoded;
}

$alphabet = 'abcdefghijklmnopqrstuvwxyz';
echo myEncode(2, $alphabet, 3)."\n";
echo myEncode(555, $alphabet, 3)."\n";


Если алфавит и длина результата фиксированы, то можно и проще:
function myEncode_1($value) {
  return chr(($value - $value % 676) / 676 + 97).
         chr(($value % 676 - $value % 26) / 26 + 97).
         chr($value % 26 + 97);
}

echo myEncode_1(2)."\n";
echo myEncode_1(555)."\n";
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Sanasol
@Sanasol Куратор тега PHP
нельзя просто так взять и загуглить ошибку
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы