Создание всех возможных вариаций
63 повідомлення
#16 років тому
Приветствую уважаемые. Возникла задача которую я ни как не могу воплотить может вы чем поможете !?
Задача такова:
Имеем
$str='qwerty';
нужно преобразовать в масив со всеми возможными вариациями подстановки символа "." но этот символ не должен стаять не в начале не в конце и 2 точки тоже не может идти подряд. Колличество символов может быть от 2 до "~" !!!
к примеру для
$str='qwer';
должен получиться вот такой итог:
Array
(
=> qwer
=> q.wer
=> qw.er
=> qwe.r
=> q.w.er
=> qw.e.r
=> q.we.r
=> q.w.e.r
)
Выяснил вот что - для того чтобы выяснить колличество вариаций нужно 2 возвести в степень количества символов минус 1.
Помогите кто чем может !!!
PS Может даже кто-то на платной основе возьмется !?
322 повідомлення
#16 років тому
Ммм в примере, я так понимаю, '~' заменили на 3?а ваше правило количества вариаций не учитывает ваши ограничения: 'символ не должен стаять не в начале не в конце и 2 точки тоже не может идти подряд'
63 повідомлення
#16 років тому
Цитата ("hobl"):Ммм в примере, я так понимаю, '~' заменили на 3?ДА
Цитата ("hobl"):
а ваше правило количества вариаций не учитывает ваши ограничения: 'символ не должен стаять не в начале не в конце и 2 точки тоже не может идти подряд'
Проверял не однократно ! Все правельно, единственное что забыл это -1 потому как в вариации отсутствие точки тоже учитывается как за вариант.
Все точно как в оптеке !
<?PHP
$str='qq';
$n_sim=strlen($str)-1; // Колличество максимального колличества точек в строке.
$n_variation=pow(2,$n_sim)-1; // Колличество вариаций.
print($n_variation);
?>
322 повідомлення
#16 років тому
Я тут не понял, если символов в строке N, точек T, то тогда какое кол-во вариаций K?Я тут немного "написал". Правильно?
N 1 2 3 4
T
1 0 1 2 3
2 0 1 2 6
3 0 1 3 7
63 повідомлення
#16 років тому
Цитата ("hobl"):Я тут не понял, если символов в строке N, точек T, то тогда какое кол-во вариаций K?
Я тут немного "написал". Правильно?
N 1 2 3 4
T
1 0 1 2 3
2 0 1 2 6
3 0 1 3 7
Ни че не понел !

322 повідомлення
#16 років тому
Ну... подсчитал эмпирическим путем и написал это в табл. И спросил твою формулу K = f(N,T), где f искомая функция
626 повідомлень
#16 років тому
Вообще все достаточно просто:- берем в цикле числа от 0 до "~"
- текущее число преобразуем в двоичную форму, например 3 => 11
- там, где получились единицы ставим точку, где 0 - точку убираем/не ставим
в нашем случае т.к. 3 позиции число будет выглядеть так:
011 => q0w1e1r => qw.e.r
Кол-во вариантов: 2 в степени (длина_строки-1)
450 повідомлень
#16 років тому
Я в php не силён, но, мне кажется, алгоритм такой:нужно строку преобразовать с массив из символов,
Если он <= 2 то
echo 'точки ставить некуда :)';
return; // насколько я знаю, дальше код выполняться не будет
обьявляем массив для результатов $result_arr =
Далее цикл от второго знака до предпоследнего
for (n=$arr; n<=$arr.length()-1; n++) { // как-то так
//берём стоку строку и засовываем в неё точку по индексу n, это сохраняем в $tmp
//дописываем $tmp в массив результатов (вроде push, его синтаксиса не знаю)
}
Далее опять цикл от второго знака до предпоследнего. В нём ставим точку не только по индексу n, а также возле всех символов до этого индекса, и вложеным циклом ставим точки после каждого символа от n до длины строки -1, каждый результат записываем в массив $result_arr
626 повідомлень
#16 років тому
Этак вы утоните в циклах. Хорошо сейчас только в 3 позиции можно точку ставить, а если их станет 10, 20, 50, что тогда?
322 повідомлення
#16 років тому
Demiurh, а какой ход рассуждений, чтобы прийти к 2 в степени...?Не учел в таблице исход. вариант, а так отвечает формуле
626 повідомлень
#16 років тому
Гм, вроде же объяснил уже.У вас точки - по сути биты, установленные в 1.
Всего 2 возможных значения (есть точка/нет точки) - отсюда степень двойки.
Длина_строки - 1 = кол-во промежутков, куда можно ставить точку.
Вы немного про системы счисления почитайте. У вас самый простой случай - система двоичная получается.
756 повідомлень
#16 років тому
Цитата ("hobl"):Ммм в примере, я так понимаю, '~' заменили на 3?
В слове qwer 4 символа)
Про двоичную систему интересный вариант, только цикл нужно брать не от 0 до ~ , а от нуля до 2 в степени (длина_строки)-1
56 повідомлень
#16 років тому
Dr_Jekyll, по логике да, это скорее что в голову каждому первым придет, но на практике получается неизвестна длина строки и получится что нужно будет писать дополнительную функцию или делать сложную рекурсию, в любом случае вариант расточительный + еще в ваш алгоритм нужно добавить проверку нет ли уже в массиве строки типа !in_array($array), так как ошибка неизбежнато что советует Demiurh имхо для такой задачи в сам раз, вот код, если кто оптимизирует я не против))
<?php
function add_bit($str, $bit)
{
$array = array();
$strlen = strlen($str)-1;
$pow = pow(2, $strlen);
for ($i = 1; $i <= $pow; $i++) {
$d = decbin($i);
for ($j = $strlen, $k = strlen($d); $j >= 0; $j--, $k--) {
$tmp_str .= $d.$str;
}
$tmp_str = str_replace(0, '', $tmp_str);
$tmp_str = str_replace(1, $bit, $tmp_str);
$array = strrev($tmp_str);
unset($tmp_str);
}
return $array;
}
var_dump(add_bit('webla', '.'));
?>
322 повідомлення
#16 років тому
О системах счисления я вполне в курсе ))) Теперь прояснилось, спасибо
63 повідомлення
756 повідомлень
#16 років тому
Цитата ("MMM_Corp"):А что будет если
$str='q....w.e.r';
?
)
регикспами оставить только буквы!