O. Поставь себя на моё место

Вы уже долгое время решаете задачи в Яндекс.Контесте.
Сегодня пришло время почувствовать себя на его месте.

Напишите небольшой кусочек тестирующей системы.

Вашему решению доступен файл scoring.json, в котором содержится информация о системе проверки.

Основой системы является список групп тестов.
Каждая группа представляет собой объект с полями:

  • points — количество очков, которое можно получить за прохождение данной группы;
  • tests — список объектов с описанием конкретного теста.

Объект описывающий тест содержит поля:

  • input — строка входных данных теста;
  • pattern — строка ожидаемых в качестве ответа.

В стандартный поток ввода вашего решения передаются ответы, полученные от тестируемой программы.

Формат ввода

В стандартный поток ввода передаются строки — ответы тестируемой программы на каждый тест. В файле scoring.json содержится информация о тестах задачи.

Формат вывода

Одно число — количество полученных тестируемой программой баллов.
Если группа тестов не была пройдена полностью, то за данную группу ставится пропорциональный балл.
Гарантируется, что баллы за группу кратны количеству тестов в ней.

Пример

Ввод

# Пользовательский ввод:
4
12
3
100
0

# Содержимое файла scoring.json
[
    {
        "points": 10,
        "tests": [
            {
                "input": "2 2",
                "pattern": "4"
            },
            {
                "input": "4 3",
                "pattern": "7"
            }
        ]
    },
    {
        "points": 30,
        "tests": [
            {
                "input": "2 1",
                "pattern": "3"
            },
            {
                "input": "25 4",
                "pattern": "29"
            },
            {
                "input": "3 -3",
                "pattern": "0"
            }
        ]
    }
]

Вывод

25

Решение

Основная сложность этого задания – понять как начисляются баллы. Например, если задание содержит 2 теста и за его прохождение дают 10 баллов, то каждый правильно пройденный тест приносит по 5 баллов. Если в следующем задании 3 теста и 30 баллов, то каждый правильно пройденный тест дает 10 баллов. Дальше все становится элементарно – читаем “расклад” читаем сколько тестов пройдено, вычисляем актуальное количество баллов.

Посмотреть код

Решение

Python
from sys import stdin
import json

json_name = 'scoring.json'

with open(json_name) as file:
    data = json.load(file)

answers = stdin.readlines()

score = 0

while data:
    tests = data.pop(0)
    multiplier = int(tests['points'] / len(tests['tests']))
    for test in tests['tests']:
        result = test['pattern']
        answer = answers.pop(0).strip('\n')
        if result == answer:
            score += multiplier

print(score)

Решение

Python
from sys import stdin
import json

json_name = 'scoring.json'

with open(json_name) as file:
    data = json.load(file)

answers = stdin.readlines()

score = 0

for tests in data:
    multiplier = int(tests['points'] / len(tests['tests']))
    for test in tests['tests']:
        result = test['pattern']
        for answer in answers:
            if result == answer.strip('\n'):
                score += multiplier

print(score)
Подписаться
Уведомить о
guest
9 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Dark Rush
Dark Rush
20.12.2023 11:26

Не особо понятно, приведён код в решении как общий шаблон или как конкретное решение задачи в хендбуке. Потому что в таком виде хендбук программу не пропустит, в начале необходимо импортировать stdin и json. (from sys import stdin, import json) Также название json-файла не задаётся вводом, оно обозначено в задаче, поэтому строку “json_name = input()” следует заменить на “json_name = ‘scoring.json'”.

Dark Rush
Dark Rush
Ответить на  Сергей Клочко
20.12.2023 11:54

Понял, тогда извиняюсь за замечание.

Рамис
Рамис
11.07.2024 11:39

Здравствуйте! Не подскажете, какая ошибка была допущена при написании кода? 3 тест не проходит
import json
from sys import stdin

answers = [string.rstrip(‘\n’) for string in stdin.readlines()]

with open(“scoring.json”, encoding=”UTF-8″) as file_in:
data = json.load(file_in)

data = {record.pop(‘points’): record.pop(‘tests’) for record in data}
data = ({key: [record.pop(‘pattern’) for record in value]
for key, value in data.items()})

points = 0
for key, value in data.items():
k = len(value)
rate = int(key / k)
for i in range(k):
if value[i] == answers.pop(0):
points += rate

print(points)

Рамис
Рамис
Ответить на  Сергей Клочко
11.07.2024 12:29

Спасибо большое за обратную связь!!

Smotri
Smotri
18.12.2024 08:57

Понимаю что смотреть в код не самое приятное занятие (сужу по себе), но не могли бы помочь понять – почему проходит только первый тест?

from sys import stdin
import json

answ_lst = [int(answer.rstrip('\n')) for answer in stdin]


count = 0
coin = 0
with open('scoring.json') as file_in:
    file_1 = json.load(file_in)
    for block in file_1:
        max_points = block['points']
        count_tests = len(block['tests'])
        for test in block['tests']:
            if int(test['pattern']) == answ_lst[count]:
                coin += (max_points / count_tests)
            count += 1
print(int(coin))