1 Востаннє редагувалося koala (21.07.2021 19:34:32)

Тема: Не можу зрозуміти чому не працює програма для розшифрування тестів

Зразок тестів:

|*|Палочки і колбочки знаходяться в:|*|А. Сітківці;|*|В. Скловидному тілі;|*|С. Кришталику;|*|D. Райдужці;|*|Е. Рогівці.|*||*||*||*|Ж|*|Пігментні клітини знаходяться в:|*|А. Кришталику;|*|В. Райдужці;|*|С. Сітківці;|*|D. Скловидному тілі;|*|Е. Передній камері.|*||*||*||*|Д|*|Гострота зору перевіряється;|*|А. Периметром;|*|В. Таблицями Рабкіна;|*|С. Таблицею Сивцева;|*|D. Кампіметром;|*|Е. Офтальмоскопом.|*||*||*||*|µ|*|Поле зору перевіряється:|*|А. Таблицею Сивцева;|*|В. Периметром;|*|С. Таллицями Рабкіна;|*|D. Тонометром;|*|Е. Офтальмоскопом.|*||*||*||*|Д|*|Кольоровідчуття перевіряється:|*|А. Таблицею Сивцева;|*|В. Таблицями Рабкіна;|*|С. Периметром;|*|D. Кампіметром;|*|Е. Офтальмоскопом.|*||*||*||*|Д|*|В нормі гострота зору позначається:|*|А. 0,1;|*|В. 0,5;|*|С. 1,5;|*|D. 1,0;|*|Е. 2,0.|*||*||*||*|Д|*|Стандартна відстань для перевірки зору:|*|А. 10 м;|*|В. 2 м;|*|С. 6 м;|*|D. 5 м;|*|Е. 3 м.|*|    |*|    |*|    |*|BX}|*|
Програма:
z=input("""Введіть тести:
""")

n= -1

p1=z.find("|*|f")
while p1>n:
    z=z.replace("|*|f", "|*|")
    z=z.replace("f|*|", "|*|")
    z=z.replace("|*|X", "|*|")
    z=z.replace("X|*|", "|*|")
    z=z.replace("|*|}", "|*|")
    z=z.replace("}|*|", "|*|")
    p1=z.find("|*|f")

p2=z.find("f|*|")
while p2>n:
    z=z.replace("f|*|", "|*|")
    z=z.replace("|*|f", "|*|")
    z=z.replace("|*|X", "|*|")
    z=z.replace("X|*|", "|*|")
    z=z.replace("|*|}", "|*|")
    z=z.replace("}|*|", "|*|")
    p2=z.find("f|*|")

p3=z.find("|*|X")
while p3>n:
    z=z.replace("|*|X", "|*|")
    z=z.replace("|*|f", "|*|")
    z=z.replace("f|*|", "|*|")
    z=z.replace("X|*|", "|*|")
    z=z.replace("|*|}", "|*|")
    z=z.replace("}|*|", "|*|")
    p3=z.find("|*|X")

p4=z.find("X|*|")
while p4>n:
    z=z.replace("X|*|", "|*|")
    z=z.replace("|*|f", "|*|")
    z=z.replace("f|*|", "|*|")
    z=z.replace("|*|X", "|*|")
    z=z.replace("|*|}", "|*|")
    z=z.replace("}|*|", "|*|")
    p4=z.find("X|*|")

p5=z.find("|*|}")
while p5>n:
    z=z.replace("|*|}", "|*|")
    z=z.replace("|*|f", "|*|")
    z=z.replace("f|*|", "|*|")
    z=z.replace("|*|X", "|*|")
    z=z.replace("X|*|", "|*|")
    z=z.replace("}|*|", "|*|")
    p5=z.find("|*|}")

p6=z.find("}|*|")
while p6>n:
    z=z.replace("}|*|", "|*|")
    z=z.replace("|*|f", "|*|")
    z=z.replace("f|*|", "|*|")
    z=z.replace("|*|X", "|*|")
    z=z.replace("X|*|", "|*|")
    z=z.replace("|*|}", "|*|")
    p6=z.find("}|*|")

#Заміна на А

pE=z.find("|*|E|*|")
while pE>n:
    z=z.replace("|*|E|*|","|*|A.|*|")
    pE=z.find("|*|E|*|")

pЖ=z.find("|*|Ж|*|")
while pЖ>n:
    z=z.replace("|*|Ж|*|","|*|A.|*|")
    pЖ=z.find("|*|Ж|*|")

pv=z.find("|*|%|*|")
while pv>n:
    z=z.replace("|*|%|*|","|*|A.|*|")
    pv=z.find("|*|%|*|")

pdk=z.find("|*|¦|*|")
while pdk>n:
    z=z.replace("|*|¦|*|","|*|A.|*|")
    pdk=z.find("|*|¦|*|")

#Заміна на B

pD=z.find("|*|D|*|")
while pD>n:
    z=z.replace("|*|D|*|","|*|B.|*|")
    pD=z.find("|*|D|*|")

pД=z.find("|*|Д|*|")
while pД>n:
    z=z.replace("|*|Д|*|","|*|B.|*|")
    pД=z.find("|*|Д|*|")

pd=z.find("|*|$|*|")
while pd>n:
    z=z.replace("|*|$|*|","|*|B.|*|")
    pd=z.find("|*|$|*|")

pkr=z.find("|*|¤|*|")
while pkr>n:
    z=z.replace("|*|¤|*|","|*|B.|*|")
    pkr=z.find("|*|¤|*|")

#Заміна на C

pC=z.find("|*|C|*|")
while pC>n:
    z=z.replace("|*|C|*|","|*|C.|*|")
    pC=z.find("|*|C|*|")

pm=z.find("|*|µ|*|")
while pm>n:
    z=z.replace("|*|µ|*|","|*|C.|*|")
    pm=z.find("|*|µ|*|")

ph=z.find("|*|#|*|")
while ph>n:
    z=z.replace("|*|#|*|","|*|C.|*|")
    ph=z.find("|*|#|*|")

pk=z.find("|*|•|*|")
while pk>n:
    z=z.replace("|*|•|*|","|*|C.|*|")
    pk=z.find("|*|•|*|")

#Заміна на D

pB=z.find("|*|B|*|")
while pB>n:
    z=z.replace("|*|B|*|","|*|D.|*|")
    pB=z.find("|*|B|*|")

pl=z.find('|*|"|*|')
while pl>n:
    z=z.replace('|*|"|*|',"|*|D.|*|")
    pl=z.find('|*|"|*|')

#Заміна на E

pA=z.find("|*|A|*|")
while pA>n:
    z=z.replace("|*|A|*|","|*|E.|*|")
    pA=z.find("|*|A|*|")

pБ=z.find("|*|Б|*|")
while pБ>n:
    z=z.replace("|*|Б|*|","|*|E.|*|")
    pБ=z.find("|*|Б|*|")

po=z.find("|*|!|*|")
while po>n:
    z=z.replace("|*|!|*|","|*|E.|*|")
    po=z.find("|*|!|*|")

#Заміна пробелів

pst=z.find("    ")
while pst>n:
    z=z.replace("    "," ")
    pst=z.find("    ")

pp=z.find("  ")#2 пробели
while pp>n:
    z=z.replace(" "," ")
    pp=z.find(" ")

pppa=z.find("|*| ")
while pppa>n:
    z=z.replace("|*| ","|*|")
    pppa=z.find("|*| ")

ppda=z.find(" |*|")
while ppda>n:
    z=z.replace(" |*|","|*|")
    ppda=z.find(" |*|")

#Заміна на абзаци

p01=z.find("|*||*||*||*|")
while p01>n:
    z=z.replace("|*||*||*||*|","|*|")
    p01=z.find("|*||*||*||*|")

p02=z.find("|*|")
while p02>n:
    z=z.replace("|*|","""
""")
    p0=z.find("|*|")

print ("""Розшифровані тести
""")
print(z)

2 Востаннє редагувалося ch0r_t (21.07.2021 19:30:08)

Re: Не можу зрозуміти чому не працює програма для розшифрування тестів

...інсульт вже близько

https://replace.org.ua/uploads/images/10563/dc294e92252771f2caec18efd43079f7.png

Правило 3.2: ...Не забувайте про наявність тегів code.

І що "Зразок тестів"? - напишіть що вам треба зробити. Що це за непоміркований clusterf*ck тут?

3

Re: Не можу зрозуміти чому не працює програма для розшифрування тестів

Це моя перша тема, дякую за те, що виправили мою помилку.

4 Востаннє редагувалося ch0r_t (21.07.2021 20:00:17)

Re: Не можу зрозуміти чому не працює програма для розшифрування тестів

Стосовно першої половини:
В кожному while перевіряється один і той же паттерн, - такі повторення пряма підказка описати щось як більш загальну функцію і краще використайте мабуть for цикл разом з range(). Те ж з символами/комбінаціями які шукаєте, заштовхайте краще їх в масив(-и), замість того аби копіювати все в код що раз.

**існує метод count().

5 Востаннє редагувалося koala (22.07.2021 06:16:30)

Re: Не можу зрозуміти чому не працює програма для розшифрування тестів

Від модератора: додав теги code і прибрав оте простирадло під спойлер, наступного разу самі

Я не дуже помилюся, якщо припущу, що ви намагаєтеся почистити відсканований текст від зайвих знаків? Будь ласка, окрім коду і даних, пояснюйте також, що ви хочете зробити (якщо треба - чому обрали саме такий спосіб), і з чим виникли проблеми.

Кілька думок стосовно коду:

z=input("""Введіть тести:
""")

У вас же, мабуть, ті тести в файлі зберігаються? Ну то й завантажуйте їх із файла і зберігайте у файл. У гіршому разі користуйтеся перенаправленням введення-виведення. input з аргументом - то для навчання, не більше.

n= -1
p1=z.find("|*|f")
while p1>n:
    z=z.replace("|*|f", "|*|")
    z=z.replace("f|*|", "|*|")
    z=z.replace("|*|X", "|*|")
    z=z.replace("X|*|", "|*|")
    z=z.replace("|*|}", "|*|")
    z=z.replace("}|*|", "|*|")
    p1=z.find("|*|f")

Ви оте p1 ще десь використовуєте? Ні. То нащо воно вам? Внесіть вираз просто в while:

while z.find("|*|f")>n:

І останній рядок теж зник. А n у нас що? -1. Тобто поки знаходиться. Перевірка входження - це оператор in:

while "|*|f" in z:

Далі. Всі ці рядки ("|*|f", "|*|X" і т.д.) повторюються і далі. Я не знаю, наскільки захаращені ними дані, але якщо їх так багато, як випливає з вашого коду, то

SEPARATOR = "|*|"               # роздільник
SEPARATOR_TRASH = "X}f"            # сміття
while any(SEPARATOR+trash in z or trash+SEPARATOR in z for trash in SEPARATOR_TRASH):
    for trash in SEPARATOR_TRASH: #trash набуває послідовно значень 'X','}','f'
        z = z.replace(trash+SEPARATOR, SEPARATOR).replace(SEPARATOR+trash, SEPARATOR)

оце - ваші 6 циклів.
Далі - всі пробіли "лікуються" банальним

while "  " in z:
    z = z.replace("  "," ")

До речі, підозрюю, що саме там ваша проблема (про яку ви не написали) - ви міняли 1 пробіл на 1, доки в стрічці лишається 1 пробіл, тобто вічно.
З відповідями те саме, тільки нам знадобиться трохи складніша за стрічку структура для того, щоб їх тримати (тут би словник, але обійдемося списками; добре що там лише по одному символу):

WRONG_ANSWERS = [["A.","EЖ%¦"],
                 ["B.","DД$¤"],
                 ["C.",""], #тут вже самостійно заповніть, за аналогією
                 ["D.",""],
                 ["E.",""]]
for answer, wrongs in WRONG_ANSWERS:
    for wrong in wrongs:
        z = z.replace(SEPARATOR+wrong+SEPARATOR, SEPARATOR+answer+SEPARATOR)

З абзацами - те саме, тільки ще простіше. У вас же не буває 10 отих розділювачів поспіль? То й while не потрібен:

z = z.replace(SEPARATOR*4, SEPARATOR).replace(SEPARATOR, '\n') #\n - від new line
Подякували: ch0r_t, vasyl_da2

6

Re: Не можу зрозуміти чому не працює програма для розшифрування тестів

А, ще питання: оцей розділювач, |*| - це точно в оригіналі так чи вже результат якоїсь обробки?

7 Востаннє редагувалося ch0r_t (21.07.2021 20:42:25)

Re: Не можу зрозуміти чому не працює програма для розшифрування тестів

До речі, метод .replace() приймає ще й третій параметр, - яку кількість знайдених під-рядків замінити.

не люблю я всі ці while.
src_text = input('Введіть тести:')

symb_seq = ["|*|f", "f|*|", "|*|X", "X|*|", "|*|}", "}|*|"]
repl_smb = "|*|" 

def fnr(what_2find, in_What, repl_With):
    for s in what_2find:
        n = in_What.count(s)
        in_What = in_What.replace(s, repl_With, n)
    return in_What

result_text = fnr(symb_seq, src_text, repl_smb)

8

Re: Не можу зрозуміти чому не працює програма для розшифрування тестів

Так, я намагаюсь почистити від зайвих символів.

Я намагаюсь створити програму для очистки від сміття та розшифрувати ( замінити на правильні відповіді)

Я в IDLE запускаю програма і вона не завершується.

Так є файли, я досконало володію робою з файлами в python, тому обрав input, я використовую тільки для навчання.

Дякую за пораду з z.find

Я намагався простішим способом їх розшифрувати

Я початківець в Python, тому ще не добре не знаю як використовувати цикли.

|*| - це роздільний з оригіналу

Дякую за, те що ви вказали на мої помилки та як їх виправити

9 Востаннє редагувалося koala (22.07.2021 07:03:22)

Re: Не можу зрозуміти чому не працює програма для розшифрування тестів

Ось, усе разом, відтестоване, з коментарями для новачка:
# константи (тобто те, що змінювати не слід) прийнято позначати ВЕЛИКИМИ_ЛІТЕРАМИ
SEP = "|*|"               # роздільник
TRASH = "X}f"             # сміття. Може, сюди й пробіл додати? Має певний сенс: |*| f |*| не буде 
                          # почищене. На прикладі "X}f " працює добре, і пробіли далі не треба чистити
ANSWERS = [["A.","EЖ%¦"], # ["правильна стрічка","символи_які_на_неї_замінюються"]
           ["B.","DД$¤"],
           ["C.","Cµ#•"], 
           ["D.",'B"'],
           ["E.","AБ!"]]

text=input("Введіть тести:\n")

# for елемент in ітероване: - це цикл по елементах; цикл підставить значення кожного елементу, 
# тут - символу зі стрічки TRASH
# any(умова зі змінною for змінна in ітероване) перевіряє, чи виконується умова хоч 
# для одного елементу ітерованого
# ітероване (iterable) - те, що можна перебирати: списки, стрічки, функція range і т.д.
while any(SEP+trash in text or trash+SEP in text for trash in TRASH):
    for trash in TRASH: #trash набуває послідовно значень 'X','}','f'
        text = text.replace(trash+SEP, SEP).replace(SEP+trash, SEP)

#гадаю, пробіли краще чистити тут, до відповідей
while "  " in text:
    text = text.replace("  "," ")

for answer, wrongs in ANSWERS:
    # спершу answer буде "A.", wrong - "EЖ%¦"; далі - "B." і "DД$¤" і т.д.
    for wrong in wrongs:
        text = text.replace(SEP+wrong+SEP, SEP+answer+SEP)

text = text.replace(SEP*4, SEP).replace(SEP, '\n') #SEP*4 - це 4 рази повторена стрічка SEP

print ("Розшифровані тести\n")
print(text)
tchort написав:

до речі, метод .replace() приймає ще й третій параметр,

Ні, пане tchort, це погана ідея.
По-перше, автор питання, швидше за все, не знає, що таке функції (хоч варто було б вивчити).
По-друге, як видно з коду, йому треба не почистити рівно стільки разів, скільки воно в стрічці, а далі зупинитися - а, навпаки, чистити все те сміття, поки воно там є. Скажімо, "|*|f{f" має стати "|*|". Ваш код цього не зробить, та й авторський код домагався цього численими повтореннями; досить довгу комбінацію "f{f{f{f{f{f{f{f{f{f{f{f{" він би пропустив, але ясно, що такого у відсканованому не трапиться.
По-третє, за можливості дотримуйтеся PEP8. Особливо в порадах новачкам. Що це за гібрид верблюда зі змією in_What?

vasyl_da, в теги code береться лише код, а не кожен рядок відповіді :)

vasyl_da написав:

я досконало володію робою з файлами в python

вибачте, не втримався

https://replace.org.ua/uploads/images/931/3b815a906b5450cb3e074cfb12393129.jpeg

Подякували: ch0r_t, vasyl_da2

10

Re: Не можу зрозуміти чому не працює програма для розшифрування тестів

Боже як я не терпів всієї тієї обробки тексту, в Python здається, коли пам'ятаю з підручника, якась ціла мікро-мова для обробки тексту рег-виразами. Вічно ще на думці в мене генералізація/узагальнення і швидкість...навіть де це не потрібно. Погана ознака.
Краще я утримаюсь поки від порад щодо Python іншим, - надто заржавів.

Що це за гібрид верблюда зі змією in_What?

В мене так майже будь де...не знаю, мені легше і швидше читати. Мабуть сліпну.

По-третє, за можливості дотримуйтеся PEP8. Особливо в порадах новачкам.

-Зберіг в закладках. Прочитаю. Не люблю цю мову, та все ж часто повертаюсь до неї, біс знає чому.

11

Re: Не можу зрозуміти чому не працює програма для розшифрування тестів

Та ясно, що тими регулярками швидше. Тут купа зайвої роботи виконується, весь текст перестворюється багато разів. Але ж це треба людину, що з for не розібралася, додатково навчати регуляркам.

Подякували: ch0r_t, vasyl_da2