Как бы я сгенерировал все возможные варианты расположения строки (x) над строкой (y) в PHP?

Я пытаюсь написать функцию, которая принимает следующие 2 параметра:

  1. Предложение в виде строки
  2. Количество строк в виде целого числа

Так что, если бы я должен был позвонить formatLines («Меня зовут Гэри», 2);

Возможные результаты будут:

  • массив («Меня зовут», «Гэри»);
  • массив («Мое имя», «Гари»);
  • массив («Мой», «имя Гари»);

Это вернуло бы: массив («Мое имя», «Гари»); потому что разница в количестве символов для каждой строки настолько мала, насколько это возможно.

Таким образом, часть, на которой я в конечном итоге застрял, — это создание множества возможных результатов, в которых слова расположены в правильном порядке, разбитых на x строк. Как только у меня будет множество возможных результатов, я смогу найти лучший результат.

Итак, как бы я мог генерировать все возможные комбинации?

С уважением

Джо

0

Решение

Кажется, что делать это, создавая все возможные способы разделения текста, а затем определять лучший, было бы излишне неэффективно. Вы можете посчитать символы и разделить их на количество строк, чтобы найти приблизительно правильное количество символов в строке.

function lineSplitChars($text, $lines) {
if (str_word_count($text) < $lines) {
throw new InvalidArgumentException('lines must be fewer than word count', 1);
}

$width = strlen($text) / $lines;                        // initial width calculation

while ($width > 0) {

$result = explode("\n", wordwrap($text, $width));   // generate result

// check for correct number of lines. return if correct, adjust width if not
$n = count($result);
if ($n == $lines) return $result;
if ($n > $lines) {
$width++;
} else {
$width--;
};
}
}
2

Другие решения

Ответ был принят здесь — но это кажется мне довольно громоздким методом решения проблемы, когда PHP уже предоставляет функцию wordwrap (), которая выполняет большую часть тяжелой работы:

 function format_lines($str, $lines)
{
$guess_length=(integer)(strlen($str)/($lines+1));
do {
$out=explode("\n", wordwrap($str, $guess_length));
$guess_length++;
} while ($guess_length<strlen($str) && count($out)>$lines);
return $out;
}

На самом деле это скорее метод грубой силы, и для очень больших входных данных лучшее решение будет использовать оптимальный поиск (добавление / удаление большего начального интервала, а затем уменьшение его в итерациях)

1

По вопросам рекламы [email protected]