Доброго времени суток друзья, столкнулся с проблемой была задана задача спроектировать тест для распознавания комбинации как выигрыша в лотереи, в строке присутствует универсальный символ, который может заменять любой символ, вот пример кода:
line = 'ABCAABDCA'
income_amount = 10
test_amount = 20
values = {
'AAA': 15,
'BBB': 20,
'CCC': 30,
'DDD':40
}
if line[0] == line[1] and line[1] == line[2] and line[2] == line[0]:
income_amount += values[line[0]+line[1]+line[2]]
if line[3] == line[4] and line[4] == line[5] and line[5] == line[3]:
income_amount += values[line[3]+line[4]+line[5]]
if income_amount == test_amount:
print('True')
else:
print('False')
Проблема в символе ‘D’ он универсален, то есть при выпадении комбинации ‘ADA’ символ D заменит A, уже третий день повис на этом условии, прошу помощи у опытных пользователей как реализовать это исключение.
Заранее спасибо!
Код ужасен. Почему всё делается через сравнения а не через поиск подстрок? Зачем третье сравнение (line[2] == line[0])?
Я бы посоветовал переписать всё через поиск подстрок (т.е. искать в большой строке сначала “AAA”, потом “BBB”…).
Для проверки универсального символа при таком небольшом объёме обрабатываемых данных имхо после проверки на “простые” тройки проще всего заменять универсальный “D” сначала на “A” и проверять, не находится ли “AAA”, потом на B и проверять не находится ли “BBB”, и, наконец, на “C” и проверка на “CCC” соответственно.
Return the number of (non-overlapping) occurrences of substring sub in string s[start:end]. Defaults for start and end and interpretation of negative values are the same as for slices.
string.replace(s, old, new[, maxreplace])
Return a copy of string s with all occurrences of substring old replaced by new. If the optional argument maxreplace is given, the first maxreplace occurrences are replaced.
Р.S. Также рекомендуется заменить название темы на "Поиск комбинаций в строке где один из символов может играть роль “универсального”, в связи с тем что слово “исключение” “зарезервированный” перевод термина exception.
Если первое - то зачем вы пытаетесь сделать второе?
Если второе - то не хватает требований: AADBB = AAA or BBB or AAA+BBB? ADDD = DDD or AAA or AAA+DDD? AADDDDBB = AAA+DDD or DDD+BBB or AAA+BBB?
А, точно точно. Забыл, что есть универсальные символы. Ну в этот алгоритм легко добавить ещё одну проверку
if((k < (len(vhod))) and ((i == vhod[k]) or (vhod[k] == 'D'))):
Ну или что-то типа этого. Ещё можно с рекурсией задачу сделать. А вобще, это смотрится как тестовое задание от работодателя. Задача не сложная, и скорее всего не из раельного проэкта, а больше проверяет мышление. Так что работодатели, проверьте ка своих кандидатов на использование алгоритмов с этого форума )
Товарищи - у меня в голове решение занимает не более 6-7 строк - что вы за спаггети-код вылаживаете? o_O @arturk, а на каком основании вы решили что AADDD = 15, а не 40?
И у вас тоже таки баг - ADD дает 40
Извиняюсь за реализацию, я забыл о джокере (символе, который может заменять другие). Так что изначально в алгоритм его не вставил, а после первого же комментария вслепую попытался всунуть проверку. Скрипт не запускал вобще )