Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.80
radno
2 / 2 / 1
Регистрация: 03.12.2012
Сообщений: 33
#1

Матрица . Как уменьшить код - PHP

06.12.2012, 14:25. Просмотров 2032. Ответов 33

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<?php
 
$base_numbers = array(1, 3, 10, 2, 5);
            $increment_matrix = array();
            $summ = 0;
 
            foreach ($base_numbers as $base_number) {
                $increment_matrix[] = $summ + $base_number;
                $summ += $base_number;
            }   
            
            array_shift($increment_matrix);
        echo "<pre>";
            echo implode("<br>",$increment_matrix); 
        echo "</pre>";  
$base_numbers = array(1, 10, 2, 5, 1);
            $increment_matrix = array();
            $summ = 0;
                    foreach ($base_numbers as $base_number) {
                $increment_matrix[] = $summ + $base_number;
                $summ += $base_number;
            }   
            
            array_shift($increment_matrix);
        echo "<pre>";
            echo implode("<br>",$increment_matrix); 
        echo "</pre>";  
$base_numbers = array(1, 2, 5, 1, 3);
            $increment_matrix = array();
            $summ = 0;
                    foreach ($base_numbers as $base_number) {
                $increment_matrix[] = $summ + $base_number;
                $summ += $base_number;
            }   
            
            array_shift($increment_matrix);
        echo "<pre>";
            echo implode("<br>",$increment_matrix); 
        echo "</pre>";  
$base_numbers = array(1, 5, 1, 3, 10);
            $increment_matrix = array();
            $summ = 0;
                    foreach ($base_numbers as $base_number) {
                $increment_matrix[] = $summ + $base_number;
                $summ += $base_number;
            }   
            
            array_shift($increment_matrix);
        echo "<pre>";
            echo implode("<br>",$increment_matrix); 
        echo "</pre>";  
        
?>
как уменьшыть код , чтоб непересоздавать новий масив $base_numbers = array();

Добавлено через 3 минуты
И как вивести на екран вот так:
4 14 16 21
11 13 18 19
3 8 9 12
6 7 10 20
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2012, 14:25
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Матрица . Как уменьшить код (PHP):

Как уменьшить код?
Здравствуйте, написал код. Но меня смущает 3 запроса к БД. Как его можно...

Навигация по сайту. Как оптимизировать и уменьшить код
Придумываю навигацию по сайту. Вот что вышло, как уменьшить может в массив...

Уменьшить код
Доброго дня всем. Можно ли уменьшить данный код? И как прописать так, чтоб если...

Как уменьшить изображение?
Ребят, всем привет! Вот у меня проблема, при загрузке больше 4м фото,...

Как уменьшить разрешение картинки?
Как уменьшить разрешение картинки до определенного размера, при загрузке на...

Как уменьшить размер фотографии
добрый день Ето скрить watermarka и загрузки картинок на сервер, но есть...

33
KOPOJI
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16744 / 6635 / 860
Регистрация: 12.06.2012
Сообщений: 19,880
Завершенные тесты: 1
08.12.2012, 14:21 #21
от этого не легче. порядок изменения, т.е. эту самую "случайность" я лично так и не понял.. логики не вижу
0
alpex
600 / 575 / 103
Регистрация: 16.07.2012
Сообщений: 1,760
08.12.2012, 14:36 #22
radno, попробуйте написать решение просто в виде php кода, что откуда берется
а[1]-а[4] входящие данные
b[1]-b[9] значения первой матрицы
с[1]-с[9] значения второй матрицы
d[1]-d[9] значения третьей матрицы
e[1]-e[9] значения четвертой матрицы
может потом станет ясно что там и как
0
radno
2 / 2 / 1
Регистрация: 03.12.2012
Сообщений: 33
09.12.2012, 03:11  [ТС] #23
спс за совет

Добавлено через 4 часа 7 минут
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?//матрица
{$arr_K = array(2,3,1,7);
    $base = array();
    foreach ($arr_K as $item) {
        $base[] = (int)$item;
            }
    $cnt = count($base);
    
    for ($i = 0; $i < ($cnt-1); $i ++){
        
            if (($arr_K[$i]+$arr_K[$i+1]) <= ($cnt)){
                $line = 1 + $arr_K[$i];     
                
            } else {
                $line = 1 + $arr_K[$i]+$arr_K[$i+1];    
                
            }
       
        echo"<pre>";
        echo $line;
        echo"</pre>";
      }
}   
?>
Я нашол некотрый алгоритм:
неподскажеш где ошыбка
как сделать чтоб выводило
5
3
9

Добавлено через 8 часов 19 минут
Алгоритм не подошол ..
Решыл задачу написанием повторного кода но есть проблема: обе матрицы состоют из одних тех же цыфр. Во второй есть лишнее "7 8 2", как их убрать???

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<?
function matrix1($arr_K){
//$arr_K = array(2,3, 1, 7);
            $increment_matrix_1 = array();
            //$Rozm_arr = array_sum($arr_K);
            //$summ = $arr_K[0]+$arr_K[0];
            $summ = 0;
            
            foreach ($arr_K as $base_number) {
            if(($summ + $base_number)==(13)){
                $increment_matrix_1[] = $summ + $base_number;
                $summ += $base_number;
            }else{
                $increment_matrix_1[] = ($summ + $base_number)%(13);
                $summ += $base_number;
                }
            }   
            
             array_shift($increment_matrix_1);
        echo "<pre>";
        echo implode(" ",$increment_matrix_1); 
        echo "</pre>";  
}       
 
$arr_K = array(2, 3, 1, 7);
    $base = array();
    foreach ($arr_K as $item) {
        $base[] = (int)$item;
        }
        $cnt = count($base);
    for ($i = 0; $i < ($cnt-1); $i ++){
        $line = array();
        $line[0] = $base[0];
        for ($j = 1; $j < $cnt; $j ++){
            if (($cnt - 1) < ($j + $i)){
                $line[$j] = $base[$j + $i - $cnt];
            } else {
                $line[$j] = $base[$j + $i];
              }
        }
        matrix1($line);
        
    }
 
function matrix2($arr_K){
//$arr_K = array(2,3, 1, 7);
            $increment_matrix = array();
            $Rozm_arr = array_sum($arr_K);
            //$summ = $arr_K[0]+$arr_K[0];
            $summ = 4;
            
            foreach ($arr_K as $base_number) {
            if(($summ + $base_number)==(13)){
                $increment_matrix[] = $summ + $base_number;
                $summ += $base_number;
            }else{
                $increment_matrix[] = ($summ + $base_number)%(13);
                $summ += $base_number;
                }
            }   
            
             array_pop($increment_matrix);
        echo "<pre>";
        echo implode(" ",$increment_matrix); 
        echo "</pre>";  
        
}       
echo "<br/>";
 
$arr_K = array(2, 3, 1, 7);
    $base = array();
    foreach ($arr_K as $item) {
        $base[] = (int)$item;
        }
        $cnt = count($base);
    for ($i = 0; $i < ($cnt); $i ++){
        $line_2 = array();
        $line_2[0] = $base[0];
        for ($j = 0; $j < $cnt; $j ++){
            if (($cnt - 1) < ($j + $i)){
                $line_2[$j] = $base[$j + $i - $cnt];
            } else {
                $line_2[$j] = $base[$j + $i];
              }
        }
        matrix2($line_2);
        
    }
?>
0
radno
2 / 2 / 1
Регистрация: 03.12.2012
Сообщений: 33
10.12.2012, 16:13  [ТС] #24
alpex, Не Подскажыте как сделать проверку чтоб исключить 7,8,2 из второго масива.
0
alpex
600 / 575 / 103
Регистрация: 16.07.2012
Сообщений: 1,760
10.12.2012, 17:04 #25
я же вам говорил напишите алгоритм в виде, что откуда берется , я не могу понять логики откуда берутся числа, сделайте так для всех матриц, а я попробую написать функцию для рассчета
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
 
// входящие данные
$a[1] = 2;
$a[2] = 3;
$a[3] = 7;
$a[4] = 1;
 
// индексы в матрицах
/**
    | 1  2  3 |
    | 4  5  6 |
    | 7  8  9 |
*/
 
$sum = $a[1] + $a[2] + $a[3] + $a[4]; // 13
 
//первая матрица
$b[1] =  $a[1] + $a[2];
$b[2] =  $a[1] + $a[2] + $a[3];
$b[3] =  $a[1] + $a[2] + $a[3] + $a[4];
$b[4] =  $a[1] + $a[3];
$b[5] =  $a[1] + $a[3] + $a[4];
$b[6] =  $a[1] + $a[3] + $a[4] + $a[1];
$b[7] =  $a[1] + $a[4];
$b[8] =  $a[1] + $a[4] + $a[1];
$b[9] =  $a[1] + $a[4] + $a[1] + $a[2]; // if ($b[] < $sum) $b[] = $b[] % $sum
 
 
// вторая матрица
 
 
 
// третья матрица
 
 
 
// четвертая матрица
0
radno
2 / 2 / 1
Регистрация: 03.12.2012
Сообщений: 33
10.12.2012, 18:36  [ТС] #26
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
// входящие данные
$a[1] = 2;
$a[2] = 3;
$a[3] = 7;
$a[4] = 1;
 
// индексы в матрицах
/**
    | 1  2  3 |
    | 4  5  6 |
    | 7  8  9 |
*/
 
$sum = $a[1] + $a[2] + $a[3] + $a[4]; // 13
 
//первая матрица
$b[1] =  $a[1] + $a[2];
$b[2] =  $a[1] + $a[2] + $a[3];
$b[3] =  $a[1] + $a[2] + $a[3] + $a[4];
$b[4] =  $a[1] + $a[3];
$b[5] =  $a[1] + $a[3] + $a[4];
$b[6] =  $a[1] + $a[3] + $a[4] + $a[1];
$b[7] =  $a[1] + $a[4];
$b[8] =  $a[1] + $a[4] + $a[1];
$b[9] =  $a[1] + $a[4] + $a[1] + $a[2]; // if ($b[] < $sum) $b[] = $b[] % $sum
 
 
// вторая матрица
$two =  $a[1] + $a[1];//4
$c[1] =  $two + $a[1];
$c[2] =  $two + $a[1] + $a[2];
$c[3] =  $two + $a[1] + $a[2] + $a[3];
$c[4] =  $two + $a[3];
$c[5] =  $two + $a[3] + $a[4];
$c[6] =  $two + $a[3] + $a[4] + $a[1]; //if ($c[] < $sum) $c[] = $c[] % $sum
$c[7] =  $two + $a[4];
$c[8] =  $two + $a[4] + $a[1];
$c[9] =  $two + $a[4] + $a[1] + $a[2]; // if ($c[] < $sum) $c[] = $c[] % $sum
#Не должно попасть: 
    $c[ ] =  $two + $a[2];//7
    $c[ ] =  $two + $a[2] + $a[3];//8
    $c[ ] =  $two + $a[2] + $a[3] + $a[4];//2 
    (етих чисел нету у Первой матрице)#
 
    
// третья матрица
$three = $a[1] + $a[1] + $a[2];//7
$d[1] =  $three + $a[1];
$d[2] =  $three + $a[1] + $a[2];
$d[3] =  $three + $a[1] + $a[2] + $a[3];
$d[4] =  $three + $a[2];
$d[5] =  $three + $a[2] + $a[3];
$d[6] =  $three + $a[2] + $a[3] + $a[4]; //if ($d[] < $sum) $d[] = $d[] % $sum
$d[7] =  $three + $a[4];                //if ($d[] < $sum) $d[] = $d[] % $sum
$d[8] =  $three + $a[4] + $a[1];       //if ($d[] < $sum) $d[] = $d[] % $sum
$d[9] =  $three + $a[4] + $a[1] + $a[2]; // if ($d[] < $sum) $d[] = $d[] % $sum
#Не должно попасть: 
    $d[ ] =  $three + $a[3];//8
    $d[ ] =  $three + $a[3] + $a[4];//2
    $d[ ] =  $three + $a[3] + $a[4] + $a[1];//4 
(етих чисел нету у Первой матрице)
 
 
// Четвертая матрица
$four = $a[1] + $a[1] + $a[2] + $a[3];//8
$e[1] =  $four + $a[1];
$e[2] =  $four + $a[1] + $a[2];
$e[3] =  $four + $a[1] + $a[2] + $a[3];// if ($e[] < $sum) $e[] = $e[] % $sum
$e[4] =  $four + $a[2];
$e[5] =  $four + $a[2] + $a[3];
$e[6] =  $four + $a[2] + $a[3] + $a[4]; //if ($e[] < $sum) $e[] = $e[] % $sum
$e[7] =  $four + $a[3];                
$e[8] =  $four + $a[3] + $a[4];       //if ($e[] < $sum) $e[] = $e[] % $sum
$e[9] =  $four + $a[3] + $a[4] + $a[1]; // if ($e[] < $sum) $e[] = $e[] % $sum
#Не должно попасть: 
    $e[ ] =  $four + $a[4];//2
    $e[ ] =  $four + $a[4] + $a[1];//4
    $e[ ] =  $four + $a[4] + $a[1] + $a[2];//7 
(етих чисел нету у Первой матрице)
 
Конец. Матриц нужно столько, сколько входных чисел.


Тот код каторый Вы, мне скинули работает . Я его чуток подправил, мне выводит все матрицы как нужно ,просто меняю поле $summ=0, на $summ=4(7,8).
Но появляютса лишние строки которых, не должно выводить.
0
alpex
600 / 575 / 103
Регистрация: 16.07.2012
Сообщений: 1,760
10.12.2012, 19:29 #27
Цитата Сообщение от radno Посмотреть сообщение
#Не должно попасть: $c[ ] = $two + $a[2];//7 $c[ ] = $two + $a[2] + $a[3];//8 $c[ ] = $two + $a[2] + $a[3] + $a[4];//2 (етих чисел нету у Первой матрице)#
не понял этих строк, а если значение в матрице при расчете попадет в одно из этих чисел(2, 7, 8), что тогда делать?
И что начиная со второй матрицы, значения в них должны быть только те которые есть в первой матрице?
и как правильно называется это значение которое в переменных $two, $three?
И вобще что это за метод где про него можно прочитать?
0
radno
2 / 2 / 1
Регистрация: 03.12.2012
Сообщений: 33
10.12.2012, 21:16  [ТС] #28
Цитата Сообщение от alpex Посмотреть сообщение
не понял этих строк, а если значение в матрице при расчете попадет в одно из этих чисел(2, 7, 8), что тогда делать?
Не записывать у масив, пропускать ети значения.

Цитата Сообщение от alpex Посмотреть сообщение
И что начиная со второй матрицы, значения в них должны быть только те которые есть в первой матрице?
Да толька те которые в первой матрице

Цитата Сообщение от alpex Посмотреть сообщение
и как правильно называется это значение которое в переменных $two, $three?
Незнаю как ответить. Чтоб вторая матрица построилась с теме же цыфрами ,что и первая нам надо (добавить первое число + первое число масива иначе вторая матрица не построитса
Чтоб третья построилась нам надо первое+первое число масива +второе число масива додать. І опять додавать по кругу.
)

Етот метод называетса построения латинских квадратов с помощью "Ідеальних кільцевих вязанок"

18_17.pdf
0
radno
2 / 2 / 1
Регистрация: 03.12.2012
Сообщений: 33
11.12.2012, 00:02  [ТС] #29
здесь тоже
0
Вложения
Тип файла: rar Strepko.rar (26.9 Кб, 1 просмотров)
alpex
600 / 575 / 103
Регистрация: 16.07.2012
Сообщений: 1,760
11.12.2012, 03:54 #30
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
function latinSquare(array $input)
{
    $result = array();
    $sum = array_sum($input);
    $count = count($input);
    $num = $input[0];
    
    for ($mtx = 0; $mtx < $count; $mtx ++){
        $num += (bool)$mtx ? $input[$mtx - 1] : 0;
        $result[$mtx] = array();
        $offset = 0;
        
        for ($row = 0; $row < ($count - 1 + $offset); $row ++){
            $value = $num;
            
            if ($mtx === 0 && $row === 0){
                $offset = 1;
                continue;
            }
            
            for ($var = 0; $var < ($count - 1); $var ++){
                
                $index = ($var + $row);
                $index = ($index >= $count) ? $index - $count : $index;
                $value += $input[$index];
                $value = ($value > $sum) ? $value % $sum : $value;
                
                if ((bool)$mtx && !in_array($value, $result[0])){
                    $offset = 1;
                    break;
                }
                
                $result[$mtx][] = $value;
            }
        }
    }
    return $result;
}
echo '<pre>';
var_dump(latinSquare(array(2, 3, 1, 7)));
echo '</pre>';


Добавлено через 16 минут
Цитата Сообщение от radno Посмотреть сообщение
18_17.pdf
в этом примере опечатка во 2 матрице 1 ряд 4 значение должно быть 18, по моим расчетам
0
radno
2 / 2 / 1
Регистрация: 03.12.2012
Сообщений: 33
11.12.2012, 15:28  [ТС] #31
alpex, Спасибо за код прекрасно работает. Вы очень прекрасно разбираетеся в пхп. Действительно в примере опечатка. Не подскажете, ещо как построить после етого матрицы с (1,2,3,4)
.
0
alpex
600 / 575 / 103
Регистрация: 16.07.2012
Сообщений: 1,760
11.12.2012, 19:24 #32
построить, в смысле вывести на екран?
два вложенных цикла for или foreach делаете и выводите, первым перебираете матрицы, а вторым значения в этих матрицах.
PHP в этих примерах практически не при чем, там самые примитивные функции используются
0
radno
2 / 2 / 1
Регистрация: 03.12.2012
Сообщений: 33
11.12.2012, 20:53  [ТС] #33
Очень благодарен большое спасибо. Неподскажыте ищо как зделать чтение через запетую, и вывод всех матриц на екран, чтоб слово array не было
0
alpex
600 / 575 / 103
Регистрация: 16.07.2012
Сообщений: 1,760
12.12.2012, 04:32 #34
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
<?php
function latinSquare(array $input)
{
    $result = array();
    $sum = array_sum($input);
    $count = count($input);
    $num = $input[0];
    
    for ($mtx = 0; $mtx < $count; $mtx ++){
        $num += (bool)$mtx ? $input[$mtx - 1] : 0;
        $result[$mtx] = array();
        $offset = 0;
        
        for ($row = 0; $row < ($count - 1 + $offset); $row ++){
            $value = $num;
            
            if ($mtx === 0 && $row === 0){
                $offset = 1;
                continue;
            }
            
            for ($var = 0; $var < ($count - 1); $var ++){
                
                $index = ($var + $row);
                $index = ($index >= $count) ? $index - $count : $index;
                $value += $input[$index];
                $value = ($value > $sum) ? $value % $sum : $value;
                
                if ((bool)$mtx && !in_array($value, $result[0])){
                    $offset = 1;
                    break;
                }
                
                $result[$mtx][] = $value;
            }
        }
    }
    return $result;
}
 
if (isset($_POST['input'])) {
    $input = explode(',', $_POST['input']);
    $input = array_map('intval', $input);
    $row = count($input) - 1;
    $result = latinSquare($input);
}
?>
 
<!DOCTYPE html>
<html>
    <head>
        <title>Построение матриц методом Латинских квадратов</title>
    <style>
        #wrapper {
            width: 760px;
            position: relative;
            background: #eee;
            padding: 30px;
        }
        table.matrix, .matrix td {
            border: 1px solid grey;
        }
        .matrix td{
            width: 25px;
            height: 25px;
        }
        h3, fieldset, .matrix td {
            text-align: center;
        }
        #wrapper table, fieldset, #wrapper {
            margin: 0 auto;
        }
        fieldset {
            width: 425px;
        }
    </style>
    </head>
    <body>
        <div id="wrapper">
            <form action="<?=$_SERVER['SCRIPT_NAME']?>" method="POST">
                <fieldset>
                    <legend>Построение матриц методом Латинских квадратов</legend>
                    <label>Введите числа через запятую :<p>
                        <input type="text" name="input" /></p></label>
                    <p><input type="submit" name="submit" value="Построить" /></p>
                </fieldset>
            </form>
            <? if (isset($result)) : ?>
            <table>
                <tbody>
                    <h3>Исходные данные : <?=htmlspecialchars($_POST['input']) ?></h3>
                </tbody>
                <tr>
                <? foreach ($result as $matrix) : ?>
                <td>
                <table class="matrix">
                    <tr>
                    <? for ($i = 0, $cnt = count($matrix); $i < $cnt; $i ++) : ?>
                    <td><?=$matrix[$i] ?></td>
                    <? if (0 === (($i + 1) % $row) && ($i + 1) !== $cnt) : ?>
                    </tr>
                    <tr>
                    <? endif ?>
                    <? endfor ?>
                    </tr>
                </table>
                </td>
                <? endforeach ?>
                </tr>
            </table>
            <? endif ?>
        </div>
    </body>
</html>
0
12.12.2012, 04:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.12.2012, 04:32
Привет! Вот еще темы с решениями:

Как уменьшить разрешение изображения?
Ко мне на сайт пользователи могут загружать аватарки. Дело в том, что я ставлю...

Как уменьшить количество запросов к БД
Здравствуйте, у меня есть цикл который выводит картинки, а alt='' и title=''...

Как уменьшить размер картинки на пхп
сделал скрипт он чет не робит подскажите что не так мне нужно уменьшить...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru