Trường hợp trùng lặp và chuyển đổi


34

Mục tiêu là, đã lấy một chuỗi làm đầu vào, sao chép từng chữ cái Latinh và "chuyển đổi" trường hợp của nó (nghĩa là chữ hoa trở thành chữ thường và ngược lại).

Ví dụ đầu vào và đầu ra:

Input      Output
bad        bBaAdD
Nice       NniIcCeE
T e S t    Tt eE Ss tT
s E t      sS Ee tT
1!1!1st!   1!1!1sStT!
n00b       nN00bB     
(e.g.)     (eE.gG.)
H3l|@!     Hh3lL|@!

Đầu vào bao gồm các ký hiệu ASCII có thể in được.

Bạn không nên sao chép các chữ cái không phải là chữ Latinh, số, ký tự đặc biệt.


17
Đây là một thử thách rất hay, đơn giản nhưng không tầm thường.
Mego

Câu trả lời:


10

Thạch, 5 byte

żŒsQ€

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

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

żŒsQ€  Main link. Argument: s (string)

 Œs    Yield s with swapped case.
ż      Zip s with the result.
   Q€  Unique each; deduplicate each pair of characters.

17

Python, 56 54 byte

lambda s:''.join(c+c.swapcase()*c.isalpha()for c in s)

Kiểm tra nó trên Ideone .


Đăng! Ra sân golf cho tôi 4 byte ...
R. Kap

Làm thế nào điều này duy trì các ký tự không chữ? Tôi nghĩ rằng họ sẽ xuất hiện dưới dạng các chuỗi trống.
đồ học

@atlasologist Như bạn có thể thấy trên Ideone, họ không. *có quyền ưu tiên cao hơn +, vì vậy nó chỉ ảnh hưởng đến ctrường hợp hoán đổi.
Dennis

Ồ, được thôi, tôi đã không nghĩ về nó như thế. Tốt đẹp.
đồ học

16

JavaScript ES6, 70 68 66 64 byte

Đã lưu 2 byte nhờ @Kevin Lau - không phải Kenny

Đã lưu 2 byte nhờ @ Cᴏɴᴏʀ O'Bʀɪᴇɴ

s=>s.replace(/[A-Z]/gi,l=>l+l[`to${l<"a"?"Low":"Upp"}erCase`]())

Giải trình

Điều này sử dụng một hacky thực sự:

l[`to${l<"a"?"Low":"Upp"}erCase`]()

mà vô dụng là:

l[`to${
   l < "a" ?
   "Low" : 
   "Upp"
}erCase`]()

Về cơ bản l < "a"kiểm tra xem điểm mã của chữ cái có nhỏ hơn điểm mã của a(do đó là một chữ cái viết hoa). Nếu có, nó sẽ làm điều to + Low + erCaseđó l['toLowerCase']()và làm cho ký tự viết thường. `trích dẫn cho phép định dạng chuỗi để về cơ bản bạn có thể nghĩ về:

`to${l < "a" ?"Low" : "Upp"}erCase`

as: "to" + (l<"a" ? "Low" : "Upp") + "erCase"tạo ra hàm để gọi (tạo chuỗi chữ hoa hoặc chữ thường). Chúng tôi đặt cái này trong dấu ngoặc vuông [ ... ]cho phép chúng tôi truy cập vào một thuộc tính có tên là chuỗi. Điều này trả về chức năng thích hợp và sau đó chúng ta chỉ cần gọi nó.


3
/[A-Z]/gilà một regex ngắn hơn: 3
Ink Ink

@ KevinLau-notKenny ồ thật tuyệt, cảm ơn!
Hạ cấp

1
to${l<"a"?"Lower":"Upper"}Caseđếnto${l<"a"?"Low":"Upp"}erCase
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ oh tốt đẹp, cảm ơn!
Hạ cấp

4
l[`to${l<"a"?"Low":"Upp"}erCase`]()Tôi nghĩ rằng chúng ta có một định nghĩa mới về cái ác.
gcampbell

10

Ruby, 37 33 (30 + -pcờ) byte

swapcaseđể giải cứu! Sắp xếp -4 byte từ @Lynn.

gsub(/[a-z]/i){$&+$&.swapcase}

gsub(/[a-z]/i){$&+$&.swapcase}cộng với pcờ là 31 byte.
Lynn

1
@Lynn Tôi tin rằng sự đồng thuận đã chỉnh sửa khác biệt cần thiết từ kịch bản mặc định, vì vậy pcờ là (space)-paka 3 byte.
Mực giá trị

8

C, 63 60 byte

f(char*s){for(;*s;s++)isalpha(putchar(*s))&&putchar(32^*s);}

Sử dụng thực tế rằng 'a' XOR 32 == 'A', vv

Ba byte được lưu nhờ FryAmTheEggman.


bạn có thể di chuyển cái s++cuối cùng putchar( &&putchar(32^*s++)) để lưu một byte
Giacomo Garabello

Tôi nghĩ bạn có thể thay thế &&bằng *, phải không?
aloisdg nói Phục hồi lại

1
Tôi khá chắc chắn rằng cả hai đều không hoạt động, nếu tôi nghĩ về cách thức &&hoạt động ngắn mạch của nó.
Lynn

f(char*s){isalpha(putchar(*s))&&putchar(32^*s);*s&&f(1+s);}đệ quy?
l4m2

1
f(char*s){*s&&f(1+s,isalpha(putchar(*s))&&putchar(32^*s));}đệ quy?
l4m2

6

CJam, 11 byte

l_el_eu.+.|

Kiểm tra nó ở đây.

Giải trình

l      e# Read input.
_el    e# Duplicate, convert to lower case.
_eu    e# Duplicate, convert to upper case.
.+     e# Concatenate the two characters in matching positions from those two
       e# strings. E.g. "ab!" "AB!" would give ["aA" "bB" "!!"].
       e# For each character from the original string and the corresponding 
.|     e# string from this list, take the set union (which eliminates duplicates
       e# and keeps the order the values appear in from left to right, so that
       e# the original case of each letter comes first).



5

Haskell, 73 byte

l=['a'..'z']
u=['A'..]
(>>= \c->c:maybe""pure(lookup c$zip l u++zip u l))

5

Cheddar , 118 104 byte

(s)->s.chars.map((i)->{if String.letters has i.lower{if i<"a"{i+i.lower}else{i+i.upper}}else{i}}).join()

Câu trả lời thực sự đầu tiên của Cheddar !!! Đây là ít khí hậu hơn tôi nghĩ nó sẽ ...; _;

Hoạt động với phiên bản 1.0.0-beta.9 , không cạnh tranh.


Như bạn có thể nói tôi đã không thiết kế cheddar để chơi golf: /

Ung dung:

(str) -> str.chars.map(
    (i) -> {
        if String.letters has i {
            if i < "a" { // Check char code, meaning it's upper case if true
                i+i.lower
            }
            else {
                i+i.upper
            }
        } else {
            i
        }
    }
).join()

Sử dụng:

var doThing = <code here>;
doThing("input...");

Cập nhật: 14/07/16 Tôi đã hoàn thành các ternary làm cho điều này giảm xuống còn 84 byte

Cheddar, 84 byte

(s)->s.chars.map((i)->String.letters has i.lower?i<"a"?i+i.lower:i+i.upper:i).join()

hoạt động như phiên bản v1.0.0-beta.14


4
Yay! Chúng tôi đã chờ đợi thời điểm này trong một thời gian dài!
DJMcMayhem

Với một hoặc hai thay đổi tên phương thức, cũng hợp lệ Sidef
cat

@cat o_o sự tương đồng là đáng lo ngại
Downgoat

Chà, cả hai đều bị ảnh hưởng bởi Perl, Perl 6, Ruby, Python, v.v., vì vậy không có gì đáng ngạc nhiên: P
mèo

1
@cat oh no no no no no, cheddar không bị ảnh hưởng bởi trăn
Downgoat

4

Võng mạc, 28 27 21 byte

Đó là các tab, không phải khoảng trắng.

.
$&  $&
T`lL    p`Ll_`  .

Dùng thử trực tuyến

Cảm ơn những lời đề nghị tất cả mọi người.


Các không gian được ăn bởi SE.
Conor O'Brien

[A-Za-z]->i`[A-Z]
Hạ cấp

Martin và tôi đang nói chuyện với nhau, và chúng tôi đã nghĩ ra: retina.tryitonline.net/ Kẻ
FryAmTheEggman

@FryAmTheEggman À, tôi quên mất _. Tôi sẽ sử dụng các tab để tôi có thể kiểm tra tất cả các trường hợp thử nghiệm cùng một lúc.
mbomb007

1
Nhưng bộ kiểm tra không cần phải chơi gôn: P Chỉ cần để lại một ghi chú rằng "dòng đầu tiên làm cho nó chạy riêng trên mỗi dòng" thường là đủ tốt. Ở đây, nó sẽ giúp bạn tiết kiệm sự điên rồ của các ký tự tab.
FryAmTheEggman

4

C, 87 80

Truyền một chuỗi làm đầu vào f()và đầu ra được ghi vào STDOUT. Chuỗi không được sửa đổi.

f(char*v){for(;*v;++v)putchar(*v),isalpha(*v)?putchar(*v-32+64*!islower(*v)):0;}

Bạn có thể cung cấp một cách để thử nó trực tuyến?
aloisdg nói Phục hồi Monica

@aloitorg Hãy thử ideone.com
mèo

4

sed, 30 byte

Mã 29 byte + tham số 1 byte -r

s/([a-z])|([A-Z])/&\u\1\l\2/g

Sử dụng:

echo -e 'bad\nNice\nT e S t\ns E t\n1!1!1st!\nn00b\n(e.g.)\nH3l|@!' |\
sed -r 's/([a-z])|([A-Z])/&\u\1\l\2/g'

4

J, 31 29 byte

[:;]<@~."1@,.tolower,.toupper

Giải trình

[:;]<@~."1@,.tolower,.toupper  Input: s
                      toupper  Convert s to all uppercase
             tolower           Convert s to all lowercase
                    ,.         Join them as columns in a 2d array
   ]                           Identity function, get s
           ,.                  Prepend s as a column to the 2d array
      ~."1@                    Take the unique chars on each row
    <@                         Box them
[:;                            Unbox the list of boxes and join their contents and return

4

Haskell, 121, 101, 85, 82

import Data.Char
g n|isLower n=toUpper n|1<2=toLower n
(>>= \x->x:[g x|isAlpha x])

3
Bằng cách thay thế if-then-other bằng các bộ bảo vệ, bạn có thể tiết kiệm 15 byte hoặc hơn. Và isLowerngắn hơn so với cấu trúc với elem, cho thêm 5 byte.
arjanen

1
>>=concatMap(hoặc concat.map) với các đối số được lật : f n = n >>= (\x->if isAlpha x then[x,r x]else[x]). Bạn có thể truy cập pointfree và bỏ qua tên hàm và thay thế định nghĩa fbằng (>>= \x->if isAlpha x then[x,r x]else[x]).
nimi

1
Thay vì otherwisebạn có thể sử dụng bất kỳ biểu thức nào ước tính True, ví dụ 1<2. Bạn có thể thay thế if .. then .. elsebằng một sự hiểu biết danh sách : \x->[x]++[g x|isAlpha x]. Oh, và có một lỗi: thứ hai toUppertrong gphải là một toLower.
nimi

1
Ồ, một điều nữa: [x]++x:.
nimi

4

Perl, 36 byte ( -ncờ 35+)

s/[a-z]/$&.(ord$&<97?lc$&:uc$&)/ige

( -pcần thẻ)

(-2 byte nhờ vào @Dom Hasting)

Giải thích ngắn:
ordtrả về giá trị số của một char. ord(any lower case) >= 97, Và ord(any upper case) <= 90).

Chạy với:

perl -pe 's/[a-z]/$&.(ord$&<97?lc$&:uc$&)/ige'

Bạn vẫn cần sử dụng /ihoặc biểu thức chính của bạn sẽ khớp với một số điểm mã giữa các chữ cái.
Oleg V. Volkov

@ OlegV.Volkov oh đúng, cảm ơn, trả lời chỉnh sửa.
Dada

Giảm nó xuống thêm một byte, sử dụng phương pháp của bạn: Hãy thử trực tuyến!
Xcali

4

Ruby, 31 + 1 = 32 30 + 1 = 31 byte

Với -pcờ, chạy

gsub(/(?<=(.))/){$1.swapcase!}

Tận dụng lợi thế của thực tế là swapcase!sẽ trả nilvề bất cứ thứ gì ngoại trừ một chữ cái ASCII, dịch thành một chuỗi trống khi được trả lại khỏi gsubkhối. @Jordan đã lưu một byte bằng cách chụp ký tự trước đó trong một cái nhìn phía sau.


Kết hợp với //và sau đó sử dụng $`[-1]là thông minh.
Jordan

1
Tôi đã quản lý để loại bỏ sáu byte bằng lookbehind : gsub(/(?<=(.))/){$1.swapcase!}. Tuy nhiên, cùng một khái niệm cơ bản, vì vậy hãy sử dụng nó.
Jordan

Mát mẻ! Điều đó có vẻ ngắn hơn một byte đối với tôi.
lịch sử

Er, vâng, một byte. Tôi nghĩ rằng tôi đã có một số mã bổ sung trong đó để kiểm tra rằng tôi vô tình đếm.
Jordan

Không cần sử dụng phiên bản tự sửa đổi .swapcase!. (Ý tôi là, loại bỏ !.)
manatwork

4

R, 191 187 168 156 98 99 byte

99 byte do cải tiến qua GiuseppeMickyT .

paste0(x<-unlist(strsplit(readline(),"")),gsub("[^A-Za-z]","",chartr("a-zA-Z","A-Za-z",x)),collapse="")

98 byte - có thể đôi khi vào năm tới, chúng ta có thể tìm thấy một sân golf khác, hahaha.
Giuseppe

1
Tôi ghét phải là người mang cái xấu mới, nhưng nó thất bại trong các trường hợp thử nghiệm với không gian. readline()có thể được sử dụng, nhưng nó sẽ tốn một byte
MickyT

@MickyT cảm ơn, đã sửa.
rturnbull

@MickyT scansẽ hoạt động với đầu vào được bao bọc trong dấu ngoặc kép (như trường hợp đối với dòng đối số trong các ngôn ngữ khác)
Giuseppe

@Giuseppe Xin lỗi tôi đã không nhận ra điều đó. Tôi chỉ nghĩ rằng nó tự động phân tách trên khoảng trắng trừ khi bạn chỉ định một ký tự không phải khoảng trắng. Xin lỗi rturnbull
MickyT

3

05AB1E , 7 byte

Mã số:

vyyš«Ù?

Giải trình:

v       # For each in input.
 yyš    # Push y and y swapcased.
    «Ù  # Concatentate and uniquify.
      ? # Print without a newline.

Sử dụng mã hóa CP-1252 . Hãy thử trực tuyến!


Có lẽ bạn có thể cung cấp một liên kết đến thông dịch viên?
nicael

2
@nicael Nó được liên kết ... Nó ở ngay trên github.
mbomb007

Vậy không có phiên dịch trực tuyến? :(
nicael

@nicael Sau đó tải xuống và chạy nó. Không cần phải có người phiên dịch trực tuyến , chỉ cần người phiên dịch.
mbomb007

1
@nicael Vâng, vẫn chưa có trình thông dịch trực tuyến nào :(. Phiên bản ngoại tuyến sẽ hoạt động.
Adnan



3

Trên thực tế, 8 byte

`;Öo╔`MΣ

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

Giải trình:

`;Öo╔`MΣ
`;Öo╔`M   for each character in input:
 ;          duplicate the character
  Ö         swap case
   o        append to original character
    ╔       remove duplicated characters
       Σ  concatenate

3

MATL, 11 9 byte

tYov"@uv!

Dùng thử trực tuyến

Giải trình

        % Implicitly grab input as string
t       % Duplicate the input
Yo      % Swap case of all characters
v       % Vertically concatenate the original and swap-cased versions
"       % For each column (letter in the original)
  @u    % Compute the unique values (without sorting)
  v!    % Vertically concatenate with the existing output and transpose
        % Implicit end of for loop and implicit display

3

Perl, 28 22 21 byte ( -pcờ 20+)

s/[a-z]/$&.$&^$"/ige

Tôi tưởng tượng bạn có thể lưu một byte bằng cách sử dụng $"thay vì ' ', nhưng tôi chưa thử nghiệm.
msh210

@ msh210, tốt đẹp! Làm thế nào tôi có thể quên kiểm tra perlvar cho các chuỗi mặc định? Cảm ơn!
Oleg V. Volkov

3

Stax , 7 6 byte

Cảm ơn @recursive cho một byte được lưu!

┤§ÆP♦■

Chạy và gỡ lỗi nó tại staxlang.xyz! (liên kết là phiên bản giải nén)

Giải nén (7 byte):

c:~\{um

Giải trình:

c:~\{um
c          Copy the top element of the stack (the input, in this case).
 :~        Switch case of each letter in the copy.
   \       Zip. This produces an array of two-character strings.
    { m    Map a block over this array of two-character strings.
     u       Get all unique elements.
           Implicit concatenate and print.

Cảm ơn đã cho stax một thử. Một cải tiến dễ dàng bạn có thể thực hiện là sử dụng uthay vì :g. Nó sẽ nhận được tất cả các phần tử duy nhất trong một mảng, đó chính xác là những gì bạn muốn trong trường hợp này. Ngoài ra, điều này có vẻ tốt golf.
đệ quy

@recursive Cảm ơn! Quên về điều đó: / Sẽ chỉnh sửa sớm.
Khuldraeseth na'Barya

Không làm việc cho 123. Bạn có thể cần thay đổi định dạng cho tất cả các đầu vào (tức là trích dẫn chúng). Liên kết cũng bị hỏng. Bạn cần thay thế m=11bằng m=2. Có một nút tạo bài đăng PPCG trên staxlang.xyz vì vậy bạn có thể muốn sử dụng nút đó.
Weijun Zhou

@ WeijunZhou Cảm ơn, đã sửa!
Khuldraeseth na'Barya

2

Python, 59 byte

lambda s:''.join((x,x+x.swapcase())[x.isalpha()]for x in s)

Đã chỉnh sửa để sửa các ký tự không phải là chữ cái



2

PHP 4.1, 57 byte

Mã này giả định truy cập thông qua một máy chủ web (ví dụ Apache), sử dụng cấu hình mặc định.

Bạn có thể vượt qua chuỗi bằng cách gửi chìa khóa Sbằng bất kỳ phương tiện ( POST, GET, COOKIE, SESSION...).

<?for($i=0;$c=$S[$i++];)echo$c,ctype_alpha($c)?$c^' ':'';


2

Lisp thông thường (Lispworks), 262 byte

(defun f(s)(let((b""))(dotimes(i(length s))(if(lower-case-p(elt s i))(progn #1=(setf b(concatenate 'string b(string #2=(elt s i))))(setf b(concatenate 'string b(string(char-upcase #2#)))))(progn #1#(setf b(concatenate 'string b(string(char-downcase #2#)))))))b))

vô dụng:

(defun f (s)
  (let ((b ""))
    (dotimes (i (length s))
      (if (lower-case-p (elt s i))
          (progn
           #1=(setf b (concatenate 'string b (string #2=(elt s i))))
           (setf b (concatenate 'string b (string (char-upcase #2#)))))
        (progn
          #1#
          (setf b (concatenate 'string b (string (char-downcase #2#)))))))
    b))

Sử dụng:

CL-USER 1 > (f "abc")
"aAbBcC"

CL-USER 2 > (f "bad")
"bBaAdD"
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.