Xắp xếp lại các chuỗi đó- (rất) -sensitive


53

Mục tiêu

Đây là một thử thách đơn giản. Mục tiêu của bạn là xắp xếp lại một chuỗi bằng cách hoán đổi từng chữ cái với chữ cái tiếp theo của cùng một trường hợp, trong khi không thay đổi các ký tự không phải chữ cái.

thí dụ

Từng bước giải thích

  1. Ký tự đầu tiên là a E. Chúng tôi tìm chữ cái tiếp theo bằng chữ in hoa: đó là a C. Chúng tôi trao đổi những nhân vật này, dẫn đến CdoE!.

  2. Chúng tôi tiến tới nhân vật tiếp theo: đây là a d. Chúng tôi tìm chữ cái tiếp theo bằng chữ thường: đó là a o. Chúng tôi trao đổi những nhân vật này, dẫn đến CodE!.

  3. Chúng tôi tiến tới nhân vật tiếp theo: đây là nhân vật dchúng tôi mới chuyển đến đây. Chúng tôi bỏ qua nó, bởi vì nó đã được xử lý.

  4. Chúng tôi tiến tới nhân vật tiếp theo: đây là nhân vật Eđã được chuyển đến đây ở bước # 1. Chúng tôi bỏ qua nó, bởi vì nó đã được xử lý.

  5. Chúng tôi tiến tới nhân vật tiếp theo: đây là a !. Chúng tôi bỏ qua nó, bởi vì nó không phải là một lá thư.

Quy tắc

  • Bạn có thể giả sử rằng chuỗi đầu vào được tạo riêng cho các ký tự ASCII có thể in được, trong phạm vi 32 - 126.

  • Bạn có thể viết một chương trình đầy đủ hoặc một chức năng, in hoặc trả về kết quả.

  • Nếu chuỗi đầu vào chứa một số lượng chữ cái lẻ, chữ cái cuối cùng còn lại không thể được hoán đổi với một chữ cái khác và vẫn giữ nguyên vị trí, bất kể trường hợp của nó. Logic tương tự được áp dụng nếu chuỗi chứa một số chữ cái chẵn, nhưng một số lẻ các chữ cái viết hoa và một số lẻ các chữ cái viết thường.

  • Đây là môn đánh gôn, vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng. Sơ hở tiêu chuẩn bị cấm.

Các trường hợp thử nghiệm

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

Các trường hợp thử nghiệm không ngẫu nhiên:

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.

Tôi giả sử một nhận xét tương tự giữ nếu đầu vào chứa một số chữ cái chẵn, nhưng một số lẻ các chữ cái viết hoa và một số lẻ các chữ cái viết thường.
Greg Martin

14
Đây là một thử thách thực sự thông minh ... Tôi cũng thích thực tế là các trường hợp thử nghiệm có thể được thực hiện bằng cách nhập một chuỗi chữ thường, thay đổi ngẫu nhiên một số chữ cái thành chữ hoa và sau đó chạy chính xác cùng một chương trình giải quyết vấn đề!
Greg Martin

1
@GregMartin Tôi phát hiện ra rằng vấn đề là nghịch đảo của chính nó bởi vì khi thử một trường hợp thử nghiệm, tôi đã vô tình gõ vào đầu ra thay vì đầu vào :-)
Luis Mendo

Tôi nghĩ bạn nên bao gồm các trường hợp thử nghiệm có nhiều hơn một ký tự ASCII không phải chữ cái ... Tôi nghĩ rằng một số triển khai có thể vô tình chuyển đổi chúng với nhau, khi điều đó không xảy ra.
Greg Martin

3
Các trường hợp kiểm tra có lẽ nên bao gồm một chuỗi không có chữ hoa và một chuỗi không có bất kỳ chữ cái nào cả.
Dennis

Câu trả lời:


4

Thạch , 21 20 19 18 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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 byte

2:"tttk<f2etAZ))P5M(Yo

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Làm thế nào nó hoạt động

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

Tiện ích Bash + Unix, 77 62 57 56 54 byte

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

Đầu vào trong stdin. Đầu ra trong thiết bị xuất chuẩn.

(Trong phiên bản cuối cùng này, stderr cũng được viết thành, nhưng sự đồng thuận của PPCG dường như vẫn ổn - stderr đơn giản bị bỏ qua. )

Chỉnh sửa 1: Cảm ơn @Dennis cho 15 byte! Cải tiến: (a) Lấy đầu vào qua stdin; (b) kết hợp 2 tập lệnh sed thành một; và (c) thay thế tr bằng thay thế thông qua mở rộng tham số bash; (b) và (c) biến mất trong Chỉnh sửa 2.

Chỉnh sửa 2: Ngắn hơn 5 byte bổ sung. Đã sử dụng lệnh gọi hàm để thay thế cả (b) và (c) trong Chỉnh sửa 1.

Chỉnh sửa 3: Thêm một byte - được thông qua] như là một phần của các đối số hàm.

Chỉnh sửa 4: Thay thế hai cuộc gọi chức năng bằng các cuộc gọi đến chính chương trình khi nó không có đối số.

Thử nghiệm và sản lượng mẫu:

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 byte

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

Giải pháp rút ngắn nghiêm trọng với sự trợ giúp của @Neil, @Arnauld và @ edc65

Giải trình

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 byte, các parens kèm theo là dư thừa khi chúng ta loại bỏ câu lệnh thứ hai :) Nice.
Ngày 1

2
Hãy bỏ qua bình luận cuối cùng của tôi. Đây là 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]]có thểo[o[j]=o[b],b]=c
edc65

Masterstroke thực sự ở đây đang sử dụng đúng và sai làm chỉ mục cho một mảng
edc65

Cảm ơn các bạn, xuống 95 bây giờ. Nó bắt đầu trở nên thực sự khó khăn để ghi lại các giải pháp theo cách có ý nghĩa. XD @ edc65 chúng được lưu trữ dưới dạng các thuộc tính trên đối tượng mảng, không phải là chỉ mục. Vâng Arnauld đã tìm ra rằng chúng đang được lưu trữ trên mảng ký tự, nhưng việc tái sử dụng đối tượng là một tai nạn may mắn hơn tôi nghĩ xuất phát từ một gợi ý riêng biệt. Ban đầu, nó được lưu trữ trên một đối tượng riêng biệt, tất nhiên là hoàn toàn không cần thiết cho phạm vi của thử thách.
1

3

Python , 82 byte

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

Hãy thử trực tuyến!


làm thế nào nó hoạt động? lambda thậm chí được gọi là?
Sange Borsch

Lambda là đệ trình (chức năng) thực tế. Mọi thứ khác chỉ là mã đi kèm phải được thực thi trước khi lambda được gọi.
Dennis

3

QBasic, 229 byte

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$

Chiến lược

Chúng tôi lặp qua chuỗi đầu vào. Khi chúng ta bắt gặp một chữ cái viết hoa, chúng ta lưu trữ nó và vị trí của nó. Lần thứ hai chúng ta bắt gặp một chữ cái viết hoa, chúng ta sử dụng các giá trị được lưu trữ đó để trao đổi nó với chữ cái trước đó. Tương tự cho chữ thường.

(Tôi chuẩn bị đăng một phiên bản dài hơn sử dụng một mảng, bởi vì tôi nghĩ rằng chuỗi QBasic là bất biến. Sau đó, tôi tình cờ thấy thực tế là nó MID$(strng$, index, length) = replacement$hoạt động tốt. Sống và học hỏi.)

Ungolfed + bình luận

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 byte

#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
Bạn cũng nên #include<string>hoặc chuyển sang C ++ 14 và khai báo lambda chung [](auto s)và giả sử slà của std::string. Ngoài ra, khai báo [](auto&s)giúp bạn không phải trả về chuỗi khi sửa đổi các đối số đầu vào để phục vụ như đầu ra được cho phép.
Karl Napf

2

Qbasic, 436 408 byte

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$

Đã lưu một byte nhờ DLosc. Lưu lại nhiều hơn bằng cách thay đổi xử lý ký tự không chữ.

Điều này về cơ bản bao gồm ba phần:

  • Chia đầu vào thành 3 chuỗi (Chữ hoa, Chữ thường và bản đồ (cũng giữ các ký tự khác))
  • Lật chữ hoa và chữ thường
  • Sử dụng bản đồ để (tái) xây dựng đầu ra.

Một lời giải thích chi tiết hơn (lưu ý rằng đây là phiên bản trước của mã, nhưng nguyên tắc vẫn được áp dụng):

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

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

Phiên bản trước (93 byte)

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

Cảm ơn @ user59178 đã nhắc nhở tôi rằng preg_replace()có thể lấy mảng chuỗi làm đối số.


Câu trả lời ban đầu (108 byte)

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

Mã được gói ở đây để phù hợp với không gian có sẵn.
Nó có thể được thực thi từ dòng lệnh:

$ 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!'

Có thể có phiên bản ngắn hơn 1 byte trên PHP 7 bằng cách thực hiện chuyển nhượng $fbên trong cuộc gọi đầu tiên của nó:

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

Cả hai giải pháp, với các trường hợp thử nghiệm và các phiên bản không có bản quyền đều có thể được tìm thấy trên Github .


1
preg_replacecó thể mất một loạt các thay thế để làm như vậy bạn chỉ cần một cuộc gọi. Ngoài ra, nó ngắn hơn để sử dụng <?=hơn echo. Với những điều này thật đơn giản để có được câu trả lời của bạn xuống tới 93 byte.
dùng59178

Bạn nói đúng preg_replace(). Tôi đã quên điều đó. Tôi không thích <?=(theo tôi <?không phải là một phần của ngôn ngữ, nó chỉ là một điểm đánh dấu) và tôi thích viết các chương trình một dòng ngắn có thể được thực thi từ dòng lệnh bằng cách sử dụng php -r. Nhưng với mục đích của mã golf, bạn lại đúng. Tôi có thể tiết kiệm 1 byte bằng cách sử dụng <?=.
axiac

1

Toán học, 96 byte

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

Một cổng câu trả lời Retina của Leo , sử dụng các biểu thức thông thường.


Tôi thực sự ngạc nhiên rằng mathicala không có nội dung cho điều đó, ý tôi là, nếu "Khi chủ nhật Phục sinh", "Khi nào là hoàng hôn" và "hình dạng của pháp" là gì, cũng vậy!
sagiksp


1

Bean , 83 byte

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 tương đương:

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

Giải trình:

Hoàn toàn lấy dòng đầu vào đầu tiên akhông được định dạng là (vì dòng mới không thể là một phần của chuỗi được xáo trộn) và hoàn toàn đưa ra chuỗi không bị xáo trộn bằng cách thay thế tuần tự các chữ hoa, sau đó là các cặp chữ thường.

Hãy thử bản demo tại đây.

Hãy thử bộ thử ở đây.


1

Ruby, 81 byte

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

1

JavaScript (ES6), 80 byte

Dựa trên câu trả lời Retina của Leo .

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

Điều này hoạt động vì các ký tự in hoa duy nhất trong mã .replace(/([A-Z])([^A-Z]*)([A-Z])/g,'$3$2$1')AZ, được sử dụng để mô tả các phạm vi ký tự. Đây chính xác là những gì chúng ta cần chuyển đổi thành chữ thường để xử lý vượt qua thứ hai.

Các trường hợp thử nghiệm


Trên thực tế, nó hóa ra rất giống với câu trả lời Python này của Dennis.
Arnauld

1

ES6 155 - 195 byte

Tôi biết đã có câu trả lời tốt hơn, nhưng tôi muốn thử mà không cần regex. Cái này cũng hoạt động về dấu câu, nhưng điều đó dường như vi phạm (^_^)bài kiểm tra. Trong trường hợp đó tôi có một c()chức năng khác , được đưa ra dưới đây.

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("(^_^)")     //> (^_^)

Giải trình

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 byte

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

Lấy một biến chuỗi làm đối số và sửa đổi nó tại chỗ để sau khi gọi lambda, biến đó chứa kết quả.

Lâu hơn nó sẽ ở Perl, bởi vì:

  • Cú pháp regex mới dài dòng hơn, ví dụ viết ra các lớp ký tự sẽ trông giống như <[A..Z]>thay vì [A-Z].
  • Các quy tắc là mã nguồn hạng nhất được phân tích cú pháp tại thời điểm biên dịch và một chuỗi chỉ có thể được nội suy vào chúng trong thời gian chạy nếu nó bao gồm một tiểu vùng độc lập (nghĩa là bạn không thể nội suy một chuỗi thành một lớp ký tự).
  • Explict EVAL, sẽ cho phép linh hoạt hơn, đòi hỏi use MONKEY-SEE-NO-EVAL;pragma không thân thiện với golf .

Về mặt tích cực, một mảng trong một @biến có thể được tham chiếu trực tiếp trong biểu thức chính quy và được coi là một phép xen kẽ.


Perl 6 , 65 byte

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

Phiên bản chức năng (đưa ra kết quả là giá trị trả về của lambda).


1

R, 343 byte

Giải pháp R vụng về khủng khiếp:

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 byte

Lâu hơn nhiều so với nó nên nhưng dù sao:

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

Điều này đầu tiên tạo ra hai danh sách: một trong các chỉ số của các ký tự chữ hoa và một cho các ký tự chữ thường. Mỗi danh sách này được lặp qua các cặp chỉ số và các ký tự tại các chỉ mục đó được chuyển đổi.

Tôi sẽ đánh golf này vào ngày mai , nhưng bây giờ là lúc để ngủ .


1

Pip , 28 byte

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

Đưa đầu vào làm đối số dòng lệnh. Hãy thử trực tuyến!

Giải trình

Đây là một giải pháp regex, sử dụng các biến regex dựng sẵn XL(chữ thường, `[a-z]`) và XU(chữ in hoa, `[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)

Khi đối số thứ hai Rlà một danh sách, các thay thế được thực hiện theo chuỗi; do đó, thay thế chữ thường và thay thế chữ hoa không can thiệp lẫn nhau.



1

AWK , 121 129 byte

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

Hãy thử trực tuyến! Lưu ý: Liên kết có thêm 8 byte để cho phép nhập nhiều dòng

Cách sử dụng khá điển hình, nhưng yêu cầu một phiên bản AWKchấp nhận một chuỗi trống làm dấu tách trường (hầu hết các phiên bản gawknhưng tôi khá chắc chắn rằng bản gốc AWKsẽ thất bại :()

Điều đó rất đơn giản vì nó chỉ đơn giản lặp lại qua từng ký tự và kiểm tra xem nó có tìm thấy một trong những trường hợp đó trước đó không. Nếu vậy, nó hoán đổi các ký tự và đặt lại chỉ mục đã kiểm tra. Về mặt học tập, tôi chưa bao giờ sử dụng câu lệnh gán trong câu lệnh gán AWKtrước đó. Vì một số lý do, nó chưa bao giờ xuất hiện. :)

Tôi có thể cạo một vài byte bằng cách gán OFS và FS bên ngoài một BEGINkhối thông qua gán dòng lệnh hoặc tương tự, nhưng nó "sạch" hơn theo cách này.

Thêm liên kết TIO cho tôi thấy rằng tôi đã gặp lỗi sao chép cần 8 byte để sửa :( (Tôi đã bỏ qua 0*(U=a):)



1

Stax , 18 byte

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

Chạy và gỡ lỗi nó

Cách tiếp cận chung là dựa trên regex.

  • Hai lần làm:
  • Tìm tất cả các trận đấu cho [a-z].*?[a-z].
  • Hoán đổi nhân vật đầu tiên và cuối cùng trong các trận đấu.
  • Trường hợp ngược.

1

R , 223 163 byte 148 byte

EDIT: -60 byte bằng cách thực hiện vòng lặp for

EDIT: -15 byte từ 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="")

Hãy thử trực tuyến!

Hoạt động bằng cách kiểm tra nếu ký tự là chữ thường hoặc chữ hoa, đặt chúng vào ma trận, đảo ngược ma trận để trích xuất các giá trị theo định dạng hoán đổi. Sau đó đầu ra với cat. Hãy thử trực tuyến đấu tranh với scan(,'')nếu mã có nhiều hơn một dòng, do đó dấu chấm phẩy trong toàn bộ dòng mã.


Tôi nhận được 168 trên liên kết của bạn, nhưng golf này là 163
Giuseppe

điều này mang đến 162.
Giuseppe

điều này có thể hoạt động; khó khăn xlà một chút thông minh, nhưng cũng loại bỏ m=matrixđược 4 byte.
Giuseppe

Còn scan(,'')vấn đề thì sao? Và giảm "lLEhW OroLd!" trong TIO scan(,'')hoặc một số cách khác để có được đầu vào?
Sumner18

1
Bạn đã bỏ lỡ một cặp vợ chồng: tio.run/##Dc5NC4IwGADgv2LC8H1rEA76muzYIRC6GB3Eg6zEwdxibjSofvvy/ tựa
Giuseppe

0

Java 7, 117 byte

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

EDIT: Chỉ cần lưu ý rằng tôi có một câu trả lời tương tự như câu trả lời Retina của @Leo , mặc dù tôi đã nghĩ về nó một cách độc lập ..

Ung dung:

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

Mã kiểm tra:

Hãy thử nó ở đâ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."));
  }
}

Đầu ra:

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.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.