Математика, 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"}і виводить масив з двох рядків. Un-просторово-стиснути його, перезапис схему , 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 n масив функцій. Другий список - це 2-на-n масив символів, Characters /@ #списки символів у двох вхідних рядках. Він працює на глибині 2, тобто на функції та окремі символи.
Reverse[...] поміняє два підлісти функцій, щоб MapThread застосував функції другого рядка до першого рядка і навпаки.
{ ... } & - анонімна функція, яка застосовується до кожного з двох вхідних рядків.
{LetterQ[#], UpperCaseQ[#]} & /@ Characters[#]розділяє рядок на список символів, а потім замінює кожен символ двома списками елементів. У цих двох списках елементів перший елемент є, Trueякщо символом є буква, а в Falseіншому випадку, так само, другий елемент вказує, чи є символом верхній регістр. UpperCaseQ[]не може повернути істину, якщо вона не отримає лист.
/. {{False, _} -> (# &), {True, True} -> ToUpperCase, {True, False} -> ToLowerCase}замінює ці два списки елементів функціями. (Розширення абревіатур tі fвідбувається до спроби будь-якого зіставлення.) Якщо список двох елементів має Falseсвій перший елемент, він замінюється функцією (# &), функцією ідентичності. (Дужки в дужках необхідні, інакше стрілка прив'язується більш щільно, ніж амперсанд.) Інакше список двох елементів починається з Trueсимволу, який був буквою, і ми виводимо функції ToUpperCaseта ToLowerCaseвідповідні його регістру. (Перевірка цього останнього Falseє непотрібною, насправді {_,_}->ToLowerCaseспрацювало б, все, що ще не було замінено, але це не буде коротшим і незрозумілішим.)
Єдиним завданням було з'ясування стислого способу зв'язати двовимірний масив функцій до масиву аргументів.
Редагування: Дякуємо @Martin Büttner за те, що ви знайшли "корисні" відрізки / вставки рядкових рядків, абревіатури 1>0та 1<0абревіатури, а також за вказівку для підрахунку довжини в байтах, а не символів (що б це не було :-))
Edit2: Далі дякую @Martin Büttner за те, що він зазначив, що забруднювати глобальний простір імен є прийнятним для гольфу, нагадуючи мені про застосування однієї символьної функції та запропонувавши замінити дві великі функції абревіатурою однієї та використовувати одну для емуляції іншої (збереження чотири символи). (Я думаю, що він робив це раніше. :-))