Обробка тексту №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

Будь-яка можлива помилка переносу в цьому виклику пов'язана з цим засобом переносу .


Я припускаю, що вхід є стандартним 7-бітним ASCII, а не деякою розширеною 8-бітовою версією?
orlp

Чи добре вважати, що будь-який не буквено-цифровий символ не вважатиметься зміною слова (наприклад, перший вклад, як #programming!і раніше, буде впливати на другий ввід pro~gram~ming)? Чи не враховуються числа (тобто дозволяються лише алфавітні символи)?
cole

@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!

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 ]

Ви можете використовувати 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


Неправильно: f("magic magic", "ma~gic")повертається"ma~gic magic"
Qwertiy

@Qwertiy виправлено. Якось виправлення це також врятувало мені 4 байти!
DankMemes

0

Перл, 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}

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.