Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Генерация всех возможных комбинаций.
 
 автор: simbel   (11.03.2010 в 02:10)   письмо автору
 
 

Здравстуйте.

Попробовал вручную расписать - чуть глаза не сломал ))). Решил что надо всё таки програмно как-то...

Помогите пожалуйста - никогда с такой задачей не сталкивался. Нужно найти все комбинации из 8-ми слов, слов может быть только 2-а: "да" и "нет". Получается всего комбинаций должно быть 2^8=256.

Что-то типа такого:

   нет да да да нет да да нет
   да нет да нет да нет да да
   да да нет да нет да нет да
   нет да да нет да да да нет
   .....
   и т.д..
------------------------------------------

нужно считать в двумерный массив:

$array[0][0] = "нет";
$array[0][1] = "да";
$array[0][2] = "да";
$array[0][3] = "да";
$array[0][4] = "нет";
$array[0][5] = "да";
$array[0][6] = "да";
$array[0][7] = "нет";

$array[1][0] = "да";
$array[1][1] = "нет";
$array[1][2] = "да";
$array[1][3] = "нет";
$array[1][4] = "да";
$array[1][5] = "нет";
$array[1][6] = "да";
$array[1][7] = "да";
....
и т.д..

  Ответить  
 
 автор: sim5   (11.03.2010 в 04:39)   письмо автору
 
   для: simbel   (11.03.2010 в 02:10)
 

Комбинация из восьми, это от 00000000 до 11111111, для вашего случая от "нет нет нет нет нет нет нет нет" до "да да да да да да да да". У вас же какая-то странная логика в массиве.

  Ответить  
 
 автор: sasha1133   (11.03.2010 в 11:20)   письмо автору
 
   для: sim5   (11.03.2010 в 04:39)
 

+1) И комбинация будет занимать всего 1 байт. А для чего это? Случайно не для теста какого нибудь?

  Ответить  
 
 автор: simbel   (11.03.2010 в 13:03)   письмо автору
 
   для: sasha1133   (11.03.2010 в 11:20)
 

Нет, это не для теста. ))

  Ответить  
 
 автор: simbel   (11.03.2010 в 12:50)   письмо автору
 
   для: sim5   (11.03.2010 в 04:39)
 

Да вобщем-то так, наверное начинать надо с "да да да да да да да да " и заканчивать "нет нет нет нет нет нет нет нет" - так было бы правильней. Я просто случайные врианты в массив поместил, без какой-либо логики.

  Ответить  
 
 автор: sim5   (11.03.2010 в 13:13)   письмо автору
 
   для: simbel   (11.03.2010 в 12:50)
 

Трудно сказать, что для вас правильней. Это в электронике существует положительная и отрицательная логика.
А зачем порождать такой массив, для какой цели?

  Ответить  
 
 автор: simbel   (11.03.2010 в 15:05)   письмо автору
 
   для: sim5   (11.03.2010 в 13:13)
 

это просто так совпало что получиллась двоичная система исчисления - делаю что-то типа фильтра данных - в нём есть 8 выпадающих списков (могло быть сколько угодно - под двоичную систему специально не подстраивал), каждый из которых содержит два значения "да" и "нет". И вот в зависмости от комбинаций значений в этих выпадающих списках - будут производиться различные выборки данных. Но для начала нужно сгенерить все возможные комбинации в массив. На основе комбинаций сформировать потом код который будет фильтровать. Вобщем, там не простой фильр, я с такой задачей первый раз столкнулся.

  Ответить  
 
 автор: sim5   (11.03.2010 в 15:08)   письмо автору
 
   для: simbel   (11.03.2010 в 15:05)
 

Для того, чтобы узнать состояние, достаточно проверить число само, и коли уж так необходимо, заменить в нем 0 на одно слово, и 1 на другое, а вот массив создавать для этого нет никакой необходимости.

  Ответить  
 
 автор: Yuriev   (11.03.2010 в 12:08)   письмо автору
 
   для: simbel   (11.03.2010 в 02:10)
 

for ($i = 1; $i < 32; $i ++) {
    for ($j = 1; $j < 8; $j ++) {
        $array[$i][$j] = если $j чёт, кладём "нет", иначе кладём "да"
    }
}

  Ответить  
 
 автор: Саня   (11.03.2010 в 12:44)   письмо автору
 
   для: Yuriev   (11.03.2010 в 12:08)
 

бред

  Ответить  
 
 автор: simbel   (11.03.2010 в 12:56)   письмо автору
 
   для: Yuriev   (11.03.2010 в 12:08)
 

Это немного не то - здесь получатся 256 одинаковых комбинаций:
да нет да нет да нет да нет


Мне же нужно получить все возможные неповторяющиеся комбинации из "да" / "нет".

  Ответить  
 
 автор: Yuriev   (11.03.2010 в 13:29)   письмо автору
 
   для: simbel   (11.03.2010 в 12:56)
 

А у меня получается не 256 да нет да нет да нет да нет, а 128 да и 128 нет
И если брать триады $i, $j и содержимое по этим координатам, что и есть Ваша неповторяющаяся восьмёрка (2^3).
Но мой скрипт - незакончено и сложно. Сейчас попробую попроще.

  Ответить  
 
 автор: DJ Paltus   (11.03.2010 в 14:42)   письмо автору
 
   для: simbel   (11.03.2010 в 02:10)
 

Если я правильно понял задание, то вот решение:

<?php
function ttod($k)    //эту функцию (перевод из десятичного в двоичный вид числа) я спер на форуме, вот тут: http://www.softtime.ru/forum/read.php?id_forum=7&id_theme=23008
{
        
$dn "";

        while (
$k >= 2)
        {
                
$m $dn;
                
$dn $k%2;
                
$dn $dn.$m;

                if (
$k%== 0)
                {
                        
$k $k/2;
                }
                else
                {
                        
$k = ($k-$k%2)/2;
                }
        }
        if (
$k == 1)  $dn "1".$dn;
        if (
$dn == 1$dn "0".$dn;
        return 
$dn;
}
$sub1 "да ";         // что пишем
$sub2 "нет ";
$len 8;           // сколько "да/нет" в строке

$num pow(2$len); // сколько вариантов получится

for ($i 0$i $num$i ++){

    
// номер варианта превращаем в строку двоичного кода
    
$str strval(ttod($i));     

    
// достраиваем строку нулями до нужной длины
    
while(strlen($str) < $len$str "0".$str;    
    
    for(
$j 0$j $len$j++){
        
// ну и всё, проверяем j-тый символ, записываем в массив то, что надо.
        
if($str[$j] == "0"$x $sub2; else $x $sub1 ;
        
$arr[$i][$j] = $x;
        }
    }
//проверка
for ($i 0$i $num$i ++){
    for(
$j 0$j $len$j++){
        echo 
$arr[$i][$j];
        }
        echo 
"<br>";
    }
?>

  Ответить  
 
 автор: sim5   (11.03.2010 в 14:54)   письмо автору
 
   для: DJ Paltus   (11.03.2010 в 14:42)
 

Достаточно проверить состояние каждого из восьми бит, заменив его на "нет" или "да". Зачем такой монстр?

  Ответить  
 
 автор: DJ Paltus   (11.03.2010 в 15:01)   письмо автору
 
   для: sim5   (11.03.2010 в 14:54)
 

Я изначально был уверен, что есть гораздо более изящный метод, который мне, увы, недоступен. Однако, в теме не было ни одного стОящего ответа и надо было что-то делать )

  Ответить  
 
 автор: Loki   (11.03.2010 в 15:04)   письмо автору
 
   для: simbel   (11.03.2010 в 02:10)
 

Фига вы тут наворотили!

<?
    $arr
=array(0=>'Нет '1=>'Да ');
    for(
$i=1$i<256$i++)
    {
        echo 
str_replace(array_keys($arr), $arrsprintf('%08b'$i)).'<br />';
    }

  Ответить  
 
 автор: simbel   (11.03.2010 в 15:11)   письмо автору
 
   для: Loki   (11.03.2010 в 15:04)
 

Всем спасибище большое за помощь!

  Ответить  
 
 автор: Yuriev   (11.03.2010 в 15:20)   письмо автору
 
   для: simbel   (11.03.2010 в 15:11)
 

<?
// Это сам код
$mas[] = array();
for (
$i 0$i 256$i++) {
    
$octat sprintf('%08s'decbin($i));
    
$octat str_replace('0''nou '$octat);
    
$octat str_replace('1''yes '$octat);
    
$octat trim($octat);
    
$mas[$i] = explode(' '$octat);
}

// А это для проверки
for ($i 0$i 256$i++) {
    for (
$j 0$j 8$j++) {
        echo 
$mas[$i][$j].' ';
    }
    echo 
'<br />';
}
?>

  Ответить  
 
 автор: Loki   (11.03.2010 в 15:12)   письмо автору
 
   для: Loki   (11.03.2010 в 15:04)
 

for($i=0; $i<256; $i++)
конечно же:)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования