Mathematica, 173 169 155 byte
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]&
Ini adalah fungsi mengambil array dari dua string, misalnya {"Foo","bAR"}dan mengeluarkan array dari dua string. Un-spasial-mengompresi, menulis ulang skema f@xseperti f[x]di mana pun muncul, memperluas singkatan notasi ( f=0>1alias False, t=!falias True, c=Characters, dan u=ToUpperCaseQ), dan un-menggantikan UpperCaseQ [#] dengan #==u@#(karakter ini sama dengan versi uppercased nya), itu adalah:
StringJoin /@ MapThread[#[#2] &, {
Reverse[
{ LetterQ[#], UpperCaseQ[#] } & /@ Characters[#] /.
{ {False, _} -> (# &), {True, True} -> ToUpperCase,
{True, False} -> ToLowerCase } & /@ #
],
Characters /@ #
}, 2] &
Interfacing: trailing &membuat fungsi ini. Argumennya dimasukkan sebagai "#" pada kedua contoh /@ #. Misalnya f=0>1; ... & [{"AAAbbb111", "Cc2Dd3Ee4"}]menghasilkan output {AaABbb111,CC2dd3Ee4}.
Memproses: Diberitahu di luar biasa agar:
- Output dari
MapThread[...]adalah daftar dua daftar karakter. StringJoin diterapkan ke masing-masing dua daftar karakter ini untuk menghasilkan daftar dua string, output.
MapThread[#[#2]&, ... , 2]bertindak pada array dari dua daftar elemen 2-oleh-n. Daftar pertama adalah susunan fungsi 2-oleh-n. Daftar kedua adalah array karakter 2-oleh-n Characters /@ #, daftar karakter dalam dua string input. Ia bekerja pada kedalaman 2, yaitu, pada fungsi dan karakter individu.
Reverse[...] swap kedua daftar fungsi sehingga MapThread akan menerapkan fungsi string kedua ke string pertama dan sebaliknya.
{ ... } & adalah fungsi anonim yang diterapkan ke masing-masing dari dua string input.
{LetterQ[#], UpperCaseQ[#]} & /@ Characters[#]membagi string menjadi daftar karakter, lalu mengganti setiap karakter dengan dua daftar elemen. Dalam dua daftar elemen ini, elemen pertama adalah Truejika karakter adalah huruf dan Falsesebaliknya, elemen kedua menunjukkan apakah karakter huruf besar. UpperCaseQ[]tidak dapat mengembalikan true jika tidak menerima surat.
/. {{False, _} -> (# &), {True, True} -> ToUpperCase, {True, False} -> ToLowerCase}mengganti dua daftar elemen ini dengan fungsi. (Perluasan singkatan tdan fterjadi sebelum pencocokan dicoba.) Jika daftar dua elemen memiliki Falsesebagai elemen pertama, itu diganti dengan fungsi (# &), fungsi identitas. (Tanda kurung diperlukan, jika panah mengikat lebih ketat daripada ampersand.) Jika tidak, daftar elemen dua dimulai dengan True, karakter adalah huruf, dan kami menampilkan fungsi ToUpperCasedan ToLowerCasesesuai dengan kasusnya. (Memeriksa yang terakhir Falseini tidak perlu, pada kenyataannya {_,_}->ToLowerCaseakan berhasil, menangkap apa pun yang belum diganti, tetapi ini tidak akan lebih pendek dan lebih tidak jelas.)
Satu-satunya tantangan adalah mencari tahu cara ringkas untuk zip array fungsi dua dimensi ke array argumen.
Sunting: Terima kasih kepada @Martin Büttner karena telah menangkap backslash "membantu" cut / paste linebreak, 1>0dan1<0 singkatan, dan juga untuk panduan untuk menghitung panjang dalam byte, bukan karakter (apa pun itu :-))
Sunting2: Terima kasih lebih lanjut kepada @Martin Büttner karena menunjukkan bahwa mencemari namespace global adalah golf yang dapat diterima, mengingatkan saya pada satu aplikasi fungsi karakter, dan menyarankan untuk mengganti dua fungsi huruf besar dengan singkatan untuk satu dan menggunakan yang lain untuk meniru yang lain (menyimpan empat karakter). (Saya pikir dia sudah melakukan ini sebelumnya. :-))