@Override
    public AudienceVotingResult vote(List<Answer> allAnswers, List<Answer> possibleAnswers, QuestionDifficulty difficulty) {
        int answersCount = possibleAnswers.size();
        if (answersCount != 2 && answersCount != 4) {
            throw new RuntimeException("Unable to vote for " + possibleAnswers.size() + " answers (only 2 and 4 are supported)");
        }

        int[] percents;
        switch (difficulty) {
            case EASY:
                if (answersCount == 4) {
                    // incorrect 0 - 20 => avg. 10 | correct: 40 - 100 => avg. 70
                    percents = generatePercents(possibleAnswers, 0, 20);
                } else { // answersCount == 2
                    // incorrect 0 - 30 => avg. 15 | correct: 80 - 100 => avg. 90
                    percents = generatePercents(possibleAnswers, 0, 30);
                }
                break;
            case MID:
                if (answersCount == 4) {
                    // incorrect 10 - 26 => avg. 18 | correct: 22 - 70 => avg. 46
                    percents = generatePercents(possibleAnswers, 10, 26);
                } else { // answersCount == 2
                    // incorrect 20 - 55 => avg. 37.5 | correct: 45 - 80 => avg. 62.5
                    percents = generatePercents(possibleAnswers, 20, 55);
                }
                break;
            case HARD:
                if (answersCount == 4) {
                    // incorrect 19 - 27 => avg. 23 | correct: 19 - 43 => avg. 31
                    percents = generatePercents(possibleAnswers, 19, 27);
                } else { // answersCount == 2
                    // incorrect 35 - 55 => avg. 45 | correct: 45 - 65 => avg. 55
                    percents = generatePercents(possibleAnswers, 35, 55);
                }
                break;
            default:
                throw new RuntimeException("Unknown difficulty of question!");
        }
        return mergeToResult(allAnswers, possibleAnswers, percents);
    }