Vui hơn với chuỗi ký tự- (rất)


28

Lấy cảm hứng từ thử thách này (hay cụ thể hơn là bằng cách đọc sai nó), tôi đã đưa ra thử thách sau:

Cho một chuỗi đầu vào S, đảo ngược thứ tự của tất cả các ký tự viết hoa và tất cả các ký tự chữ thường. Để lại tất cả các ký tự không phải chữ cái tại chỗ. Ví dụ:

Chào thế giới!

Lưu ý rằng chữ hoa W( chữ hoa đầu tiên) đã được thay thế bằng H(chữ cái cuối cùng). Tương tự với các chữ cái viết thường: 'd' (đầu tiên) được hoán đổi với e(cuối cùng), l(thứ hai) được thay thế bằng l(bút cuối cùng) ... Tất cả các ký tự không phải chữ cái được đặt đúng chỗ.

Đầu vào

  • Đầu vào là một chuỗi chỉ có các ký tự ASCII trong phạm vi 32-126.
  • Đầu vào được đảm bảo dài ít nhất 1 ký tự và sẽ không vượt quá giới hạn ngôn ngữ của bạn.

Đầu ra

  • Cùng một chuỗi, với các ký tự được hoán đổi như mô tả.

Quy tắc bổ sung

  • Sơ hở tiêu chuẩn bị cấm
  • Câu trả lời phải là một chương trình đầy đủ hoặc một chức năng, không phải là một đoạn trích hoặc một mục REPL.
  • , câu trả lời ngắn nhất trong byte thắng.

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

A
A

Ok
Ok

OK
KO

Hello, World!
Wdlro, Holle!

0123456789
0123456789

The quick brown Fox jumps over the lazy doge
Feg odyza lehtr Tev ospmu jxon wor bkci uqeh

odd
ddo

racecar
racecar

EtOn Em OsN R AaToNsIsIhT!!1!
ThIs Is NoT A RaNsOmEnOtE!!1!

Bạn có thể muốn bao gồm một testcase 2 char, giải pháp ban đầu của tôi đã thất bại về điều đó lúc đầu. (Đã sửa lỗi miễn phí bằng cách thay đổi .+thành .*)
ETHproductions 11/2/2017

"Lazy doge" đã nhắc nhở tôi về điều này: youtube.com/watch?v=W-d6uUSY9hk
FinW

Câu trả lời:


5

MATL , 14 byte

2:"t@Y2myy)Pw(

Dùng thử tại MATL Online

Giải trình

        % Impicitly grab input as a string
2:      % Push the array [1, 2] to the stack
"       % For each value in this array
  t     % Duplicate the top element of the stack (S)
  @     % Get the current loop index
  Y2    % Load the predefined literal 1Y2 ('ABC...Z') on the first loop
        % and the predefined literal 2Y2 ('abc...z') on the second loop (M)
  m     % Create a logical array the length of S that is TRUE when a character is in the
        % array M and FALSE otherwise (B)
  yy    % Make a copy of both S and B
  )     % Grab just the letters of S that were in M using B as an index
  P     % Reverse this array
  w     % Flip the top two stack elements
  (     % Assign them back into the string
        % Implicit end of for loop and implicit display

1
Lam tôt lăm! Tôi đã có 2:"tttXk>f)5MP(Yo17 byte
Luis Mendo

11

Võng mạc , 19 byte

Retina không có cách trực tiếp để đảo ngược chuỗi, nhưng chúng ta có thể làm điều đó bằng cách khai thác giai đoạn sắp xếp:

O^#`[a-z]
O^#`[A-Z]

Sắp xếp ( O), đọc chúng dưới dạng số ( #), sau đó đảo ngược thứ tự ( ^), của tất cả các chuỗi khớp với biểu thức chính quy (chữ cái viết thường cho dòng đầu tiên và chữ in hoa cho dòng thứ hai).

Điều này hoạt động bởi vì khi chúng ta cố gắng đọc các chuỗi không có ký tự số dưới dạng số chúng được xử lý 0, vì vậy tất cả các ký tự có cùng giá trị để sắp xếp. Vì sắp xếp ổn định, chúng được để lại theo cùng một thứ tự và đảo ngược chúng trả về chuỗi gốc được đảo ngược.

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


10

Perl , 45 byte

44 byte mã + -pcờ.

for$c(u,l){@T=/\p{L$c}/g;s/\p{L$c}/pop@T/ge}

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

Các ký tự Unicode \p{Lu}và các lớp \p{Ll}khớp tương ứng chữ hoa và chữ thường.
Vì vậy, /\p{L$c}/sẽ trả về danh sách tất cả các chữ cái in hoa (hoặc thấp hơn) (và lưu nó bên trong @T).
Và sau đó, regex s/\p{$c}/pop@T/gesẽ thay thế từng chữ cái (viết hoa, viết thường) bằng chữ cái cuối cùng @Ttrong khi xóa nó khỏi @T.


7

JavaScript (ES6), 74 73 71 70 byte

f=
s=>(g=r=>s=s.replace(r,_=>a.pop(),a=s.match(r)))(/[A-Z]/g,g(/[a-z]/g))
<input oninput=o.textContent=f(this.value)><pre id=o>

Chỉnh sửa: Đã lưu 1 byte nhờ @Arnauld.


4
Tôi biết có một cách tốt hơn ...
Sản phẩm điện tử

5

JavaScript (ES6), 92 byte

s=>(F=(r,s)=>s.replace(r,([x],a,y)=>y+F(r,a)+x))(/[a-z](.*)([a-z])/,F(/[A-Z](.*)([A-Z])/,s))

Hiện đã phải là một cách để tận dụng sự giống nhau giữa regexes ...

Kiểm tra đoạn


Điều này có giả định rằng hàm được gán cho một biến được gọi fkhông? Không nên trong số byte?
steenbergh

@steenbergh Hàm này là ẩn danh, nó có thể được gọi là bất cứ thứ gì bạn muốn
Kritixi Lithos

1
@steenbergh Không, đó là một chức năng ẩn danh tạo ra một chức năng khác Fsau đó gọi nó một cách đệ quy hai lần. Hàm ngoài không thực sự gọi chính nó tại bất kỳ điểm nào.
Sản xuất ETH

Tại sao bạn sử dụng dấu ngoặc đơn xung quanh .*trong biểu thức chính quy?
Lu-ca

@Luke để bắt những nhân vật đó ( atrong ([x],a,y)=>)
ETHproductions 11/2/2017

4

Perl 6 , 75 69 byte

{my @a=.comb;@(grep $_,@a).&{@$_=[R,] $_} for /<:Lu>/,/<:Ll>/;[~] @a}

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

  1. my @a=.comb;
    Chia chuỗi thành các ký tự và lưu trữ chúng trong một mảng.

  2. for /<:Lu>/,/<:Ll>/
    Đối với hai biểu thức khớp với chữ in hoa và chữ thường, tương ứng ...

    • @(grep $_,@a)
      Nhận một lát của tất cả các mục mảng phù hợp với biểu thức chính quy.

    • .&{@$_=[R,] $_}
      Chỉ định đảo ngược của lát cắt cho chính nó.

  3. [~] @a
    Nối mảng đã sửa đổi để tạo thành một chuỗi một lần nữa và trả về nó.


-6 byte bằng cách đánh cắp ý tưởng để sử dụng các lớp Unicode thay vì phạm vi ký tự, từ giải pháp của @ Dada.


3

Thạch , 14 byte

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.
    ,Ṛ$         Pair with its reverse. 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.

không phải là nitpicky nhưng .. 14 ký tự! = 23 byte :) mẹeff.in /
Gizmo

@Gizmo Jelly sử dụng một bảng mã . Xem bài đăng meta này để biết thêm thông tin.
Suever

@Suever Ôi thật gọn gàng, hôm nay đã học được điều gì đó ^. ^
Gizmo

3

Tiện ích Bash + Unix, 122 121 byte

f()(p=[^$1*
v="\)\([$1\)\("
for((n=99;n;n--)){
q="$q;s/^\($p$v.*$v$p\)$/\1\4\3\2\5/"
p=[^$1*[$1$p
}
sed $q)
f a-z]|f A-Z]

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

Không thực sự rất ngắn; có lẽ ai đó có thể chơi gôn hơn nữa

Đầu vào trên stdin, đầu ra trên thiết bị xuất chuẩn.

Điều này sẽ hoạt động chính xác trên đầu vào dưới 200 ký tự.

(Trên thực tế, nó xử lý chính xác bất kỳ chuỗi nào có ít hơn 200 chữ cái viết thường và ít hơn 200 chữ cái viết hoa.)

Nếu bạn tăng 99 trong mã lên 102 (với chi phí thêm một byte), nó sẽ xử lý các chuỗi tối đa 205 ký tự.

Tuy nhiên, bạn không thể tăng 99 trong mã ngoài 102 vì khi đó bạn sẽ vượt quá độ dài đối số tối đa của sed.

Đây là một phiên bản không có bất kỳ giới hạn kích thước đầu vào cụ thể nào, nhưng số lượng dài hơn một chút, 137 byte. (Phiên bản dài hơn này ghi vào một tệp phụ trợ có tên t.)

f()(p=[^$1*
v="\)\([$1\)\("
for((n=`wc -c<t`;n;n--)){
sed -i "s/^\($p$v.*$v$p\)$/\1\4\3\2\5/" t
p=[^$1*[$1$p
})
cat>t
f a-z]
f A-Z]
cat t

Chạy thử:

for x in A Ok OK 'Hello, World!' 0123456789 'The quick brown Fox jumps over the lazy doge' odd racecar 'EtOn Em OsN R AaToNsIsIhT!!1!'
  do
    echo "$x"
    ./swapping3 <<<"$x"
    echo
  done

A
A

Ok
Ok

OK
KO

Hello, World!
Wdlro, Holle!

0123456789
0123456789

The quick brown Fox jumps over the lazy doge
Feg odyza lehtr Tev ospmu jxon wor bkci uqeh

odd
ddo

racecar
racecar

EtOn Em OsN R AaToNsIsIhT!!1!
ThIs Is NoT A RaNsOmEnOtE!!1!

Điều thú vị là nó thất bại trong TIO. Có thể phụ thuộc vào việc sedtriển khai được cài đặt trên hệ thống của bạn, nhưng với GNU, sedbạn có thể thêm -rtùy chọn và loại bỏ việc \thoát tất cả dấu ngoặc đơn.
manatwork

2

Python 2 , 115 byte

s=input();u=str.isupper
exec"r='';i=0\nfor c in s:r+=c[u(c):]or filter(u,s)[~i];i+=u(c)\ns=r.swapcase();"*2
print s

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


Bạn có thể thay thế \ n bằng ;?
Tim

Tiếc là không có. Đối số của execđược phân tích cú pháp như mã Python thông thường, vì vậy vòng lặp for phải nằm trên dòng riêng của nó.
Dennis

2

Java (OpenJDK 8) , 271 byte

s->new String(new Error(){char[]o=s.toCharArray();char c;int b;{while(b++<2)for(int l=0,r=o.length;l<r;l++){for(--r;r>l&&f(r);r--);for(;l<r&&f(l);l++);if(l<r){o[l]=o[r];o[r]=c;}}}boolean f(int i){c=o[i];return b>1?!Character.isUpperCase(c):!Character.isLowerCase(c);}}.o)

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


Bạn có thể lưu một số byte bằng cách biến nó thành lambda. s->new String...
Phi tuyến

1
@NonlinearFnut cảm ơn bạn! 294 -> 272, cũng đã sửa lỗi khi r a l được sử dụng lại mà không khởi tạo.
DmitrySamoylenko

Chào mừng đến với PPCG! Một số điều bạn vẫn có thể chơi golf: char[]o=s.toCharArray();char c;int b;to char o[]=s.toCharArray(),c,b;; và cả hai &&để &'; và c=o[i];return b>1?!Character.isUpperCase(c):!Character.isLowerCase(c);đến c=o[i];Character x=c;return b>1?!x.isUpperCase(c):!x.isLowerCase(c);( tổng cộng 259 byte ). Và tôi có lẽ đã bỏ lỡ một số điều để chơi golf nhiều hơn. Ngoài ra, nếu bạn chưa nhìn thấy nó, các mẹo chơi gôn trong Java có thể rất thú vị để đọc.
Kevin Cruijssen

1

R , 107 byte

u=utf8ToInt(scan(,''));for(i in c(65,97)){l=which(u%in%i:(i+25));u[l]=u[rev(l)]};cat(intToUtf8(u,T),sep="")

Chuyển thể từ phản ứng của tôi với thách thức liên kết. Điều này là dễ dàng hơn đáng kể so với chỉ trao đổi cặp. Tôi tự hỏi nếu tôi có thể có được 100 phụ với một số golf ...

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

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.