Mathematica, 173 169 155 Bytes
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]&
Dies ist eine Funktion, die ein Array von zwei Zeichenfolgen {"Foo","bAR"}aufnimmt , z. B. und ein Array von zwei Zeichenfolgen ausgibt. Dekomprimieren Sie es räumlich, schreiben Sie das Schema f@xwie f[x]gewünscht neu, erweitern Sie die Notationsabkürzungen ( f=0>1aka False, t=!faka True, c=Charactersund u=ToUpperCaseQ) und ersetzen Sie UpperCaseQ [#] nicht durch #==u@#(dieses Zeichen entspricht der Großbuchstaben-Version).
StringJoin /@ MapThread[#[#2] &, {
Reverse[
{ LetterQ[#], UpperCaseQ[#] } & /@ Characters[#] /.
{ {False, _} -> (# &), {True, True} -> ToUpperCase,
{True, False} -> ToLowerCase } & /@ #
],
Characters /@ #
}, 2] &
Schnittstelle: Durch das Trailing &wird dies zu einer Funktion. Sein Argument wird in beiden Instanzen von als "#" eingefügt /@ #. Zum Beispiel f=0>1; ... & [{"AAAbbb111", "Cc2Dd3Ee4"}]erzeugt die Ausgabe {AaABbb111,CC2dd3Ee4}.
Verarbeitung: erzählt in üblichen außerhalb in auftrag:
- Die Ausgabe von
MapThread[...]ist eine Liste von zwei Listen von Zeichen. StringJoin wird auf jede dieser beiden Zeichenlisten angewendet, um eine Liste mit zwei Zeichenfolgen zu erstellen, die Ausgabe.
MapThread[#[#2]&, ... , 2]Wirkt auf ein Array von zwei 2-mal-n-Elementlisten. Die erste Liste ist ein 2-mal-n-Array von Funktionen. Die zweite Liste ist ein 2-mal-n-Array von Zeichen Characters /@ #, die Liste der Zeichen in den beiden Eingabezeichenfolgen. Es arbeitet in der Tiefe 2, dh an den Funktionen und einzelnen Zeichen.
Reverse[...] Vertauscht die beiden Unterlisten von Funktionen, sodass MapThread die Funktionen der zweiten Zeichenfolge auf die erste Zeichenfolge anwendet und umgekehrt.
{ ... } & ist eine anonyme Funktion, die auf jede der beiden Eingabezeichenfolgen angewendet wird.
{LetterQ[#], UpperCaseQ[#]} & /@ Characters[#]Teilt eine Zeichenfolge in eine Liste von Zeichen und ersetzt jedes Zeichen durch zwei Elementlisten. In diesen beiden Elementlisten gibt das erste Element an, Trueob das Zeichen ein Buchstabe ist, und Falseansonsten gibt das zweite Element an, ob es sich bei dem Zeichen um Großbuchstaben handelt. UpperCaseQ[]kann nicht true zurückgeben, wenn es keinen Brief erhält.
/. {{False, _} -> (# &), {True, True} -> ToUpperCase, {True, False} -> ToLowerCase}ersetzt diese beiden Elementlisten durch Funktionen. (Erweiterung der Abkürzungen tund ferfolgt, bevor ein Abgleich versucht wird.) Wenn eine Liste mit zwei Elementen Falseals erstes Element vorhanden ist, wird sie durch die Funktion (# &), die Identitätsfunktion, ersetzt. (Die Klammern sind erforderlich, ansonsten ist der Pfeil enger als das kaufmännische Und.) Andernfalls beginnt die Liste mit zwei Elementen True, das Zeichen war ein Buchstabe, und wir geben die Funktionen aus , die der Groß- ToUpperCaseund ToLowerCaseKleinschreibung entsprechen. (Es ist nicht erforderlich, nach letzterem zu suchen. Dies würde Falsetatsächlich {_,_}->ToLowerCasefunktionieren und alles auffangen, was noch nicht ersetzt wurde. Dies wäre jedoch nicht kürzer und unklarer.)
Die einzige Herausforderung bestand darin, einen prägnanten Weg zu finden, um ein zweidimensionales Array von Funktionen mit einem Array von Argumenten zu verbinden.
Edit: Danke an @Martin Büttner für das Abfangen von "hilfreichen" Backslashes zum Ausschneiden / Einfügen von Zeilenumbrüchen, die 1>0und 1<0Abkürzungen, und auch für die Anleitung zum Zählen der Länge in Bytes, nicht in Zeichen (was auch immer das sind :-))
Edit2: Vielen Dank an @Martin Büttner für den Hinweis, dass das Verschmutzen des globalen Namensraums akzeptabel ist. Erinnert mich an eine Zeichenfunktionsanwendung und schlägt vor, die beiden Großbuchstaben durch eine Abkürzung für eine zu ersetzen und die eine zu verwenden, um die andere zu emulieren (Speichern) vier Zeichen). (Ich denke, er hat das schon mal gemacht. :-))