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@x
seperti f[x]
di mana pun muncul, memperluas singkatan notasi ( f=0>1
alias False
, t=!f
alias 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 True
jika karakter adalah huruf dan False
sebaliknya, 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 t
dan f
terjadi sebelum pencocokan dicoba.) Jika daftar dua elemen memiliki False
sebagai 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 ToUpperCase
dan ToLowerCase
sesuai dengan kasusnya. (Memeriksa yang terakhir False
ini tidak perlu, pada kenyataannya {_,_}->ToLowerCase
akan 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>0
dan1<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. :-))