สลับตัวพิมพ์ใหญ่เป็นสองสตริง


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!

ลักษณะ

อินพุตเป็นสองสตริงs1และs2มีความยาวเท่ากัน แต่ละรายการจะมี ASCII ที่พิมพ์ได้เท่านั้นและมีความยาวอย่างน้อยหนึ่งตัว คุณสามารถป้อนสิ่งเหล่านี้เป็นสองสายอาร์เรย์ของสองสายหรือสายเดียวกับs1และs2คั่นด้วยแท็บหรือขึ้นบรรทัดใหม่

ผลลัพธ์มีดังต่อไปนี้:

  • สำหรับตัวละครแต่ละตัวcในs1:

    • หากตัวละครไม่ใช่ตัวอักษรให้เอาออกมันไม่เปลี่ยนแปลง

    • มิฉะนั้นถ้าcเป็นจดหมาย:

      • ค้นหาตัวละครจับคู่ (หนึ่งที่ดัชนีเดียวกัน) s2ใน

        • ถ้าเป็นอักษรตัวcใหญ่ให้พิมพ์ผลลัพธ์เป็นตัวพิมพ์ใหญ่

        • หากเป็นตัวอักษรตัวเล็กให้พิมพ์เป็นตัวcพิมพ์เล็ก

        • มิฉะนั้นเอาต์พุตจะcไม่เปลี่ยนแปลง

  • จากนั้นทำสิ่งเดียวกันยกเว้นด้วยs1และs2สลับ

เป็นหลักในทุกตัวอักษรs1ที่ตัวละครที่ตรงกันในs2เป็นเมืองหลวงควรเป็นตัวพิมพ์ใหญ่และตัวอักษรทั้งหมดในs1ด้วยตัวอักษรตัวพิมพ์เล็กที่ดัชนีเดียวกันในs2ควรจะเป็นตัวพิมพ์เล็ก (และในทางกลับกัน)

กรณีทดสอบ

การป้อนข้อมูล:

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

เอาท์พุท:

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

การป้อนข้อมูล:

PRogrammiNG puzZLes & CODe golf
SdlkhkfaladlKsdlalksdg7ldklDgsl

เอาท์พุท:

Programming Puzzles & Code Golf
SDlkhkfalADlksdLAlksdg7LDkldgsl

การป้อนข้อมูล:

AAAbbb111
Cc2Dd3Ee4

เอาท์พุท:

AaABbb111
CC2dd3Ee4

33
ฉันไม่สามารถใช้ชีวิตของฉันเพื่อหาว่าสิ่งนี้อาจเกิดจากการกดปุ่ม Shift ที่ชำรุด แต่ฉันจะเถียงกับใครใน Doorknob ยิ่งใหญ่? : P
Geobits

1
อินพุตต้องอยู่ในบรรทัดเดียวกันหรือไม่? หรือฉันสามารถใช้อักขระอื่น (แท็บ?) เพื่อแยกพวกเขาได้หรือไม่
kirbyfan64sos

@ เดนนิสไม่จำเป็นต้องป้อนข้อมูลตามที่แสดงในคำถาม
Doorknob

@ kirbyfan64sos คุณสามารถรับได้สองสายคืออาร์เรย์ของสตริงหรือสองสายคั่นด้วยแท็บหรือขึ้นบรรทัดใหม่ ฉันจะแก้ไขให้เป็นคำถาม
Doorknob

ขึ้นบรรทัดใหม่ที่ได้รับอนุญาตคืออะไร
Downgoat

คำตอบ:


7

Pyth, 19 18 ไบต์

LCmrW&@dG@drG1d2Cb

นี่เป็นการกำหนดฟังก์ชันyที่ยอมรับและส่งคืนรายการสตริง

ตรวจสอบกรณีทดสอบทั้งหมดในครั้งเดียวในPyth คอมไพเลอร์

ขอบคุณ @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}

นี่คือฟังก์ชั่นที่ไม่ระบุชื่อที่ปรากฏอาร์เรย์ของสตริงจากสแต็กและปล่อยให้หนึ่งกลับมา

ในเบราว์เซอร์ที่รองรับคุณสามารถตรวจสอบกรณีทดสอบทั้งหมดได้ในครั้งเดียวใน ล่าม 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]);}

Ungolfed:

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

สิ่งนี้จะสร้างฟังก์ชั่นที่ยอมรับสองสตริงและคืนค่า tuple ของสตริง ไม่มีอะไรฉลาดเป็นพิเศษเกิดขึ้นที่นี่; เราเพียงแค่กำหนดฟังก์ชั่นด้านในที่ใช้อัลกอริทึมในสเป็คโดยตรงและเรียกมันสองครั้ง

Ungolfed:

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นั้นคือตัวพิมพ์ใหญ่ ในกรณีนี้cใน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"}และส่งออกอาร์เรย์ของสองสาย ยกเลิกการสันนิฐานอัดมันเขียนโครงการที่f@xเป็นf[x]ที่ใดก็ตามที่มันจะปรากฏขึ้น, การขยายตัวย่อที่สัญกรณ์ ( f=0>1aka False, t=!faka True, c=Charactersและu=ToUpperCaseQ) และยกเลิกการเปลี่ยน UpperCaseQ [#] ด้วย#==u@#(ตัวละครตัวนี้เท่ากับรุ่น uppercased ของมัน) มันเป็น:

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

การเชื่อมต่อ: การตามรอย&ทำให้ฟังก์ชั่นนี้ อาร์กิวเมนต์ถูกแทรกเป็น "#" /@ #ที่ทั้งสองกรณีของ ตัวอย่างเช่นf=0>1; ... & [{"AAAbbb111", "Cc2Dd3Ee4"}]สร้างผลลัพธ์{AaABbb111,CC2dd3Ee4}การผลิตการส่งออก

การประมวลผล: บอกตามปกตินอกเพื่อ:

  • การส่งออกของ MapThread[...]เป็นรายการของสองรายการของตัวละคร StringJoin ถูกนำไปใช้กับรายการอักขระทั้งสองรายการเหล่านี้เพื่อสร้างรายการของสองสตริงคือเอาต์พุต
  • MapThread[#[#2]&, ... , 2]ทำหน้าที่ในอาร์เรย์ของรายการองค์ประกอบ 2-by-n สองรายการ รายการแรกคือฟังก์ชันแบบ 2-by-n รายการที่สองคืออาร์เรย์แบบอักขระขนาดละ 2 ตัวและCharacters /@ #รายการอักขระในสายป้อนข้อมูลสองรายการ มันทำงานได้ที่ความลึก 2 เช่นในฟังก์ชั่นและตัวละครแต่ละตัว
  • Reverse[...] สลับรายการย่อยทั้งสองของฟังก์ชั่นเพื่อที่ MapThread จะใช้ฟังก์ชันของสตริงที่สองกับสตริงแรกและในทางกลับกัน
  • { ... } & เป็นฟังก์ชันที่ไม่ระบุตัวตนที่ใช้กับสตริงอินพุตสองสตริง
  • {LetterQ[#], UpperCaseQ[#]} & /@ Characters[#]แยกสตริงออกเป็นรายการอักขระจากนั้นแทนที่อักขระแต่ละตัวด้วยรายการองค์ประกอบสองรายการ ในรายการองค์ประกอบทั้งสององค์ประกอบแรกคือTrueถ้าตัวละครเป็นตัวอักษรและFalseในทำนองเดียวกันองค์ประกอบที่สองระบุว่าตัวละครเป็นตัวพิมพ์ใหญ่ UpperCaseQ[]ไม่สามารถคืนจริงได้หากไม่ได้รับจดหมาย
  • /. {{False, _} -> (# &), {True, True} -> ToUpperCase, {True, False} -> ToLowerCase}แทนที่ทั้งสองรายการองค์ประกอบด้วยฟังก์ชั่น (การขยายตัวย่อtและfเกิดขึ้นก่อนที่จะพยายามจับคู่ใด ๆ ) หากรายการองค์ประกอบสองรายการFalseเป็นองค์ประกอบแรกมันจะถูกแทนที่ด้วยฟังก์ชั่นฟังก์ชั่น(# &)ตัวตน (จำเป็นต้องใส่วงเล็บมิฉะนั้นลูกศรจะผูกอย่างแน่นหนากว่าเครื่องหมายแอมเปอร์แซนด์) มิฉะนั้นรายการองค์ประกอบทั้งสองจะเริ่มต้นด้วยTrueอักขระนั้นเป็นตัวอักษรและเราจะแสดงฟังก์ชันToUpperCaseและToLowerCaseสอดคล้องกับตัวพิมพ์ (การตรวจสอบล่าสุดFalseนี้ไม่จำเป็นจริง ๆ แล้ว{_,_}->ToLowerCaseจะได้ผลจับอะไรที่ยังไม่ถูกแทนที่ แต่สิ่งนี้จะไม่สั้นลงและคลุมเครือมากขึ้น)

ความท้าทายเพียงอย่างเดียวคือการหาวิธีรวบรัดเพื่อซิปอาร์เรย์สองมิติของฟังก์ชันไปยังอาร์เรย์ของอาร์กิวเมนต์

แก้ไข: ขอบคุณ @Martin Büttnerสำหรับการจับแบ็กสแลช "ตัด / วาง linebreak ที่" เป็นประโยชน์ " 1>0และและ1<0ตัวย่อและสำหรับคำแนะนำในการนับความยาวเป็นไบต์ไม่ใช่ตัวอักษร (ไม่ว่าจะเป็น :-))

แก้ไข 2: ขอขอบคุณ @Martin Büttnerที่ชี้ให้เห็นว่าการสร้างมลภาวะให้กับเนมสเปซทั่วโลกนั้นเป็นสิ่งที่ยอมรับได้กอล์ฟเตือนให้ฉันนึกถึงแอพพลิเคชั่นตัวละครตัวหนึ่งและแนะนำให้แทนที่ฟังก์ชั่น สี่ตัวอักษร) (ฉันคิดว่าเขาทำสิ่งนี้มาก่อน :-))


Golfitude เพิ่มเติม: ใช้f@gแทนf[g](ตลอดรหัสของคุณ) ฉันค่อนข้างแน่ใจว่าคุณไม่ต้องการบล็อก (f=0>1;t=!f;c=Characters;StringJoin/@...)&เพียงแค่ทำ สิ่งนี้ส่งผลกระทบต่อเนมสเปซส่วนกลาง แต่เราก็ทำได้ดีเมื่อเล่นกอล์ฟ นอกจากนี้ผมยังไม่ได้นับ แต่คุณอาจจะสามารถบันทึกไบต์โดยการจัดเก็บToUpperCaseในตัวแปร ( uพูด) และแทนที่ด้วยUpperCaseQ@# #==u@#
Martin Ender

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)

ฟังก์ชันส่งคืนสตริงใน tuple


1
@ mbomb007 ฉันขอจุดแก้ไขโพสต์ของฉันได้ไหม ในความเห็นของฉันความขัดแย้งนั้นมีความยุ่งเหยิงนั่นคือสาเหตุที่ฉันไม่เคยใช้มัน
Beta Decay

มันเป็นรูปแบบมาตรฐานและให้เครดิตกับผู้คนที่ช่วยคุณเล่นกอล์ฟโดยแสดงให้เห็นว่านี่ไม่ใช่สิ่งที่คุณคิด มิฉะนั้นเพื่อที่จะเห็นว่าคุณเปลี่ยนแปลงอย่างมีนัยสำคัญเลยพวกเขาต้องดูประวัติการแก้ไข เป็นมิตรต่อผู้ใช้มากกว่าที่จะแสดงการเปลี่ยนแปลงไบต์ แต่ฉันคิดว่ามันขึ้นอยู่กับคุณว่าจะให้เครดิตผู้ที่ช่วยคุณหรือไม่
mbomb007

ดูโพสต์เมตานี้สำหรับคำอธิบายเพิ่มเติมว่าทำไมจึงมีประโยชน์
mbomb007

@ mbomb007 คำตอบที่ได้รับการยอมรับสำหรับลิงก์เมตาที่คุณบอกว่าไม่มีและไม่จำเป็นต้องมีนโยบายเกี่ยวกับเรื่องนี้ถึงแม้ว่ามันจะมีเหตุผลที่คนอาจต้องการที่จะรวมพวกเขาดังนั้นฉันคิดว่ามันขึ้นอยู่กับผู้โพสต์แต่ละคน
xnor

@ xnor ขอบคุณที่สรุปสิ่งที่ฉันพูดไว้ข้างต้น มีประโยชน์มาก
mbomb007

2

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

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

ฟังก์ชั่นที่ไม่ระบุชื่อซึ่งรับสองสตริงและส่งคืนสตริงเอาต์พุตในรายการ ฉันทำเครื่องหมายว่า Python 2 เพราะ Python 3 ไม่อนุญาตให้I,I[::-1]นั่งคนเดียวในตอนท้าย


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ส่งคืนสตริงใน tuple


ตอนนี้ได้รับการแก้ไขแล้วตอนนี้ใช้ได้กับทุกกรณีทดสอบ
บลู

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'ing พวกเขาใช้อักขระ 11 ตัวที่มีค่าใช้จ่าย) ใช้การเรียกซ้ำหลักและตัวแปรโกลบอล x และ y เป็นอาร์กิวเมนต์

main (<non-zero>, argv) = call main (0, {argv [1], argv [2]}) จากนั้นพิมพ์ newline จากนั้นเรียก main (0, {argv [2], argv [1]})

main (0, {x, y}) = ถ้า x เป็นจุดสิ้นสุดของสตริงส่งคืน 0 มิฉะนั้นพิมพ์ตัวพิมพ์ที่ถูกต้องของอักขระตัวแรกของ x และเรียก main (0, {x + 1, y + 1})

รันด้วยสองสตริงเป็นอาร์กิวเมนต์


คุณขโมยชื่อผู้ใช้ของฉันหรือไม่ ;)
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

จะอัปเดตถ้าฉันสามารถลง wc -c ได้ ใช้งานได้ดีจริง ๆ


คุณช่วยโพสต์เวอร์ชั่นที่ไม่ดีขึ้นได้ไหม? ฉันอยากรู้ว่ามันใช้งานอย่างไร แต่มีเวลาอ่านสัญลักษณ์ของคุณยากมาก)
Vartan

แน่นอนค่ะ ให้เวลาฉันหน่อย.
เจค

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;

Ungolfed:

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

Ungolfed:

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

ความพยายามครั้งแรกในสกาล่า 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 เป็นฟังก์ชั่นที่รับสตริงอินพุตสองสตริงและทำงานด้วยฟังก์ชันโลคัลที่ใช้สองครั้งสำหรับการเปลี่ยนเคสของสตริง

รหัสเดียวกันโดยมีการเยื้องและเป็นชื่อที่อ่านง่ายกว่า:

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.