Вы уже долгое время решаете задачи в Яндекс.Контесте.
Сегодня пришло время почувствовать себя на его месте.
Напишите небольшой кусочек тестирующей системы.
Вашему решению доступен файл 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 баллов. Дальше все становится элементарно – читаем “расклад” читаем сколько тестов пройдено, вычисляем актуальное количество баллов.
Посмотреть код
Решение
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)
Решение
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)
Не особо понятно, приведён код в решении как общий шаблон или как конкретное решение задачи в хендбуке. Потому что в таком виде хендбук программу не пропустит, в начале необходимо импортировать stdin и json. (from sys import stdin, import json) Также название json-файла не задаётся вводом, оно обозначено в задаче, поэтому строку “json_name = input()” следует заменить на “json_name = ‘scoring.json'”.
Спасибо за замечание, я внес правки и теперь задача проходит тест в Яндексе после элементарного копипастинга.
Данный ресурс создан не совсем для того, чтобы копипастить решения в Яндекс. Он скорее для того, чтобы любой человек мог посмотреть как эту задачу можно было решить и порадоваться, если его решение такое же или даже лучше, или поучиться, если по какой-то причине оно оказалось хуже.
То, что я оформляю задачи так, чтобы их можно было сдать в хэндбук, сделано исключительно для того, чтобы любой желающий мог убедиться, что решение действительно работает.
Но я это все решаю на своем компьютере, и иногда мне удобно, чтобы ввод и особенно вывод не совсем соответствовал тому, что хочет Яндекс. Я не всегда достаточно внимателен, чтобы переделать решение со своего компьютера под формат Яндекс хэндбука.
Понял, тогда извиняюсь за замечание.
Нет проблем, я действительно недоглядел, что довольно просто, если оформлять по 10 задач в день.
Здравствуйте! Не подскажете, какая ошибка была допущена при написании кода? 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)
На мой взгляд, у вас ошибочная логика в подготовке данных. Если быть точнее, то выбран не самый удачный формат для их представления.
Представьте, что есть несколько тестов, за которые дают одинаковый балл.
Словарь, который вы строите не совместим с такой ситуацию, так как в любом словаре ключ должен быть уникальным.
Спасибо большое за обратную связь!!
Понимаю что смотреть в код не самое приятное занятие (сужу по себе), но не могли бы помочь понять – почему проходит только первый тест?
Проблема вашего решения в том, что вы решили,что в качестве ответов могут быть только целые числа. Но в теории там могут быть и дробные числа и даже строки. И если в первом случае ваш код пусть неправильно, но сработает, то во втором – уже нет.