Первый входной массив — это ключ к правильным ответам на экзамене, например ["а", "а", "б", "г"]. Второй содержит представленные ответы студента.
Два списка не пусты и имеют одинаковую длину. Верните оценку для этого списка ответов, давая +4 за каждый правильный ответ, -1 за каждый неправильный ответ и +0 за каждый пустой ответ, представленный в виде пустой строки (в C используется символ пробела). Если оценка < 0, вернуть 0.
Например:
checkExam(["a", "a", "b", "b"], ["a", "c", "b", "d"]) → 6
checkExam(["a", "a", "c", "b"], ["a", "a", "b", ""]) → 7
Мое решение: он отлично работает для всех других условий:
def checkExam(arr1,arr2):
total = 0
for i,j in zip(arr1, arr2):
if i == j:
total += 4
if i != j:
total -= 1
if total < 0:
return 0
return total
** Кроме этого:
checkExam(["a", "a", "c", "b"], ["a", "a", "b", ""]) → 7
Проблема в том, что я не знаю, как сравнивать ("b") с ("") (пустой элемент), поэтому он возвращает +0 для пустого ответа.
**
вы можете просто проверить j== ''
, чтобы проверить пустую строку
Кстати, называть ваши аргументы arr1 и arr2 нехорошо - постарайтесь выбрать лучшие имена переменных, это хорошая привычка использовать осмысленные имена. Я бы предложил переименовать arr1
в correct_answers
, а arr2
переименовать в given_answers
. и что i
и j
должны быть correct
и given
соответственно. Наконец, я думаю, что ваш окончательный if
, который проверяет отрицательный результат, должен быть вне вашего цикла - в настоящее время он выходит из функции, как только сумма становится отрицательной - что может произойти, когда первый ответ неверный.
Да спасибо наверное так и сделаю. Это была глупая ошибка.
Почему вы возвращаетесь из цикла, когда получаете отрицательную сумму? Просто примените логику, как указано:
def check_exam(arr1, arr2):
total = 0
for i, j in zip(arr1, arr2):
if i == j:
total += 4
elif j: # only deduct if j is non-emtpy
total -= 1
return max(total, 0) # no negative marks
>>> check_exam(["a", "a", "b", "b"], ["a", "c", "b", "d"])
6
>>> check_exam(["a", "a", "c", "b"], ["a", "a", "b", ""])
7
И если вы действительно хотите загадочную однострочную строку:
def check_exam(arr1, arr2):
return max(0, sum(4*(i==j) or -bool(j) for i, j in zip(arr1, arr2)))
# or less cryptic
return max(0, sum(4 if i==j else -1 for i, j in zip(arr1, arr2) if j))
ваш код в конечном итоге даст отрицательные оценки, которые, я думаю, ему не нужны
Спасибо теперь понял.
Как насчет незашифрованного oneliner? Прямой вариант длиннее всего на два символа.
попробуйте это, я думаю, это решит вашу проблему .. дайте мне знать, если это не так. даже я новичок в этом, поэтому любая помощь в улучшении кода будет отличной
def check_exam(arr1,arr2):
total = 0
for i,j in zip(arr1, arr2):
if i == j:
total += 4
elif j= = "": #i have made a change here
total += 0
elif i != j:
total -= 1
return max(total,0)
Спасибо, братан, теперь все понятно.
Это даст вам то, что вы хотите
def check_exam(solution, student_submit):
scores = [0 if y == "" else 4 if (y==x) else -1 for (x,y) in zip(solution,student_submit)]
return max(sum(scores),0)
теперь добавлен оператор возврата
Также он возвращает отрицательные баллы, которые должны быть нормализованы до нуля.
Спасибо @TonySuffolk66 пропустил эту часть вопроса, добавил это сейчас
ваша версия вычисляет сумму дважды, что не очень хорошо....
Вы также можете сделать это, как в реальной жизни. Вы знаете, на бумаге. Где вы вообще не сравните неданный ответ с ожидаемым ответом. Где вы бы пропустить это полностью.
def check_exam(expect, given):
total = 0
for e, g in zip(expect, given):
if g:
total += 4 if e == g else -1
return max(0, total)
Однострочная версия:
def check_exam(expect, given):
return max(0, sum(4 if e == g else -1 for e, g in zip(expect, given)))
Другие однострочные:
def check_exam(expect, given):
return max(0, sum((-1, 4)[e == g] for e, g in zip(expect, given)))
def check_exam(expect, given):
return max(0, sum(f' {e}'.find(g) for e, g in zip(expect, given)))
Последний также будет правильно обрабатывать ' '
(ну, как ''
):
>>> check_exam(['a', 'a', 'a', 'a'], ['a', 'b', '', ' '])
3
То есть, если из 100 ответов я дам все правильные, кроме первого, моя оценка будет равна 0? Это не кажется справедливым. (
check_exam(['a'] * 100, ['b'] + ['a'] * 99)
возвращает0
)