Алгоритм составления всевозможных комбинаций ответов в викторине - PullRequest
0 голосов
/ 29 октября 2018

У меня есть тест на личность, где есть 8 вопросов, и у каждого вопроса есть 4 варианта.

Пользователь должен окончательно выбрать 8 ответов (1 ответ на вопрос), и оценки будут назначены личностям на основе выбранных ответов.

Теперь я должен найти все возможные комбинации ответов, что составляет 4 (варианты) ^ 8 (вопросы) = 65536 возможных комбинаций.

Если формат матрицы такой

q11 q12 q13 q14 
q21 q22 q23 q24
q31 q32 q33 q34
....
q81 q82 q83 q84

Мне нужен алгоритм, чтобы выбрать все возможные комбинации ответов и выяснить индивидуальные оценки для каждой полученной комбинации.

Помоги мне. Спасибо.

Ответы [ 3 ]

0 голосов
/ 29 октября 2018

Я не понимаю, если для вас важно хранить эту комбинацию q14 q13 q12 q11, это псевдокод для создания последовательности вашего примера

int columns=3;
int rows=7;
string matrix[7][4];
for(int i=0; i<rows; i++){
   for(int j=0; j<columns; j++){
      matrix[i][j]="q"+(i+1)+(j+1);
   }
}
0 голосов
/ 29 октября 2018
<?php 

$all_option_combinations = getAllOptionCombinations(getAllOptionsData());
printAllCombinations($all_option_combinations);


function printAllCombinations($all_option_combinations){
    foreach($all_option_combinations as $each_combination){
        echo implode(" ",$each_combination).PHP_EOL;
    }
}

function getAllOptionsData(){
    $question_with_options = [];
    for($i = 1;$i < 9; $i++){
        $current_question_options = [];
        $current_question_options[] = 'q'.$i.'1';
        $current_question_options[] = 'q'.$i.'2';
        $current_question_options[] = 'q'.$i.'3';
        $current_question_options[] = 'q'.$i.'4';
        $question_with_options[] = $current_question_options;
    }

    return $question_with_options;
}

function getAllOptionCombinations($options_data){
    $current_combinations = array_map("returnAsArray",$options_data[0]);
    $options_size = count($options_data);

    for($i = 1;$i < $options_size; $i++){
        $next_combinations = [];
        $each_question_options_size = count($options_data[ $i ]);
        $current_combinations_size  = count($current_combinations);
        for($j = 0; $j < $current_combinations_size; $j++){
            for($k = 0; $k < $each_question_options_size; $k++){
                $combination = $current_combinations[ $j ];
                $combination[] = $options_data[ $i ][ $k ];
                $next_combinations[] = $combination;
            }          
        }
        $current_combinations = $next_combinations;
    }

    return $current_combinations;
}

function returnAsArray($each_value){
    return array($each_value);
}

ВЫВОД:

q11 q21 q31 q41 q51 q61 q71 q81
q11 q21 q31 q41 q51 q61 q71 q82
q11 q21 q31 q41 q51 q61 q71 q83
q11 q21 q31 q41 q51 q61 q71 q84
q11 q21 q31 q41 q51 q61 q72 q81
q11 q21 q31 q41 q51 q61 q72 q82
q11 q21 q31 q41 q51 q61 q72 q83
q11 q21 q31 q41 q51 q61 q72 q84
q11 q21 q31 q41 q51 q61 q73 q81
q11 q21 q31 q41 q51 q61 q73 q82
q11 q21 q31 q41 q51 q61 q73 q83
q11 q21 q31 q41 q51 q61 q73 q84
q11 q21 q31 q41 q51 q61 q74 q81
q11 q21 q31 q41 q51 q61 q74 q82
q11 q21 q31 q41 q51 q61 q74 q83
q11 q21 q31 q41 q51 q61 q74 q84
q11 q21 q31 q41 q51 q62 q71 q81
q11 q21 q31 q41 q51 q62 q71 q82
q11 q21 q31 q41 q51 q62 q71 q83
q11 q21 q31 q41 q51 q62 q71 q84
....65516 more lines
  • Поскольку вы не упомянули язык, я использовал свой выбор языка, то есть PHP .
  • Этот код получает все необходимые комбинации.
  • Теперь вы можете просто присвоить значение каждому варианту и рассчитать окончательный счет для каждой комбинации. То, как вы этого добиваетесь, - это упражнение, которое я оставляю вам (поскольку вы не проявили свои усилия). Дайте мне знать, если вы тоже боретесь в этом.
0 голосов
/ 29 октября 2018

вы можете попробовать что-то вроде этого (python):

ans1 = 1
ans2 = 3
ans3 = 1
ans4 = 2
ans5 = 4
ans6 = 1
ans7 = 2
ans8 = 3

score = ans1 +ans2 +ans3 +ans4 +ans5 +ans6 +ans7 +ans8

if score < 12:
    print("You are personality type 1")

if score >= 12 and score < 24:
    print("You are personality type 2")

...

Это обычный способ, которым тесты такого типа получают свои результаты.

EDIT Этот код даст вам все возможные результаты (ответы от 1-4 на 8 вопросов). Однако для запуска потребуется время, и вы должны сделать достаточно, чтобы операторы его использовали:

import itertools

def permute(LIST):
    length=len(LIST)
    if length <= 1:
        yield LIST
    else:
        for n in range(0,length):
             for end in permute( LIST[:n] + LIST[n+1:] ):
                 yield [ LIST[n] ] + end

for x in permute([1,1,2,2,3,3,4,4]):
    print(x)
...