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>1
aka False
, t=!f
aka 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ที่ชี้ให้เห็นว่าการสร้างมลภาวะให้กับเนมสเปซทั่วโลกนั้นเป็นสิ่งที่ยอมรับได้กอล์ฟเตือนให้ฉันนึกถึงแอพพลิเคชั่นตัวละครตัวหนึ่งและแนะนำให้แทนที่ฟังก์ชั่น สี่ตัวอักษร) (ฉันคิดว่าเขาทำสิ่งนี้มาก่อน :-))