leni_m
@leni_m
ЧупаКобрус

Как написать функцию?

1 - a
2 - b
3 - c
4 - aa
5 - ab
6 - ac
7 - ba
8 - bb
9 - bc
10 - ca
11 - cb
12 - cc
13 - aaa
14 - aab
15 - aac
16 - aba
17 - abb
18 - abc
19 - aca
20 - acb
21 - acc
...
Необходимо написать функцию
function create_word ($alphabet, $index) {
    ....
    return $word;
}

чтобы результат её был таков:
create_word ("abc", 9); // "bc"
create_word ("abc", 18); // "abc"

Может кто подскажет чего? А то не могу понять с какой стороны подойти.
  • Вопрос задан
  • 182 просмотра
Решения вопроса 5
function create_word(string $str, int $cnt): string
{
    $len = \strlen($str);
    if ($len === 0 || $cnt === 0) {
        return '';
    }

    $result = '';
    while ($cnt > $len) {
        $i = ($cnt % ($len)) ?: $len;
        $result = $str[$i - 1] . $result;
        $cnt = ($cnt - $i) / $len;
    }
    $result = $str[$cnt - 1] . $result;
    
    return $result;
}

echo create_word('abc', 9);  //'bc'
echo create_word('abc', 18); //'abc'
Ответ написан
Комментировать
@Vitsliputsli
Переводите второй аргумент в троичную систему, а цифры заменяйте на буквы abc при выводе. Либо в другую, если букв не 3.

Нет, ошибся, не соответствует системе счисления, проще циклами пробежаться.
Ответ написан
@m4f1
$text_lenght = 3;
$charset = 'abc';
$charset_length = strlen($charset);

function recurse($width, $position, $base_string)
{
    global $text_lenght, $charset, $charset_length;
     
    for ($i = 0; $i < $charset_length; ++$i) {
        if ($position  < $width - 1) {
            recurse($width, $position + 1, $base_string . $charset[$i]);
        }
    if (strlen($base_string . $charset[$i]) <= $text_lenght) {
      echo $base_string . $charset[$i].'</br>';
    }		

    }
}

recurse($text_lenght, 0, '');
Ответ написан
Immortal_pony
@Immortal_pony Куратор тега PHP
function create_word($aplhabet, $index) {
    $words = [];

    $prevLevelWords = [""];    
    foreach (range(1, strlen($aplhabet)) as $offset) {
        $currentLevelWords = [];
        foreach (str_split($aplhabet) as $letter) {
            foreach ($prevLevelWords as $prevLevelWord) {
                $word = $letter . $prevLevelWord;
                $currentLevelWords[] = $word;
                $words[] = $word;
            }
        }
        $prevLevelWords = $currentLevelWords;
    }
    
    return $words[$index-1] ?? false;
}
Ответ написан
Комментировать
bitniks
@bitniks
Go/PHP/Symfony developer
С использованием рекурсии
function create_word($alphabet, $index) {
    $index = $index - 1;    
    if ($index < strlen($alphabet)) {
        return str_split($alphabet)[$index];
    }
    
    return create_word($alphabet, floor($index / strlen($alphabet))) .
        create_word($alphabet, $index % strlen($alphabet) + 1);
}

sandbox.onlinephpfunctions.com/code/5a4fcdacd6e70a...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы