数学,173个 169 155字节
f=0>1;t=!f;c=Characters;u=ToUpperCase;StringJoin/@MapThread[#@#2&,{Reverse[{LetterQ@#,#==(u@#)}&/@c@#/.{{f,_}->(#&),{t,t}->u,{t,f}->ToLowerCase}&/@#],c/@#},2]&
此函数采用两个字符串的数组,例如{"Foo","bAR"}
,输出两个字符串的数组。联合国空间上压缩它,改写该计划f@x
为f[x]
凡出现,扩大了符号缩写(f=0>1
又名False
,t=!f
又名True
,c=Characters
和u=ToUpperCaseQ
),并且未替换为UpperCaseQ [#] #==u@#
(这个角色等于它的大写的版本),它是:
StringJoin /@ MapThread[#[#2] &, {
Reverse[
{ LetterQ[#], UpperCaseQ[#] } & /@ Characters[#] /.
{ {False, _} -> (# &), {True, True} -> ToUpperCase,
{True, False} -> ToLowerCase } & /@ #
],
Characters /@ #
}, 2] &
接口:尾随&
使它起作用。在的两个实例中,其参数均以“#”插入/@ #
。例如f=0>1; ... & [{"AAAbbb111", "Cc2Dd3Ee4"}]
产生输出{AaABbb111,CC2dd3Ee4}
。
加工:按常规顺序在外面告诉:
- 的输出
MapThread[...]
是两个字符列表的列表。StringJoin应用于这两个字符列表中的每一个,以产生两个字符串的列表,即输出。
MapThread[#[#2]&, ... , 2]
作用于两个2×n元素列表的数组。第一个列表是2×n函数数组。第二个列表是2×n字符数组,Characters /@ #
即两个输入字符串中的字符列表。它在深度2(即功能和单个字符)上起作用。
Reverse[...]
交换函数的两个子列表,以便MapThread将第二个字符串的函数应用于第一个字符串,反之亦然。
{ ... } &
是应用于两个输入字符串中的每个字符串的匿名函数。
{LetterQ[#], UpperCaseQ[#]} & /@ Characters[#]
将字符串拆分为字符列表,然后将每个字符替换为两个元素列表。在这两个元素列表中,第一个元素是True
字符是否为字母,False
否则,类似地,第二个元素指示字符是否为大写。 UpperCaseQ[]
如果未收到字母,则不能返回true。
/. {{False, _} -> (# &), {True, True} -> ToUpperCase, {True, False} -> ToLowerCase}
用函数替换这两个元素列表。(缩写的膨胀t
和f
任何匹配尝试之前发生)。如果两个元件列表具有False
作为其第一元件,它被替换为函数(# &)
,恒等函数。(括号是必需的,否则箭头比&符更紧密地绑定。)否则,两个元素列表以开头True
,该字符为字母,然后输出函数ToUpperCase
并ToLowerCase
对应于其大小写。(检查最后一个False
是不必要的,实际上{_,_}->ToLowerCase
是可行的,可以捕获尚未替换的任何东西,但这不会变得更短且更晦涩。)
唯一的挑战是想出一种简洁的方法来将二维函数数组压缩为参数数组。
编辑:感谢@MartinBüttner捕获了“有用的”剪切/粘贴换行符反斜杠,1>0
和和1<0
缩写,并且还提供了以字节为单位而不是字符计数长度的指导(无论是:-))
Edit2:还要感谢@MartinBüttner指出污染全局名称空间是可以接受的,这使我想起了一个字符函数应用程序,并建议将两个大写函数替换为一个缩写,并使用一个模拟另一个函数(保存)。四个字符)。(我认为他以前已经做到了。:-))