ถอดรหัสสัญญาณตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ - สตริงที่ไวต่อแสง


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 ผมพบว่าปัญหาที่เกิดขึ้นเป็นสิ่งที่ตรงกันข้ามของตัวเองเพราะเมื่อพยายามกรณีทดสอบฉันตั้งใจพิมพ์ในการส่งออกแทนการป้อนข้อมูล :-)
หลุยส์ Mendo

ฉันคิดว่าคุณควรรวมกรณีทดสอบที่มีตัวอักษร ASCII ที่ไม่ใช่ตัวอักษรมากกว่าหนึ่งตัว ... ฉันคิดว่าการใช้งานบางอย่างอาจสลับกันโดยไม่ตั้งใจเมื่อไม่ควรเกิดขึ้น
เกร็กมาร์ติน

3
กรณีทดสอบอาจมีสตริงที่ไม่มีตัวอักษรตัวพิมพ์ใหญ่และสตริงโดยไม่มีตัวอักษรใด ๆ เลย
Dennis

คำตอบ:


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

ยูทิลิตี Bash + Unix, 77 62 57 56 54 ไบต์

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

อินพุตใน stdin เอาต์พุตใน stdout

(ในเวอร์ชั่นล่าสุดนี้ stderr ยังถูกเขียนขึ้นด้วย แต่ฉันทามติ PPCG น่าจะเป็นสิ่งที่ไม่เป็นไร - stderr ก็ไม่สนใจเลย )

แก้ไข 1: ขอบคุณ @Dennis สำหรับ 15 ไบต์! การปรับปรุง: (a) การรับข้อมูลผ่าน stdin; (b) รวมสคริปต์ sed 2 ตัวเข้าด้วยกัน และ (c) การแทนที่ tr ด้วยการทดแทนผ่านการขยายพารามิเตอร์ bash; (b) และ (c) หายไปใน Edit 2

แก้ไข 2: ตัวย่อเพิ่มเติม 5 ไบต์ ใช้การเรียกฟังก์ชันเพื่อแทนที่ทั้ง (b) และ (c) ใน Edit 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

ES6, 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 ไบต์ parens ที่ล้อมรอบจะซ้ำซ้อนเมื่อเราลบ statement ที่สอง :) Nice
ม.ค.

2
โปรดละเว้นความคิดเห็นล่าสุดของฉัน นี่คือ 99:/[a-z]/i.test(c)?o[e=c>"Z"]=1/(b=o[e])?[o[b],o[j]]=[c,o[b]]:j:0
Arnauld

2
[o[b],o[j]]=[c,o[b]]อาจเป็นo[o[j]=o[b],b]=c
edc65

masterstroke ที่แท้จริงที่นี่ใช้จริงและเท็จเป็นดัชนีสำหรับอาร์เรย์
edc65

ขอขอบคุณพวกคุณลงไปที่ 95 ตอนนี้ มันเริ่มยากที่จะจัดทำเอกสารโซลูชันในลักษณะที่สมเหตุสมผล XD @ edc65 จัดเก็บเป็นคุณสมบัติบนวัตถุอาร์เรย์ไม่ใช่ดัชนี ใช่ Arnauld คิดออกว่าพวกเขาถูกเก็บไว้ในชุดตัวละคร แต่การนำวัตถุกลับมาใช้ใหม่เป็นอุบัติเหตุที่โชคดีกว่าฉันคิดว่ามาจากคำแนะนำแยกต่างหาก ตอนแรกมันถูกเก็บไว้ในวัตถุที่แยกต่างหากซึ่งแน่นอนว่าไม่จำเป็นสำหรับขอบเขตของการท้าทาย
ม.ค.

3

Pythonขนาด 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'

ลองออนไลน์!


มันทำงานยังไง? แลมบ์ดาเรียกว่าอะไร
Sarge Borsch

แลมบ์ดาเป็นสิ่งที่เกิดขึ้นจริง (ฟังก์ชั่น) การส่ง ทุกสิ่งทุกอย่างเป็นเพียงโค้ดประกอบที่จะต้องดำเนินการก่อนที่แลมบ์ดาจะถูกเรียก
เดนนิส

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$งานได้ดีอยู่และเรียนรู้)

Ungolfed + แสดงความคิดเห็น

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

C ++ 11 (GCC), 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)จะช่วยคุณไม่ให้ส่งคืนสตริงเป็นการแก้ไขอาร์กิวเมนต์อินพุตเพื่อใช้เป็นเอาต์พุต
Karl Napf

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$

บันทึกหนึ่งไบต์ด้วย DLosc บันทึกอีกหลายรายการโดยเปลี่ยนการจัดการตัวอักษรที่ไม่ใช่ตัวอักษร

โดยทั่วไปประกอบด้วยสามส่วน:

  • แบ่งอินพุตออกเป็น 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!'

เวอร์ชันที่สั้นกว่า 1 ไบต์สามารถทำได้ใน PHP 7 โดยการบีบการมอบหมาย$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 <?=ไบต์ใช้
axiac

1

Mathematica, 96 ไบต์

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

พอร์ตของคำตอบจอประสาทตาของ Leoซึ่งใช้การแสดงออกปกติ


ฉันประหลาดใจจริง ๆ ว่า mathematica ไม่มีตัวสำหรับสิ่งนั้นฉันหมายถึงถ้า "เมื่อวันอาทิตย์อีสเตอร์", "เมื่อพระอาทิตย์ตกดิน" และ "รูปร่างของฝรั่งเศส" ได้รับการสร้างขึ้นสิ่งนี้ควรเช่นกัน!
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

JavaScript ที่เทียบเท่า:

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

คำอธิบาย:

การรับบรรทัดแรกของอินพุตที่ยังไม่ฟอร์แมตโดยนัยa(เนื่องจากการขึ้นบรรทัดใหม่ไม่สามารถเป็นส่วนหนึ่งของสตริงที่มีสัญญาณรบกวน) และส่งออกสตริงที่ไม่มีเกลียวโดยปริยายโดยการแทนที่ตัวพิมพ์ใหญ่ตามลำดับ

ลองสาธิตที่นี่

ลองชุดทดสอบที่นี่



1

JavaScript (ES6), 80 ไบต์

ขึ้นอยู่กับคำตอบ Retina ของลีโอ

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ที่จะใช้ในการอธิบายช่วงตัวอักษร นี่คือสิ่งที่เราต้องแปลงให้เป็นตัวพิมพ์เล็กเพื่อประมวลผลรอบที่สอง

กรณีทดสอบ


ที่จริงแล้วมันกลับกลายเป็นว่าคล้ายกับคำตอบของไพ ธ อนโดยเดนนิส
Arnauld

1

ES6 155 - 195 ไบต์

ฉันรู้ว่ามีคำตอบที่ดีกว่าอยู่แล้ว แต่ฉันต้องการลองโดยไม่ต้อง regex อันนี้ใช้ได้กับเครื่องหมายวรรคตอนด้วย แต่ดูเหมือนว่าจะละเมิดการ(^_^)ทดสอบ ในกรณีที่ฉันมี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

Perl 6 , 56 ไบต์

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

รับค่าตัวแปรสตริงเป็นอาร์กิวเมนต์และแก้ไขแบบแทนที่ดังนั้นหลังจากเรียกแลมบ์ดาตัวแปรจะมีผลลัพธ์

นานกว่านั้นจะอยู่ใน Perl เพราะ:

  • ไวยากรณ์ regex ใหม่ที่ละเอียดมากขึ้นเช่นการเขียนออกชั้นเรียนตัวอักษรจะมีลักษณะแทน<[A..Z]>[A-Z]
  • Regexes เป็นซอร์สโค้ดอันดับแรกที่แยกวิเคราะห์ในเวลารวบรวมและสตริงสามารถถูกแทรกเข้าไปในไฟล์เหล่านั้น ณ รันไทม์หากประกอบด้วย subregex ที่มีอยู่ในตัวเอง (เช่นคุณไม่สามารถแทรกสตริงเข้าไปในคลาสอักขระ)
  • โจ่งแจ้งEVALซึ่งจะช่วยให้มีความยืดหยุ่นมากขึ้นต้องกอล์ฟที่ไม่เป็นมิตรuse MONKEY-SEE-NO-EVAL;pragma

ในด้านบวกอาร์เรย์ใน@ตัวแปรสามารถอ้างอิงได้โดยตรงใน regex และถือเป็นทางเลือก


Perl 6 , 65 ไบต์

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

รุ่นที่ใช้งานได้ (ให้ผลลัพธ์เป็นค่าส่งคืนของแลมบ์ดา)


1

R, 343 ไบต์

วิธีแก้ปัญหา R เงอะงะชะมัด:

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

Python 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

Pip , 28 ไบต์

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

รับอินพุตเป็นอาร์กิวเมนต์บรรทัดคำสั่ง ลองออนไลน์!

คำอธิบาย

นี่คือโซลูชัน regex โดยใช้ตัวแปร builtin regex 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ก่อน ด้วยเหตุผลบางอย่างมันไม่เคยเกิดขึ้น :)

ฉันอาจจะสามารถโกนสองสามไบต์โดยบอกให้มอบหมาย OFS และ FS นอกBEGINบล็อกผ่านการมอบหมายบรรทัดคำสั่งหรือคล้ายกัน แต่มัน "สะอาด" ด้วยวิธีนี้

การเพิ่มลิงค์ TIO แสดงให้ฉันเห็นว่าฉันมีข้อผิดพลาดในการถอดความที่ต้องใช้ 8 ไบต์เพื่อแก้ไข :( (ฉันออกไปแล้ว0*(U=a):)



1

Stax , 18 ไบต์

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

เรียกใช้และแก้ไขข้อบกพร่อง

วิธีการทั่วไปนั้นใช้ regex

  • สองครั้งทำ:
  • [a-z].*?[a-z]ค้นหารายการที่ตรงกันทั้งหมด
  • สลับอักขระตัวแรกและตัวสุดท้ายในการแข่งขัน
  • กลับกรณี

1

R , 223 163 ไบต์ 148 ไบต์

แก้ไข: -60 ไบต์โดยใช้สำหรับลูป

แก้ไข: -15 ไบต์จาก Giuseppe

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

ลองออนไลน์!

ทำงานโดยการทดสอบว่าตัวละครเป็นตัวพิมพ์เล็กหรือตัวพิมพ์ใหญ่วางไว้ในเมทริกซ์กลับค่าเมทริกซ์เพื่อแยกค่าในรูปแบบที่สลับ catแล้วออกด้วย ลองใช้แบบออนไลน์ดิ้นรนกับscan(,'')ถ้ารหัสมากกว่าหนึ่งบรรทัดดังนั้นอัฒภาคในบรรทัดเดียวของรหัส


ฉันได้รับ 168 ลิงก์ของคุณ แต่กอล์ฟนี้คือ 163
Giuseppe

และสิ่งนี้จะนำไปสู่ ​​162.
Giuseppe

นี้อาจจะทำงาน; xเล่นซอเป็นบิตฉลาด แต่การกำจัดm=matrixเป็น 4 ไบต์เช่นกัน
จูเซปเป้

แล้วscan(,'')ปัญหาล่ะ และลด "lLEhW OroLd!" ใน TIO ไปยังscan(,'')หรือวิธีอื่นในการรับอินพุต
Sumner18


0

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

แก้ไข: เพิ่งสังเกตเห็นว่าฉันมีคำตอบที่คล้ายกันเป็นคำตอบ Retina ของ@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.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.