Xóa không gian, duy trì viết hoa


27

Đầu vào của bạn sẽ là một câu, cụm từ hoặc từ tiếng Anh. Nó sẽ chỉ chứa a-zA-Z' -,.!?. Nhiệm vụ của bạn là lấy đầu vào, xóa khoảng trắng và sau đó phân phối lại viết hoa sao cho các chữ cái tại các chỉ mục được viết hoa trước đó (và chỉ các chữ cái tại các chỉ mục được viết hoa trước đó) được viết hoa.

Ví dụ: nếu đầu vào là A Quick Brown Fox Jumped Over The Lazy Dog, các chỉ mục (dựa trên 0) của chữ in hoa là 0, 2, 8, 14, 18, 25, 30, 34, 39. Tiếp theo, xóa khoảng trắng khỏi đầu vào : AQuickBrownFoxJumpedOverTheLazyDog. Tiếp theo, viết thường tất cả các chữ cái, nhưng viết hoa những chữ cái tại 0, 2, 8, 14, 18, 25, 30, 34, 39: AqUickbrOwnfoxJumpEdovertHelazYdog, là đầu ra của bạn.

Đầu vào

Đầu vào của bạn sẽ là một câu, cụm từ hoặc từ tiếng Anh. Nó chỉ có thể chứa các chữ cái viết thường, chữ in hoa, dấu gạch ngang, dấu nháy đơn, dấu phẩy, dấu chấm, dấu chấm hỏi, dấu chấm than và dấu cách.

Đầu ra

Đầu vào với khoảng trắng được loại bỏ, chữ thường-d, với các chữ cái ở chỉ mục của chữ in hoa trong chữ hoa đầu vào-d.

LƯU Ý: Chương trình của bạn không thể sập (lỗi thực thi như vậy chấm dứt) với IndexOutOfRange hoặc lỗi tương tự.

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

Hi! Test!
Hi!tEst!

A Quick Brown Fox Jumped Over The Lazy Dog
AqUickbrOwnfoxJumpEdovertHelazYdog

testing TESTing TeStING testing testing TESTING
testingtESTIngteStInGTEstingtestingtestiNG

TESTING... ... ... success! EUREKA???!!! maybe, don't, NOOOOO
TESTING.........success!eureKA???!!!maybe,don't,nooooo

Enter        PASSWORD ---------
Enterpassword---------

A a B b C c D d E e F f G g H h I i J j K k L l M m N n O o P p Q q R r S s T t U u V v W w X x Z z
AabbCcddEeffGghhIijjKkllMmnnOoppQqrrSsttUuvvWwxxZz

  TEST
teST


'Ví dụ: nếu đầu vào là "Một con cáo nâu nhanh chóng nhảy qua con chó lười", thì các chỉ số (dựa trên 0) của các chữ in hoa là 0, 2, 8, 14, 18, 23, 27, 32' Chúng là0, 2, 8, 14, 18, 25, 30, 34, 39
Luke Sawczak

@LukeSawczak cảm ơn bạn, xấu của tôi
Stephen

Trúng không gian không được phép, tôi giả sử?
Luis Mendo

@LuisMendo giả định của bạn là chính xác. Đây là mã golf, phải không? : P
Stephen

Câu trả lời:


7

Thạch , 14 13 byte

nŒlTɓḲFŒlŒuṛ¦

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

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

nŒlTɓḲFŒlŒuṛ¦  Main link. Argument: s (string)

 Œl            Convert s to lowercase.
n              Perform character-wise "not equal" comparison.
   T           Get the indices of all truthy elements, i.e., the indices of all
               uppercase letters in s. Let's call the resulting array J.
    ɓ          Begin a dyadic chain with left argument s and right argument J.
     ḲF        Split s at spaces and flatten, removing the spaces.
       Œl      Convert s to lowercase.
            ¦  Sparse application:
         Œu        Convert s to uppercase.
           ṛ       Take the resulting items of the uppercased string at all indices
                   in J, the items of the lowercased string at all others.



5

Python 3 , 78 75 72 byte

s=input()
for c in s:s=s[c>' '!=print(end=(c+c).title()[s<'@'or'['<s]):]

Cảm ơn @xnor vì đã chơi golf 6 byte!

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


Bạn chỉ có thể so sánh sthay vì s[0]?
xnor

Phải, tất nhiên. Cảm ơn!
Dennis

1
(c*2).title()có thể giúp bạn cả hai trường hợp, mặc dù đã chuyển.
xnor

3 byte khác. Cảm ơn một lần nữa!
Dennis

Khôn lanh! Mất một lúc tôi mới hiểu ra nó c>' '!=f()tương đương với (c>' ') and (' '!=f()).
Chas Brown

5

05AB1E , 15 14 byte

-1 byte nhờ Emigna

ðKuvy¹Nè.lil}?

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

ðK             # Remove spaces
  u            # Convert to uppercase
   vy          # For each character...
     ¹Nè       #   Get the character at the same index from the original input
        .lil}  #   If it was a lowercase letter change this one to lowercase
             ? # Print without a newline

Bạn lưu một byte nếu bạn viết hoa chuỗi bị loại bỏ không gian và viết thường nó trong điều kiện.
Emigna

5

Haskell , 98 95 89 88 81 byte

Cảm ơn @name, @nimi, @Zgarb và @Laikoni vì đã giúp loại bỏ tổng cộng 14 byte

import Data.Char
\s->zipWith(\p->last$toLower:[toUpper|isUpper p])s$filter(>' ')s

Ung dung:

import Data.Char
\sentence -> zipWith (\oldChar newChar ->
                        if isUpper oldChar
                        then toUpper newChar
                        else toLower newChar)
                     sentence
                     (filter (/= ' ') sentence)

Trên thiết bị di động, nhưng có vẻ như bạn có thể lưu một số byte bằng bộ lọc (/ = '')
Henry

Đúng, chắc chắn có thể. Bỏ lỡ một phần của thông số kỹ thuật lưu ý rằng khoảng trắng là khoảng trắng duy nhất cần xóa.
Julian Wolf

1
filter(>' ')cho một byte ít hơn
nimi

2
Tôi nghĩ rằng cơ thể của lambda có thể được rút ngắn thànhlast(toLower:[toUpper|isUpper p])c
Zgarb

Chuyển đổi các đối số zipWithnên lưu thêm một byte : f s=zipWith(\p->last$toLower:[toUpper|isUpper p])s$filter(>' ')s.
Laikoni

4

V , 24 byte

ÄVuÓó
ejlDò/¥2lõ
vuk~òGd

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

Những loại thử thách này chính xác là những gì V được tạo ra. :)

Giải trình:

Ä           " Duplicate this line
 Vu         " Convert it to lowercase
   Óó       " Remove all spaces
e           " Move to the end of this line
 j          " Move down a line (to the original)
  l         " Move one char to the right
   D        " And delete the end of this line
    ò       " Recursively:
     /      "   Search for:
         õ  "     An uppercase character
      ¥2l   "     On line 2
            "     (This will break the loop when there are no uppercase characters left)
vu          "   Convert it to lowercase
  k         "   Move up a line
   ~        "   Convert this to uppercase also
    ò       " Endwhile
     G      " Move to the last line
      d     " And delete it

@DLosc Câu hỏi hay! Các dòng mới báo hiệu sự kết thúc của lệnh regex, chẳng hạn như lệnh thay thế (loại bỏ) hoặc lệnh tìm kiếm. Chi tiết hơn có trên trang này: github.com/DJMcMayhem/V/wiki/Regexes
DJMcMayhem

4

Python 2, 100 byte

s=input()
print"".join([c.lower(),c.upper()][s[i].isupper()]for i,c in enumerate(s.replace(" ","")))

3
Chào mừng bạn đến với PPCG, và câu trả lời đầu tiên rất tốt!
Sản phẩm ETH

3

Alice , 32 byte

/..- ~l+u~mSloy
\ia''-y.'Qa.+a@/

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

Giải trình

Đây là một mẫu tiêu chuẩn cho các chương trình hoạt động hoàn toàn trong chế độ thứ tự. Unwrapping, chương trình như sau:

i.' -l.uQm.lay.a-'~y+'~aS+o@

i       take input as string
.       duplicate
' -     remove spaces from copy
l.u     create all-lowercase and all-uppercase versions
Q       reverse stack, so original string is on top
m       truncate original string to length of spaces-removed string
.lay    convert everything except uppercase characters to \n
.a-'~y  convert everything except \n (i.e., convert uppercase characters) to ~
+       superimpose with lowercase string
        \n becomes the corresponding lowercase character, and ~ remains as is
'~aS    convert ~ to \n
+       superimpose with uppercase string
        lowercase in existing string stays as is because it has a higher code point
        \n becomes corresponding uppercase character
o       output
@       terminate

3

JavaScript (ES6), 94 91 85 byte

s=>s.replace(/./g,c=>c==" "?"":c[`to${"@"<s[x]&s[x++]<"["?"Upp":"Low"}erCase`](),x=0)
  • 6 byte được lưu với sự hỗ trợ từ ETHproductions & Arnauld.

Thử nó

o.innerText=(f=

s=>s.replace(/./g,c=>c==" "?"":c[`to${"@"<s[x]&s[x++]<"["?"Upp":"Low"}erCase`](),x=0)

)(i.value="Hi! Test!");oninput=_=>o.innerText=f(i.value)
<input id=i><pre id=o>



Bạn có thể làm '@'<s[i]&s[i]<'['?
Sản phẩm ETH

@StepHen: Aw, anh bạn, đã không thấy điều đó đêm qua khi tôi đang làm việc này.
Xù xì

@ETHproductions: Tôi đã tự hỏi nếu nó có thể ngắn hơn nhưng tôi quá lười để tìm kiếm những ký tự tôi cần sử dụng: D Hóa ra nó không tiết kiệm một byte; cảm ơn.
Xù xì

3

Võng mạc , 77 71 byte

.+
$&¶$&
T`L `l_`.+$
+`((.)*)[A-Z].*(¶(?<-2>.)*)
$1$3 
.+¶

T`l `L_` .?

Hãy thử trực tuyến! Liên kết bao gồm bộ kiểm tra. Giải thích: Giai đoạn đầu tiên nhân đôi dòng trong khi giai đoạn thứ hai hạ thấp bản sao và xóa khoảng trắng của nó. Giai đoạn thứ ba sau đó lặp qua từng chữ cái viết hoa từ phải sang trái và cố gắng đặt một khoảng trắng trước ký tự tương ứng trên dòng thứ hai. Dòng đầu tiên bị xóa và khoảng trắng được sử dụng để viết hoa các ký tự có liên quan của kết quả. Chỉnh sửa: Đã lưu 6 byte nhờ @Kobi.


Câu hỏi nhỏ: Là (.?)$4các bộ phận cần thiết? Có vẻ như có một nhóm tùy chọn ở cuối không làm gì cả.
Kobi

@Kobi Không có gì nhỏ về câu hỏi đó! Ban đầu, nó là một phần trong nỗ lực sử dụng ngoại hình để khớp các ký tự được đặt trực tiếp lên trên thay vì phải dịch chúng thành một bước riêng biệt.
Neil

3

Perl, 95 94 + 1 = 95 byte

Hình phạt 1 byte cho -n

Lưu một byte bằng cách thay thế từ s/\s//g đếns/ //g

$s=$_;s/ //g;$_=lc($_);while(/(.)/gs){$p=$&;$p=uc($p)if(substr($s,$-[0],1)=~/[A-Z]/);print$p;}

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

Giải trình:

  1. Tạo bản sao của chuỗi đầu vào.

  2. Xóa tất cả các khoảng trắng và chuyển đổi chuỗi thành chữ thường.

  3. Sau đó bắt đầu vòng lặp trên mỗi chữ cái. Kiểm tra thư ở cùng một vị trí trong chuỗi lưu cho chữ hoa. Nếu nó trên - làm cho thư hiện tại bị giam cầm. In thư.

Lưu ý rằng perl cần được chạy với chuyển đổi dòng lệnh "-n"


Chào mừng đến với PPCG! Nếu bạn muốn, bạn có thể thêm một liên kết đến Dùng thử trực tuyến: tio.run/# (Tôi sẽ thêm nó, nhưng tôi không biết đây là Perl 5 hay Perl 6)
Stephen

1
Tôi nghĩ rằng bạn cần phải đếm +1byte cho -ncờ. Khác hơn thế, điều này có vẻ tốt! Chào mừng đến với trang web! :)
DJMcMayhem

@StepHen là Perl 5, colud bạn thêm liên kết? Tôi không thể chạy mã của tôi ở đó theo cách propper.
Veitcel

Rất vui khi thấy một tay golf Perl mới! Tôi đã thêm liên kết TIO vào câu trả lời của bạn và cải thiện định dạng.
Dada


2

Python 3 , 117 byte

s=input()
y=list(s.replace(' ','').lower())
i=0
for c in y:
 if s[i].isupper():y[i]=c.upper()
 i+=1
print(''.join(y))

Dùng thử trực tuyến!

Đây là khá nhiều mã golf đầu tiên của tôi, vì vậy nó có thể là xấu, trừ sự giúp đỡ từ các bình luận bên dưới!

PS Có, thật ngu ngốc khi xác định và tăng ilưu các byte trên phạm vi (len (y)). Ồ tốt


1
Chào mừng đến với PPCG! Đẹp đầu tiên nộp! Tuy nhiên, tuân thủ các tiêu chuẩn I / O của trang web của chúng tôi, việc gửi của bạn phải là một chức năng của chuỗi hoặc nhận đầu vào; bạn không thể cho rằng đầu vào là một biến. Hy vọng bạn tận hưởng kì nghỉ của bạn! :)
HyperNeutrino

Cảm ơn; đã chỉnh sửa một hàm trong, nhưng cũng lưu 5 byte trong phần thân: D
Luke Sawczak

1
@LukeSawczak lưu một tấn byte bằng cách thay đổi thành một khoảng trống để thụt lề và có thể thêm Thử trực tuyến! liên kết nếu bạn muốn
Stephen

1
Bạn có thể loại bỏ không gian sau return.
Máy

@LukeSawczak thế nào đây? tio.run/ Kẻ
Stephen

2

C # (.NET Core) , 108 101 byte

using System.Linq;s=>s.Replace(" ","").Select((c,i)=>s[i]>64&s[i]<91?char.ToUpper(c):char.ToLower(c))

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

  • 7 byte được lưu sau khi nhận ra rằng charlớp có tĩnh ToUpper()ToLower()phương thức.

2

Than , 33 byte

A⁰χFLθ¿⁼§θι A⁺¹χχ¿№α§θ⁻ιχ↥§θι↧§θι

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

Vì tôi vẫn không biết làm thế nào để chuyển một chuỗi có khoảng trắng dưới dạng một tham số đầu vào vào mã Char than, tôi chỉ gán trong tiêu đề chuỗi thử nghiệm cho biến Char than đại diện cho đầu vào đầu tiên (θ ):

AA Quick Brown Fox Jumped Over The Lazy Dogθ

Vì vậy, mã có cùng số byte như thể chuỗi được truyền làm đầu vào đầu tiên.

Bạn có thể thấy ở đây phiên bản dài dòng của mã.


1
Tôi đã nói trong một câu trả lời khác nhưng chỉ trong trường hợp bạn quên, chỉ cần nhập vào dưới dạng một mảng python với một phần tử
ASCII - chỉ

Tôi chỉ yêu cầu đầu vào để có một dòng mới.
Neil

2

PHP, 181 byte

Tôi thử lấy số lượng nhỏ byte, đây là mã của tôi:

<?php
$s=readline();
preg_match_all('/[A-Z]/',$s,$m,PREG_OFFSET_CAPTURE);
$s=strtolower(str_replace(' ','',$s));
while($d=each($m[0]))$s[$d[1][1]]=strtoupper($s[$d[1][1]]);
echo $s;

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


Thay vì Hằng số, PREG_OFFSET_CAPTUREbạn có thể sử dụng giá trị 256, $argnlà một biến ngắn hơn như readline()đối với đầu vào và tôi nghĩ ctype_uppervà sử dụng lcfirstucfirstsẽ tiết kiệm rất nhiều byte với một vòng lặp và sử dụng $$itoán tử ternary
Jörg Hülsermann

2

Java 8, 184 177 161 byte

s->{String r="";for(int i=0,j=i,t,u;i<s.length;){t=s[i++];if(t>32){u=s[j++];r+=(char)(t<65|t>90&t<97|t>122?t:u>64&u<91?t&~32:u>96&u<123|u<33?t|32:t);}}return r;}

Chắc chắn có thể được đánh gôn thêm ..
- 16 byte nhờ @ OlivierGrégoire bằng cách lấy đầu vào char[]thay vì String.

Giải trình:

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

s->{                           // Method with char-array parameter and String return-type
  String r="";                 //  Result-String
  for(int i=0,j=i,t,u;         //  Some temp integers and indices
      i<s.length;){            //  Loop over the String
    t=s[i++];                  //   Take the next character and save it in `t` (as integer)
                               //   and raise index `i` by 1
    if(t>32){                  //   If `t` is not a space:
     u=s[j++];                 //   Take `u` and raise index `j` by 1
     r+=                       //   Append the result-String with:
      (char)                   //    Integer to char conversion of:
       (t<65|t>90&t<97|t>122?  //     If `t` is not a letter:
        t                      //      Simply use `t` as is
       :u>64&u<91?             //     Else if `u` is uppercase:
        t&~32                  //      Take `t` as uppercase
       :u>96&u<123|u<33?       //     Else if `u` is lowercase or a space:
        t|32                   //      Take `t` as lowercase
       :                       //     Else:
        t);                    //      Take `t` as is
    }
  }                            //  End of loop
  return r;                    //  Return result-String
}                              // End of method

1
Hãy char[]thay vì một String cho thế này, bạn sẽ tiết kiệm nhiều byte!
Olivier Grégoire

Mặt khác, tôi cũng trả lời bằng một thuật toán khác. Và ở đây, tôi lấy các đối số ngược lại: in = String, out = char[]:-)
Olivier Grégoire

2

Lisp thường gặp, 104 byte

(defun f(s)(map'string(lambda(x y)(if(upper-case-p x)(char-upcase y)(char-downcase y)))s(remove #\  s)))

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

Viết tắt bất thường cho Lisp thông thường!

Mã đơn giản:

(defun f (s)                     ; receive the string as parameter
  (map 'string                   ; map the following function of two arguments
       (lambda (x y)             ; x from the original string, y from the string with removed spaces
         (if (upper-case-p x)    ; if x is uppercase
             (char-upcase y)     ; get y uppercase
             (char-downcase y))) ; else get y lowercase
       s
       (remove #\  s)))

2

Java (OpenJDK 8) , 150 117 113 97 byte

s->{for(int i=0,j=0,c;i<s.length;)if((c=s[i++]&95)>0)System.out.printf("%c",c^(s[j++]|~c/2)&32);}

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

Trong khi chơi gôn nhiều hơn, tôi đã đạt tới 102 byte:

s->{for(int i=0,j=0,c;i<s.length;)if((c=s[i++]&95)>0)System.out.printf("%c",c<64?c|32:c|s[j]&32,j++);}

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

Nhưng tôi nhớ rằng điều này đã bắt đầu giống như câu trả lời của Dennis 'C vì vậy tôi chỉ đơn giản chuyển câu chuyện của anh ấy và ... phép thuật đã xảy ra. Lợi ích lớn từ cảng là loại bỏ các nhánh và sự lặp lại bên trong chúng.


@ceilingcat không hoạt động: Hi! Test!nên trở thành Hi!tEst!, nhưng với giải pháp của bạn thì nó trở thành Hi!Test.
Olivier Grégoire

2

Google Sheets, 213 byte

=ArrayFormula(JOIN("",IF(REGEXMATCH(MID(A1,ROW(OFFSET(A1,0,0,LEN(A1))),1),"[A-Z]"),MID(UPPER(SUBSTITUTE(A1," ","")),ROW(OFFSET(A1,0,0,LEN(A1))),1),MID(LOWER(SUBSTITUTE(A1," ","")),ROW(OFFSET(A1,0,0,LEN(A1))),1))))

Đầu vào là trong ô A1và công thức bị phá vỡ như thế này:

  • ArrayFormula() hãy để chúng tôi đánh giá từng nhiệm kỳ của ROW() một cách độc lập
  • JOIN() nối tất cả các kết quả độc lập đó thành một chuỗi
  • IF(REGEXMATCH(),UPPER(),LOWER() là những gì làm cho nó thay thế bằng cách sử dụng chữ hoa hoặc chữ thường tùy thuộc vào trường hợp nào ở vị trí đó trong đầu vào
  • ROW(OFFSET())trả về một mảng các giá trị 1để A1.lengthcó thể được đưa vào các MID()chức năng vì vậy chúng tôi có thể đánh giá từng nhân vật lần lượt

Kết quả của các trường hợp thử nghiệm: (Sẽ dễ đọc hơn nếu bạn nhấp vào phiên bản lớn hơn.)

TestCases


2

Ruby , 80 byte

->a{n=a.downcase.delete' '
n.size.times{|i|(?A..?Z)===a[i]&&n[i]=n[i].upcase}
n}

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


Bạn có thể lưu một vài byte bằng cách sử dụng n.gsub(/./){}thay vì n.size.times{};n: n.gsub(/./){(?A..?Z)===a[i]?$&.upcase: $&}.
Jordan

2

Perl, 92 byte

$p[$i++]=$-[0]while s/[A-Z]/lc($&)/e;s/\s//g;for$c(@p){substr($_,$c,1)=~tr[a-z][A-Z]};print;

Giải trình:

$p[$i++]=$-[0]while s/[A-Z]/lc($&)/e;   #get locations of caps into an array at the same time converting letters to lowercase

s/\s//g;   #delete all spaces

for$c(@p){substr($_,$c,1)=~tr[a-z][A-Z]};   #convert lowercase letters to uppercase where uppercase letters were present

print;   # print (of course) :)

1
Chào mừng đến với PPCG! :)
Stephen

Bạn cần thêm -ncờ để làm cho câu trả lời của bạn hợp lệ. Một vài điều chơi golf: s/ //glà đủ (không cần \s), y/a-z/A-Z/cũng giống như tr[a-z][A-Z], bạn có thể sử dụng -pcờ để bạn không cần lần cuối print, bạn không cần dấu ngoặc đơn lc$&.
Dada



1

Python 2, 106 105 byte

s=input()
print''.join(map(lambda(c,u):[c.lower,c.upper][u](),zip(s.replace(' ',''),map(str.isupper,s))))

Chỉnh sửa: lưu một byte qua print ''.join=>print''.join .

Dạng Lambda, 99 byte

lambda s:''.join(map(lambda(c,u):[c.lower,c.upper][u](),zip(s.replace(' ',''),map(str.isupper,s))))

1

SCALA, 128 ký tự, 128 byte

var l=s.toLowerCase().filter(x=>x!=32)
for(i<-0 to l.size-1){if(s(i).isUpper)l=l.substring(0,i)+l(i).toUpper+l.substring(i+1)}
l

Cảm ơn vì thử thách này. Hãy thử trực tuyến!


1

q / kdb +, 49 byte

Dung dịch:

{@[a;(&)#:[a:lower x except" "]#x in .Q.A;upper]}

Ví dụ:

q){@[a;(&)#:[a:lower x except" "]#x in .Q.A;upper]}"Hi! Test!"
"Hi!tEst!"

q){@[a;(&)#:[a:lower x except" "]#x in .Q.A;upper]}"A Quick Brown Fox Jumped Over The Lazy Dog"
"AqUickbrOwnfoxJumpEdovertHelazYdog"

q){@[a;(&)#:[a:lower x except" "]#x in .Q.A;upper]}"testing TESTing TeStING testing testing TESTING"
"testingtESTIngteStInGTEstingtestingtestiNG"

q){@[a;(&)#:[a:lower x except" "]#x in .Q.A;upper]}"TESTING... ... ... success! EUREKA???!!! maybe, don't, NOOOOO"
"TESTING.........success!eureKA???!!!maybe,don't,nooooo"

q){@[a;(&)#:[a:lower x except" "]#x in .Q.A;upper]}"Enter        PASSWORD ---------"
"Enterpassword---------"

q){@[a;(&)(#:[a:lower x except" "]#x)in .Q.A;upper]}"A a B b C c D d E e F f G g H h I i J j K k L l M m N n O o P p Q q R r S s T t U u V v W w X x Z z"
"AabbCcddEeffGghhIijjKkllMmnnOoppQqrrSsttUuvvWwxxZz"

q){@[a;(&)#:[a:lower x except" "]#x in .Q.A;upper]}"  TEST"
"teST"

Giải trình:

Tìm các chỉ mục trong đó đầu vào là chữ hoa và sau đó áp dụng hàm uppercho các chỉ mục đó trên phiên bản chữ thường, loại bỏ không gian của chuỗi đầu vào. Lưu ý rằng chúng ta không thể áp dụng hàm vượt quá độ dài của chuỗi, vì vậy hãy sử dụng hàm Take ( #) để cắt ngắn chuỗi đầu vào theo chiều dài của chữ thường, phiên bản loại bỏ khoảng trắng.

{@[a;where count[a:lower x except " "]#x in .Q.A;upper]} / ungolfed
{                                                      } / lambda function
 @[ ;                                           ;     ]  / apply FUNC to VAR at INDICES: @[VAR;INDICES;FUNC]
                                                 upper   / uppercase, upper["abc"] -> "ABC"
                                       x in .Q.A         / boolean list where input is in uppercase alphabet ABC..XYZ
                                      #                  / take this many elements from list on the right (ie truncate)
           count[                    ]                   / returns length of the stuff inside the brackets, count["ABC"] -> 3                                        
                         x except " "                    / remove " " from string
                   lower                                 / lowercase, lower["ABC"] -> "abc"
                 a:                                      / save in variable a
     where                                               / returns indices where true where[101b] -> 0 2
   a                                                     / our lowercased, space-stripped input

Tiền thưởng:

Sau khi đọc câu trả lời, tôi nghĩ tôi sẽ thử một giải pháp trong đó tôi lặp lại đầu vào, cho đến nay tôi chỉ quản lý một giải pháp 53 byte:

{a{$[y in .Q.A;upper x;x]}'#:[a:lower x except" "]#x}

1

Swift 3.0, 199 byte

var s="AS Ff",i=[String](),p=[Int](),j=0;for c in s.characters{if c>="A"&&c<="Z"{p.append(j)};if c != " "{i.append(String(c).lowercased())};j=j+1};for c in p{i[c]=i[c].uppercased()};print(i.joined())

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


1

Perl 5, 40 bytes

37 byte mã + -Fcờ. (lưu ý rằng trên các phiên bản cũ của Perl, bạn có thể cần thêm -ancờ)

print$F[$i++]=~/[A-Z]/?uc:lc for/\S/g

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

Giải thích:
Nhờ -F, @Fchứa một danh sách mỗi ký tự của đầu vào.
for/\S/glặp đi lặp lại trên mỗi ký tự không phải không gian của đầu vào. Chúng tôi sử dụng $iđể đếm mà chúng tôi đang lặp đi lặp lại. Nếu $F[$i++]là ký tự viết hoa ( /[A-Z]/), thì chúng tôi in ký tự hiện tại viết hoa ( uc), nếu không, chúng tôi in ký tự viết thường ( lc). Lưu ý rằng uclctrả lại đối số của họ không thay đổi nếu đó không phải là một chữ cái.


Phiên bản trước (ít chơi gôn hơn: 47 byte):

 s/ //g;s%.%$_=$&;$F[$i++]=~/[A-Z]/?uc:lc%ge

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.