Mathematica, 173 169 155 bayt
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]&
Bu, iki diziden oluşan, örneğin iki diziden oluşan bir diziyi alan bir işlevdir {"Foo","bAR"}. Şemasını yeniden, o un-mekansal-sıkıştırarak f@xolarak f[x]notasyonu kısaltmalar (genişleyen, Göründüğü her yerde f=0>1aka False, t=!faka True, c=Charactersve u=ToUpperCaseQ) ve un-değiştirilmesi ile UpperCaseQ [#] #==u@#(Bu karakterin kendine Büyük harfli versiyonunu eşittir), öyle:
StringJoin /@ MapThread[#[#2] &, {
Reverse[
{ LetterQ[#], UpperCaseQ[#] } & /@ Characters[#] /.
{ {False, _} -> (# &), {True, True} -> ToUpperCase,
{True, False} -> ToLowerCase } & /@ #
],
Characters /@ #
}, 2] &
Arayüzleme: takip eden &bir fonksiyon yapar. Argümanı her iki durumda da "#" olarak eklenir /@ #. Örneğin f=0>1; ... & [{"AAAbbb111", "Cc2Dd3Ee4"}]çıktı üretir {AaABbb111,CC2dd3Ee4}.
İşleme: Sırayla her zamanki gibi sıralanmıştır:
- Çıktısı,
MapThread[...]iki karakter listesinin bir listesidir. StringJoin, iki dizenin bir listesini üretmek için bu iki karakter listesinin her birine uygulanır, çıktı.
MapThread[#[#2]&, ... , 2]2'ye iki öğe listesinin bir dizisine etki eder. İlk liste 2'ye kadar bir işlevler dizisidir. İkinci liste, Characters /@ #iki giriş dizesindeki karakter listeleri olan 2'ye kadar bir karakter dizisidir . İşlev 2'de ve tek tek karakterlerde, derinlik 2'de çalışır.
Reverse[...] iki işlev listesinin yerini değiştirir, böylece MapThread ikinci dizginin işlevlerini ilk dizgeye uygular ve bunun tersi de geçerlidir.
{ ... } & İki giriş dizesinin her birine uygulanan anonim bir işlevdir.
{LetterQ[#], UpperCaseQ[#]} & /@ Characters[#]bir dize karakter listesine böler, sonra her karakteri iki eleman listesi ile değiştirir. Bu iki öğe listesinde, ilk öğe, Truekarakterin bir harf olması durumundadır ve Falseaksi halde benzer şekilde, ikinci öğe karakterin büyük harf olup olmadığını gösterir. UpperCaseQ[]Bir mektup almazsa true döndüremezsiniz.
/. {{False, _} -> (# &), {True, True} -> ToUpperCase, {True, False} -> ToLowerCase}bu iki öğe listesini işlevlerle değiştirir. (Kısaltmaların genişletilmesi tve feşleşme denenmeden önce gerçekleşir.) İki öğe listesinin Falseilk öğesi olarak varsa, işlev (# &), kimlik işlevi ile değiştirilir. (Parantez aksi işareti daha sıkı şekilde ok gereklidir.) İle Aksi takdirde, iki öğe listesi başlar True, karakter yazmak oldu ve çıkış fonksiyonları ToUpperCaseve ToLowerCasekendi halinde karşılık gelir. (Bunun sonuncusunu kontrol etmek Falsegereksizdir, aslında {_,_}->ToLowerCaseişe yarar, henüz değiştirilmemiş bir şeyi yakalamak, ancak bu daha kısa ve daha karanlık olmazdı.)
Tek zorluk, iki boyutlu bir fonksiyon dizisini bir argüman dizisine bağlamanın özlü bir yolunu bulmaktı.
Düzenleme: "yararlı" kesme / yapıştırma linebreak tersbölüleri yakalamak için @Martin Büttner sayesinde 1>0ve 1<0kısaltmalar ve ayrıca rehberlik bayt uzunluğunu saymak için değil (o :-) ne olursa olsun) karakterleri
Düzen2: Küresel isim alanını kirletmenin kabul edilebilir bir golf olduğunu, bana bir karakter işlevi uygulamasının hatırlattığını ve iki büyük harf işlevinin birinin kısaltmasıyla kullanıldığını ve birinin diğerinin öykünmek için kullanılmasının kullanıldığını öne sürdüğü için @Martin Büttner'e teşekkürler dört karakter). (Sanırım bunu daha önce yaptı. :-))