Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Как реализовать поиск комбинаций в строке где один из символов может играть роль "универсального"?

python
Теги: #<Tag:0x00007f7b64963048>

(Владислав Кузь) #1

Доброго времени суток друзья, столкнулся с проблемой была задана задача спроектировать тест для распознавания комбинации как выигрыша в лотереи, в строке присутствует универсальный символ, который может заменять любой символ, вот пример кода:

    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, уже третий день повис на этом условии, прошу помощи у опытных пользователей как реализовать это исключение.
Заранее спасибо!


(Mykhailo Poliarush) #2

Код в сообщении абсолютно нечитабельный, вам отправлено персональное сообщение. Как поправите, тогда и можно будет смотреть на вашу проблему.


(Владислав Кузь) #3

Михаил, прошу прощения за корявое сообщение код исправил, спасибо за замечание!


(rpwheeler) #4
  1. Код ужасен. Почему всё делается через сравнения а не через поиск подстрок? Зачем третье сравнение (line[2] == line[0])?
  2. Я бы посоветовал переписать всё через поиск подстрок (т.е. искать в большой строке сначала “AAA”, потом “BBB”…).
  3. Для проверки универсального символа при таком небольшом объёме обрабатываемых данных имхо после проверки на “простые” тройки проще всего заменять универсальный “D” сначала на “A” и проверять, не находится ли “AAA”, потом на B и проверять не находится ли “BBB”, и, наконец, на “C” и проверка на “CCC” соответственно.

Документация в помощь:

https://docs.python.org/2/library/string.html

string.count(s, sub[, start[, end]])

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.


(rpwheeler) #5

Р.S. Также рекомендуется заменить название темы на "Поиск комбинаций в строке где один из символов может играть роль “универсального”, в связи с тем что слово “исключение” “зарезервированный” перевод термина exception.


(vmaximv) #6

Не совсем понятно, что вам нужно:

  1. Протестировать подсчет выигрыша
  2. Реализовать подсчет выигрыша

Если первое - то зачем вы пытаетесь сделать второе?
Если второе - то не хватает требований: AADBB = AAA or BBB or AAA+BBB? ADDD = DDD or AAA or AAA+DDD? AADDDDBB = AAA+DDD or DDD+BBB or AAA+BBB?


(Владислав Кузь) #7

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


(Владислав Кузь) #8

Спасибо, буду изменять сейчас, благодарю за ссылку.


(vmaximv) #9

Тогда вы должны понимать

  1. Вы не можете протестировать систему, если нет возможности привести ее в детерминированное состояние.
  2. Если вы можете привести систему в необходимое состояние, хешмэп эквивалентных классов вариантов комбинаций и их выигрышей строится на раз-два(три).

(Artur Korobeynyk) #10

Что-то такое набросал, не проверял, но должно работать:

def vuigrash(vhod):
    k = 0
    jack_pot_count = 0
    jack_pot_win_value = 0
    jack_pot_won = False
    for i in vhod:
        k+=1
        if jack_pot_won:
            jack_pot_won = False
            continue
        if((k < (len(vhod))) and (i == vhod[k])):
            jack_pot_count += 1
        else:
            jack_pot_count = 0
        if(jack_pot_count == 2):
            jack_pot_count = 0;
            jack_pot_win_value += values[i+i+i]
            jack_pot_won = True
    return jack_pot_win_value

line = 'ABCAAAAABCDDDC'
income_amount = 10
test_amount = 20
values = {
'AAA': 15,
'BBB': 20,
'CCC': 30,
'DDD':40
}

print vuigrash(line)

(5am) #11

судя по коду, тут не учитывается что:

Проблема в символе ‘D’ он универсален, то есть при выпадении комбинации ‘ADA’ символ D заменит A


(Artur Korobeynyk) #12

А, точно точно. Забыл, что есть универсальные символы. Ну в этот алгоритм легко добавить ещё одну проверку

if((k < (len(vhod))) and ((i == vhod[k]) or (vhod[k] == 'D'))):

Ну или что-то типа этого. Ещё можно с рекурсией задачу сделать. А вобще, это смотрится как тестовое задание от работодателя. Задача не сложная, и скорее всего не из раельного проэкта, а больше проверяет мышление. Так что работодатели, проверьте ка своих кандидатов на использование алгоритмов с этого форума )


(5am) #13

change - мой вариант имел баг и игнорировал DDD :smile:


(5am) #14

ага, на этом форуме уже встречалось похожее, правда там была не комбинация из 3х одинаковых символов


(vmaximv) #15

Товарищи - у меня в голове решение занимает не более 6-7 строк - что вы за спаггети-код вылаживаете? o_O
@arturk, а на каком основании вы решили что AADDD = 15, а не 40?
И у вас тоже таки баг - ADD дает 40


(Artur Korobeynyk) #16

Извиняюсь за реализацию, я забыл о джокере (символе, который может заменять другие). Так что изначально в алгоритм его не вставил, а после первого же комментария вслепую попытался всунуть проверку. Скрипт не запускал вобще )