2つの文字列の大文字の入れ替え


27

your shift key is broken. wheNever you type two lines, the cApitaL
LetteRs in them get swappeD. you must write a program to fiX THIS!

説明

入力は2つの文字列でs1あり、s2、長さが等しいです。それぞれには、印刷可能なASCIIのみが含まれ、長さは少なくとも1文字です。次の2つの文字列、2つの文字列の配列、または持つ単一の文字列として入力これらのかもしれないs1s2、タブや改行のいずれかで区切られています。

出力は次のとおりです。

  • 各文字のc中にs1

    • 文字が文字でない場合は、そのまま出力します。

    • それ以外の場合、c文字が:

      • で一致する文字(同じインデックスの文字)を見つけますs2

        • 大文字の場合、出力 c大文字になります。

        • 小文字の場合、出力 cします。

        • それ以外の場合、出力はc変更されません。

  • 次に、with s1s2switch を除いて同じことを行います。

本質的に、s1一致する文字s2が大文字であるすべての文字は大文字にs1するs2必要があり、同じインデックスに小文字が含まれるすべての文字は小文字になります(逆も同様です)。

テストケース

入力:

ABCDEfghijKlMnOpqrstuvwxyz
aaaaaaaaaaaaaaaa----------

出力:

abcdefghijklmnopqrstuvwxyz
AAAAAaaaaaAaAaAa----------

入力:

PRogrammiNG puzZLes & CODe golf
SdlkhkfaladlKsdlalksdg7ldklDgsl

出力:

Programming Puzzles & Code Golf
SDlkhkfalADlksdLAlksdg7LDkldgsl

入力:

AAAbbb111
Cc2Dd3Ee4

出力:

AaABbb111
CC2dd3Ee4

33
私の人生では、これが壊れたシフトキーによってどのように引き起こされるのかを理解することはできませんが、全能のドアノブと誰と議論するのですか?:P
ジオビット

1
入力は同じ行にある必要がありますか?または、他の文字(タブ?)を使用してそれらを分離できますか?
kirbyfan64sos

@Dennisいいえ、質問に示されているとおりに入力する必要があります。
ドアノブ

@ kirbyfan64sos 2つの文字列、文字列の配列、またはタブまたは改行で区切られた2つの文字列を使用できます。それを質問に編集します。
ドアノブ

末尾の改行は許可されますか?
ダウンゴート

回答:


7

Pyth、19 18バイト

LCmrW&@dG@drG1d2Cb

これは、文字列のリストを受け入れて返す関数yを定義します。

Pyth Compiler / Executorですべてのテストケースを一度に検証します。

@Jakubeが1バイトのゴルフをしてくれてありがとう。

使い方

                   " (implicit) Initialize G to 'abcdefghijklmnopqrstuvwxyz'.

L                  " Define y(b):
                Cb "   Zip to turn the two strings into an array of char pairs.
  m                "   Map (implicit variable d):
      @dG          "     Intersect d with G.
         @drG1     "     Intersect d with G.upper().
    W&             "     If both are non-empty:
   r          d2   "       Apply swapcase() to d.
 C                 "   Zip to turn the character pairs back into two strings.

12

CJam、25バイト

{z{_el_eu&\__:^32&f^?}%z}

これは、スタックから文字列の配列をポップし、1つを返す匿名関数です。

サポートされているブラウザーでは、CJamインタープリターですべてのテストケースを一度に検証できます。

テストケース

コード

qN/2/                     e# Read input and split into arrays of two strings.

{z{_el_eu&\__:^32&f^?}%z}

%                         e# Map the block over all string arrays.
:+N*                      e# Separate the strings by linefeeds.

入力

ABCDEfghijKlMnOpqrstuvwxyz
aaaaaaaaaaaaaaaa----------
PRogrammiNG puzZLes & CODe golf
SdlkhkfaladlKsdlalksdg7ldklDgsl
AAAbbb111
Cc2Dd3Ee4

出力

abcdefghijklmnopqrstuvwxyz
AAAAAaaaaaAaAaAa----------
Programming Puzzles & Code Golf
SDlkhkfalADlksdLAlksdg7LDkldgsl
AaABbb111
CC2dd3Ee4

使い方

z                       e# Zip to transform the array of strings into an array
                        e# of character pairs.
 {                  }%  e# For each character pair:
  _el                   e#   Push a copy and convert to lowercase.
     _eu                e#   Push a copy and convert to uppercase.
        &               e#   Intersect. The result will be an empty string if
                        e#   and only if both characters are letters.
         \              e#   Swap the character pair on top of the stack.
          __            e#   Push two copies.
            :^          e#   XOR both characters.
              32&       e#   Logical AND with 32. This pushes 32 for letters of
                        e#   different cases and 0 for letters of the same case.
                 f^     e#   XOR each character with the result.
                   ?    e#   Select the original copy for non-empty intersection
                        e#   and the modified one otherwise.
                      z e# Zip to turn the characters pairs back into two strings.

8

C、126バイト

これは、これまでで初めてのゴルフの試みです。私が何か間違ったことをしたかどうかを教えてください。

私はビット単位の操作を使用して切り替えを実行しています

ゴルフ:

main(u,a,s,t)char**a,*s,*t;{for(s=a[1],t=a[2];*t;s++,t++)isalpha(*s)*isalpha(*t)?u=(*t^*s)&32,*t^=u,*s^=u:0;*s=10;puts(a[1]);}

ゴルフをしていない:

main(u,a,s,t) char**a,*s,*t; {       // K&R style arguments
    for(s=a[1],t=a[2];*t;s++,t++)    // initialize loop.
        isalpha(*s) * isalpha(*t) ? // ensure both characters are letters (if)
            u = (*t^*s) & 0x20,      // check if characters have swapped case
            *t^=u,                   // if so, xor the bit which represents case
            *s^=u                    // for both characters in the string.
        :0;                          // end ternary statement (endif)
    *s=10;                           // replace null terminator in first string 
    puts(a[1]);                      // with newline. This allows both output to 
}                                    // be printed out all at once

編集:&&を*に置き換えました


6

SQL(PostGreSQL)、427バイト

巨大なサイズにもかかわらず、これは予想よりもかなり小さくなりました。正直に言って、それができるとは確信が持てませんでした。私はまだできることがたくさんあると思う:)

CREATE FUNCTION F(TEXT,TEXT)RETURNS TABLE(S TEXT) AS'SELECT unnest(array[string_agg(CASE WHEN T~''[A-Z]''THEN upper(S)WHEN T~''[a-z]''THEN lower(S)ELSE S END,''''),string_agg(CASE WHEN S~''[A-Z]''THEN upper(T)WHEN S~''[a-z]''THEN lower(T)ELSE T END,'''')])FROM(SELECT ROW_NUMBER()OVER()N,S FROM regexp_split_to_table($1,'''')X(S))A JOIN(SELECT ROW_NUMBER()OVER()M,T FROM regexp_split_to_table($2,'''')Y(T))B ON N=M'LANGUAGE SQL

フォーマットおよびコメント

-- Declare the function spec
CREATE FUNCTION F(TEXT,TEXT)RETURNS TABLE(S TEXT) AS  
'SELECT unnest(   -- turns array into a table
    array[        -- build array of the column results
    string_agg( -- Aggregate the result into a string
        CASE 
        WHEN T~''[A-Z]''THEN upper(S) -- uppercase it if corresponding char is uppercase
        WHEN T~''[a-z]''THEN lower(S) -- lowercase it if corresponding char is lowercase
        ELSE S END
        ,''''),
    string_agg( -- Same as the previous but swap strings
        CASE 
        WHEN S~''[A-Z]''THEN upper(T)
        WHEN S~''[a-z]''THEN lower(T)
        ELSE T END
        ,'''')
    ])
FROM
    -- split the first string
   (SELECT ROW_NUMBER()OVER()N,S FROM regexp_split_to_table($1,'''')X(S))A
    JOIN
    -- split the second string
   (SELECT ROW_NUMBER()OVER()M,T FROM regexp_split_to_table($2,'''')Y(T))B 
   ON N=M
'
LANGUAGE SQL

試運転

SELECT F(A,B) AS Result
FROM (VALUES 
    ('AAAbbb111', 'Cc2Dd3Ee4'), 
    ('ABCDEfghijKlMnOpqrstuvwxyz', 'aaaaaaaaaaaaaaaa----------'), 
    ('PRogrammiNG puzZLes & CODe golf', 'SdlkhkfaladlKsdlalksdg7ldklDgsl')
    )A(A,B)

Result
-----------------------------
AaABbb111
CC2dd3Ee4
abcdefghijklmnopqrstuvwxyz
AAAAAaaaaaAaAaAa----------
Programming Puzzles & Code Golf
SDlkhkfalADlksdLAlksdg7LDkldgsl

4

ジュリア、140バイト

f(s,t)=(C(x,y)=(i=0;z="";for c=x i+=1;z*=string(isalpha(c)?isupper(y[i])?uppercase(c):islower(t[i])?lowercase(c):c:c)end;z);(C(s,t),C(t,s)))

これにより、2つの文字列を受け入れ、文字列のタプルを返す関数が作成されます。ここでは特に賢いことは何も起きていません。仕様でアルゴリズムを直接実装する内部関数を定義し、それを2回呼び出すだけです。

ゴルフをしていない:

function f(s, t)
    C(x, y) = begin
        i = 0
        z = ""
        for c in x
            i += 1
            if isalpha(c)
                if isupper(y[i])
                    z *= string(uppercase(c))
                elseif islower(y[i])
                    z *= string(lowercase(c))
                else
                    z *= string(c)
                end
            else
                z *= string(c)
            end
        end
        return z
    end

    return (C(s, t), C(t, s))
end

4

JavaScriptのES6、128の 108バイト

s=(a,b,t)=>[...a].map((l,i)=>/[^a-z]/.exec(b[i])?l.toUpperCase():l.toLowerCase()).join``+(t?'':`
`+s(b,a,1))

JavaScriptの者toUpperCase()toLowerCase()バイトの多くを取るが、String.fromCharCode()さらに長いです


1
これは、文字が文字でs2はなく、対応する文字s1が大文字であるという条件を考慮していません。この場合、cin s1はそのまま返されなければなりません。
cPu1

@ cPu1対処しました:)
Downgoat

4

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別名Falset=!f別名Truec=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、文字は文字であり、関数ToUpperCaseToLowerCaseそのケースに対応する関数を出力します。(この最後のチェックFalseは不要であり、実際に{_,_}->ToLowerCaseは動作し、まだ交換されていないものをキャッチしますが、これは短くて不明瞭ではありません。)

唯一の課題は、関数の2次元配列を引数の配列に圧縮する簡潔な方法を見つけることでした。

編集:「便利」カット/改行のバックスラッシュを貼り付けをキャッチするため@MartinBüttnerのおかげで、1>01<0略語また、文字ではなくバイトで長さを数えるガイダンス(それらは何でも:-))

Edit2:グローバルネームスペースを汚染することは許容できるゴルフであることを指摘し、1つのキャラクター関数アプリケーションを思い出させ、2つの大文字関数を一方の略語に置き換え、もう一方をエミュレートするために使用することを提案してくれた@MartinBüttnerにさらに感謝します(保存4文字)。(私は彼が前にこれをやったと思う:-))


より多くのゴ​​ルフ量:(コード全体)のf@g代わりに使用f[g]します。また、ブロックは必要ないと確信しています。ただやる(f=0>1;t=!f;c=Characters;StringJoin/@...)&。これはグローバルな名前空間を汚染しますが、ゴルフをするときはまったく問題ありません。また、私は数えていないが、あなたは格納することで、バイトを保存することができるかもしれないToUpperCase変数で(u言う)と交換UpperCaseQ@##==u@#
マーティンエンダー

3

Python 3、131バイト

def j(s,g):p=lambda s,g:''.join(i.upper()if j.istitle()else i.lower()if j.islower()else i for i,j in zip(s,g));return p(s,g),p(g,s)

関数は文字列をタプルで返します


1
@ mbomb007投稿の編集のポイントを尋ねてもいいですか?私の意見では、取り消し線は乱雑であり、それが私がそれらを決して使用しない理由です。
ベータ崩壊

これは標準的な形式であり、ゴルフを始めた人たちに少しの信用を与えます。それ以外の場合、大幅に変更したことを確認するには、編集履歴を表示する必要があります。バイトの変更を表示する方がユーザーフレンドリーですが、助けてくれた人を称賛するかどうかはあなた次第だと思います。
mbomb007

役立つ理由の詳細については、このメタ投稿を参照してください。
mbomb007

@ mbomb007あなたがリンクするメタ投稿に対する受け入れられた答えは、それを含めることを望む理由を与えてはいるが、これについてのポリシーである必要はないと言っているので、それは各ポスター次第だと思う。
xnor

@xnor上で言ったことを要約してくれてありがとう。非常に役立ちます。
mbomb007

2

アーラン、157バイト

f(A,B)->S=string,G=fun(A,B)->[if Q>64andalso Q<91->S:to_upper(P);Q>96andalso Q<123->S:to_lower(P);true->P end||{P,Q}<-lists:zip(A,B)]end,G(A,B)++"\n"++G(B,A).

2つの文字列(実際にはリスト)を2文字のタプルリストに圧縮し、リスト内包表記を使用して各文字を適切なケースにマッピングします。


2

Python 2、101バイト

lambda*I:["".join([a.upper(),a.lower(),a][~-b.isalpha()or"Z"<b]for a,b in zip(*X))for X in I,I[::-1]]

2つの文字列を受け取り、リストに出力文字列を返す匿名関数。Python 3ではI,I[::-1]そのように最後に一人で座ることができないため、これをPython 2とマークしました。


1

Python、126バイト

t="".join;s="low","upp";y=lambda a,b:eval("a"+".%ser()"%s[b.isupper()]*b.isalpha());f=lambda a,b:(t(map(y,a,b)),t(map(y,b,a)))

関数fは文字列をタプルで返します


これは修正され、すべてのテストケースで機能するようになりました。
ブルー

1

C、181バイト

char*x,*y;main(int a,char**_){a?x=_[2],y=_[1],main(0,0),putchar(10),x=_[1],y=_[2],main(0,0):(*x?putchar(!isupper(*x)?!islower(*x)?*y:tolower(*y):toupper(*y)),x++,y++,main(0,0):0);}

価値のある方法で標準ライブラリ名を短縮するのに苦労していました(#define 'それらは11文字のオーバーヘッドがかかります)。メイン再帰とグローバル変数xおよびyを引数として使用します。

main(<non-zero>、argv)= main(0、{argv [1]、argv [2]})を呼び出してから改行を出力し、main(0、{argv [2]、argv [1]})を呼び出します

main(0、{x、y})= xが文字列の最後である場合は0を返し、そうでない場合はxの最初の文字の大文字と小文字を正しく出力し、main(0、{x + 1、y + 1})を呼び出します。

2つの文字列を引数として実行します。


ユーザー名を盗んでいますか?;)
ベータ崩壊

1

C - 164 153バイト- GCC

#define r z[_][w]
main(_,z,w)char**z;{while(--_)for(w=0;r;r+=r<25?97:r<91&&r>64?z[!(_-1)+1][w]-=32,_-1?z[_-1][w]-=97:0,32:0,w++);puts(z[1]),puts(z[2]);}

gcc prog.c

./a.out AfdgF a2dfsd

wc -cを停止できれば更新されます。実際に非常にうまく機能します


未使用のバージョンを投稿できますか?私はこれがどのように機能するのか興味がありますが、あなたのシンボルを読むのに苦労しています;)
バルタン

確実なこと。ちょっと待って。
ジェイク

0

F#、211文字

let n x y=List.fold2(fun a i j->a@match j with|c when c>='A'&&c<='Z'->[Char.ToUpper i]|c when c>='a'&&c<='z'->[Char.ToLower i]|_->[i])[](x|>Seq.toList)(y|>Seq.toList)|>String.Concat
let m a b =n a b+"\n"+n b a

もっとよくなるはず ...


0

Matlab、140

function [s,t]=f(s,t)
c=s>96&s<123;C=s>64&s<91;d=t>96&t<123;D=t>64&t<91;s(c&D)=s(c&D)-32;s(C&d)=s(C&d)+32;t(d&C)=t(d&C)-32;t(D&c)=t(D&c)+32;

ゴルフをしていない:

function [s,t] = f(s,t)
c = s>96 & s<123;         % letters that are lowercase in 1st string
C = s>64 & s<91;          % letters that are uppercase in 1st string
d = t>96 & t<123;         % letters that are lowercase in 2nd string
D = t>64 & t<91;          % letters that are uppercase in 2nd string
s(c&D) = s(c&D) - 32;     % make uppercase in 1st string
s(C&d) = s(C&d) + 32;     % make lowercase in 1st string
t(d&C) = t(d&C) - 32;     % make uppercase in 2nd string
t(D&c) = t(D&c) + 32;     % make lowercase in 2nd string

例:

>> [s,t]=f('PRogrammiNG puzZLes & CODe golf','SdlkhkfaladlKsdlalksdg7ldklDgsl')
s =
Programming Puzzles & Code Golf
t =
SDlkhkfalADlksdLAlksdg7LDkldgsl

0

C、164バイト

問題で説明されているように、アルゴリズムをほとんど実装しています。入力パラメーターとして2つのストリングを取ります。

char*a,*b;main(c,v)char**v;{for(a=v[1],b=v[2];*a&&*b;++a,++b)isupper(*a)&&islower(*b)?*a+=32,*b-=32:isupper(*b)&&islower(*a)?*b+=32,*a-=32:0;puts(v[1]);puts(v[2]);}

ゴルフをしていない:

char *a, *b; /* Helpers */

main(c, v)
char **v;
{
    /* While strings not terminated... */
    for (a = v[1], b = v[2]; *a && *b; ++a, ++b)
        isupper(*a) && islower(*b)
            ? *a += 32, *b -= 32 /* Make first string lowercase, second uppercase */
            : isupper(*b) && islower(*a)
                ? *b += 32, *a -= 32; /* Make second string lowercase, first uppercase */

    puts(v[1]); /* print out first string */
    puts(v[2]); /* print out second string */
}

0

ルビー、102

$><<gets.chars.zip(gets.chars).map{|i|/[a-z][A-Z]|[A-Z][a-z]/=~i*''?(i.map &:swapcase):i}.transpose*''

元の文字列を取得し、配列内の文字をペアにします。下限/上限または上限/下限のいずれかである場合は、両方のケースを交換します。次に、配列を転置して、順序付けられた配列に戻します。

これには、入力に末尾の改行が必要です。


0

Perl 5.10以降、101 99バイト

perl -p00e '/\n/;s/([a-z])(?=.{$-[0]}([a-z]))/$x=($1^$2)&" ";$s{$-[2]}=$2^$x;$1^$x/egis;s|.|$s{$-[0]}//$&|eg'

コマンドラインフラグ用に96バイト+ 3バイトp00。単一の改行区切り文字列を入力として受け取ります。

$ echo -e "AAAbbb111\nCc2Dd3Ee4" | perl -p00e '...'

または、STDINに入力を入力できます。

$ perl -p00e '...'
AAAbbb111 <Enter>
Cc2Dd3Ee4 <Ctrl+D>

分解:

perl -p00e'  # Slurp everything into $_, print $_ automatically at the end
    /\n/;    # Match first newline, setting $-[0] to length(s1)

    s/
        ([a-z])  # Match a single letter in s1
        (?=
            .{$-[0]}  # Match n chars where n is length(s1) (until corresponding char in s2)
            ([a-z])   # Corresponding letter in s2
        )
    /
        $x=($1^$2)&" ";   # Check whether bit 6 is the same for both chars.
                          # (Only difference between a lowercase and uppercase ASCII letter
                          # is bit 6; ASCII space is 100000 in binary)

        $s{$-[2]}=$2^$x;  # Swap case of corresponding char in s2 and store in %s,
                          # with position as the key

        $1^$x             # Swap case of current char
    /egis;

    s|.|$s{$-[0]}//$&|eg  # Do a second pass through $_. If there's a value stored in %s
                          # corresponding to this position, use it
'

0

Scalaでの最初の試み、138文字

def f(s:String,t:String)={val g=(a:Char,o:Char)=>if(o.isUpper)a.toUpper else a.toLower;s.zip(t).map(c=>(g.tupled(c),g(c._2, c._1))).unzip}

fは、2つの入力文字列を受け取り、文字列の大文字小文字を変更するために2回使用されるローカル関数を使用してジョブを実行する関数です。

インデントとより読みやすい名前を付けた同じコード:

def f_ungolfed(first : String, second : String) = {
  val aux = (c1: Char, c2: Char) => if (c2.isUpper) c1.toUpper else c1.toLower
    first.zip(second).map(
         c => (aux.tupled(c), aux.tupled(c.swap))
    ).unzip
} 




弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.