Обработка текста № 1: перенос слов

14

Фон

Это первая часть 3-луночного гольф-поля по обработке текста. Общая идея заключается в том, что если вы возьмете вводимый текст и передадите его через решения для всех трех задач (с небольшим количеством склеивающего кода), он будет выплывать в красиво отформатированном абзаце. В этом первом задании ваша задача - дефис фрагмента текста с использованием заданных шаблонов переноса.

вход

Ваша программа должна принимать два строковых ввода: фрагмент текста и список шаблонов переноса. Первый ввод - просто непустая строка печатных символов ASCII и пробелов; он не будет содержать разрывы строк или тильды ~. Второй ввод - это список слов, разделенных запятыми, который состоит из слогов, разделенных тильдой, из строчных символов ASCII. Пример есть ex~cel~lent,pro~gram~ming,abil~i~ties.

Выход

Ваша программа должна изменить первый вход следующим образом. Любое слово (максимальная подстрока буквенных символов ASCII), чья версия в нижнем регистре через дефис находится во втором вводе, должно быть заменено этой версией из дефиса, но его регистр должен быть сохранен. В приведенном выше списке примеров, если текст содержит слово Excellent, оно должно быть заменено на Ex~cel~lent; однако, неExcellently должны быть изменены. Ваш вывод должен быть этой измененной строкой.

Подробные правила и оценка

Вы можете предположить следующее о входных данных:

  • Первый вход не содержит тильды, а также ни начальных, ни конечных, ни повторяющихся пробелов. Это не пусто.
  • Второй вход содержит как минимум одно слово, а каждое слово содержит как минимум два слога. Каждый слог не пуст.
  • Второй вход не содержит слово, которое встречается как слог в другом слове.

При желании вы можете изменить порядок двух входов и, при желании, добавить один завершающий символ новой строки в выход.

Вы можете написать функцию или полную программу. Побеждает меньшее количество байтов, и стандартные лазейки запрещены.

Тестовые случаи

Они перечислены в формате 1st input [newline] 2nd input [newline] output.

Excellent programming abilities, you work excellently!
ex~cel~lent,pro~gram~ming,abil~i~ties
Ex~cel~lent pro~gram~ming abil~i~ties, you work excellently!

Superman (sometimes incorrectly spelled "Super-man") is super #&%@ing strong.
su~per,some~times,in~cor~rectly,spell~ing
Superman (some~times in~cor~rectly spelled "Su~per-man") is su~per #&%@ing strong.

IncONsISTent caPItalizATIon!
in~con~sis~tent,cap~i~tal~iza~tion
In~cON~sIS~Tent caP~I~tal~izA~TIon!

Such short words.
awk~ward
Such short words.

Digits123 are456cool789.
dig~its,dig~i~tal,are~cool
Dig~its123 are456cool789.

magic magic
ma~gic
ma~gic ma~gic

Любая возможная ошибка переноса в этой задаче связана с этим инструментом переноса .

Zgarb
источник
Я предполагаю, что вход является стандартным 7-битным ASCII, а не какой-то расширенной 8-битной версией?
orlp
Можно ли предположить, что любой не алфавитно-цифровой символ не будет считаться изменением слова (например, на первый вход, подобный вводу, #programming!все равно будет влиять второй ввод pro~gram~ming)? Числа также не учитываются (т.е. допускаются только буквы алфавита)?
Коул
@orlp Да, ввод состоит из стандартных печатаемых символов ASCII, перечисленных здесь .
Згарб
@Cole Неалфавитные символы не являются частью слов (см. Второй контрольный пример). Цифры считаются не алфавитными, я добавлю тестовый пример по этому поводу.
Згарб
Могу ли я предположить максимальное количество слогов в одном слове?
Qwertiy

Ответы:

5

Пип, 60 54 байта

Fwa^`([A-Za-z]+)`O{aQ'~?'~w@++y}M(LCwQ_RM'~FIb^',Yv)|w

GitHub хранилище для Pip

Принимает входные данные в качестве аргументов командной строки (что требует ввода кавычек вокруг ввода 1, при условии, что он содержит пробелы). Конечный символ новой строки не печатается (добавьте xв конец программы, чтобы добавить один).

Несколько неловко, с комментариями:

 ; Split 1st input on runs of letters, including the separators in the results
a^:`([A-Za-z]+)`
 ; Split 2nd input on commas
b^:',
 ; Iterate over the words w in that list
Fwa {
  ; Filter b for entries that match the current word (lowercase, with tildes removed)
 m:(LCw EQ _RM'~)FIb
  ; We expect this to be a list of 0 or 1 elements
  ; If it has one, m gets that element (the hyphenation pattern); if it's empty, m gets nil
 i:-1
 m:m@i
  ; Map this function to each character of pattern m: if it's tilde, return tilde;
  ; otherwise, return corresponding character of w
 m:{aEQ'~ ? '~ w@++i}Mm
  ; Output the result, unless it was nil (falsey), in which case output the original word
 Om|w
}

Образец прогона:

C:\Users\dlosc> pip.py hyphens.pip "IncONsISTent caPItalizATIon!" in~con~sis~tent,cap~i~tal~iza~tion
In~cON~sIS~Tent caP~I~tal~izA~TIon!
DLosc
источник
8

Сетчатка , 88 байт

+is`(?<![a-z~])([a-z~]+)(?=([a-z]+)+[^a-z~].*(?<=[\n,]\1(?(2)!)(?<-2>~\2)+[\n,]))
$1~
\n.*
<empty>

В целях подсчета каждая строка помещается в отдельный файл, \nзаменяется реальными символами новой строки и <empty>представляет собой пустой файл. Для удобства вы можете запустить приведенный выше код из одного файла (где <empty>есть пустая строка), если вы используете -sфлаг интерпретатора.

Мартин Эндер
источник
2

Javascript ES6, 117 141 символов

f=(t,p)=>p.split`,`.map(p=>t=t.replace(RegExp("((?:^|[^a-z])"+p.replace(/~/g,")(")+")(?=$|[^a-z])","ig"),(...x)=>x.slice(1,-2).join("~")))&&t

Тестовое задание:

document.querySelector(".question pre").textContent.split("\n\n").map(t=>(t=t.split("\n"))&&f(t[0],t[1])==t[2])
// Array [ true, true, true, true, true ]
Qwertiy
источник
Вы можете использовать eval вместо конструктора RegExp. Строковые шаблоны также могут сохранять несколько байтов
Downgoat
1

Javascript (ES6), 173 169

Основной поиск и замена регулярных выражений

(a,b)=>(b.split`,`.map(s=>a=a.replace(eval(`/(^|[^a-z])(${s.replace(/~/g,"")})(?=[^a-z]|$)/gi`),(_,n,o)=>(x=0,n+s.split``.map((q,i)=>(q=='~'&&++x?q:o[i-x])).join``))),a)

скрипка

Редактировать: Исправлена ​​ошибка в тестовом примере magic magic,ma~gic

DankMemes
источник
Неправильно: f("magic magic", "ma~gic")возвращается"ma~gic magic"
Qwertiy
@Qwertiy исправлено. Каким-то образом это помогло мне сэкономить 4 байта!
DankMemes
0

Perl, 146

$a=<>;$d=$_=~s/~//rg,$a=~s/(?<!\pL)$d(?!\pL)/h($&,$_)/gie for(split/,|\n/,<>);
print$a;
sub h{($g,$h)=@_;while($h=~/~/g){substr($g,"@-",0)='~'}$g}

Всего лишь первая попытка, многие вещи могут быть сокращены - продолжится завтра!

Jarmex
источник