В духе Patch the Image вот такая же проблема, но с текстом.
Вызов
Немного гнили сокрушил ваш драгоценный текст! Учитывая абзац, состоящий из символов ASCII, с прямоугольным отверстием где-то в нем, ваша программа должна попытаться заполнить отверстие соответствующим текстом, чтобы абзац смешивался как можно лучше.
Дальнейшие определения
- Отверстие всегда будет прямоугольным и может занимать несколько строк.
- Там будет только одна дыра.
- Обратите внимание, что дыра не обязательно попадает на границы слов (на самом деле, обычно это не так).
- Отверстие будет составлять не более 25% входного абзаца, но может перекрывать или расширяться за «конец» «нормального» текста (см. Примеры Евклида или Барсука ниже).
- Поскольку обнаружение дыры не является главной
#
целью этой проблемы, она будет состоять исключительно из хеш-меток, чтобы упростить идентификацию. - Никакое другое место во входном абзаце не будет иметь хеш-метки.
- Ваш код не может использовать «обычный» текст в приведенных ниже примерах - он будет только получать и обрабатывать текст с дырой в нем.
- Ввод может быть в виде одной многострочной строки, в виде массива строк (один элемент на строку), в виде файла и т. Д. - на ваш выбор наиболее удобный для вашего языка.
- При желании может быть принят необязательный дополнительный ввод, детализирующий координаты отверстия (например, кортеж координат или тому подобное).
- Пожалуйста, опишите ваш алгоритм в вашем представлении.
голосование
Избирателей просят оценить записи на основе того, насколько хорошо алгоритм заполняет текстовое отверстие. Некоторые предложения включают следующее:
- Соответствует ли заполненная область приблизительному распределению пробелов и знаков препинания, как в остальной части абзаца?
- Введена ли в заполненной области неверный синтаксис? (например, два пробела подряд, точка, за которой следует знак вопроса, ошибочная последовательность, например
, ,
и т. д.) - Если вы прищурите глаза (то есть вы на самом деле не читаете текст), можете ли вы увидеть, где раньше была дыра?
- Если за отверстием нет слов CamelCase, есть ли в нем слово? Если за пределами отверстия нет заглавных букв, есть ли в отверстии? Если за отверстием много заглавных букв, содержит ли отверстие пропорциональное количество?
Критерий достоверности
Для того чтобы представление считалось действительным, оно не должно изменять какой-либо текст абзаца за пределами дыры (включая завершающие пробелы). Одиночный завершающий перевод строки в самом конце не является обязательным.
Тестовые случаи
Формат - это оригинальный абзац в блоке кода, за которым следует тот же абзац с отверстием. Абзацы с отверстием будут использоваться для ввода.
1 (патч изображение)
In a popular image editing software there is a feature, that patches (The term
used in image processing is inpainting as @minxomat pointed out.) a selected
area of an image, based on the information outside of that patch. And it does a
quite good job, considering it is just a program. As a human, you can sometimes
see that something is wrong, but if you squeeze your eyes or just take a short
glance, the patch seems to fill in the gap quite well.
In a popular image editing software there is a feature, that patches (The term
used in image processing is inpainting as @minxomat pointed out.) a selected
area of an image, #############information outside of that patch. And it does a
quite good job, co#############is just a program. As a human, you can sometimes
see that something#############t if you squeeze your eyes or just take a short
glance, the patch seems to fill in the gap quite well.
2 (Геттисбергский адрес)
But, in a larger sense, we can not dedicate, we can not consecrate, we can not
hallow this ground. The brave men, living and dead, who struggled here, have
consecrated it, far above our poor power to add or detract. The world will
little note, nor long remember what we say here, but it can never forget what
they did here. It is for us the living, rather, to be dedicated here to the
unfinished work which they who fought here have thus far so nobly advanced. It
is rather for us to be here dedicated to the great task remaining before us-
that from these honored dead we take increased devotion to that cause for which
they gave the last full measure of devotion-that we here highly resolve that
these dead shall not have died in vain-that this nation, under God, shall have
a new birth of freedom-and that government of the people, by the people, for
the people, shall not perish from the earth.
But, in a larger sense, we can not dedicate, we can not consecrate, we can not
hallow this ground. The brave men, living and dead, who struggled here, have
consecrated it, far above our poor power to add or detract. The world will
little note, nor long remember what we say here, but it can never forget what
they did here. It is for us the living, rather, to be dedicated here to the
unfinished work which they who fought here h######################advanced. It
is rather for us to be here dedicated to the######################before us-
that from these honored dead we take increas######################use for which
they gave the last full measure of devotion-######################solve that
these dead shall not have died in vain-that ######################, shall have
a new birth of freedom-and that government of the people, by the people, for
the people, shall not perish from the earth.
3 (Лорем Ипсум)
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim
ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit
in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur
sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt
mollit anim id est laborum.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim
ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
aliquip ex ea commodo conse################irure dolor in reprehenderit
in voluptate velit esse cil################giat nulla pariatur. Excepteur
sint occaecat cupidatat non################in culpa qui officia deserunt
mollit anim id est laborum.
4 (Джаббервоки)
'Twas brillig, and the slithy toves
Did gyre and gimble in the wabe;
All mimsy were the borogoves,
And the mome raths outgrabe.
'Twas brillig, and the slithy toves
Did gyre a######### in the wabe;
All mimsy #########borogoves,
And the mome raths outgrabe.
5 (доказательство Евклидом теоремы Пифагора)
1.Let ACB be a right-angled triangle with right angle CAB.
2.On each of the sides BC, AB, and CA, squares are drawn,
CBDE, BAGF, and ACIH, in that order. The construction of
squares requires the immediately preceding theorems in Euclid,
and depends upon the parallel postulate. [footnote 14]
3.From A, draw a line parallel to BD and CE. It will
perpendicularly intersect BC and DE at K and L, respectively.
4.Join CF and AD, to form the triangles BCF and BDA.
5.Angles CAB and BAG are both right angles; therefore C, A,
and G are collinear. Similarly for B, A, and H.
6.Angles CBD and FBA are both right angles; therefore angle ABD
equals angle FBC, since both are the sum of a right angle and angle ABC.
7.Since AB is equal to FB and BD is equal to BC, triangle ABD
must be congruent to triangle FBC.
8.Since A-K-L is a straight line, parallel to BD, then rectangle
BDLK has twice the area of triangle ABD because they share the base
BD and have the same altitude BK, i.e., a line normal to their common
base, connecting the parallel lines BD and AL. (lemma 2)
9.Since C is collinear with A and G, square BAGF must be twice in area
to triangle FBC.
10.Therefore, rectangle BDLK must have the same area as square BAGF = AB^2.
11.Similarly, it can be shown that rectangle CKLE must have the same
area as square ACIH = AC^2.
12.Adding these two results, AB^2 + AC^2 = BD × BK + KL × KC
13.Since BD = KL, BD × BK + KL × KC = BD(BK + KC) = BD × BC
14.Therefore, AB^2 + AC^2 = BC^2, since CBDE is a square.
1.Let ACB be a right-angled triangle with right angle CAB.
2.On each of the sides BC, AB, and CA, squares are drawn,
CBDE, BAGF, and ACIH, in that order. The construction of
squares requires the immediately preceding theorems in Euclid,
and depends upon the parallel postulate. [footnote 14]
3.From A, draw a line parallel to BD and CE. It will
perpendicularly intersect BC and DE at K and L, respectively.
4.Join CF and AD, to form the triangles BCF and BDA.
5.Angles CAB and BAG are both right angles; therefore C, A,
and G are #############milarly for B, A, and H.
6.Angles C#############e both right angles; therefore angle ABD
equals ang############# both are the sum of a right angle and angle ABC.
7.Since AB#############FB and BD is equal to BC, triangle ABD
must be co#############iangle FBC.
8.Since A-#############ight line, parallel to BD, then rectangle
BDLK has t############# of triangle ABD because they share the base
BD and hav#############titude BK, i.e., a line normal to their common
base, conn#############rallel lines BD and AL. (lemma 2)
9.Since C #############with A and G, square BAGF must be twice in area
to triangl#############
10.Therefo############# BDLK must have the same area as square BAGF = AB^2.
11.Similar############# shown that rectangle CKLE must have the same
area as square ACIH = AC^2.
12.Adding these two results, AB^2 + AC^2 = BD × BK + KL × KC
13.Since BD = KL, BD × BK + KL × KC = BD(BK + KC) = BD × BC
14.Therefore, AB^2 + AC^2 = BC^2, since CBDE is a square.
6 (Badger, Badger, Badger by weebl)
Badger, badger, badger, badger, badger,
badger, badger, badger, badger, badger
Mushroom, mushroom, a-
Badger, badger, badger, badger, badger,
badger, badger, badger, badger, badger
Mushroom, mushroom, a-
Badger, badger, badger, badger, badger,
badger, badger, badger, badger, badger
Mush-mushroom, a
Badger, badger, badger, badger, badger,
badger, badger, badger, badger, badger
Argh! Snake, a snake!
Snaaake! A snaaaake, oooh its a snake!
Badger, badger, badger, badger, badger,
badger, badger, badger, badger, badger
Mushroom, mushroom, a-
Badger##################badger, badger,
badger##################badger, badger
Mushro##################
Badger##################badger, badger,
badger##################badger, badger
Mush-mushroom, a
Badger, badger, badger, badger, badger,
badger, badger, badger, badger, badger
Argh! Snake, a snake!
Snaaake! A snaaaake, oooh its a snake!
источник
Ответы:
Python 2
Я знаю, что @atlasologist уже опубликовал решение в Python 2, но мои работы немного отличаются. Это работает, проходя все отверстия сверху вниз, слева направо, просматривая 5 символов назад и выше, и находя символ, в котором они совпадают. Если найдено несколько символов, выбирается наиболее распространенный. Если символы не найдены, это снимает ограничение над символами. Если все еще нет найденных символов, это уменьшает количество символов, которые он просматривает, и повторяется.
Вот результат Барсука, Барсука, Барсука:
Вот результат из доказательства:
И результат Jabberwocky:
источник
Python 2
Это довольно простое решение. Он создает строку образца, состоящую из слов, которые имеют среднюю длину слова
A
- (A
/ 2) иA
+ (A
/ 2), затем применяет обрезанные начальные и завершающие пробелы фрагменты из образца в область патча. Он не обрабатывает заглавные буквы, и я уверен, что есть тестовый сценарий, который сломает его, но на примерах это хорошо. Смотрите ссылку ниже, чтобы запустить все тесты.Я также вставил патч в код для хорошей меры.
Lorem Ipsum, оригинал, затем исправленный:
Попытайся
источник
mushroger
...#
символов в коде.@
, ничего интересного.Ява Шекспир
Кому нужно знать стандартные английские соглашения? Просто сделай свой собственный! Также как барду было позволено придумывать свои слова. Этот бот не слишком беспокоится об исправлении обрезанных слов, он просто вставляет случайные слова. В результате получается прекрасная поэзия. В качестве бонуса барда имеет более высокий калибр и может обрабатывать несколько лунок, если они имеют одинаковый размер!
Пример ввода
Прекрасный выход
Последние несколько строк глубоко поэтичны, если я сам так скажу. Это удивительно хорошо работает и с адресом Геттисберга.
Посмотрим, что заставляет Шекспира тикать. Вот код По сути, он стремится построить словарный запас на основе ввода. Затем он использует эти слова и случайным образом помещает их в отверстие (следя за тем, чтобы оно подходило). Он является детерминированным, поскольку он использует фиксированное начальное число для случайности.
Большая часть поэзии Шекспира является общественным достоянием.
источник
Python 2.7
Еще одно решение Python с другим подходом. Моя программа видит текст в виде цепочки Маркова , где за каждой буквой следует другая буква с определенной вероятностью. Итак, первым шагом является построение таблицы вероятностей. Следующий шаг - применить эти вероятности к патчу.
Полный код, включая пример текста, приведен ниже. Поскольку в одном примере использовались символы Юникода, я включил явную кодовую страницу (utf-8) для совместимости с этим примером.
Пример вывода для Lorem Ipsum:
Дополнительная поэтическая линия в Jabberwocky:
источник
C # 5 массивный как всегда
Я бросил это вместе, это немного беспорядок, но иногда дает хорошие результаты. Это в основном детерминированный алгоритм, но с некоторой (фиксированной) случайностью, добавленной, чтобы избежать создания одной и той же строки для похожих пробелов. Нужно приложить некоторые усилия, чтобы избежать просто наличия столбцов пробелов по обе стороны от пробелов.
Он работает, разбивая входные данные на слова и знаки препинания (знаки препинания происходят из списка, введенного вручную, потому что я не могу разобраться, может ли Unicode сделать это для меня), так что он может ставить пробелы перед словами, а не перед пунктуация, потому что это довольно типично. Он разбивается на типичные пробелы. В смысле цепей Маркова (я думаю), он считает, как часто каждый токен следует друг за другом, а затем не вычисляет вероятности для этого (я полагаю, что, поскольку документы настолько крошечные, мы бы лучше склонялись к вещам мы видим много где можем). Затем мы выполняем поиск в ширину, заполняя пространство, оставленное хешами и «частичными» словами с обеих сторон, при этом стоимость вычисляется как
-fabness(last, cur) * len(cur_with_space)
гдеfabness
возвращается числоcur
повторенийlast
для каждого добавленного токена в сгенерированной строке. Естественно, мы стараемся минимизировать стоимость. Поскольку мы не всегда можем заполнить пробел словами и пунктуацией, найденными в документе, он также учитывает ряд «специальных» токенов из определенных состояний, в том числе частичные строки с обеих сторон, которые мы отклоняем при произвольно увеличивающихся затратах.Если BFS не удается найти решение, мы наивно пытаемся выбрать случайное наречие или просто вставить пробелы, чтобы заполнить пробел.
Полученные результаты
Все 6 можно найти здесь: https://gist.github.com/anonymous/5277db726d3f9bdd950b173b19fec82a
Тестовый пример Евклида прошел не очень хорошо ...
Патч изображение
бессмыслица
барсук
Я рад тому, как этот получился ... К счастью, "барсук, барсук" подходит, или этот не сделал бы так хорошо
Код
Запустить его с
Это довольно много. Единственный отдаленно интересный бит - это
Fill
метод. Я включил реализацию кучи, потому что .NET не имеет (ПОЧЕМУ MS ПОЧЕМУ ?!).источник