Toán học, 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]&
Đây là một hàm lấy một mảng gồm hai chuỗi, ví dụ {"Foo","bAR"}
và xuất ra một mảng gồm hai chuỗi. Un-không gian-nén nó, viết lại chương trình f@x
như f[x]
bất cứ nơi nào nó xuất hiện, mở rộng các chữ viết tắt ký hiệu ( f=0>1
aka False
, t=!f
aka True
, c=Characters
và u=ToUpperCaseQ
), và bỏ thay thế UpperCaseQ [#] với #==u@#
(nhân vật này tương đương với phiên bản uppercased của nó), đó là:
StringJoin /@ MapThread[#[#2] &, {
Reverse[
{ LetterQ[#], UpperCaseQ[#] } & /@ Characters[#] /.
{ {False, _} -> (# &), {True, True} -> ToUpperCase,
{True, False} -> ToLowerCase } & /@ #
],
Characters /@ #
}, 2] &
Giao diện: dấu vết &
làm cho điều này một chức năng. Đối số của nó được chèn là "#" trong cả hai trường hợp /@ #
. Ví dụ f=0>1; ... & [{"AAAbbb111", "Cc2Dd3Ee4"}]
sản xuất đầu ra {AaABbb111,CC2dd3Ee4}
.
Xử lý: Đã nói ở bên ngoài thông thường theo thứ tự:
- Đầu ra của
MapThread[...]
một danh sách gồm hai danh sách các ký tự. StringJoin được áp dụng cho mỗi danh sách hai ký tự này để tạo ra một danh sách gồm hai chuỗi, đầu ra.
MapThread[#[#2]&, ... , 2]
hành động trên một mảng gồm hai danh sách phần tử 2 nhân. Danh sách đầu tiên là một mảng các hàm 2 nhân. Danh sách thứ hai là một mảng các ký tự 2 nhân, Characters /@ #
danh sách các ký tự trong hai chuỗi đầu vào. Nó hoạt động ở độ sâu 2, tức là trên các chức năng và các ký tự riêng lẻ.
Reverse[...]
hoán đổi hai danh sách con của các hàm để MapThread sẽ áp dụng các hàm của chuỗi thứ hai cho chuỗi thứ nhất và ngược lại.
{ ... } &
là một hàm ẩn danh được áp dụng cho mỗi trong hai chuỗi đầu vào.
{LetterQ[#], UpperCaseQ[#]} & /@ Characters[#]
chia một chuỗi thành một danh sách các ký tự, sau đó thay thế mỗi ký tự bằng hai danh sách thành phần. Trong hai danh sách thành phần này, phần tử đầu tiên là True
nếu ký tự là một chữ cái và mặt False
khác, tương tự, phần tử thứ hai cho biết ký tự có phải là chữ hoa hay không. UpperCaseQ[]
không thể trả lại đúng nếu nó không nhận được thư.
/. {{False, _} -> (# &), {True, True} -> ToUpperCase, {True, False} -> ToLowerCase}
thay thế hai danh sách thành phần này bằng các hàm. (Mở rộng các chữ viết tắt t
và f
xảy ra trước khi bất kỳ kết hợp nào được thử.) Nếu danh sách hai phần tử có False
thành phần tử đầu tiên, nó được thay thế bằng hàm (# &)
, hàm nhận dạng. (Các dấu ngoặc đơn là cần thiết, nếu không, mũi tên liên kết chặt chẽ hơn dấu và.) Nếu không, danh sách hai phần tử bắt đầu bằng True
, ký tự là một chữ cái và chúng ta xuất các hàm ToUpperCase
và ToLowerCase
tương ứng với trường hợp của nó. (Việc kiểm tra lần cuối False
này là không cần thiết, trên thực tế {_,_}->ToLowerCase
sẽ có hiệu quả, nắm bắt mọi thứ chưa được thay thế, nhưng điều này sẽ không ngắn hơn và tối nghĩa hơn.)
Thử thách duy nhất là tìm ra một cách cô đọng để nén một mảng hàm hai chiều thành một mảng các đối số.
Edit: Nhờ @ Martin Büttner cho việc đánh bắt "hữu ích" cắt / dán backslashes linebreak, các 1>0
và 1<0
chữ viết tắt, và cũng có thể cho hướng dẫn để đếm chiều dài tính bằng byte không ký tự (bất kể đó là những :-))
Edit2: Xin chân thành cảm ơn @Martin Büttner đã chỉ ra rằng việc gây ô nhiễm không gian tên toàn cầu là golf có thể chấp nhận được, nhắc nhở tôi về một ứng dụng chức năng ký tự và đề nghị thay thế hai chức năng viết hoa bằng một chữ viết tắt cho một cái và sử dụng cái này để mô phỏng cái kia (tiết kiệm bốn nhân vật). (Tôi nghĩ rằng anh ấy đã làm điều này trước đây :-))