Tukar kapitalisasi dua string

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!

Deskripsi

Inputnya adalah dua string, s1dan s2panjangnya sama. Masing-masing hanya berisi ASCII yang dapat dicetak dan panjangnya setidaknya satu karakter. Anda dapat memasukkan ini sebagai dua string, array dua string, atau string tunggal dengan s1dan s2dipisahkan oleh tab atau baris baru.

Outputnya adalah sebagai berikut:

  • Untuk setiap karakter cdi s1:

    • Jika karakter bukan huruf, output tidak berubah.

    • Kalau tidak, jika cada surat:

      • Temukan karakter yang cocok (satu pada indeks yang sama) di s2.

        • Jika huruf kapital, output cdikapitalisasi.

        • Jika huruf kecil, hasilkan cdalam huruf kecil.

        • Jika tidak, output ctidak berubah.

  • Kemudian lakukan hal yang sama, kecuali dengan s1dan s2diaktifkan.

Pada dasarnya, semua huruf di s1mana karakter yang cocok dalam huruf s2kapital harus dikapitalisasi, dan semua huruf s1dengan huruf kecil di indeks yang sama s2harus menjadi huruf kecil (dan sebaliknya).

Uji kasus

Memasukkan:

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

Keluaran:

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

Memasukkan:

PRogrammiNG puzZLes & CODe golf
SdlkhkfaladlKsdlalksdg7ldklDgsl

Keluaran:

Programming Puzzles & Code Golf
SDlkhkfalADlksdLAlksdg7LDkldgsl

Memasukkan:

AAAbbb111
Cc2Dd3Ee4

Keluaran:

AaABbb111
CC2dd3Ee4
Gagang pintu
sumber
33
Saya tidak bisa seumur hidup saya mencari tahu bagaimana ini bisa disebabkan oleh kunci shift yang rusak, tapi siapa saya untuk berdebat dengan Doorknob yang maha kuasa? : P
Geobits
1
Apakah input harus di jalur yang sama? Atau bisakah saya menggunakan beberapa karakter lain (tab?) Untuk memisahkan mereka?
kirbyfan64sos
@ Dennis Tidak, input harus disediakan seperti yang ditunjukkan dalam pertanyaan.
Gagang pintu
@ kirbyfan64sos Anda dapat mengambil dua string, array string, atau dua string yang dipisahkan oleh tab atau baris baru. Saya akan mengeditnya menjadi pertanyaan.
Gagang pintu
Apakah baris baru tertinggal diperbolehkan?
Downgoat

Jawaban:

7

Pyth, 19 18 byte

LCmrW&@dG@drG1d2Cb

Ini mendefinisikan fungsi y yang menerima dan mengembalikan daftar string.

Verifikasi semua kasus uji sekaligus di Pyth Compiler / Executor .

Berkat @Jakube untuk bermain golf 1 byte.

Bagaimana itu bekerja

                   " (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.
Dennis
sumber
12

CJam, 25 byte

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

Ini adalah fungsi anonim yang memunculkan array string dari tumpukan dan mengembalikannya.

Di browser yang didukung, Anda dapat memverifikasi semua kasus uji sekaligus dalam juru bahasa CJam .

Uji kasus

Kode

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.

Memasukkan

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

Keluaran

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

Bagaimana itu bekerja

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.
Dennis
sumber
8

C, 126 byte

Ini adalah upaya pertama saya di golf kode, pernah. Beri tahu saya jika saya melakukan kesalahan.

Saya menggunakan operasi bitwise untuk melakukan switching

Golf:

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]);}

Tidak Disatukan:

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

edit: diganti && dengan *

Vartan
sumber
6

SQL (PostGreSQL), 427 Bytes

Meskipun ukurannya sangat besar, ini akhirnya menjadi sedikit lebih kecil dari yang saya harapkan. Saya tidak yakin saya akan bisa jujur. Saya curiga masih banyak yang bisa dilakukan :)

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

Diformat dan dikomentari

-- 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

Uji coba

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
MickyT
sumber
4

Julia, 140 byte

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)))

Ini menciptakan fungsi yang menerima dua string dan mengembalikan tuple string. Tidak ada yang pintar terjadi di sini; kita cukup mendefinisikan fungsi bagian dalam yang secara langsung mengimplementasikan algoritma dalam spesifikasi dan menyebutnya dua kali.

Tidak Disatukan:

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
Alex A.
sumber
4

JavaScript ES6, 128 108 byte

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()dan toLowerCase()membutuhkan banyak byte tetapi String.fromCharCode()bahkan lebih lama

Downgoat
sumber
1
Ini tidak menjelaskan kondisi di mana karakter dalam s2bukan huruf dan karakter yang sesuai dalam s1huruf besar. Dalam hal ini, cdi s1harus dikembalikan tidak berubah.
cPu1
@ cPu1 Saya sudah membahasnya :)
Downgoat
4

Mathematica, 173 169 155 byte

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]&

Ini adalah fungsi mengambil array dari dua string, misalnya {"Foo","bAR"}dan mengeluarkan array dari dua string. Un-spasial-mengompresi, menulis ulang skema f@xseperti f[x]di mana pun muncul, memperluas singkatan notasi ( f=0>1alias False, t=!falias True, c=Characters, dan u=ToUpperCaseQ), dan un-menggantikan UpperCaseQ [#] dengan #==u@#(karakter ini sama dengan versi uppercased nya), itu adalah:

StringJoin /@ MapThread[#[#2] &, {
    Reverse[
        { LetterQ[#], UpperCaseQ[#] } & /@ Characters[#] /. 
        { {False, _} -> (# &), {True, True} -> ToUpperCase, 
          {True, False} -> ToLowerCase } & /@ #
    ],
    Characters /@ #
}, 2] &

Interfacing: trailing &membuat fungsi ini. Argumennya dimasukkan sebagai "#" pada kedua contoh /@ #. Misalnya f=0>1; ... & [{"AAAbbb111", "Cc2Dd3Ee4"}]menghasilkan output {AaABbb111,CC2dd3Ee4}.

Memproses: Diberitahu di luar biasa agar:

  • Output dari MapThread[...]adalah daftar dua daftar karakter. StringJoin diterapkan ke masing-masing dua daftar karakter ini untuk menghasilkan daftar dua string, output.
  • MapThread[#[#2]&, ... , 2]bertindak pada array dari dua daftar elemen 2-oleh-n. Daftar pertama adalah susunan fungsi 2-oleh-n. Daftar kedua adalah array karakter 2-oleh-n Characters /@ #, daftar karakter dalam dua string input. Ia bekerja pada kedalaman 2, yaitu, pada fungsi dan karakter individu.
  • Reverse[...] swap kedua daftar fungsi sehingga MapThread akan menerapkan fungsi string kedua ke string pertama dan sebaliknya.
  • { ... } & adalah fungsi anonim yang diterapkan ke masing-masing dari dua string input.
  • {LetterQ[#], UpperCaseQ[#]} & /@ Characters[#]membagi string menjadi daftar karakter, lalu mengganti setiap karakter dengan dua daftar elemen. Dalam dua daftar elemen ini, elemen pertama adalah Truejika karakter adalah huruf dan Falsesebaliknya, elemen kedua menunjukkan apakah karakter huruf besar. UpperCaseQ[]tidak dapat mengembalikan true jika tidak menerima surat.
  • /. {{False, _} -> (# &), {True, True} -> ToUpperCase, {True, False} -> ToLowerCase}mengganti dua daftar elemen ini dengan fungsi. (Perluasan singkatan tdan fterjadi sebelum pencocokan dicoba.) Jika daftar dua elemen memiliki Falsesebagai elemen pertama, itu diganti dengan fungsi (# &), fungsi identitas. (Tanda kurung diperlukan, jika panah mengikat lebih ketat daripada ampersand.) Jika tidak, daftar elemen dua dimulai dengan True, karakter adalah huruf, dan kami menampilkan fungsi ToUpperCasedan ToLowerCasesesuai dengan kasusnya. (Memeriksa yang terakhir Falseini tidak perlu, pada kenyataannya {_,_}->ToLowerCaseakan berhasil, menangkap apa pun yang belum diganti, tetapi ini tidak akan lebih pendek dan lebih tidak jelas.)

Satu-satunya tantangan adalah mencari tahu cara ringkas untuk zip array fungsi dua dimensi ke array argumen.

Sunting: Terima kasih kepada @Martin Büttner karena telah menangkap backslash "membantu" cut / paste linebreak, 1>0dan1<0 singkatan, dan juga untuk panduan untuk menghitung panjang dalam byte, bukan karakter (apa pun itu :-))

Sunting2: Terima kasih lebih lanjut kepada @Martin Büttner karena menunjukkan bahwa mencemari namespace global adalah golf yang dapat diterima, mengingatkan saya pada satu aplikasi fungsi karakter, dan menyarankan untuk mengganti dua fungsi huruf besar dengan singkatan untuk satu dan menggunakan yang lain untuk meniru yang lain (menyimpan empat karakter). (Saya pikir dia sudah melakukan ini sebelumnya. :-))

Menara Eric
sumber
Lebih banyak golf: gunakan f@galih-alih f[g](di seluruh kode Anda). Saya juga cukup yakin Anda tidak perlu blok. Lakukan saja (f=0>1;t=!f;c=Characters;StringJoin/@...)&. Ini mencemari namespace global, tapi kami sama sekali tidak keberatan dengan itu saat bermain golf. Juga, saya belum menghitung, tetapi Anda mungkin dapat menyimpan byte dengan menyimpan ToUpperCasedalam variabel ( u, katakanlah) dan ganti UpperCaseQ@#dengan #==u@#.
Martin Ender
3

Python 3, 131 byte

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)

Fungsi mengembalikan string dalam sebuah tuple

Peluruhan Beta
sumber
1
@ mbomb007 Bolehkah saya menanyakan maksud mengedit posting saya? Menurut pendapat saya dicoret itu berantakan, itu sebabnya saya tidak pernah menggunakannya.
Beta Decay
Ini format standar, dan memberikan sedikit pujian kepada orang-orang yang membantu Anda bermain golf, dengan menunjukkan bahwa ini bukan yang awalnya Anda pikirkan. Jika tidak, untuk melihat bahwa Anda mengubahnya secara signifikan, mereka harus melihat riwayat sunting. Lebih mudah digunakan untuk menampilkan byte-perubahan, tetapi saya kira terserah pada Anda apakah akan menghargai mereka yang membantu Anda atau tidak.
mbomb007
Lihat posting meta ini untuk penjelasan lebih lanjut tentang mengapa ini membantu.
mbomb007
@ mbomb007 Jawaban yang diterima untuk meta post yang Anda tautkan mengatakan tidak ada dan tidak perlu ada kebijakan tentang ini, meskipun itu memberikan alasan orang mungkin ingin memasukkan mereka, jadi saya pikir itu terserah masing-masing poster.
xnor
@ xnor Terima kasih telah merangkum apa yang saya katakan di atas. Sangat membantu.
mbomb007
2

Erlang, 157 byte

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).

Ritsleting dua string (sebenarnya, daftar) ke dalam daftar dua karakter-tupel dan memetakan masing-masing karakter ke kasus yang sesuai menggunakan pemahaman daftar.

cPu1
sumber
2

Python 2, 101 byte

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]]

Fungsi anonim yang mengambil dua string dan mengembalikan string output dalam daftar. Saya telah menandai ini sebagai Python 2 karena Python 3 tidak memungkinkan I,I[::-1]untuk duduk sendiri di akhir seperti itu.

Sp3000
sumber
1

Python, 126 byte

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)))

Fungsi fmengembalikan string dalam sebuah tuple

Biru
sumber
Itu sekarang sudah diperbaiki, sekarang berfungsi untuk semua kasus uji.
Biru
1

C, 181 byte

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);}

Mengalami kesulitan memperpendek nama perpustakaan standar dengan cara yang berharga, (# define'ing mereka membutuhkan 11 karakter overhead). Menggunakan rekursi utama dan variabel global x dan y sebagai argumen.

main (<non-zero>, argv) = panggil main (0, {argv [1], argv [2]}) lalu cetak baris baru lalu panggil main (0, {argv [2], argv [1]})

main (0, {x, y}) = jika x adalah akhir dari string mengembalikan 0, selain itu cetak huruf yang benar dari karakter pertama x dan panggil main (0, {x + 1, y + 1}).

Jalankan dengan dua string sebagai argumen.

LambdaBeta
sumber
Apakah Anda mencuri nama pengguna saya? ;)
Beta Decay
1

C - 164 153 Bytes - 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

Akan memperbarui jika saya bisa turun wc -c. Bekerja dengan sangat baik sebenarnya

jake
sumber
Bisakah Anda mem-posting versi yang tidak disunat? Saya ingin tahu bagaimana ini bekerja, tetapi mengalami kesulitan membaca simbol Anda;)
Vartan
Tentu saja. Beri saya waktu sebentar.
jake
0

F #, 211 karakter

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

dapat menjadi lebih baik ...

mike m
sumber
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;

Tidak Disatukan:

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

Contoh:

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

C, 164 byte

Cukup banyak menerapkan algoritma seperti yang dijelaskan dalam masalah. Mengambil 2 string sebagai parameter input.

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]);}

Tidak Disatukan:

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 */
}
Cole Cameron
sumber
0

Ruby, 102

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

Mengambil string asli, memasangkan surat dalam array. Jika keduanya lebih rendah / tutup atau tutup / lebih rendah, maka bertukar pada keduanya. Kemudian, pindahkan array kembali ke array yang kita pesan.

Ini membutuhkan baris baru di input.

Bukan itu Charles
sumber
0

Perl 5.10+, 101 99 byte

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

96 byte + 3 byte untuk bendera baris perintah p00. Mengambil satu string yang dibatasi baris baru sebagai input:

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

Atau Anda dapat memasukkan input pada STDIN:

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

Rusak:

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
'
IniSuitIsBlackNot
sumber
0

Upaya pertama di scala, 138 karakter

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 adalah fungsi yang mengambil dua string input dan melakukan pekerjaan, dengan fungsi lokal, digunakan dua kali, untuk mengubah kasus string.

Kode yang sama, dengan lekukan dan hanya sedikit nama yang lebih mudah dibaca:

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
} 
pengguna47106
sumber
0

Jelly , 13 byte

=Œu=/ị"Ɱż"Œs$

Tautan monadik yang menerima dan mengembalikan daftar dua "string" (daftar karakter dalam Jelly).

Cobalah online!

Jonathan Allan
sumber
0

Python 2 , 97 byte

lambda a,b:''.join([x,chr(ord(x)&95|ord(y)&32)][(x+y).isalpha()]for x,y in zip(a+'\n'+b,b+' '+a))

Cobalah online!

Chas Brown
sumber
0

Tcl , 194 byte

proc C a\ b {proc L x\ y {expr [[set S string] is u $y]?"[$S tou $x]":"[$S is lo $y]"?"[$S tol $x]":"$x"}
lmap x [split $a ""] y [split $b ""] {append s [L $x $y]
append t [L $y $x]}
list $s $t}

Cobalah online!

sergiol
sumber
0

Haskell , 109 91 byte

import Data.Char
(!)=zipWith f
f c|isUpper c=toUpper|isAlpha c=toLower|1<3=id
a#b=[b!a,a!b]

Terima kasih kepada @Laikoni selama 16 byte!

Cobalah online!

Angs
sumber