2011-11-11 2 views
0

스크립트 및 문제를 작성하려고합니다. 이 일을 어떻게 할 수 있는지 아는 사람이 있으면 알려주거나, 어쩌면 이것이 가능할 수 있는지 아는 사람에게 물어볼 수 있습니까?PHP 번호 스크립트 배열 루프

  1. 최대 숫자는 1에서 20까지 선택할 수 있습니다. 1 ~ 20 사이의 임의의 숫자를 반복하고 선택할 수 있습니다.
  2. 이 숫자를 무시합니다. 1,2,4,6,9,12 이것은 변경할 수있는 배열입니다.
  3. 각 배열 라인을 가질 수 있습니다 각 배열 라인 5.I 이전 번호는 아래 참조 일치 수있는 고유 약 10 배열
  4. 최대 2 숫자를 가질 필요가 고유해야 4 개 번호
  5. 개까지.

어떻게해야합니까? 어떤 도움이라도 좋을 것입니다.

 
e.g. 


Array(
    [0] => Array 
    (
     [0] => 3 
     [1] => 16 
     [2] => 22 
     [3] => 24 
    ) 
    [1] => Array 
    (
     [0] => 3 
     [1] => 16 
     [2] => 7 
     [3] => 13 
    ) 
    [2] => Array 
    (
     [0] => 20 
     [1] => 17 
     [2] => 10 
     [3] => 18 
    ) 
) 


This not allow as some array match each other 



Array(
    [0] => Array 
    (
     [0] => 3 
     [1] => 16 
     [2] => 22 
     [3] => 24 
    ) 
    [1] => Array - cant have this as 3 of the numbers matchs the previous array.only two numbers can match. 
    (
     [0] => 3 
     [1] => 16 
     [2] => 22 
     [3] => 13 
    ) 
    [2] => Array 
    (
     [0] => 20 
     [1] => 17 
     [2] => 10 
     [3] => 18 
    ) 
) 

고맙습니다.

+2

이 숙제인가? – prodigitalson

+0

저는 선택할 수있는 20 개의 자식 요소가있을 때 최대 4 개의 고유 한 자식 요소가있는 10 개의 부모 요소가있는 다중 딤 배열을 갖는 것이 가능한지 이해하지 못합니다. 이 작업을 수행하려면 상위 요소 당 최대 2 개의 하위 요소 (총 20 개, 총 배열 요소 10 개) 만 가질 수 있습니다. 그렇지 않으면 처음 5 개의 상위 요소를 4 개의 하위 요소로 채우면 채워지지 않은 5 개의 상위 요소가 생깁니다. –

+0

@Digital Precision @Digital Precision 이것은 완전히 가능합니다. 현재 행은 이전 행의 2 개 이상을 매치하지 않아야하며, 고유 한 것으로 단지 두 행이 다른 순서로있는 한 동일한 번호를 사용할 수 있음을 의미합니다. – dqhendricks

답변

1

이것은 당신의 조건을 만족하는 것 같다 http://codepad.viper-7.com/WHkQeD

<?php 
$num_arrays = 10; $num_elements = 4; 
$min = 1; $max = 20; 
$exclude_numbers = array(1, 4, 6); // Add numbers here to exclude 

$answer = array(); 
for($i = 0; $i < $num_arrays; $i++) 
{ 
    $answer[$i] = array(); 
    for($j = 0; $j < $num_elements; $j++) 
    { 
     do 
     { 
      $current = rand($min, $max); 
      // If the previous array exists and there are more than two common elements when we add the $current element, continue 
      if(isset($answer[$i-1]) && count(array_intersect($answer[$i-1], array_merge($answer[$i], array($current))) > 2) 
      { 
       continue; 
      } 
     } while(in_array($current, $exclude_numbers) || in_array($current, $answer[$i])); 
     $answer[$i][$j] = $current; 
    } 
} 

var_dump($answer); 

편집 : 여기이 조건을 모두 만족하는 완벽한 솔루션입니다. 같은

Demo

<?php 
$num_arrays = 10; $num_elements = 4; 
$min = 1; $max = 20; 
$exclude_numbers = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13); 

$answer = array(); 
for($i = 0; $i < $num_arrays; $i++) 
{ 
    $answer[$i] = array(); 
    for($j = 0; $j < $num_elements; $j++) 
    { 
     do 
     { 
      // Get a random element 
      $current = rand($min, $max); 
      $new_array = array_merge($answer[$i], array($current)); 

      // If the previous array has more than two common elements (because of the added $current), get a new $current 
      if(isset($answer[$i-1]) && count(array_intersect($answer[$i-1], $new_array)) > 2) 
      { 
       $answer[$i] = array_diff($new_array, $answer[$i-1]); 
       $j = count($answer[$i]) - 1; 
       continue; 
      } 
     } while(in_array($current, $exclude_numbers) || in_array($current, $answer[$i])); 

     $answer[$i][$j] = $current; 

     // If the array is complete, we need to check for unique arrays 
     if(count($answer[$i]) == $num_elements) 
     { 
      $k = $i - 1; 
      while($k >= 0) 
      { 
       if(count(array_diff($answer[$k], $answer[$i])) == 0) 
       { 
        // This array is the same as a previous one, start over 
        $answer[$i] = array(); 
        $j = -1; 
        break; 
       } 
       $k--; 
      } 
      // Optionally sort each array 
      sort($answer[$i]); 
     } 
    } 
} 

var_dump($answer); 
+0

그것이 만족하지 않는 유일한 방법은 각 배열이 고유한지 확인하는 것입니다 (OP # 4). 그러나 do() 루프에 추가 할 수 있습니다. – nickb

+0

이것은 내가 가지고있는 가장 가까운 배열이지만 배열의 고유 번호를 생성하지 않으며 그 번호를 무시하지 않습니다. 내가해야 할 일은 없을 것입니다. 그런 다음 동일한 숫자를 반복하여 반복하는 값을 설정했습니다. 내가 chnage 수 있는지보십시오. – SameasBefore

+0

@SameasBefore - 모든 기준을 충족하는 솔루션으로 답변을 업데이트했습니다. 작동하는지 확인한 후 제 대답을 승인 된 것으로 표시하십시오. 감사. – nickb

0

뭔가를해야만 :

function generate_list($max, $forbidden) 
{ 
    $list = array(); 
    while(count($list) < 4) 
    { 
     $new = rand(1, $max); 
     if(in_array($new, $forbidden)) 
     { 
      continue; 
     } 

     $list[] = $new; 
     $forbidden[] = $new; 
    } 

    return $list; 
} 

function count_max_same($new_list, $old_lists) 
{ 
    $max_same = 0; 
    foreach($old_lists as $current_list) 
    { 
     $max_same = max($max_same, count(array_intersect($new_list, $old_lists))); 
    } 
    return $max_same; 
} 

function generate_unique_lists($count_of_lists, $max, $forbidden, $max_same = 2, $max_tries = 1000) 
{ 
    $lists = array(); 

    while($max_tries-- AND count($lists) < $count_of_lists) 
    { 
     $new_list = generate_list($max, $forbidden); 
     if(count_max_same($new_list, $lists) <= $max_same) 
     { 
      $lists[] = $new_list; 
     } 
    } 

    return $lists; 
} 
+0

동일한 스크립트를 사용하지만 브라우저에 출력이 없으면 결과가 어떻게 표시되는지 확인하려고했습니다. – SameasBefore