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

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

02.05.2022, 20:52. Показов 1988. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru