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"}
2つの文字列の配列を受け取り、2つの文字列の配列を出力する関数です。スキームを書き換え、それをアン空間的に圧縮するf@x
ようf[x]
(それは表記の略語を展開し、表示されている箇所f=0>1
別名False
、t=!f
別名True
、c=Characters
、およびu=ToUpperCaseQ
)、および非交換UpperCaseQ [#]と#==u@#
(この文字は、その大文字版に等しい)、それは次のようになります。
StringJoin /@ MapThread[#[#2] &, {
Reverse[
{ LetterQ[#], UpperCaseQ[#] } & /@ Characters[#] /.
{ {False, _} -> (# &), {True, True} -> ToUpperCase,
{True, False} -> ToLowerCase } & /@ #
],
Characters /@ #
}, 2] &
インターフェース:トレーリング&
はこれを機能にします。その引数は、の両方のインスタンスで「#」として挿入されます/@ #
。たとえばf=0>1; ... & [{"AAAbbb111", "Cc2Dd3Ee4"}]
、出力を生成します{AaABbb111,CC2dd3Ee4}
。
処理:次の順序で通常の外で語られました:
- の出力は、
MapThread[...]
文字の2つのリストのリストです。StringJoinは、これら2つの文字リストのそれぞれに適用され、2つの文字列のリスト、つまり出力を生成します。
MapThread[#[#2]&, ... , 2]
2行2列の2つの要素リストの配列に作用します。最初のリストは、関数の2行n列の配列です。2番目のリストは、2行n列の文字配列Characters /@ #
、2つの入力文字列の文字のリストです。深さ2、つまり機能と個々のキャラクターで機能します。
Reverse[...]
関数の2つのサブリストを交換して、MapThreadが2番目の文字列の関数を最初の文字列に適用するようにします。
{ ... } &
2つの入力文字列のそれぞれに適用される匿名関数です。
{LetterQ[#], UpperCaseQ[#]} & /@ Characters[#]
文字列を文字のリストに分割し、各文字を2つの要素リストに置き換えます。これらの2つの要素リストでは、最初の要素はTrue
文字が文字であるFalse
場合、そうでない場合は同様に、2番目の要素は文字が大文字かどうかを示します。 UpperCaseQ[]
手紙を受け取っていない場合、trueを返すことはできません。
/. {{False, _} -> (# &), {True, True} -> ToUpperCase, {True, False} -> ToLowerCase}
これらの2つの要素リストを関数に置き換えます。(略語の拡張t
及びf
任意マッチングが試みられる前に発生する。)は、2つの要素のリストを持っている場合False
、その最初の要素としては、それが関数に置き換えられ(# &)
、恒等関数。(括弧が必要です。そうでない場合、矢印はアンパサンドよりもしっかりとバインドされます。)そうでない場合、2要素リストはで始まりTrue
、文字は文字であり、関数ToUpperCase
とToLowerCase
そのケースに対応する関数を出力します。(この最後のチェックFalse
は不要であり、実際に{_,_}->ToLowerCase
は動作し、まだ交換されていないものをキャッチしますが、これは短くて不明瞭ではありません。)
唯一の課題は、関数の2次元配列を引数の配列に圧縮する簡潔な方法を見つけることでした。
編集:「便利」カット/改行のバックスラッシュを貼り付けをキャッチするため@MartinBüttnerのおかげで、1>0
と1<0
略語また、文字ではなくバイトで長さを数えるガイダンス(それらは何でも:-))
Edit2:グローバルネームスペースを汚染することは許容できるゴルフであることを指摘し、1つのキャラクター関数アプリケーションを思い出させ、2つの大文字関数を一方の略語に置き換え、もう一方をエミュレートするために使用することを提案してくれた@MartinBüttnerにさらに感謝します(保存4文字)。(私は彼が前にこれをやったと思う:-))