文字处理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 2015年

是否可以假设任何非字母数字的字符都不会算作单词的更改(例如,类似的第一个输入#programming!仍会受到的第二个输入的影响pro~gram~ming)?数字也不计数吗(即仅允许使用字母字符)?
科尔

@orlp是,输入由此处列出的标准可打印ASCII字符组成。
Zgarb 2015年

@Cole非字母字符不是单词的一部分(请参阅第二个测试用例)。数字被视为非字母,我将为此添加一个测试用例。
Zgarb 2015年

我可以在一个单词中假设最大的音节数吗?
Qwertiy 2015年

Answers:


5

点子,60 54字节

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

Pip的GitHub存储库

将输入作为命令行参数(假设输入1包含空格,则必须在输入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 2015年

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 magicma~gic


错误:f("magic magic", "ma~gic")返回"ma~gic magic"
Qwertiy 2015年

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

只是第一次尝试,很多事情都可以缩短-明天将继续!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.