Mathematica, 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"}และส่งออกอาร์เรย์ของสองสาย ยกเลิกการสันนิฐานอัดมันเขียนโครงการที่f@xเป็นf[x]ที่ใดก็ตามที่มันจะปรากฏขึ้น, การขยายตัวย่อที่สัญกรณ์ ( f=0>1aka False, t=!faka True, c=Charactersและu=ToUpperCaseQ) และยกเลิกการเปลี่ยน UpperCaseQ [#] ด้วย#==u@#(ตัวละครตัวนี้เท่ากับรุ่น uppercased ของมัน) มันเป็น:
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-by-n สองรายการ รายการแรกคือฟังก์ชันแบบ 2-by-n รายการที่สองคืออาร์เรย์แบบอักขระขนาดละ 2 ตัวและ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สำหรับการจับแบ็กสแลช "ตัด / วาง linebreak ที่" เป็นประโยชน์ " 1>0และและ1<0ตัวย่อและสำหรับคำแนะนำในการนับความยาวเป็นไบต์ไม่ใช่ตัวอักษร (ไม่ว่าจะเป็น :-))
แก้ไข 2: ขอขอบคุณ @Martin Büttnerที่ชี้ให้เห็นว่าการสร้างมลภาวะให้กับเนมสเปซทั่วโลกนั้นเป็นสิ่งที่ยอมรับได้กอล์ฟเตือนให้ฉันนึกถึงแอพพลิเคชั่นตัวละครตัวหนึ่งและแนะนำให้แทนที่ฟังก์ชั่น สี่ตัวอักษร) (ฉันคิดว่าเขาทำสิ่งนี้มาก่อน :-))