उन मामलों को खोलना - (बहुत) -संवेदी तार


53

लक्ष्य

यह एक सरल चुनौती है। आपका लक्ष्य एक अक्षर को उसी मामले के अगले अक्षर के साथ स्वैप करके एक स्ट्रिंग को अनचेक करना है, जबकि गैर-अक्षर वर्णों को छोड़ दिया गया है।

उदाहरण

स्टेप बाई स्टेप स्पष्टीकरण

  1. पहला चरित्र ए है E। हम ऊपरी मामले में अगले पत्र की तलाश करते हैं: यह ए C। हम इन पात्रों की अदला-बदली करते हैं, जिसके कारण यह होता है CdoE!

  2. हम अगले चरित्र के लिए आगे बढ़ते हैं: यह एक है d। हम निचले मामले में अगले पत्र की तलाश करते हैं: यह ए o। हम इन पात्रों की अदला-बदली करते हैं, जिसके कारण यह होता है CodE!

  3. हम अगले चरित्र के लिए आगे बढ़ते हैं: यह वह है dजिसे हमने अभी यहां स्थानांतरित किया है। हम इसे अनदेखा करते हैं, क्योंकि यह पहले ही संसाधित हो चुका है।

  4. हम अगले चरित्र के लिए आगे बढ़ते हैं: यह वह है Eजिसे यहां # 1 चरण में स्थानांतरित किया गया था। हम इसे अनदेखा करते हैं, क्योंकि यह पहले ही संसाधित हो चुका है।

  5. हम अगले चरित्र के लिए आगे बढ़ते हैं: यह एक है !। हम इसे अनदेखा करते हैं, क्योंकि यह एक पत्र नहीं है।

नियम

  • आप मान सकते हैं कि इनपुट स्ट्रिंग विशेष रूप से मुद्रण योग्य ASCII वर्णों से बनी है, 32 - 126 की रेंज में।

  • आप या तो एक पूर्ण कार्यक्रम या एक फ़ंक्शन लिख सकते हैं, जो या तो प्रिंट करता है या परिणाम देता है।

  • यदि इनपुट स्ट्रिंग में विषम संख्या में अक्षर होते हैं, तो अंतिम शेष अक्षर को एक दूसरे के साथ स्वैप नहीं किया जा सकता है और इसे किसी भी स्थिति में नहीं रहना चाहिए। एक ही तर्क लागू होता है यदि स्ट्रिंग में अक्षरों की एक समान संख्या होती है, लेकिन अपरकेस अक्षरों की एक विषम संख्या और निचले अक्षरों की एक विषम संख्या।

  • यह कोड-गोल्फ है, इसलिए बाइट्स में सबसे कम जवाब जीतता है। मानक खामियों को मना किया जाता है।

परीक्षण के मामलों

Input : lLEhW OroLd!
Output: hELlO WorLd!

Input : rpGOZmaimgn uplRzse naC DEoO LdGf
Output: prOGRamming puzZles anD COdE GoLf

Input : eIt uqHKC RBWOO xNf ujPMO SzRE HTL EOvd yAg
Output: tHe quICK BROWN fOx juMPS OvER THE LAzy dOg

Input : NraWgCi: Nsas-eNEiTIsev rNsiTG!!
Output: WarNiNg: Case-sENsITive sTriNG!!

नहीं-तो-यादृच्छिक परीक्षण के मामले:

Input : (^_^)
Output: (^_^)

Input : AWCTY HUOS RETP
Output: WATCH YOUR STEP

Input : hwn oeesd acsp nawyya
Output: who needs caps anyway

Input : SpMycaeIesKyBorekn
Output: MySpaceKeyIsBroken

Input : D's mroyr, Ivam. I'e faardi I act'n od htta.
Output: I'm sorry, Dave. I'm afraid I can't do that.

मुझे लगता है कि यदि इनपुट में अक्षरों की एक समान संख्या है, तो एक समान टिप्पणी रखती है, लेकिन अपरकेस अक्षरों की एक विषम संख्या और निचले अक्षरों की एक विषम संख्या।
ग्रेग मार्टिन

14
यह वास्तव में एक बड़ी चुनौती है ... मुझे यह भी पसंद है कि परीक्षण के मामलों को एक लोअरकेस स्ट्रिंग में टाइप करके बनाया जा सकता है, बेतरतीब ढंग से अक्षरों में से कुछ को अपरकेस में बदल दिया जाता है, और फिर उसी समस्या को हल करने वाले सटीक प्रोग्राम को चला रहा है!
ग्रेग मार्टिन

1
@GregMartin मुझे पता चला कि समस्या का अपना विलोम है क्योंकि जब एक परीक्षण मामले की कोशिश की जाती है तो मैं गलती से इनपुट के बजाय आउटपुट में टाइप किया जाता है :-)
लुइस मेंडो

मुझे लगता है कि आपको एक से अधिक गैर-अक्षर वाले ASCII चरित्र के साथ परीक्षण मामलों को शामिल करना चाहिए ... मुझे लगता है कि कुछ कार्यान्वयन गलती से उन्हें एक-दूसरे के साथ स्विच कर सकते हैं, जब ऐसा होने वाला नहीं है।
ग्रेग मार्टिन

3
परीक्षण मामलों में संभवतः अपरकेस अक्षरों के बिना एक स्ट्रिंग और बिना किसी अक्षर के एक स्ट्रिंग शामिल होना चाहिए।
डेनिस

जवाबों:


4

जेली , 21 20 19 18 बाइट्स

s2UF,
nŒlTÇyJịŒsµ⁺

इसे ऑनलाइन आज़माएं!

यह काम किस प्रकार करता है

nŒlTÇyJịŒsµ⁺  Main link. Argument: s (string)

 Œl           Convert to lowercase.
n             Test for inequality.
   T          Truth; yield all indices of 1's.
    Ç         Call the helper link. Yields [A, B] (pair of lists).
      J       Indices; yield I := [1, ..., len(s)].
     y        Translate; replace the integers of I that occur in A with the
              corresponding integers in B.
        Œs    Swapcase; yield s with swapped case.
       ị      Use the translated index list to index into s with swapped case.
          µ   Combine all links to the left into a chain.
           ⁺   Duplicate the chain, executing it twice.


s2UF,         Helper link. Argument: J (list of indices)

s2            Split J into pairs. If the length is odd, the last list will be
              a singleton list.
  U           Upend; reverse each pair. This is a no-op for singletons lists.
   F          Flatten, concatenating the pairs.
    ,          Pair the previous result with J.


9

MATL , 22 बाइट्स

2:"tttk<f2etAZ))P5M(Yo

इसे ऑनलाइन आज़माएं! या सभी परीक्षण मामलों को सत्यापित करें

यह काम किस प्रकार करता है

2:"       % Do the following twice
  ttt     %   Input string (implicit). Push three more copies
  k       %   Convert to lowercase
  <f      %   Indices of characters that had their code point increased by
          %   the lowercase conversion, i.e. that were uppercase letters
  2e      %   Convert to 2-row matrix. This pads a zero in the lower-right 
          %   corner if necessary
  tAZ)    %   Keep only columns that don't contain zeros. Thus if there
          %   was a character that can't be swapped it will be ignored             
  )       %   Get 2-row matrix of characters at those positions
  P       %   Flip vertically. This does the swapping
  5M      %   Push matrix of original indices again
  (       %   Write the swapped characters onto their original positions
  Yo      %   Change case. In the first iteration, this prepares the
          %   string so the second iteration will process the letters that
          %   were originally lowercase. In the second iteration, it
          %   undoes the change of case 
          % End (implicit)
          % Display (implicit)

6

बैश + यूनिक्स उपयोगिताओं, 77 62 57 56 54 बाइट्स

sed -r "s/([$1)([^$1*)([$1)/\3\2\1/g"||$0 a-z]|$0 A-Z]

स्टड में इनपुट। स्टडआउट में आउटपुट।

(इस अंतिम संस्करण में, stderr को भी लिखा जाना होता है, लेकिन PPCG सर्वसम्मति से लगता है कि यह ठीक है - stderr को केवल अनदेखा किया गया है। )

संपादित 1: 15 बाइट्स के लिए @ डेनिस के लिए धन्यवाद! सुधार: (ए) स्टड के माध्यम से इनपुट लेना; (बी) 2 सेड स्क्रिप्ट को एक में जोड़ना; और (ग) बैश पैरामीटर विस्तार के माध्यम से प्रतिस्थापन के साथ ट्रे की जगह; (b) और (c) Edit 2 में गायब हो गया।

2 संपादित करें: 5 अतिरिक्त बाइट्स द्वारा छोटा। संपादन 1 में दोनों (बी) और (सी) को बदलने के लिए एक फ़ंक्शन कॉल का उपयोग किया।

3 संपादित करें: फ़ंक्शन तर्कों के भाग के रूप में एक और बाइट - पास]।

संपादित करें 4: दो फ़ंक्शन कॉल को प्रोग्राम में कॉल के साथ बदल दिया जब उसमें कोई तर्क न हो।

परीक्षण किया और नमूना उत्पादन:

for x in 'lLEhW OroLd!' 'rpGOZmaimgn uplRzse naC DEoO LdGf' 'eIt uqHKC RBWOO xNf ujPMO SzRE HTL EOvd yAg' 'NraWgCi: Nsas-eNEiTIsev rNsiTG!!' '(^_^)' 'AWCTY HUOS RETP' 'hwn oeesd acsp nawyya' 'SpMycaeIesKyBorekn' "D's mroyr, Ivam. I'e faardi I act'n od htta."; do ./swapping <<<"$x" 2>/dev/null; done

hELlO WorLd!
prOGRamming puzZles anD COdE GoLf
tHe quICK BROWN fOx juMPS OvER THE LAzy dOg
WarNiNg: Case-sENsITive sTriNG!!
(^_^)
WATCH YOUR STEP
who needs caps anyway
MySpaceKeyIsBroken
I'm sorry, Dave. I'm afraid I can't do that.

6

ईएस 6, 185 95 बाइट्स

i=>(o=[...i]).map((c,j)=>/[a-z]/i.test(c)?o[e=c>"Z"]=1/(b=o[e])?o[o[j]=o[b],b]=c:j:0)&&o.join``

@Neil, @Arnauld और @ edc65 की मदद से समाधान को गंभीर रूप से छोटा किया गया

व्याख्या

f = i =>
  // Get array of characters from input string
  (o = [...i])
    .map((c, j) => 
      // Check if it's a text character, otherwise skip it
      /[a-z]/i.test(c) ? 
        // Get last character position for case
        // merged with setting a variable for if the character is lowercase
        // merged with storing the current case character position,  
        // under properties on the array (with keys "true" or "false")
        o[e = c>"Z"] =
          // Check if there exists a character position to switch with
          // merged with storing the current position for quick access
          1/(b=o[e]) ? 
            // This statement will end up returning the Array subset, 
            // which will be falsy in the above conditional since (1/[])==false
            o[
              // Switch left character to the right
              o[j]=o[b]
            // Switch right character to the left
            ,b]=c : 
            // No character exists for case, so return current character position
            j
         // It was not a text character, so do nothing
         :0
      )
  // Join array and return as result
  && o.join``;

`lLEhW OroLd!
NraWgCi: Nsas-eNEiTIsev rNsiTG!!
rpGOZmaimgn uplRzse naC DEoO LdGf
eIt uqHKC RBWOO xNf ujPMO SzRE HTL EOvd yAg
(^_^)
AWCTY HUOS RETP
hwn oeesd acsp nawyya
SpMycaeIesKyBorekn
D's mroyr, Ivam. I'e faardi I act'n od htta`
  .split`\n`
  .map(testCase => console.log(f(testCase)));


6 बाइट्स, जब हम दूसरे स्टेटमेंट को हटाते हैं तो एनक्लोजिंग परेंस बेमानी हो जाते हैं :) नाइस।
Jan

2
कृपया मेरी पिछली टिप्पणी को नजरअंदाज करें। यहाँ पर 99 है:/[a-z]/i.test(c)?o[e=c>"Z"]=1/(b=o[e])?[o[b],o[j]]=[c,o[b]]:j:0
अरनॉल्ड 16

2
[o[b],o[j]]=[c,o[b]]हो सकता हैo[o[j]=o[b],b]=c
edc65

यहाँ असली मास्टरस्ट्रोक एक सरणी के लिए अनुक्रमित के रूप में सही और गलत का उपयोग कर रहा है
edc65

धन्यवाद दोस्तों, अब 95 तक। यह वास्तव में इस तरह से समाधान का दस्तावेज बनाना मुश्किल हो जाता है जो समझ में आता है। XD @ edc65 वे सरणी ऑब्जेक्ट पर गुण के रूप में संग्रहीत हैं, अनुक्रमित नहीं। हाँ, अरनॉल्ड को पता चला कि वे चरित्र सरणी पर संग्रहीत किए जा रहे थे, लेकिन ऑब्जेक्ट का पुन: उपयोग एक भाग्यशाली दुर्घटना से अधिक था जो मुझे लगता है कि एक अलग सुझाव से आया था। प्रारंभ में इसे एक अलग वस्तु पर संग्रहीत किया गया था जो निश्चित रूप से चुनौती के दायरे के लिए पूरी तरह से अनावश्यक था।
Jan

3

पायथन , 82 बाइट्स

lambda s:S(r.lower(),t,S(r,t,s))
import re
S=re.sub
r='([A-Z])(.*?)'*2
t=r'\3\2\1'

इसे ऑनलाइन आज़माएं!


यह कैसे काम करता है? मेमने को भी कहा जाता है?
सर्ज बोर्स्च

लैम्ब्डा वास्तविक (फंक्शन) सबमिशन है। बाकी सब कुछ सिर्फ कोड के साथ होता है जिसे लैम्बडा कहने से पहले निष्पादित करना पड़ता है।
डेनिस

3

QBasic, 229 बाइट्स

LINE INPUT s$
FOR i=1TO LEN(s$)
c$=MID$(s$,i,1)
IF"@"<c$AND"[">c$THEN
IF u THEN MID$(s$,u,1)=c$:MID$(s$,i,1)=u$
u=-i*(u=0)
u$=c$
ELSEIF"`"<c$AND"{">c$THEN
IF l THEN MID$(s$,l,1)=c$:MID$(s$,i,1)=l$
l=-i*(l=0)
l$=c$
END IF
NEXT
?s$

रणनीति

हम इनपुट स्ट्रिंग के माध्यम से लूप करते हैं। जब हम एक बड़े अक्षर का सामना करते हैं, तो हम इसे और इसकी स्थिति को संग्रहीत करते हैं। दूसरी बार जब हम एक बड़े अक्षर का सामना करते हैं, तो हम पिछले एक के साथ स्वैप करने के लिए उन संग्रहीत मूल्यों का उपयोग करते हैं। लोअरकेस के लिए भी।

(मैं एक लंबे समय तक संस्करण को पोस्ट करने वाला था जो एक सरणी का उपयोग करता था, क्योंकि मुझे लगा कि QBasic तार अपरिवर्तनीय थे। तब मैंने इस तथ्य पर ठोकर खाई कि यह MID$(strng$, index, length) = replacement$ठीक काम करता है। जियो और सीखो।)

असंगठित + ने टिप्पणी की

LINE INPUT text$

FOR i = 1 TO LEN(text$)
  char$ = MID$(text$, i, 1)
  IF "A" <= char$ AND "Z" >= char$ THEN
    ' Uppercase
    IF upperIndex = 0 THEN
      ' This is the first of a pair of uppercase letters
      ' Store the letter and its index for later
      upperLetter$ = char$
      upperIndex = i
    ELSE
      ' This is the second of a pair of uppercase letters
      ' Put it at the position of the previous uppercase letter
      ' and put that letter at this letter's position
      MID$(text$, upperIndex, 1) = char$
      MID$(text$, i, 1) = upperLetter$
      upperIndex = 0
    END IF
  ELSEIF "a" <= char$ AND "z" >= char$ THEN
    ' Lowercase
    IF lowerIndex = 0 THEN
      ' This is the first of a pair of lowercase letters
      ' Store the letter and its index for later
      lowerLetter$ = char$
      lowerIndex = i
    ELSE
      ' This is the second of a pair of lowercase letters
      ' Put it at the position of the previous lowercase letter
      ' and put that letter at this letter's position
      MID$(text$, lowerIndex, 1) = char$
      MID$(text$, i, 1) = lowerLetter$
      lowerIndex = 0
    END IF
  END IF
NEXT i

PRINT text$

2

सी ++ 11 (जीसीसी), 154 149 बाइट्स

#include<algorithm>
[](std::string s){int*p,u,l=u=-1;for(auto&c:s)(c|32)-97<26U?p=&(c&32?u:l),~*p?(std::swap(c,s[*p]),*p=-1):*p=&c-&s[0]:0;return s;}

1
आपको या तो #include<string>C ++ 14 पर स्विच करना चाहिए या एक सामान्य लैम्ब्डा घोषित करना चाहिए [](auto s)और sहोना चाहिए std::string। इसके अलावा, घोषित करना [](auto&s)आपको स्ट्रिंग को वापस लौटने से बचाता है क्योंकि आउटपुट के रूप में सेवा करने के लिए इनपुट तर्कों को संशोधित करने की अनुमति है।
कार्ल नेफ

2

Qbasic, 436 408 बाइट्स

LINE INPUT a$:b=len(a$):FOR a=1TO b:t$=MID$(a$,a,1)
IF"@"<t$AND"[">t$THEN
b$=b$+"U":u$=u$+t$
ELSEIF"`"<t$AND"{">t$THEN
b$=b$+"L":l$=l$+t$
ELSE b$=b$+t$
END IF:NEXT
FOR x=1TO b STEP 2:g$=g$+MID$(u$,x+1,1)+MID$(u$,x,1):h$=h$+MID$(l$,x+1,1)+MID$(l$,x,1):NEXT
FOR x=1TO b:t$=MID$(b$,x,1)
IF"U"=t$THEN
u=u+1:z$=z$+MID$(g$,u,1)
ELSEIF"L"=t$THEN l=l+1:z$=z$+MID$(h$,l,1)
ELSE z$=z$+t$
END IF:NEXT:?z$

डीकोस के लिए एक बाइट धन्यवाद। गैर-पत्र वर्णों की हैंडलिंग को बदलकर कई और सहेजे गए।

इसमें मूल रूप से तीन भाग होते हैं:

  • इनपुट को 3 स्ट्रिंग्स में विभाजित करना (अपरकेस, लोअरकेस, और एक नक्शा (अन्य वर्णों को पकड़े हुए))
  • अपरकेस और लोअरकेस अक्षरों को फ़्लिप करना
  • मैप का उपयोग करके (पुनः) आउटपुट का निर्माण करें।

एक अधिक विस्तृत विवरण (ध्यान दें कि यह कोड के पुराने संस्करण का है, लेकिन सिद्धांत अभी भी लागू होता है):

' --- Part I: Reading the input
LINE INPUT a$
'This FOR loop takes one character at a time
b=len(a$):FOR a=1TO b
' And checks in what category the character belongs
t$=MID$(a$,a,1):SELECT CASE t$
' For each group, char t$ is added to that group (u$ for uppercase, 
' l$ for lowercase. The map in b$ is updated with a U or L on this index,
' or with the non-letter char t$.
CASE"A"TO"Z":b$=b$+"U":u$=u$+t$
CASE"a"TO"z":b$=b$+"L":l$=l$+t$
CASE ELSE:b$=b$+t$
END SELECT:NEXT

' --- Part II: Swapping within case-groups
' Loop through u$ and l$ twp chars at a time, and add those chunks in reverse order
' to g$ and h$. Because mid$ doesn't fail past the end of a string (but returns ""), 
' this automatically compensates for odd-length groups.
FOR x=1TO b STEP 2:g$=g$+MID$(u$,x+1,1)+MID$(u$,x,1):h$=h$+MID$(l$,x+1,1)+MID$(l$,x,1):NEXT

' --- Part III: Read the map to put it all back together
FOR x=1TO b:t$=MID$(b$,x,1)
' See what group was in this spot, then read the next char from the flipped string.
' This keeps an index on those strings for the next lookup.
IF t$="U"THEN
u=u+1:z$=z$+MID$(g$,u,1)
ELSEIF t$="L"THEN l=l+1:z$=z$+MID$(h$,l,1)
' The map contains a non-letter char, just drop that in
ELSE z$=z$+t$
' And finally,display the end result.
END IF:NEXT:?z$

2

PHP, 108 93 83 बाइट्स

<?=preg_replace([$a="/([a-z])([^a-z]*)([a-z])/",strtoupper($a)],"$3$2$1",$argv[1]);

पिछला संस्करण (93 बाइट्स)

<?=preg_replace(["/([a-z])([^a-z]*)([a-z])/","/([A-Z])([^A-Z]*)([A-Z])/"],"$3$2$1",$argv[1]);

मुझे याद दिलाने के लिए @ user59178 का धन्यवाद जो preg_replace()तर्क के रूप में तार के सरणियों को ले सकता है।


मूल उत्तर (108 बाइट्स)

$f=preg_replace;echo$f("/([a-z])([^a-z]*)([a-z])/",$r="$3$2$1",
$f("/([A-Z])([^A-Z]*)([A-Z])/",$r,$argv[1]));

उपलब्ध जगह को फिट करने के लिए कोड को यहां लपेटा गया है।
इसे कमांड लाइन से निष्पादित किया जा सकता है:

$ php -d error_reporting=0 -r '$f=preg_replace;echo$f("/([a-z])([^a-z]*)([a-z])/",$r="$3$2$1",$f("/([A-Z])([^A-Z]*)([A-Z])/",$r,$argv[1]));' 'lLEhW OroLd!'

पीएचपी 7 पर 1-बाइट का छोटा संस्करण संभव $fहै, इसके पहले कॉल के अंदर का असाइनमेंट निचोड़ कर :

echo($f=preg_replace)("/([a-z])([^a-z]*)([a-z])/",$r="$3$2$1",
$f("/([A-Z])([^A-Z]*)([A-Z])/",$r,$argv[1]));

दोनों समाधान, परीक्षण मामलों और ungolfed संस्करणों के साथ पर पाया जा सकता Github


1
preg_replaceप्रतिस्थापन की एक सरणी ले सकते हैं ऐसा करने के लिए आपको केवल एक कॉल की आवश्यकता है। इसके अलावा इसका उपयोग करने के लिए कम <?=है echo। इसके साथ यह आपके उत्तर को 93 बाइट्स तक ले जाने के लिए सरल है।
user59178

आप के बारे में सही कर रहे हैं preg_replace()। मैं इसके विषय मे भूल गया। मुझे पसंद नहीं है <?=(मेरी राय <?में यह भाषा का हिस्सा नहीं है, यह सिर्फ एक मार्कर है) और मुझे छोटी एक पंक्ति वाले प्रोग्राम लिखना पसंद है जिन्हें कमांड लाइन से निष्पादित किया जा सकता है php -r। लेकिन कोड गोल्फ के उद्देश्य से आप फिर से सही हैं। मैं 1 बाइट का उपयोग करके बचा सकता हूं <?=
21

1

गणितज्ञ, 96 बाइट्स

s[#,r="([a-z])(.*?)([a-z])"]~(s=StringReplace[#,RegularExpression@#2->"$3$2$1"]&)~ToUpperCase@r&

लियो के रेटिना उत्तर का एक बंदरगाह , जो नियमित अभिव्यक्ति का उपयोग करता है।


मुझे ईमानदारी से आश्चर्य हुआ कि गणितज्ञ के लिए एक बिलिन नहीं है, मेरा मतलब है, अगर "जब ईस्टर का रविवार", "जब सूर्यास्त होता है" और "बाड़ का आकार क्या होता है" तो बिलियन बनते हैं, यह भी होना चाहिए!
sagiksp


1

बीन , 83 बाइट्स

Hexdump:

00000000 26 53 d0 80 d3 d0 80 a0 5d 20 80 0a a1 81 81 00  &SÐ.ÓÐ. ] ..¡...
00000010 23 81 01 20 80 0a a1 81 81 02 23 81 01 a8 db c1  #.. ..¡...#..¨ÛÁ
00000020 ad da dd a9 a8 db de c1 ad da dd aa bf a9 a8 db  .ÚÝ©¨ÛÞÁ.Úݪ¿©¨Û
00000030 c1 ad da dd 29 a4 b3 a4 b2 a4 31 a8 db e1 ad fa  Á.ÚÝ)¤³¤²¤1¨Ûá.ú
00000040 dd a9 a8 db de e1 ad fa dd aa bf a9 a8 db e1 ad  Ý©¨ÛÞá.úݪ¿©¨Ûá.
00000050 fa dd 29                                         úÝ)
00000053

समतुल्य जावास्क्रिप्ट:

a.replace(/([A-Z])([^A-Z]*?)([A-Z])/g,'$3$2$1').replace(/([a-z])([^a-z]*?)([a-z])/g,'$3$2$1')

स्पष्टीकरण:

अवैध रूप से इनपुट की पहली पंक्ति को अनफ़िल्टर्ड के रूप में लेना a(क्योंकि newlines तले हुए स्ट्रिंग का हिस्सा नहीं हो सकता है), और अंतर्निहित रूप से अपरिपक्व रूप से अपरकेस की जगह अनियंत्रित स्ट्रिंग को आउटपुट करता है, फिर निचले जोड़े को।

यहाँ डेमो की कोशिश करो।

यहां परीक्षण सूट का प्रयास करें।


1

रूबी, 81 बाइट्स

puts f=->(i,s){i.gsub /([#{s})([^#{s}*)([#{s})/,'\3\2\1'}[f[$*[0],'a-z]'],'A-Z]']

1

जावास्क्रिप्ट (ईएस 6), 80 बाइट्स

लियो के रेटिना उत्तर के आधार पर ।

s=>eval("s"+(r=".replace(/([A-Z])([^A-Z]*)([A-Z])/g,'$3$2$1')")+r.toLowerCase())

यह काम करता है क्योंकि कोड में केवल बड़े अक्षर .replace(/([A-Z])([^A-Z]*)([A-Z])/g,'$3$2$1')हैं Aऔर Z, जिनका उपयोग वर्ण श्रेणियों का वर्णन करने के लिए किया जाता है। यह ठीक वही है जो हमें दूसरे पास की प्रक्रिया के लिए लोअरकेस में बदलने की आवश्यकता है।

परीक्षण के मामलों


दरअसल, यह डेनिस के इस पायथन जवाब के समान है ।
अरनुलद

1

ES6 155 - 195 बाइट्स

मुझे पता है कि पहले से ही एक बेहतर जवाब है, लेकिन मैं रेगेक्स के बिना कोशिश करना चाहता था। यह एक विराम चिह्न पर भी काम करता है, लेकिन यह (^_^)परीक्षण का उल्लंघन करता है। उस मामले में मेरा एक और c()कार्य है, जो नीचे दिया गया है।

f=(s)=>{d={};s=[...s];for(i in s){b=s[i];for(j in s)if(i<j&!d[i]&c(s[j])==c(b)){d[j]=1;s[i]=s[j];s[j]=b;break}}return s.join('')}
c=c=>~(c.charCodeAt()/32)

f("M I'o DaG") //> I'M a GoD
f("(^_^)")     //> )_^^(

c=c=>((c!=c.toUpperCase())<<1|c!=c.toLowerCase())||c.charCodeAt()

f("M I'o DaG") //> I'M a GoD
f("(^_^)")     //> (^_^)

व्याख्या

f=(s)=>{
    d={};        //list of indexes already swapped
    s=[...s];        //string to array, stolen from above ES6 answer
    for(i in s){
        b=s[i];        //keep a note of what we are swapping
        for(j in s)        //iterate over the array again
            if( i<j & !d[i] & c(s[j])==c(b) ){
                        //only pay attention after we pass i'th
                        //only swap if this char hasn't been swapped
                        //only swap if both chars in same 'category'
                d[j]=1;        //note that the latter char has been swapped
                s[i]=s[j];
                s[j]=b;
                break        //avoid swapping on the same 'i' twice
            }
    }
    return s.join('')        //return as string
}

1

पर्ल 6 , 56 बाइट्स

{for "A".."Z","a".."z" ->@c {s:g/(@c)(.*?)(@c)/$2$1$0/}}

एक स्ट्रिंग चर को एक तर्क के रूप में लेता है, और इसे जगह में संशोधित करता है ताकि लंबो को कॉल करने के बाद चर में परिणाम हो।

लंबे समय से यह पर्ल में होगा, क्योंकि:

  • नया रेगेक्स सिंटेक्स अधिक क्रिया है, जैसे वर्ण वर्गों को लिखने के <[A..Z]>बजाय इसके जैसा दिखेगा [A-Z]
  • Regexes प्रथम श्रेणी के स्रोत कोड हैं जिन्हें संकलित समय पर पार्स किया गया है, और एक स्ट्रिंग को केवल रन-टाइम में उन पर प्रक्षेपित किया जा सकता है, यदि इसमें एक स्व-निहित सबरजेक्स होता है (यानी आप किसी स्ट्रिंग को वर्ण वर्ग में प्रक्षेपित नहीं कर सकते हैं)।
  • व्याख्या करें EVAL, जो अधिक लचीलेपन की अनुमति देगा, इसके लिए गोल्फ-अनफ्रेंडली प्रागमा की आवश्यकता होती है use MONKEY-SEE-NO-EVAL;

प्लस ओर, एक @चर में एक सरणी को एक रेगेक्स में सीधे संदर्भित किया जा सकता है, और इसे एक विकल्प के रूप में माना जाता है।


पर्ल 6 , 65 बाइट्स

{reduce ->$_,@c {S:g/(@c)(.*?)(@c)/$2$1$0/},$_,"A".."Z","a".."z"}

कार्यात्मक संस्करण (लैम्बडा के वापसी मूल्य के रूप में परिणाम उत्पन्न करता है)।


1

आर, 343 बाइट्स

बहुत अनाड़ी आर समाधान:

f <- function(x) {
        y=unlist(strsplit(x,""))
        z=data.frame(l=ifelse(y %in% letters,0,ifelse(y %in% LETTERS,1,2)),s=y)
        l <- list(which(z$l==0),which(z$l==1))
        v <- unlist(l)
        for(j in 1:2) for (i in seq(1,ifelse(length(l[[j]])%%2==1,length(l[[j]])-2,length(l[[j]])-1),2)) l[[j]][i:(i+1)] <- rev(l[[j]][i:(i+1)])
        z[v,] <- z[unlist(l),]
        return(z$s)
    }

f("D's mroyr, Ivam. I'e faardi I act'n od htta.")

# [1] I ' m   s o r r y ,   D a v e .   I ' m   a f r a i d   I   c a n ' t   d o   t h a t .

1

पायथन 2, 181 बाइट्स

वैसे भी इससे अधिक होना चाहिए, लेकिन:

def F(s):
 for l in[i for i,c in enumerate(s)if c.isupper()],[i for i,c in enumerate(s)if c.islower()]:
  for a,b in zip(l[0::2],l[1::2]):s=s[:a]+s[b]+s[a+1:b]+s[a]+s[b+1:]
 print s

यह पहले दो सूचियाँ बनाता है: अपरकेस वर्णों के सूचकांकों में से एक और निचले वर्णों के लिए एक। इन सूचियों में से प्रत्येक को सूचकांकों के जोड़े में बदल दिया जाता है, और उन सूचकांकों के पात्रों को बदल दिया जाता है।

मैं इसे कल नीचे कर दूंगा , लेकिन अब सोने का समय है


1

पिप , 28 बाइट्स

Y[XLXU]aRy.`.*?`.y{Sa@0a@va}

कमांड-लाइन तर्क के रूप में इनपुट लेता है। इसे ऑनलाइन आज़माएं!

व्याख्या

यह एक रेगेक्स सॉल्यूशन है, बिल्ट रेगेक्स वेरिएबल्स XL(लोअरकेस लेटर्स, `[a-z]`) और XU(अपरकेस लेटर्स, `[A-Z]`) का उपयोग करते हुए।

                              a is 1st cmdline arg; v is -1 (implicit)
Y[XLXU]                       Yank a list containing XL and XU into y
         y.`.*?`.y            Concatenate y, `.*?`, and y itemwise, giving this list:
                              [`[a-z].*?[a-z]`; `[A-Z].*?[A-Z]`]
       aR                     In a, replace matches of each regex in that list...
                  {        }  ... using this callback function:
                   Sa@0a@v     Swap the 0th and -1st characters of the match
                          a    and return the resulting string
                              Print (implicit)

जब दूसरा तर्क Rसूची है, तो श्रृंखला में प्रतिस्थापन किए जाते हैं; इस प्रकार, लोअरकेस रिप्लेसमेंट और अपरकेस प्रतिस्थापन एक दूसरे के साथ हस्तक्षेप नहीं करते हैं।



1

AWK , 121 129 बाइट्स

BEGIN{FS=OFS=""}{for(a=1;a<=NF;a++){if($a~/[A-Z]/?U>0?p=U+(U=0):0*(U=a):$a~/[a-z]/?L>0?p=L+(L=0):0*(L=a):0>0){t=$a;$a=$p;$p=t}}}1

इसे ऑनलाइन आज़माएं! नोट: लिंक में मल्टीलाइन इनपुट की अनुमति देने के लिए 8 अतिरिक्त बाइट्स हैं

उपयोग काफी विशिष्ट है, लेकिन AWKउस क्षेत्र के विभाजक के रूप में एक खाली स्ट्रिंग को स्वीकार करने के एक संस्करण की आवश्यकता होती है ( gawkलेकिन अधिकांश संस्करण मुझे यकीन है कि मूल AWKविफल होगा :()

यह बहुत सीधा है क्योंकि यह बस प्रत्येक चरित्र और जाँच पर पुनरावृत्त करता है अगर यह उस मामले से पहले पाया गया हो। यदि हां, तो यह वर्णों को स्वैप करता है और चेक किए गए इंडेक्स को रीसेट करता है। चीजों के सीखने के पक्ष में, मैंने AWKपहले असाइनमेंट स्टेटमेंट में कभी भी असाइनमेंट स्टेटमेंट का उपयोग नहीं किया था। किसी कारण से यह कभी नहीं आया था। :)

मैं BEGINकमांड-लाइन असाइनमेंट या इसी तरह के ब्लॉक के बाहर OFS और FS असाइन करने के लिए कहकर कुछ बाइट्स शेव करने में सक्षम हो सकता हूं , लेकिन यह इस तरह से "क्लीनर" है।

TIO लिंक मुझे पता चला है कि मैं एक प्रतिलेखन त्रुटि है कि 8 बाइट्स की आवश्यकता को ठीक करने :( था जोड़ा जा रहा है (मैं बाहर छोड़ दिया 0*(U=a):)


1

सी (जीसीसी) , 212 206 बाइट्स

#define I(a,b)if(S[j=i]>=a&S[i]<-~b){for(;S[++j]<a|S[j]>b;);j<l?s[i]=S[j],s[j]=S[i]:0;}
i,j,l;f(char*S){char*s=calloc(l=-~strlen(S),1);for(i=~0;++i<strlen(S);)if(!s[i]){s[i]=S[i];I(65,90)I(97,'z')}puts(s);}

इसे ऑनलाइन आज़माएं!


@ceilingcat धन्यवाद।
जोनाथन फ्रेच

1

स्टैक्स , 18 बाइट्स

âß:}\]ó☺æ■jφ╛jz/Φi

इसे चलाएं और डीबग करें

सामान्य दृष्टिकोण रीगेक्स-आधारित है।

  • दो बार करें:
  • के लिए सभी मैच खोजें [a-z].*?[a-z]
  • मैचों में पहला और आखिरी चरित्र स्वैप करें।
  • मामला उलटा।

1

आर , 223 163 बाइट्स 148 बाइट्स

संपादित करें: -60 लूप के लिए लागू करके बाइट्स

EDIT: -15 ग्यूसेप से बाइट्स

u=utf8ToInt(scan(,''));for(i in c(65,97)){l=which(u%in%i:(i+25));x=sum(l|1)%/%2;u[l[1:(x*2)]]=u[c(matrix(l,2)[2:1,1:x])]};cat(intToUtf8(u,T),sep="")

इसे ऑनलाइन आज़माएं!

यदि चरित्र एक लोअरकेस या अपरकेस है, तो परीक्षण करके काम करता है, उन्हें एक मैट्रिक्स में रखता है, एक स्वैप प्रारूप में मूल्यों को निकालने के लिए मैट्रिक्स को इन्वर्ट करता है। फिर आउटपुट के साथ catscan(,'')यदि कोड एक से अधिक लाइन है, तो कोड की सिंगल लाइन में अर्धविराम के साथ ऑनलाइन संघर्ष करने का प्रयास करें ।


मुझे आपके लिंक पर 168 मिलते हैं, लेकिन यह गोल्फ 163
Giuseppe

और यह इसे 162 तक लाता है।
Giuseppe

यह शायद काम करता है; xनगण्य चालाक सा है, लेकिन से छुटकारा पाने के m=matrixरूप में अच्छी तरह था 4 बाइट।
ग्यूसेप

scan(,'')समस्या के बारे में क्या ? और "LLEhW OroLd!" TIO में scan(,'')या इनपुट प्राप्त करने के लिए किसी अन्य तरीके से?
सुमेर १18

1
आपने एक युगल को याद किया: tio.run/##Dc5NC4IwGADgv2LC8H1rEA76muzYIRC6GB3Eg6zEwdxibjSofvvy/ ...
Giuseppe

0

जावा 7, 117 बाइट्स

String c(String s){String x="([a-z])(.*?)([a-z])",y="$3$2$1";return s.replaceAll(x,y).replaceAll(x.toUpperCase(),y);}

संपादित करें: अभी मैंने देखा कि मेरे पास @Leo के रेटिना उत्तर के समान उत्तर है , हालांकि मैंने इसके बारे में स्वतंत्र रूप से सोचा है।

Ungolfed:

String c(final String s) {
  String x = "([a-z])(.*?)([a-z])",
         y = "$3$2$1";
  return s.replaceAll(x, y).replaceAll(x.toUpperCase(), y);
}

टेस्ट कोड:

इसे यहाँ आज़माएँ।

class M{
  static String c(String s){String x="([a-z])(.*?)([a-z])",y="$3$2$1";return s.replaceAll(x,y).replaceAll(x.toUpperCase(),y);}

  public static void main(String[] a){
    System.out.println(c("lLEhW OroLd!"));
    System.out.println(c("rpGOZmaimgn uplRzse naC DEoO LdGf"));
    System.out.println(c("eIt uqHKC RBWOO xNf ujPMO SzRE HTL EOvd yAg"));
    System.out.println(c("NraWgCi: Nsas-eNEiTIsev rNsiTG!!"));
    System.out.println(c("(^_^)"));
    System.out.println(c("AWCTY HUOS RETP"));
    System.out.println(c("hwn oeesd acsp nawyya"));
    System.out.println(c("SpMycaeIesKyBorekn"));
    System.out.println(c("D's mroyr, Ivam. I'e faardi I act'n od htta."));
  }
}

आउटपुट:

hELlO WorLd!
prOGRamming puzZles anD COdE GoLf
tHe quICK BROWN fOx juMPS OvER THE LAzy dOg
WarNiNg: Case-sENsITive sTriNG!!
(^_^)
WATCH YOUR STEP
who needs caps anyway
MySpaceKeyIsBroken
I'm sorry, Dave. I'm afraid I can't do that.
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.