Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 02.05.2022
Сообщений: 8

Документация в дорогу

02.05.2022, 20:52. Показов 2034. Ответов 2

Студворк — интернет-сервис помощи студентам
Делал-делал — в итоге всё должно работать, но почему-то при первом тесте валит, мол, не совпадает количество параграфов..
Я знаю, что на этом форуме уже есть такие старые темы, но ни на одной нету ответа.
Может кто-то решил уже это или есть у кого идеи, что можно добавить в код ниже, чтобы всё проходило? Руки просто опускаются...

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
rom docx import Document
 
openBold, openItalic, lineCounter = 0, 0, True
 
 
def markdown_to_docx(inp=''):
    global lineCounter
 
    def converter(doc, text, style=None):
        global openBold, openItalic
 
        """
        :param doc: Document() class
        :param text:
        :param style: heading*num* | paragraph*symb*
 
        """
        if style is None:
            p = doc.add_paragraph()
            for char in text:
                if char == '*':
                    openBold += 1
                    if openBold == 1:
                        if openItalic == 0:
                            p.add_run(text[:text.find(char)])  # common
                        elif openItalic == 1:
                            p.add_run(text[:text.find(char)]).italic = True  # italic
                        text = text[text.find(char) + 1:]
                    elif openBold == 2:
                        text = text[1:]
                    elif openBold == 3:
                        if openItalic == 1:
                            runner = p.add_run(text[:text.find(char)])  # bold italic
                            runner.bold, runner.italic = True, True
                        else:
                            p.add_run(text[:text.find(char)]).bold = True  # bold
                        text = text[text.find(char) + 1:]
                    elif openBold == 4:
                        text = text[1:]
                        openBold = 0
                elif char == '_':
                    openItalic += 1
                    if openItalic == 1:
                        if openBold == 0:
                            p.add_run(text[:text.find(char)])  # common
                        elif openBold == 2:
                            p.add_run(text[:text.find(char)]).bold = True  # italic
                        text = text[text.find(char) + 1:]
                    elif openItalic == 2:
                        if openBold == 2:
                            runner = p.add_run(text[:text.find(char)])  # bold italic
                            runner.italic, runner.bold = True, True  # italic bold
                        else:
                            p.add_run(text[:text.find(char)]).italic = True  # italic
                        text = text[text.find(char) + 1:]
                        openItalic = 0
            p.add_run(text)
 
        elif style[:-1] == 'heading':
            h = doc.add_heading(level=int(style[-1]))
            for char in text:
                if char == '*':
                    openBold += 1
                    if openBold == 1:
                        if openItalic == 0:
                            h.add_run(text[:text.find(char)])  # common
                        elif openItalic == 1:
                            h.add_run(text[:text.find(char)]).italic = True  # italic
                        text = text[text.find(char) + 1:]
                    elif openBold == 2:
                        text = text[1:]
                    elif openBold == 3:
                        if openItalic == 1:
                            runner = h.add_run(text[:text.find(char)])  # bold italic
                            runner.bold, runner.italic = True, True
                        else:
                            h.add_run(text[:text.find(char)]).bold = True  # bold
                        text = text[text.find(char) + 1:]
                    elif openBold == 4:
                        text = text[1:]
                        openBold = 0
                elif char == '_':
                    openItalic += 1
                    if openItalic == 1:
                        if openBold == 0:
                            h.add_run(text[:text.find(char)])  # common
                        elif openBold == 2:
                            h.add_run(text[:text.find(char)]).bold = True  # italic
                        text = text[text.find(char) + 1:]
                    elif openItalic == 2:
                        if openBold == 2:
                            runner = h.add_run(text[:text.find(char)])  # bold italic
                            runner.italic, runner.bold = True, True  # italic bold
                        else:
                            h.add_run(text[:text.find(char)]).italic = True  # italic
                        text = text[text.find(char) + 1:]
                        openItalic = 0
            h.add_run(text)
        elif style == 'paragraphLB':
            p = doc.add_paragraph(style='List Bullet')
            for char in text:
                if char == '*':
                    openBold += 1
                    if openBold == 1:
                        if openItalic == 0:
                            p.add_run(text[:text.find(char)])  # common
                        elif openItalic == 1:
                            p.add_run(text[:text.find(char)]).italic = True  # italic
                        text = text[text.find(char) + 1:]
                    elif openBold == 2:
                        text = text[1:]
                    elif openBold == 3:
                        if openItalic == 1:
                            runner = p.add_run(text[:text.find(char)])  # bold italic
                            runner.bold, runner.italic = True, True
                        else:
                            p.add_run(text[:text.find(char)]).bold = True  # bold
                        text = text[text.find(char) + 1:]
                    elif openBold == 4:
                        text = text[1:]
                        openBold = 0
                elif char == '_':
                    openItalic += 1
                    if openItalic == 1:
                        if openBold == 0:
                            p.add_run(text[:text.find(char)])  # common
                        elif openBold == 2:
                            p.add_run(text[:text.find(char)]).bold = True  # italic
                        text = text[text.find(char) + 1:]
                    elif openItalic == 2:
                        if openBold == 2:
                            runner = p.add_run(text[:text.find(char)])  # bold italic
                            runner.italic, runner.bold = True, True  # italic bold
                        else:
                            p.add_run(text[:text.find(char)]).italic = True  # italic
                        text = text[text.find(char) + 1:]
                        openItalic = 0
            p.add_run(text)
        elif style == 'paragraphLN':
            p = doc.add_paragraph(style='List Number')
            for char in text:
                if char == '*':
                    openBold += 1
                    if openBold == 1:
                        if openItalic == 0:
                            p.add_run(text[:text.find(char)])  # common
                        elif openItalic == 1:
                            p.add_run(text[:text.find(char)]).italic = True  # italic
                        text = text[text.find(char) + 1:]
                    elif openBold == 2:
                        text = text[1:]
                    elif openBold == 3:
                        if openItalic == 1:
                            runner = p.add_run(text[:text.find(char)])  # bold italic
                            runner.bold, runner.italic = True, True
                        else:
                            p.add_run(text[:text.find(char)]).bold = True  # bold
                        text = text[text.find(char) + 1:]
                    elif openBold == 4:
                        text = text[1:]
                        openBold = 0
                elif char == '_':
                    openItalic += 1
                    if openItalic == 1:
                        if openBold == 0:
                            p.add_run(text[:text.find(char)])  # common
                        elif openBold == 2:
                            p.add_run(text[:text.find(char)]).bold = True  # italic
                        text = text[text.find(char) + 1:]
                    elif openItalic == 2:
                        if openBold == 2:
                            runner = p.add_run(text[:text.find(char)])  # bold italic
                            runner.italic, runner.bold = True, True  # italic bold
                        else:
                            p.add_run(text[:text.find(char)]).italic = True  # italic
                        text = text[text.find(char) + 1:]
                        openItalic = 0
            p.add_run(text)
 
    dc, ls = Document(), inp.split('\n')
    name = ls[0]
    for line in ls[1:]:
        if line == '':
            if lineCounter:
                lineCounter = False
                continue
        if line:
            lineCounter = True
            if line[:7].count('#') == 1:
                converter(dc, line[2:], 'heading1')
 
            elif line[:7].count('#') == 2:
                converter(dc, line[3:], 'heading2')
 
            elif line[:7].count('#') == 3:
                converter(dc, line[4:], 'heading3')
 
            elif line[:7].count('#') == 4:
                converter(dc, line[5:], 'heading4')
 
            elif line[:7].count('#') == 5:
                converter(dc, line[6:], 'heading5')
 
            elif line[:7].count('#') == 6:
                converter(dc, line[7:], 'heading6')
 
            elif str(line[:2]) == '- ':
                converter(dc, line[2:], 'paragraphLB')
 
            elif str(line[:2]) == '* ':
                converter(dc, line[2:], 'paragraphLB')
 
            elif str(line[:2]) == '+ ':
                converter(dc, line[2:], 'paragraphLB')
 
            elif line[0].isdigit() and line[1] == '.':
                converter(dc, line[3:], 'paragraphLN')
 
            elif line[:3].count('_') == 1 or line[:3].count('*') == 1:
                dc.add_paragraph().add_run(line[1:-1]).italic = True
            elif line[:3].count('_') == 2 or line[:3].count('*') == 2:
                dc.add_paragraph().add_run(line[2:-2]).bold = True
            elif line[:3].count('_') == 3 or line[:3].count('*') == 3:
                runner = dc.add_paragraph().add_run(line[3:-3])
                runner.bold = True
                runner.italic = True
            else:
                converter(dc, line)
    dc.save(f"{name}.docx")

тест слишком длинный, но вот его часть:

test01
Абзацы создаются при помощи пустой строки. Если вокруг текста сверху и снизу есть пустые строки, то текст превращается в абзац.

Чтобы сделать перенос строки вместо абзаца,
нужно поставить два пробела в конце предыдущей строки.

Заголовки отмечаются диезом `#` в начале строки, от одного до шести. Например:

# Заголовок первого уровня
## Заголовок h2
### Заголовок h3
#### Заголовок h4
##### Заголовок h5
###### Заголовок h6

В декоративных целях заголовки можно «закрывать» с обратной стороны.

### Списки

Для разметки неупорядоченных списков можно использовать или `*`, или `-`
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.05.2022, 20:52
Ответы с готовыми решениями:

Документация в дорогу
Константин снова уезжает на каникулы и хочет взять с собой документацию. Только в этот раз структура документации значительно сложнее, и...

Документация в дорогу
Константин снова уезжает на каникулы и хочет взять с собой документацию. Только в этот раз структура документации значительно сложнее, и...

Документация в дорогу
Константин снова уезжает на каникулы и хочет взять с собой документацию. Только в этот раз структура документации значительно сложнее, и...

2
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
02.05.2022, 21:05
Я так полагаю, Константин снова уезжает на каникулы?.. Внизу страницы есть несколько упоминаний этого вопроса (Похожие темы), там есть что-то полезное?
0
0 / 0 / 0
Регистрация: 02.05.2022
Сообщений: 8
02.05.2022, 21:08  [ТС]
Именно эта самая задача.
Константин снова уезжает на каникулы и хочет взять с собой документацию. Только в этот раз структура документации значительно сложнее, и поэтому необходимо модифицировать конвертер, который вы написали в задаче «Простая документация в дорогу».

Помогите Константину и напишите новый конвертер, который принимает на вход название документа, а потом несколько строк с содержимым документа в формате Markdown. Ваш конвертер должен создавать документ Word и сохранять его в файле <название документа>.docx.

Помимо элементов, с которыми уже умеет работать предыдущая программа, она должна также корректно обрабатывать: обычный, наклонный, жирный и наклонно-жирный текст внутри обычных абзацев, нумерованных и ненумерованных списков. Обратите внимание, что внутри жирного текста может быть кусочек наклонного текста, и тогда он должен быть написан наклонно-жирным стилем (такое верно и для жирного текста внутри наклонного).

На пустые строки Markdown создаются пустые строки в документе только в том случае, если эта строка не первая после строки с текстом.

Формат ввода
Строка с названием документа, а затем его содержимое на нескольких строках в формате Markdown.

Формат вывода
Сохранённый на диске в директории с программой файл <название документа>.docx со сконвертированным содержимым.
в похожих темах даже не смотрите - там нет ничего, тем более ответов
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.05.2022, 21:08
Помогаю со студенческими работами здесь

Документация в дорогу
Здравствуйте, у кого есть, поделитесь, пожалуйста, тестом для проверки задачи &quot;Документация в дорогу&quot;, кто сейчас решает такую...

Документация в дорогу
Константин снова уезжает на каникулы и хочет взять с собой документацию. Только в этот раз структура документации значительно сложнее, и...

Документация в дорогу
Константин снова уезжает на каникулы и хочет взять с собой документацию. Только в этот раз структура документации значительно сложнее, и...

Простая документация в дорогу
Константин уезжает на каникулы к бабушке в деревню, Интернет там не работает. Однако в свободное время он хотел почитать документацию на...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru