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@x
olarak f[x]
notasyonu kısaltmalar (genişleyen, Göründüğü her yerde f=0>1
aka False
, t=!f
aka True
, c=Characters
ve 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, True
karakterin bir harf olması durumundadır ve False
aksi 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 t
ve f
eşleşme denenmeden önce gerçekleşir.) İki öğe listesinin False
ilk öğ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ı ToUpperCase
ve ToLowerCase
kendi halinde karşılık gelir. (Bunun sonuncusunu kontrol etmek False
gereksizdir, aslında {_,_}->ToLowerCase
iş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>0
ve 1<0
kı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ı. :-))