Здравствуйте! "Обучаю" программу грамотно выводить русские слова. Программа для мобильников, поэтому не все слова целиком вмещаются в строку. Следовательно, нужно как-то разделять их и переносить.
Хочу сделать такой алгоритм.
Разбираем слово, не влезающее в строку. Если буква - гласная, но не первая и не предпоследняя в слове, после нее ставим дефис и дописываем слово на следующей строке.
Вопросы:
1) Какие слова по этому алгоритму будут переноситься неправильно?
2) Если процент неверно переносимых слов велик, то как усовершенствовать алгоритм?
P.S. Алгоритм будет цикличным, поэтому не должно возникать проблем со словами, в которых стыкуются приставка, оканчивающаяся на гласную, и корень, на гласную начинающийся. Переноситься должны корни, суффиксы, окончания.
P.P.S. Просьба к модератору. Пожалуйста, переместите тему в наиболее подходящий раздел. К сожалению, я не могу определить, какому из разделов она соответствует :fp:
Цитата: Hakami от июля 6, 2012, 11:38
Здра-вству-йте! "Обу-чаю" про-гра-мму гра-мо-тно вы-во-ди-ть ру-сские сло-ва. Про-гра-мма для мо-би-льни-ков, по-э-то-му не все сло-ва це-ли-ком вме-ща-ю-тся в стр-оку. Сле-до-ва-те-льно, ну-жно как-то ра-зде-ля-ть их и пе-ре-но-си-ть.
Хо-чу сде-ла-ть та-кой алго-ри-тм.
Ра-зби-ра-ем сло-во, не вле-за-ю-щее в стро-ку. Если бу-ква - гла-сная, но не пе-рвая и не пре-дпо-сле-дняя в сло-ве, по-сле нее ста-вим де-фис и до-пи-сы-ва-ем сло-во на сле-ду-ю-щей стро-ке.
Во-про-сы:
1) Ка-кие сло-ва по это-му алго-ри-тму бу-дут пе-ре-но-си-ться не-пра-ви-льно?
2) Если про-це-нт не-ве-рно пе-ре-но-си-мых слов ве-лик, то как усо-ве-рше-нств-ова-ть алго-ри-тм?
правильно понял алго-ри-тм?
lehoslav, спасибо ;up:
Разве что "в стро-ку" в первом абзаце.
Значит главный минус - "ть"...
Казусы вроде "не-пра-ви-ЛЬНО", "алго-ри-ТМ"... :???
Добавить что ли цикл, определяющий наличие гласных после выбранной...
«Обу-чаю», с отрывом одной буквы от корня — разве не ошибка?
Цитата: Python от июля 6, 2012, 14:47
«Обу-чаю», с отрывом одной буквы от корня — разве не ошибка?
Ошибка. Нужно найти все морфемы, кроме приставок, которые могут встретиться в словах, не вмещающихся в строке длиной от 100 пикселей.
Кстати, к гласным в программе можно присовокупить и "ь" (будет "сле-до-ва-те-ль-но" и "пра-ви-ль-но", но перенос-то только один, ближайший к концу, но еще не уходящий за пределы строки, т.е., например, "следователь-но", если, конечно, "следователь" влезет).
Я в детстве сделал программу, расставляющий мягкие переносы (потому что у меня Word отказывался переносить русские слова).
Алгоритм был примерно такой:
1. В тексте выискивались непрерывные последовательности букв, каждая из них рассматривалась отдельно (т.е. «наконец-то» интерпретировалось как два слова).
2. Стыку каждых двух соседних букв присваивался флаг «можно/нельзя переносить». Первоначально он везде принимает значение «можно».
3. Флаг на стыке согласная-гласная меняется на «нельзя». («слXовXо»)
4. Флаг правее первой буквы и левее последней меняется на «нельзя». («АXзиXя»)
5. Все флаги с начала слова до первой его гласной меняются на нельзя; потом то же самое с обратной стороны: флаги с конца слова до последней гласной меняются на «нельзя». («сXтXроителXь»)
6. Флаги левее букв Й, Ь, Ъ меняются на «нельзя». («безXъязыкиXй»)
7. Флаги левее и правее удвоенной согласной меняются на «нельзя». («програXммXный»)
8. Там где всё еще стоят флаги «можно» расставляются мягкие переносы.
Приставками и сложными словами я не заморачивался. Результат получался, разумеется, непрофессиональный, но вполне подходил для «газетного» стиля, и для мобильников, насколько я понимаю, тоже подошел бы.
Т.е. у меня было примерно так:
ЦитироватьЗдра-в-с-т-вуй-те! "Обу-чаю" про-г-рам-му гра-мо-т-но вы-во-дить рус-ские сло-ва. Про-г-рам-ма для мо-би-ль-ни-ков, по-э-то-му не все сло-ва це-ли-ком вме-ща-ю-т-ся в стро-ку. Сле-до-ва-те-ль-но, ну-ж-но как-то ра-з-де-лять их и пе-ре-но-сить.
Хо-чу сде-лать та-кой ал-го-ритм.
Ра-з-би-ра-ем сло-во, не вле-за-ю-щее в стро-ку. Если бу-к-ва - гла-с-ная, но не пе-р-вая и не пре-д-по-сле-д-няя в сло-ве, по-с-ле нее ста-вим де-фис и до-пи-сы-ва-ем сло-во на сле-ду-ю-щей стро-ке.
Во-про-сы:
1) Ка-кие сло-ва по это-му ал-го-ри-т-му бу-дут пе-ре-но-си-ть-ся не-п-ра-ви-ль-но?
2) Ес-ли про-цент не-ве-р-но пе-ре-но-си-мых слов ве-лик, то как усо-ве-р-ше-н-с-т-во-вать ал-го-ритм?
Таким образом, мой алгоритм мог перенести и «пе-рвый» и «пер-вый» — что, вроде бы, соответствует формальным правилам.
Цитата: Hellerick от июля 6, 2012, 15:37
7. Флаги левее и правее удвоенной согласной меняются на «нельзя». («програXммXный»)
Разве так переносить нельзя: «программ-ный»?
Цитата: Lodur от июля 6, 2012, 15:54
Цитата: Hellerick от июля 6, 2012, 15:37
7. Флаги левее и правее удвоенной согласной меняются на «нельзя». («програXммXный»)
Разве так переносить нельзя: «программ-ный»?
Гм...
Цитата: http://www.gramota.ru/spravka/rules/?rub=perenos7. Нельзя оставлять в конце строки или переносить в начало следующей две одинаковые согласные, стоящие между гласными.
Получается, что можно.
Цитата: http://www.gramota.ru/spravka/rules/?rub=perenos7. Нельзя оставлять в конце строки или переносить в начало следующей две одинаковые согласные, стоящие между гласными.
- значит, нужно оставить запрет перед одинаковыми согласными, а всякие "алл-еи" будут исключены по 3 пункту Вашего алгоритма (стык между согласной и гласной).
P.S. А в целом, алгоритм у Вас замечательный, спасибо :yes:.
Алё, ребята, здесь где-то недалеко это уже было растоплено...
Грубо говоря, как хошь, так и переноси.
Если есть желание не показаться свином, одинаковые буквы разбивай.
Если хочешь показаться не свином, постарайся не разбивать морфемы.
Но ни в коем случае не разбивай слог (буква согласного + буква гласного).
Если же не хочешь выглядеть полным идиотом, не переноси не слог (без буквы гласного).
Буквы же гласного выучи наизусть в "обессмысленную" скороговорку (ибо в этом "смысла нет", однако с упором на жёсткий контроль произношения): и, э, а, о, у, ы; е, ё, ю, я - именно в этой последовательности и с учётом знаков препинания...
Спасибо единомышленнику.
Бросаю здесь задел.
На время.
http://files.mail.ru/Q7G0VD
Цитировать4. Флаг правее первой буквы и левее последней меняется на «нельзя». («АXзиXя»)
5. Все флаги с начала слова до первой его гласной меняются на нельзя; потом то же самое с обратной стороны: флаги с конца слова до последней гласной меняются на «нельзя». («сXтXроителXь»)
Кажется, перенос недопустим и с отделением начальных и конечных групп, состоящих из одних гласных (ау-тизм, си-яя).
Цитата: Python от июля 8, 2012, 16:58
Кажется, перенос недопустим и с отделением начальных и конечных групп, состоящих из одних гласных (ау-тизм, си-яя).
Не слышал такого правила, но звучит разумно.
Вот что меня действительно интересует, это правила переноса в английском тексте. Нигде не могу найти внятной информации об этом.
В английском перенос завязан на делении по морфемам, даже если при этом разрываются слоги. Неуверен, разбиваются ли английские корни переносами на части.
К передпредыдущему.
Те же, что и в неанглийском, если речь о русской графике... Фонетико (не путпть с фонематикой) - морфемо - графические... То есть удобство (для за ради) речи/произношения/понимания/практики... Другого закона нет (хотя и были, и будут)... Но этот - главенствует (удобство)...
В английском не только по морфемам. Ещё и просто по слогам. Причём, насколько я заметил, liquida cum muta не разрываются. А вообще, в словарях даётся деление на слоги.
Начнем с того, что я слышал, а Америке и Британии сложились разные традиции переноса.
Насколько я понимаю, с одной стороны нужно стремиться к тому, чтобы первая часть слова подсказывала правильное произношение (в частности, указывая на открытость-закрытость слога), и с другой стороны чтобы переносной дефис не создавал неверное впечатление о словоделении (чтобы «leg-end» не воспринималось как «конец ноги»). Но формально это описать весьма трудно.
Цитата: wangjhenbai от июля 8, 2012, 17:45
А вообще, в словарях даётся деление на слоги.
Не деление на слоги, а «hyphenation». Не путаем. Как раз роль слогов в этом не совсем понятна.