Vốn hóa trao đổi


35

Cho hai chuỗi ký tự, chuyển mẫu viết hoa của từng chuỗi sang chuỗi khác. Ít byte nhất sẽ thắng.

Input:   CodeGolf xxPPCGxx  
Output:  coDEGOlf XxppCgxx
  • Cả hai chuỗi sẽ có độ dài bằng nhau và không trống, chỉ có các chữ cái a..zA..Z.
  • Bạn có thể xuất hai chuỗi kết quả theo thứ tự liên quan đến đầu vào.
  • Bạn có thể biểu diễn một cặp chuỗi dưới dạng một chuỗi bằng dấu phân cách một ký tự không ký tự cho đầu vào và / hoặc đầu ra.
  • Bạn có thể biểu diễn một chuỗi dưới dạng danh sách các ký tự hoặc chuỗi một ký tự, nhưng không phải là một chuỗi các giá trị điểm mã trừ khi đây chỉ là các chuỗi trong ngôn ngữ của bạn.
  • Đầu vào và đầu ra của bạn có thể đại diện cho các chuỗi khác nhau.

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

CodeGolf xxPPCGxx -> coDEGOlf XxppCgxx
lower UPPER -> LOWER upper
MiXeD lower -> mixed LoWeR
A A -> A A
ABcd EfGh -> AbCd EFgh

Câu trả lời:


14

Java (JDK 10) , 66 byte

a->b->{for(int i=a.length,t;i-->0;b[i]^=t)a[i]^=t=(a[i]^b[i])&32;}

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

Giải thích

a->b->{                           // Curried lambda
 for(int i=a.length,t;i-->0;      //  Descending loop on i,
                                  //  Declare t
     b[i]^=t                      //   Apply the case difference to b[i]
   )
  a[i]^=t=(a[i]^b[i])&32;         //   Assign the case difference of the two letters to t, and apply it to a[i].
}

9
Hoàn toàn không liên quan đến câu trả lời này của bạn, nhưng nó dễ hơn là tạo một cuộc trò chuyện. ; p Bạn có nhận thấy TIO Java-10 có lỗi khi sử dụng array[i++%n]+=...;không? array[t=i++%n]=array[t]+...;hoạt động tốt; và cũng array[i%n]+=...;i++;hoạt động tốt, nhưng sử dụng i++hoặc ++ivới một modulo và +=nối vào một hàng trong một mảng không hoạt động .. Ở đây, ví dụ TIO Java 10 để xem vấn đề. Đây có phải là một lỗi (hoặc tính năng: S) trong Java 10 JDK hoặc trong trình biên dịch Java 10 TIO không?
Kevin Cruijssen

1
@KevinCruijssen Tôi thấy vấn đề này, nhưng có vẻ lạ. Tôi thấy rằng phiên bản được sử dụng trên TIO là 10.0.0_46 (trong ngày 20-03-2018). Phiên bản mới nhất là 10.0.1. Có lẽ chúng ta nên yêu cầu TIO cập nhật phiên bản Java của họ.
Olivier Grégoire

3
@KevinCruijssen Dennis đã cập nhật phiên bản lên 10.0.1 và vấn đề vẫn đang xảy ra (Tôi chưa cài đặt Java 10 nên tôi dựa vào TIO, giống như bạn). Tôi đã hỏi về Stack Overflow vì tôi không biết chuyện gì xảy ra ở đây ... Thật khó hiểu!
Olivier Grégoire

5
@KevinCruijssen Không sao, câu trả lời này không thu hút được nhiều người ủng hộ: P Dù sao đi nữa ... Vấn đề là bạn thực sự đã tìm thấy một lỗi . Vì thông số kỹ thuật nói rằng nó sẽ hoạt động như bạn nghĩ, hãy tiếp tục viết câu trả lời của bạn theo cách đó, được tối ưu hóa cho Java 10 nếu bạn yêu cầu như vậy. Theo cách đó, bạn có câu trả lời Java 10 hợp lệ, nhưng không thể kiểm chứng được do lỗi đó. Chỉ cần viết nó và kiểm tra nó trong Java 8, sau đó thực hiện các thay đổi Java 10 thích hợp như thay đổi Stringthành var.
Olivier Grégoire

6
Tôi nghĩ thật là gọn gàng khi bạn tìm thấy một lỗi trong JDK 10. Công việc tốt:]
Chọc

13

C (gcc) , 86 58 55 53 byte

c(a,s,e)char*a,*s;{for(;*s++^=e=(*s^*a)&32;)*a++^=e;}

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



@Cowsquack Wow; cảm ơn rất nhiều.
Jonathan Frech


@ OlivierGrégoire Cảm ơn.
Jonathan Frech

8

Thạch , 9 byte

O&32^/^OỌ

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

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

O&32^/^OỌ  Main link. Argument: [s, t] (pair of strings)

O          Ordinal; replace each character with its code point.
 &32       Perform bitwise AND with 32, yielding 32 for lowercase letters, 0 for
           uppercase ones.
    ^/     Reduce by XOR, yielding 32 for letter pairs with different 
           capitalizations, 0 for letter pair with matching capitalizations.
      ^O   XOR the result with each of the code points.
        Ọ  Unordinal; replace each code point with its character.

1
... chúng tôi biết điều đó sẽ xảy ra: D
Jonathan Allan

7

APL (Dyalog Classic) , 13 12 byte

⊖⊖819⌶¨⍨∊∘⎕a

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

đầu vào và đầu ra là ma trận ký tự 2 × N

⎕a là bảng chữ cái tiếng Anh viết hoa 'ABC...Z'

∊∘⎕a trả về một ma trận boolean cho biết các chữ cái trong đầu vào là chữ hoa

819⌶ chuyển đổi đối số bên phải của nó thành chữ hoa hoặc chữ thường tùy thuộc vào đối số bên trái boolean của nó ("819" là leetspeak cho "BIG")

819⌶¨⍨làm điều đó cho mỗi ¨ký tự ( ), hoán đổi ( ) các đối số

có nghĩa là đảo ngược theo chiều dọc; một hành động như là đối số bên trái 819⌶và hành động còn lại là hành động cuối cùng


1
"819" is leetspeak for "BIG"... Nghiêm túc? Đó là lời giải thích thực tế cho lý do tại sao nó là 819? 0_o
DLosc

@DLosc có :) xem trò chuyện
ngn

5

Bình thường , 10 byte

rVV_mmrIk1

Hãy thử nó ở đây!

Giải thích & thủ thuật Pyth gọn gàng được sử dụng

  • rVV_mmrIk1- Chương trình đầy đủ. Đầu vào được lấy từ STDIN dưới dạng danh sách hai chuỗi và đầu ra được ghi vào STDOUT dưới dạng danh sách hai danh sách các ký tự.

  • mm - Đối với mỗi ký tự trong mỗi chuỗi:

    • Ik - Kiểm tra xem nó có bất biến dưới ...
    • r...1- ... Chuyển đổi thành chữ hoa. Hiệu suất Đúng cho các ký tự viết hoa và Sai cho các ký tự viết thường.
  • _ - Đảo ngược danh sách đó.

  • VV - Và nhân đôi chức năng sau cho hai danh sách:

    • r- Chuyển đổi thành chữ hoa nếu giá trị là True(aka 1), khác chuyển thành chữ thường.

Nội dung đệ trình này lạm dụng thực tế r0r1là các hàm chữ thường và chữ hoa trong Pyth và chúng tôi sử dụng các giá trị thật (các giá trị thu được bằng cách kiểm tra xem mỗi ký tự là chữ hoa, đảo ngược) Truecho năng suất chữ hoa và Falsechữ thường. Thực tế là booleans là các lớp con của số nguyên trong Python rất tiện cho cách tiếp cận mà câu trả lời này đang sử dụng. Cả hai cách tiếp cận Jelly của Dennis và Jonathan đều dẫn đến hơn 18 byte, vì vậy tôi khá hài lòng với các thủ thuật dành riêng cho Pyth được sử dụng ở đây.




3

J , 36 31 27 byte

-9 byte nhờ FrownyFrog!

(XOR"$32*[:~:/97>])&.(3&u:)

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

Giải pháp trước đó là:

J , 36 31 byte

-5 byte nhờ FrownyFrog!

|:@(XOR 32*0~:/@|:97>])&.(3&u:)

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

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

                          (3&u:)  converts the strings to code points
   (                    )&.       then do the following and convert back to chars
                    97>]          check if they are uppercase letters 
             0~:/@|:              transpose and check if the two values are different
          32*                     multiply by 32 (32 if different, 0 otherwise)
      XOR                         xor the code point values with 32 or 0
 |:@                              and transpose

[:thể là 0 và (22 b.)có thể XOR. &.(3&u:)tiết kiệm 1 byte.
FrownyFrog

@FrownyFrog Chơi golf rất hay, cảm ơn bạn! Bạn thực sự tốt!
Galen Ivanov


@FrownyFrog Wow! Bạn có thể giải thích việc sử dụng "$? Cảm ơn!
Galen Ivanov

Đầu vào được thực hiện với ,:, có 2 hàng ở bên trái. Chúng tôi cần "(1)nhưng "$làm việc quá, bởi vì nó là viết tắt của "1 _. $ b.0cho thứ hạng của $ (đơn nguyên, bên trái, bên phải).
FrownyFrog

3

R , 118 94 75 72 byte

m=sapply(scan(,""),utf8ToInt);w=m>96;apply(m-32*(w-w[,2:1]),2,intToUtf8)

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

Phải có một cách chơi golf nhiều. -43 byte nhờ Giuseppe, người đã chỉ cho tôi giải pháp MATL của Luis Mendo. Liên kết TIO chứa một giải pháp chức năng cho cùng một số byte.

m=sapply(a<-scan(,""),utf8ToInt)    # Turns input into a matrix of bytecode (2 columns)
w=m>96                              # Predicate : which chars are lower?
apply(m-32*(w-w[,2:1]),2,intToUtf8) # -32*w turns the string to UPPER
                                    # +32*w[,2:1] swaps capitalization
                                    # intToUtf8 turns bytecode to strings

Phần thưởng: Đầu ra là một vectơ có tên có tên là các chuỗi đầu vào ban đầu!


Bạn sẽ có thể bỏ a<-vì bạn không sử dụng abất cứ nơi nào khác.
Giuseppe

@Giuseppe Bạn có đọc được suy nghĩ của tôi không? ;)
JayCe

3

mã máy x86-64, 14 byte

Có thể gọi từ C (quy ước gọi SysV x86-64) với nguyên mẫu này:

void casexchg(char *rdi, char *rsi);  // modify both strings in place

Một phiên bản có độ dài rõ ràng với chiều dài trong rcxcùng kích thước. void casexchg(char *rdi, char *rsi, int dummy, size_t len);


Điều này sử dụng cùng một thuật toán trao đổi bit như các câu trả lời C và Java: Nếu cả hai chữ cái là cùng một trường hợp, thì không cần phải thay đổi. Nếu họ ngược lại, cả hai cần phải thay đổi.

Sử dụng XOR để phân biệt bit trường hợp của hai chuỗi. mask = (a XOR b) AND 0x20là 0 cho cùng hoặc 0x20 cho khác nhau. a ^= mask; b ^= maskcaseflip cả hai chữ cái nếu chúng là trường hợp ngược lại. (Vì mã chữ cái ASCII cho phần trên và phần dưới chỉ khác nhau ở bit 5.)

Danh sách NASM (từ nasm -felf64 -l/dev/stdout). Sử dụng cut -b 26- <casexchg.lst >casexchg.lstđể biến điều này trở lại thành một cái gì đó bạn có thể lắp ráp.

   addr    machine
 6         code          global casexchg
 7         bytes         casexchg:
 8                       .loop:
 9 00000000 AC               lodsb                ; al=[rsi] ; rsi++
10 00000001 3207             xor   al, [rdi]
11 00000003 2420             and   al, 0x20       ; 0 if their cases were the same: no flipping needed
12                       
13 00000005 3007             xor   [rdi], al      ; caseflip both iff their cases were opposite
14 00000007 3046FF           xor   [rsi-1], al
15                       
16 0000000A AE               scasb                ; cmp al,[rdi] / inc rdi
17                           ; AL=0 or 0x20.
18                           ; At the terminating 0 in both strings, AL will be 0 so JNE will fall through.
19                           ; 0x20 is ASCII space, which isn't allowed, so AL=0x20 won't cause early exit
20 0000000B 75F3             jne  .loop
21                       ;    loop  .loop            ; caller passes explict length in RCX
22                       
23 0000000D C3               ret

  size = 0xe bytes = 14
24 0000000E 0E           db $ - casexchg_bitdiff

Lệnh chậm loopcũng là 2 byte, tương tự như một đoạn ngắn jcc. scasbvẫn là cách tốt nhất để tăng rdivới lệnh một byte. Tôi đoán chúng ta có thể xor al, [rdi]/ stosb. Đó sẽ là cùng kích thước nhưng có thể nhanh hơn choloop trường hợp (bộ nhớ src + store rẻ hơn bộ nhớ dst + tải lại). Và vẫn sẽ đặt ZF một cách thích hợp cho trường hợp độ dài ẩn!

Hãy thử trực tuyến! với một _start gọi nó trên argv [1], argv [2] và sử dụng sys_write trên kết quả





2

QBasic, 133 byte

INPUT a$,b$
FOR i=1TO LEN(a$)
c=ASC(MID$(a$,i,1))
d=ASC(MID$(b$,i,1))
s=32AND(c XOR d)
?CHR$(c XOR s);
r$=r$+CHR$(d XOR s)
NEXT
?
?r$

Lấy hai chuỗi được phân tách bằng dấu phẩy và đưa ra kết quả phân tách dòng mới. Sử dụng thuật toán xử lý bit từ câu trả lời Jelly của Dennis . Ngoài ra, mẹo chơi golf chính ở đây là chuỗi kết quả đầu tiên được in trực tiếp, mỗi lần một ký tự, ngắn hơn một chút so với việc lưu cả hai chuỗi kết quả trong các biến và in chúng ra ngoài vòng lặp.


2

JavaScript, 77 74 73 byte

W=>W.map((w,x)=>w.map((c,i)=>W[+!x][i][`to${c>{}?'Low':'Upp'}erCase`]()))

Lấy một mảng các mảng char, xuất ra một mảng các mảng char.

-1 byte ( @Arnauld ): c>'Z'c>{}


1
Bạn có thể lưu một byte với c>{}.
Arnauld

1

Võng mạc , 75 byte

^
¶
+`¶(([A-Z])|(.))(.*)¶(([A-Z])|(.))
$#6*$u$1$#7*$l$1¶$4$#2*$u$5$#3*$l$5¶

Hãy thử trực tuyến! Giải thích: Các dòng mới được sử dụng làm điểm đánh dấu để xác định số lượng chuỗi đã được xử lý. Regex cố gắng khớp với các chữ cái viết hoa hoặc không có bất kỳ ký tự nào. Nếu một chữ cái viết hoa được khớp thì ký tự kia được viết hoa nếu không nó được viết hoa và ngược lại, trong khi các dòng mới được chuyển sang ký tự tiếp theo.



1

Hội (nasm, x64, Linux) , 25 byte (nguồn 123 byte)

Hex byte:

0x88, 0xE6, 0x30, 0xC6, 0x80, 0xE6, 0x20, 0x88
0xF2, 0x66, 0x31, 0xD0, 0x88, 0x26, 0xAA, 0xAC
0x8A, 0x26, 0x8A, 0x07, 0x08, 0xE4, 0x75, 0xE8, 0xC3

Điểm vào chức năng là tại a, với các chuỗi được sử dụng RDIRSI.

b:MOV DH,AH
XOR DH,AL
AND DH,32
MOV DL,DH
XOR AX,DX
MOV [RSI],AH
STOSB
LODSB
a:MOV AH,[RSI]
MOV AL,[RDI]
OR AH,AH
JNZ b
RET

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


Tôi chỉ nhận ra rằng bạn đang chơi golf nguồn asm, không phải kích thước mã máy. Điều đó thường vui hơn, vì đôi khi nó hữu ích trong cuộc sống thực. (Tất cả những thứ khác đều bằng nhau, nhỏ hơn thường tốt hơn cho mật độ bộ đệm của giao diện người dùng và uop.) Mẹo chơi gôn trong mã máy x86 / x64 .
Peter Cordes

@PeterCordes Cảm ơn vì tiền boa. Tôi đã thêm các byte hex. Phần lắp ráp của tôi hơi rỉ sét (lần trước tôi phải viết một trình điều khiển thiết bị nhỏ cho DOS 3.3!) Nhưng tôi nghĩ rằng tôi đã nhận được hầu hết các tối ưu hóa.
ErikF

Vâng, điều này có vẻ khá tốt. Thú vị hack đăng ký một phần. and al,32chỉ có 2 byte, sử dụng mã hóa AL, im8 đặc biệt mà hầu hết các lệnh ALU có. Bạn có thể yêu cầu độ dài chuỗi trong RCX và sử dụng loop. Tôi sẽ nói bạn nên test ah,ahbởi vì điều đó hiệu quả hơnor cùng chiều dài, nhưng nó dài hơn trong nguồn asm nên thành ngữ cũ nát thực sự có công với việc chơi golf mã nguồn asm: P
Peter Cordes

Sử dụng xor bộ nhớ đích và cấu trúc vòng lặp chặt chẽ hơn, phiên bản của tôi có 14 byte mã máy x86-64 . Tương tự cho các chuỗi có độ dài ẩn hoặc độ dài rõ ràng. Nguồn NASM của nó có lẽ cũng có thể được đánh xuống dưới 123 byte. Tôi không chắc cái nào sẽ chạy nhanh hơn trên CPU hiện đại như Skylake hay Ryzen (Ryzen sẽ không có thêm chi phí nào cho việc hợp nhất DH khi đọc DX, nhưng SKL sẽ cần thêm một chu kỳ để chèn một uop hợp nhất.)
Peter Cordes


0

than củi , 17 byte

Eθ⭆ι⎇№α§§θ¬κμ↥λ↧λ

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Lấy đầu vào là một mảng của hai chuỗi. Giải trình:

 θ                  Input array
E                   Map over strings
   ι                Current string
  ⭆                 Map over characters
         θ          Input array
           κ        Outer loop index
          ¬         Logical Not
        §           Index into array
            μ       Inner loop index
       §            Index into array
      α             Uppercase characters
     №              Count number of matches
              λ λ   Current character
             ↥      Uppercase
               ↧    Lowercase
    ⎇               Ternary
                    Implicitly print

0

F #, 120 byte

Bugger.

open System
let g=Seq.fold2(fun a x y->a+string(x|>if y>'Z'then Char.ToLower else Char.ToUpper))""
let b f s=g f s,g s f

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

Hàm glấy hai chuỗi làm tham số. Seq.fold2áp dụng một hàm với bộ tích lũy ( a) cho mỗi phần tử ( xy) trong chuỗi. Ban đầu alà một chuỗi rỗng và nó thêm ký tự được chuyển đổi vào nó trong mỗi lần lặp.

blà chức năng chính. Đầu tiên nó chuyển đổi fđối với s, và sau đó chuyển đổi sđối với f. Sau đó, nó trả về một tuple với cả hai giá trị.



0

Ruby , 74 69 byte

->a,b{a.zip(b).map{|x|x.one?{|y|y>?_}?x.map(&:swapcase):x}.transpose}

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

Đầu vào và đầu ra là các mảng ký tự, vì vậy chân trang thực hiện các phép biến đổi qua lại từ các chuỗi.

Tôi vẫn chưa chắc liệu đây có phải là một cách tiếp cận tốt cho vấn đề hay không, nhưng thử thách này chắc chắn trông giống như một kịch bản sử dụng tốt cho swapcasephương pháp.


0

PHP 4.1.2 , 40 byte

Thay thế cặp dấu ngoặc kép bằng byte A0 (trong ISO-8859-1 hoặc Windows-1252, đây là NBSP) để lấy số byte hiển thị, sau đó chạy từ trình duyệt web (hoặc từ dòng lệnh), cung cấp các chuỗi như các đối số chuỗi truy vấn (hoặc biến môi trường) ab.

<?=$a^$c=($a^$b)&str_pad("",2e5),_,$b^$c;

Trong phiên bản PHP này, register_globals được bật theo mặc định, do đó, chuỗi sẽ tự động được gán cho các biến $a$b. Tăng giá trị 2e5(200000) nếu cần thiết.

PHP 7.1+, 58 byte

Chạy trên dòng lệnh, sử dụng php -r 'code here' string1 string2:

[,$a,$b]=$argv;echo("$b $a"^$a.=" $b")&str_pad("",3e5)^$a;

Giá trị 3e5 (300000) được chọn vượt quá (MAX_ARG_STRLEN * 2 + 1) trên hầu hết các hệ thống Linux (cụ thể là x86 và các kiến ​​trúc khác mà PAGE_SIZE là 4096 và MAX_ARG_STRLEN do đó là 131072), để tránh sự cố với bất kỳ chuỗi đầu vào nào có thể. Tăng nếu cần thiết.

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


0

Stax , 10 byte

▌Ö↑o╓→ì]yç

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

Đây là một đại diện vô danh của cùng một chương trình để cho thấy nó hoạt động như thế nào.

        Example
        ["Ab", "cd"]                    
:)      [["Ab", "cd"], ["cd", "Ab"]]    Get all rotations of input
m       ["cd", "Ab"]                    For each, run the rest of program; print result
  M     ["cA", "db"]                    Transpose matrix
  {     "cA"                            Begin block for mapping to result
    B   "A" 99                          "Pop" first element from string array; leave the rest
    96> "A" 1                           Is the character code > 96?
    :c  "a"                             Set case of string; 0 -> upper,  1 -> lower
  m     "ab"                            Perform the map using the block

Chạy cái này


0

Pha lê , 108 byte

def f(a,b)r=s=""
a.zip(b){|x,y|r+="`"<x<"{"?y.downcase: y.upcase
s+="`"<y<"{"?x.downcase: x.upcase}
{s,r}end

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

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

def f(a, b)                       # Strings as list of characters
r = s = ""                        # Strings buffers initialization
a.zip(b) do |x, y|                # Join two arrays to paired tuples and iterate
r+="`"<x<"{"?y.downcase: y.upcase # Check if character is downcase using triple
s+="`"<y<"{"?x.downcase: x.upcase # comparison and ascii table. Then apply it to
end                               # the other character using String methods
{s, r}                            # Return two new strings using a tuple
end                               # PS: Tuples are inmutable structures in Crystal
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.