Средняя оценка теста из массива результатов с различными размерами групп - PullRequest
0 голосов
/ 30 января 2019

Я работаю над проблемой, в которой мне нужно вычислить среднее значение из набора результатов испытаний по следующим критериям.-эта программа была протестирована на нескольких тестовых примерах, и каждый тестовый пример имеет следующие результаты. "OK", "Неправильный ответ", "TimeOut", "Ошибка времени выполнения" - тестовые случаи были организованы в группы, пронумерованные последовательными натуральными числамипрограмма набирала баллы для группы только в том случае, если результат каждого тестового примера в группе был «ОК», например, если имена тестовых примеров - test1, test2a, test2b, ​​test2c, test3, test4.В этом случае test2a, test2b, ​​test2c все образуют одну группу и все должны набрать OK, чтобы получить общую точку.

Написать функцию

class Solution{
public int solution (String[] test, String[] result){}
}
//example:
test[0] = "test1a",  result[0] = "Wrong answer"
test[1] = "test2",  result[1] = "OK"
test[2] = "test1b",  result[2] = "Runtime error"
test[3] = "test1c",  result[0] = "OK"
test[4] = "test3",  result[4] = "Time limit exceeded" 
//result above is 33.

Предположим, что целое число находится в диапазоне 1-300 -массивы test и result имеют одинаковую длину - каждый тестовый случай появляется только один раз - тестовый случай упорядочен последовательными натуральными целыми числами из 1. - тестовые случаи в группах, содержащих не менее двух тестов, отличаются суффиксом в нижнем регистре в алфавитном порядке от a.- каждая строка в результатах содержит одно из: «OK», «Неправильный ответ», «TimeOut», «Ошибка времени выполнения»

. Сейчас я написал код для удаления массива тестовых строк и получения целых чисел для каждой тестовой группы.,Затем я создал Integer, Integer HashMap, где я проверяю целые числа, которые я собрал после использования регулярных выражений, и проверяю, чтобы все тестовые случаи в группе были в порядке, прежде чем присваивать им 100

import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Codechef
{
public static int solution(String[] test, String[] result)
{
    HashMap<Integer, Integer> scoreMap =  new HashMap<Integer, Integer>();

    int[] stripped = new int[test.length];

    //stripped the String of numbers..
    for(int i = 0; i < test.length;i++)
    {
       stripped[i] = Integer.parseInt(test[i].replaceAll("[^0-9]", ""));
    }

    //working with just the numbers from the test groups array
    for(int i = 0; i < stripped.length; i++)
    {
        if(scoreMap.containsKey(stripped[i]))
        {
            if(result[i].equals("OK"))
                scoreMap.put(stripped[i], 100);

            else
                scoreMap.put(stripped[i], 0);
        }

        else
        {
            if(result[i].equals("OK"))
                scoreMap.put(stripped[i], 100);

            else
                scoreMap.put(stripped[i], 0);
        }

    }

    int correctAnswers = 0;
    for(int val: scoreMap.values())
    {
        if(val == 100)
            correctAnswers++;
    }

    double avg =  correctAnswers/scoreMap.size() * 100;

    return (int)Math.floor(avg); 

    //return Math.floor(correctAnswers/scoreMap.size() * 100);

}


public static void main (String[] args) throws java.lang.Exception
{
    // your code goes here
    String[] test1 = {"test1", "test2a", "test2b", "test4", "test2c", "test3", "test5", "test6", "test7"};
    String[] results1 = {"OK", "OK", "Wrong answer", "OK", "Wrong answer", "Wrong answer", "OK", "TimeOut","Runtime error"}; 
    int average1 =  solution(test1, results1);

    String[] test2 = {"stackoverflow1", "stackoverflow2a", "stackoverflow2b", "stackoverflow4", "stackoverflow2c", "stackoverflow3", "stackoverflow5", "stackoverflow6", "stackoverflow7"};
    String[] results2 = {"Runtime error", "OK", "Wrong answer", "OK", "TimeOut", "Wrong answer", "OK", "Timeout","TimeOut"};

    int average2 =  solution(test2, results2);

    String[] test3 = {"test1", "test2a", "test2b", "test4", "test2c", "test3", "test5", "test6", "test7"};
    String[] results3 = {"OK", "OK", "TimeOut", "OK", "TimeOut", "OK", "TimeOut", "Runtime error","OK"}; 
    int average3 =  solution(test3, results3);

    System.out.println("Avg1 = " + average1);
    System.out.println("Avg2 = " + average2);
    System.out.println("Avg3 = " + average3);

}

}

1 Ответ

0 голосов
/ 31 января 2019

Если я вас правильно понял, тестовый пример может состоять из одного теста или нескольких тестов, формально говоря о наборе тестов.

Позволяет ввести следующие два класса:

private static class TestSuiteResult {
    private String name;
    private List<TestResult> results = new ArrayList<>();

    public TestSuiteResult(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public List<TestResult> getResults() {
        return results;
    }
}

private static class TestResult {
    private String name;
    private String result;

    public TestResult(String name, String result) {
        this.name = name;
        this.result = result;
    }

    public String getName() {
        return name;
    }

    public String getResult() {
        return result;
    }
}

Далее, давайте попробуем проанализировать входные данные String[] tests и String[] results для вышеприведенных классов.Регулярное выражение test(\d*)([a-z])? соответствует любому вводу, который начинается с test, за которым следует любое количество цифр, за которыми может следовать символ из az.Захватывающие группы используются для извлечения необходимых кусочков.

String regex = "(\\w*?)(\\d*)([a-z])?";
Pattern pattern = Pattern.compile(regex);

Map<String, TestResult> testResults = new HashMap<>();
Map<String, TestSuiteResult> testSuiteResults = new HashMap<>();

for (int i = 0; i < tests.length; i++) {

    String test = tests[i];
    Matcher matcher = pattern.matcher(test);

    // check for illegal test name
    if (!matcher.matches()) {
        continue;
    }

    String name = matcher.group(1);
    String digitPart = matcher.group(2);
    String character = matcher.group(3);

    if (character != null) {
        // multi test
        String suiteName = name + digitPart;
        TestSuiteResult suite = testSuiteResults.get(digitPart);
        TestSuiteResult suite = testSuiteResults.get(suiteName);
        if (suite == null) {
            suite = new TestSuiteResult(suiteName);
            testSuiteResults.put(suite.getName(), suite);
        }
        String result = results[i];
        TestResult multi = new TestResult(character, result);
        suite.getResults().add(multi);
    } else {
        // single test
        String result = results[i];
        TestResult single = new TestResult(test, result);
        testResults.put(single.getName(), single);
    }
}

Далее мы можем рассчитать общее количество тестов и из общего количества действительных тестов.Я рассматривал набор тестов как отдельный тест, который действителен только в том случае, если все содержащиеся в нем тесты являются действительными.

int totalAmountOfTests = testResults.size() + testSuiteResults.size();

int validTests = 0;
for (Map.Entry<String, TestResult> entry : testResults.entrySet()) {
    if (entry.getValue().getResult().equals("OK")) {
        validTests++;
    }
}
for (Map.Entry<String, TestSuiteResult> entry : testSuiteResults.entrySet()) {
    List<TestResult> suiteResults = entry.getValue().getResults();
    boolean valid = true;
    for (TestResult suiteResult : suiteResults) {
        if (!suiteResult.getResult().equals("OK")) {
            valid = false;
        }
    }
    if (valid) {
        validTests++;
    }
}

Теперь, наконец, мы можем вычислить среднее количество пройденных тестов.При приведении average к int мы округляем до нижней цифры.

double average = (double) totalAmountOfTests / validTests;
int averageRounded = (int) average;

Полный рабочий пример доступен здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...