Александр Г.
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 повідомлення
#16 років тому
1278627

Ну вот вуаля. Не без помощи но решение готово. Да... давненько я так голову не ломал ))
Николай М.
1895 повідомлень
#16 років тому
А что будет если

$str='q....w.e.r';

?
)
Дмитрий Васильковский
756 повідомлень
#16 років тому
Цитата ("MMM_Corp"):
А что будет если

$str='q....w.e.r';

?
)

регикспами оставить только буквы!
Ил Миха
56 повідомлень
#16 років тому
Цитата ("MMM_Corp"):
А что будет если

$str='q....w.e.r';

?
)

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