Mathematica, 173 169 155 bajtów
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]&
Jest to funkcja pobierająca tablicę dwóch ciągów, np. {"Foo","bAR"}I wysyłająca tablicę dwóch ciągów. Un-przestrzennie ściskając go, przepisywanie schemat f@xjak f[x]wszędzie wydaje się, rozszerzając skróty notacją ( f=0>1aka False, t=!faka True, c=Charactersi u=ToUpperCaseQ), i un-zastąpienie UpperCaseQ [#] z #==u@#(postać ta jest równa jego wersję duże litery), to jest:
StringJoin /@ MapThread[#[#2] &, {
Reverse[
{ LetterQ[#], UpperCaseQ[#] } & /@ Characters[#] /.
{ {False, _} -> (# &), {True, True} -> ToUpperCase,
{True, False} -> ToLowerCase } & /@ #
],
Characters /@ #
}, 2] &
Interfejs: trailing &sprawia, że jest to funkcja. Jego argument jest wstawiany jako „#” w obu przypadkach /@ #. Na przykład f=0>1; ... & [{"AAAbbb111", "Cc2Dd3Ee4"}]produkuje dane wyjściowe {AaABbb111,CC2dd3Ee4}.
Przetwarzanie: Powiedziane zwykle na zewnątrz w celu:
- Dane wyjściowe
MapThread[...]to lista dwóch list znaków. StringJoin jest stosowany do każdej z tych dwóch list znaków, aby utworzyć listę dwóch ciągów, wynik.
MapThread[#[#2]&, ... , 2]działa na tablicę dwóch list elementów 2 na n. Pierwsza lista to tablica funkcji 2 na n. Druga lista to tablica znaków 2 na n Characters /@ #, lista znaków w dwóch ciągach wejściowych. Działa na głębokości 2, tj. Na funkcjach i poszczególnych znakach.
Reverse[...] zamienia dwie podlisty funkcji, dzięki czemu MapThread zastosuje funkcje drugiego ciągu do pierwszego ciągu i odwrotnie.
{ ... } & to anonimowa funkcja stosowana do każdego z dwóch ciągów wejściowych.
{LetterQ[#], UpperCaseQ[#]} & /@ Characters[#]dzieli ciąg na listę znaków, a następnie zastępuje każdy znak dwiema listami elementów. Na tych dwóch listach elementów pierwszy element ma Truepostać, jeśli znak jest literą, a w Falseprzeciwnym razie drugi element wskazuje, czy znak jest pisany wielkimi literami. UpperCaseQ[]nie może zwrócić prawdy, jeśli nie otrzyma listu.
/. {{False, _} -> (# &), {True, True} -> ToUpperCase, {True, False} -> ToLowerCase}zastępuje te dwie listy elementów funkcjami. (Rozwinięcie skrótów ti fwystępuje przed próbą dopasowania). Jeśli lista dwóch elementów ma Falseswój pierwszy element, jest ona zastępowana funkcją (# &), funkcją tożsamości. (Nawiasy są konieczne, w przeciwnym razie strzałka wiąże się ściślej niż znak ampersand). W przeciwnym razie lista dwóch elementów zaczyna się od True, znak był literą, a my wyprowadzamy funkcje ToUpperCasei ToLowerCaseodpowiadamy ich wielkości. (Sprawdzanie tego ostatniego nie Falsejest konieczne, w rzeczywistości {_,_}->ToLowerCasezadziałałoby, wyłapując wszystko, co jeszcze nie zostało wymienione, ale nie byłoby to krótsze i bardziej niejasne).
Jedynym wyzwaniem było znalezienie zwięzłego sposobu spakowania dwuwymiarowej tablicy funkcji do tablicy argumentów.
Edycja: Podziękowania dla @Martin Büttner za wyłapanie ukośnych odwrotnych ukośników, skrótów 1>0i 1<0skrótów, oraz pomoc w liczeniu długości w bajtach, a nie znakach (cokolwiek to jest :-))
Edit2: Dalsze podziękowania dla @Martin Büttner za zwrócenie uwagi na to, że zanieczyszczenie globalnej przestrzeni nazw jest akceptowalnym golfem, przypomnienie mi jednej aplikacji funkcji znakowej i zasugerowanie zastąpienia dwóch funkcji wielkimi literami skrótem dla jednej i używanie jednej do emulacji drugiej (zapisywanie cztery znaki). (Myślę, że już to zrobił. :-))