Viết hoa chữ cái đầu tiên của mỗi từ đầu vào


34

Đây là một cách tương đối nhanh, nhưng tôi chắc chắn bạn sẽ thích nó.

Codegolf một chương trình sẽ lấy đầu vào dưới dạng câu và sau đó cung cấp đầu ra với chữ cái đầu tiên được viết hoa trong mỗi từ.

Quy tắc:

  1. Đệ trình có thể không ở dạng hàm. Vậy không

    function x(y){z=some_kind_of_magic(y);return z;} là câu trả lời cuối cùng của bạn ... Mã của bạn phải cho thấy rằng nó nhận đầu vào và cung cấp đầu ra.

  2. Mã phải bảo toàn bất kỳ chữ in hoa nào khác mà đầu vào có. Vì thế

    eCommerce and eBusiness are cool, don't you agree, Richard III?
    

    sẽ được hiển thị dưới dạng

    ECommerce And EBusiness Are Cool, Don't You Agree, Richard III?
    
  3. Một số bạn có thể nghĩ, "Dễ thôi, tôi sẽ chỉ sử dụng regex!" và do đó, sử dụng biểu thức chính quy trong ngôn ngữ chơi gôn đã chọn của bạn sẽ bị phạt 30 ký tự sẽ được áp dụng cho số mã cuối cùng của bạn. Nụ cười nham hiểm

  4. Một "từ" trong trường hợp này là bất cứ thứ gì được ngăn cách bởi một khoảng trắng. Do đó palate cleanserlà hai từ, trong khi pigeon-toedđược coi là một từ. if_you_love_her_then_you_should_put_a_ring_on_itđược coi là một từ. Nếu một từ bắt đầu bằng một ký tự không theo thứ tự chữ cái, từ đó được giữ nguyên, vì vậy _thissau khi kết xuất vẫn như _this. (Kudos gửi Martin Buttner vì đã chỉ ra trường hợp thử nghiệm này).

    • 4b. Không có gì đảm bảo rằng các từ trong cụm từ đầu vào sẽ được phân tách bằng một khoảng trắng.
  5. Test Case, (vui lòng sử dụng để kiểm tra mã của bạn):

    Đầu vào:

    eCommerce rocks. crazyCamelCase stuff. _those  pigeon-toed shennanigans. Fiery trailblazing 345 thirty-two Roger. The quick brown fox jumped over the lazy dogs. Clancy Brown would have been cool as Lex Luthor. good_bye
    

    Đầu ra:

    ECommerce Rocks. CrazyCamelCase Stuff. _those  Pigeon-toed Shennanigans. Fiery Trailblazing 345 Thirty-two Roger. The Quick Brown Fox Jumped Over The Lazy Dogs. Clancy Brown Would Have Been Cool As Lex Luthor. Good_bye
    
  6. Đây là mã golf, mã ngắn nhất thắng ...

Chúc may mắn...


1
Còn không gian ở cuối dòng thì sao? Chúng ta có phải bảo tồn chúng không? Chúng tôi có thể thêm một nếu nó phục vụ nhu cầu của chúng tôi?
Dennis

2
Dennis, vui lòng giữ lại khoảng trắng từ đầu vào ...
WallyWest

3
! = TitleCase chết tiệt! c # thua LẠI!
Ewan

1
@Tim Khoảng trắng kép trước Pigeon-toed là chính xác . Ông nói để bảo tồn khoảng cách.
mbomb007

2
Những gì tách các từ? Bất kỳ khoảng trắng (tab, dòng mới, vv) hoặc chỉ khoảng trắng?
Steven Rumbalski

Câu trả lời:


21

CJam, 15 13 byte

Lq{_eu?_S-}/;

Hãy thử trực tuyến trong trình thông dịch CJam .

Mã giả

L             e# B := ""
 q            e# Q := input()
  {       }/  e# for C in Q:
   _eu?       e#     C := B ? C : uppercase(C)
       _S-    e#     B := string(C).strip(" ")
            ; e# discard(B)

Tất cả các ký tự C đã sửa đổi được để lại trên ngăn xếp và do đó, được in khi thoát.


3
Chết tiệt này là thông minh. D:
Martin Ender

Tôi phải đồng ý, vượt qua ai đó bằng 4 ký tự trong một ngôn ngữ codegolf là một kỳ công trong chính nó ... được thực hiện tốt.
WallyWest

12
@WallyWest: Ngôn ngữ chơi gôn có thể mang lại ấn tượng rằng họ chơi golf, nhưng tôi đảm bảo với bạn rằng họ không chơi. TMTOWTDI đúng với tất cả các ngôn ngữ và đặc biệt đối với những ngôn ngữ được tích hợp nhiều. Đôi khi bạn thắng , đôi khi bạn thua và đôi khi bạn cảm thấy như mình bị xe tải đâm .
Dennis

13

CSS 2.1, 49

:after{content:attr(t);text-transform:capitalize}

Giải thích :

  • Các attrchức năng lấy đầu vào từ một t(văn bản) thuộc tính HTML.
  • Đầu vào được viết hoa bằng cách đặt text-transformthành capitalize.
  • Đầu ra được cung cấp dưới dạng nội dung được tạo, sử dụng thuộc contenttính trên phần tử giả .::after

Đoạn trích có thể chạy được :

:after {
    content: attr(t);
    text-transform: capitalize;
}
<div t="eCommerce rocks. crazyCamelCase stuff. _those  pigeon-toed shennanigans. Fiery trailblazing 345 thirty-two Roger. The quick brown fox jumped over the lazy dogs. Clancy Brown would have been cool as Lex Luthor. good_bye"></div>

Lưu ý : CSS 2.1 đã chỉ định hành vi mong muốn: ghi capitalizeđè ký tự đầu tiên của mỗi từ. Tuy nhiên, CSS3 viết hoa đơn vị chữ cái đầu tiên của mỗi từ. Vì vậy, đoạn trích ở trên sẽ không hoạt động chính xác cả trên IE cũ, vốn không tuân theo CSS 2.1; cũng như trên các trình duyệt tuân thủ mới theo CSS3.


Ồ, điều này thật thông minh!
IQAndreas

1
(quá tệ về sự _thosecố trên trình duyệt CSS3, nhưng tôi vẫn nâng cao vì cách giải quyết vấn đề duy nhất.)
IQAndreas

@Oriol, "ồ cái này thật thông minh!" thật! Xin lỗi IQAndreas, tôi phải mượn bình luận của bạn ở đây ... đây là một cách tiếp cận khéo léo để giải quyết vấn đề ... tôi sẽ phải sử dụng phương pháp này ...
WallyWest

10

Javascript ( ES6 ), 77 byte

alert(prompt().split(' ').map(x=>x&&x[0].toUpperCase()+x.slice(1)).join(' '))

Đã bình luận

alert( // output
    prompt(). // take input
    split(' '). // split by spaces
    map(x=> // map function to array
        x && // if x, empty string "" is falsey and returns itself
        x[0].toUpperCase() + x.slice(1) // capaitalize 1st char and concatenate the rest
    ).
    join(' ') // join array with spaces
)

Điều gì xảy ra nếu các từ được phân tách bằng nhiều khoảng trắng? [4b]
Caek 11/05/2015

3
@Caek Nó được xử lý bởi x&&. Một chuỗi rỗng là falsey nên các &&mạch ngắn và trả về toán hạng bên trái, chuỗi trống. Không gian được bảo tồn.
nderscore 11/05/2015

Tuyệt vời, cảm ơn đã giải thích. Có thể giúp tôi tìm hiểu làm thế nào tôi có thể làm cho nó hoạt động bây giờ.
Caek 11/05/2015

Điều này sẽ viết hoa ngay cả các ký tự không phải là chữ Asiii, do đó å sẽ trở thành Å!
leo

9

Perl, 13 byte

perl -040pe '$_="\u$_"'

9 byte cộng với 4 byte cho 040p(giả sử tôi đã giải thích chính xác các quy tắc về các yêu cầu đặc biệt ).

-040đặt dấu tách bản ghi đầu vào $/thành một khoảng trắng, do đó các khoảng trắng được giữ nguyên; các \udãy thoát chuyển đổi ký tự tiếp theo title case.


Công việc tuyệt vời, đề cập đến danh dự cho việc sử dụng dòng lệnh!
WallyWest

7

CJam, 17 15 byte

lS/{S+(eu\+}/W<

Kiểm tra nó ở đây.

Khá đơn giản thực hiện các thông số kỹ thuật. Sử dụng cái mới {}&để tránh lỗi cho các không gian liên tiếp.

Hai byte được lưu bởi Dennis.


Công cụ tuyệt vời! Có phải CJam chủ yếu chỉ là một ngôn ngữ chơi gôn hay nó có một số ứng dụng thương mại thực tế?
WallyWest

6
@WallyWest Không, đó chỉ là ngôn ngữ chơi gôn. Nó chắc chắn không có ứng dụng thương mại , nhưng cá nhân tôi thỉnh thoảng sử dụng nó cho các tập lệnh vứt đi nhanh chóng (vì nó có rất nhiều phần mềm dựng sẵn và nếu bạn biết bạn đang làm gì thì gõ ít ký tự hơn là gõ nhanh hơn nhiều ký tự hơn;)).
Martin Ender

Bạn có thể lưu một vài byte bằng cách nối thêm khoảng trắng vào mỗi từ. Tùy thuộc vào câu trả lời của OP cho câu hỏi của tôi, điều này có thể đưa bạn đến 14 hoặc 12 byte.
Dennis

@Dennis Oh đúng rồi, tôi đã chơi xung quanh nó, nhưng không xem xét đơn giản là thêm nó trước khi loại bỏ nhân vật đầu tiên. Tôi sẽ thay đổi vào ngày mai, cảm ơn bạn!
Martin Ender

@Dennis Cảm ơn, tôi đã thay đổi nó, nhưng tôi không chắc ý bạn là phiên bản 14 byte nào. Nếu bạn đang nói về việc bỏ qua cái thứ hai +, thì nó sẽ bị hỏng nếu đầu vào chứa khoảng trắng ở cuối.
Martin Ender

7

C, 64 63 byte

a;main(c){while(~(c=getchar()))putchar(a?c:toupper(c)),a=c-32;}

Khắc phục: một số trình biên dịch (như Clang) không thích tham số int thay cho argv, vì vậy tôi đã chuyển nó sang biến toàn cục. Số lượng byte giữ nguyên. Cảm ơn ossifrage squeamish đã nhận thấy. Xuống tới 63 byte, cảm ơn Dennis.

Ung dung:

int a;

int main(int c) {
    while(~(c = getchar()))
        putchar(a ? c : toupper(c)),
        a = c - ' ';
}

Khá đơn giản: nếu a là sai, ký tự được chuyển thành chữ hoa. Nó được đặt sau khi đọc một khoảng trắng: c - '' chỉ sai khi c == ''. toupper () bỏ qua mọi thứ không phải là chữ thường, vì vậy các ký hiệu và nhiều khoảng trắng đều ổn. -1 có tất cả các bit được đặt, vì vậy khi getchar () trả về -1, toán tử NOT làm cho nó bằng 0 và vòng lặp dừng lại. a được khai báo là biến toàn cục, do đó, nó được khởi đầu bằng 0 (sai). Điều này đảm bảo rằng từ đầu tiên được viết hoa.


1
while(~(c=getchar())- Tôi thích nó. Clang sẽ không thực sự biên dịch cái này, nhưng bạn có thể có cùng số lượng nhân vật vớic;main(a){...}
ossifrage squeamish

1
Nếu bạn trao đổi các khai báo acvà thứ tự của toán tử ternary, bạn có thể thay thế ==bằng -để lưu một byte.
Dennis

Bạn đúng, tất nhiên.
Andrea Biondo

Tốt đẹp! +1 Chương trình sẽ hoạt động như nhau khi sử dụng while(!(c = getchar())), phải không?
Spikatrix

1
@Cool Guy: Không, bitwise ~và logic !không giống nhau. Trong C, bất cứ điều gì không bằng 0 đều được coi là đúng, vì vậy điều kiện của bạn sẽ giống như while((c = getchar()) == 0)điều tất nhiên sẽ không hoạt động. Toán tử bitwise NOT ~phủ định giá trị từng bit một. Để phá vỡ vòng lặp, ~cphải bằng 0: điều này có nghĩa là tất cả các bit phải là một, để khi bị phủ định, chúng trở thành tất cả các số 0. Giá trị đó (đối với int 32 bit) 0xFFFFFFFF, nếu được ký, là -1(EOF).
Andrea Biondo

7

Python 3, 59 56 byte

f=1
for c in input():print(end=f*c.upper()or c);f=c==" "

Cảm ơn @Raticsity cho 3 byte.


3
Thế còn print(end=f*c.upper()or c)? Điều đó sẽ tiết kiệm 4 byte

@Raticsity Oh wow, tôi không biết bạn có thể có một bản in trống chỉ với một từ khóa arg. Cảm ơn!
Sp3000

7

Phiên bản Perl <5.18, 30 27 26 25

say map"\u$_",split$,=$"

24nhân vật +1cho -n.

\ulàm cho nhân vật tiếp theo trong một chuỗi chữ hoa . @ ThisSuitIsBlackNot đã chỉ ra điều này để tiết kiệm 1 byte. Trước khi chúng ta sử dụng chức năng ucfirst.

Từ các perldocs ,

Như một trường hợp đặc biệt khác, split sẽ mô phỏng hành vi mặc định của công cụ dòng lệnh awk khi MẪU bị bỏ qua hoặc một chuỗi ký tự bao gồm một ký tự khoảng trắng (chẳng hạn như '' hoặc "\ x20", nhưng không phải là / /). Trong trường hợp này, mọi khoảng trắng hàng đầu trong EXPR sẽ bị xóa trước khi phân tách xảy ra và thay vào đó, MẪU được xử lý như thể nó là / \ s + /; đặc biệt, điều này có nghĩa là bất kỳ khoảng trắng liền kề nào (không chỉ là một ký tự khoảng trắng) được sử dụng làm dấu phân cách. Tuy nhiên, điều trị đặc biệt này có thể tránh được bằng cách chỉ định mẫu / / thay vì chuỗi "", do đó chỉ cho phép một ký tự khoảng trắng duy nhất là dấu phân cách. Trong các Perls trước đó, trường hợp đặc biệt này đã bị hạn chế sử dụng "" đơn giản làm đối số mẫu để phân tách, trong Perl 5.18.

$"đánh giá một không gian, điều này sẽ bảo tồn các không gian. Vì chúng tôi muốn đặt cả hai $,ký tự khoảng trắng và nhập ký tự khoảng trắng vào phần tách, @nutki chỉ ra rằng chúng tôi có thể thực hiện cả hai làm đầu vào cho phần tách. Điều đó tiết kiệm 3 byte từ những gì chúng ta có trước đây, đó là cài đặt đầu tiên $,và sau đó nhập $"vào phần tách.

Sử dụng ,bản đồ thay vì {}lưu một byte bổ sung, như @ alexander-brett đã chỉ ra.

Chạy với:

echo 'eCommerce     rocks. crazyCamelCase stuff. _those  pigeon-toed shennanigans. Fiery trailblazing 345 thirty-two Roger. The quick brown fox jumped over the lazy dogs. Clancy Brown would have been cool as Lex Luthor. good_bye' | perl -nE'say map"\u$_",split$,=$"'

1
Tiết kiệm 1 byte với...map"\u$_",split...
alexander-brett

@ alexander-brett cảm ơn! Tôi cập nhật câu trả lời.
hmatt1

5

> <> (Cá) , 39 byte

</?-' 'o:;?(0:<-*' '*('{'$)'`'::i
i/.0e

Phương pháp:

  • Lấy một char và viết hoa nếu trong phạm vi a-zsau đó in ra. (mã từ trái sang phải cho phần này là i::'backquote')$'{'(*' '*+)
  • Nếu char được lấy cuối cùng là char EOF thì thoát khác in nó
  • Nếu char được lấy cuối cùng là char không gian thì chuyển đến điểm 1 khác lấy một chữ cái mới và chuyển đến điểm 2.

5

JAVA, 273 byte

CHỈNH SỬA

import static java.lang.System.*;class x{public static void main(String[] s){char[] a=new java.util.Scanner(in).nextLine().toCharArray();boolean f=1>0;for(int i=0;i<a.length;i++){if(a[i]==' '){f=1>0;continue;}if(f){a[i]=Character.toUpperCase(a[i]);f=1<0;}}out.println(a);}}

Đây là câu trả lời đầu tiên của tôi trong PCG, không chắc điều này có được chấp nhận hay không.
Atul Kumbhar

Chào mừng bạn! Bạn có thể thử xóa khoảng trắng và sử dụng các ký tự đơn cho tên biến. Có một số lời khuyên khác để chơi golf JAVA là tốt.
nderscore

Cảm ơn @nderscore cho gợi ý, tôi đã chỉnh sửa câu trả lời của mình bằng các mẹo.
Atul Kumbhar

Nhìn tốt hơn! Tôi cũng đã thêm số byte vào bài viết của bạn cho bạn.
nderscore 11/05/2015

1
@TuukkaX Anh ấy không có publicở phía trước của class.. Và nếu bạn có nghĩa là anh ta có thể loại bỏ publicở phía trước của static void main(..., sau đó bạn là sai, trừ khi anh ta cũng làm thay đổi classđến interfacevà sử dụng Java 8+.
Kevin Cruijssen

5

JavaScript (giải pháp regex) - 104 byte

Ai đó phải cắn viên đạn và đăng giải pháp RegEx! 74 ký tự, cộng với hình phạt +30 ký tự:

alert(prompt().replace(/(^| )[a-z]/g,function(m){return m.toUpperCase()}))

Hoặc nếu bạn muốn đọc và hiểu mã theo kiểu không nén:

//     Matches the (beginning of the line or a space), followed by a lowercase English character.  
string.replace( /(^| )[a-z]/g ,
                function(match) { return match.toUpperCase(); }

1
Thông minh ... mặc dù tất nhiên, bạn đã phải trả giá bằng hình phạt 30 ký tự ... Tôi
ngả

4

Python 2, 73 byte

i=raw_input()
print''.join((c,c.upper())[p==' ']for p,c in zip(' '+i,i))

Chương trình này viết hoa một chữ cái nếu đứng trước một khoảng trắng (với một khoảng trống cho ký tự đầu tiên trong chuỗi). Nó dựa vào .upper()phương thức chuỗi để viết hoa chính xác.


2
Bạn có thể lưu 2 byte bằng cách chuyển sang Python 3. (-4 raw_input=> input, +2 print=> print())
Steven Rumbalski

Cảm ơn Steven. Tôi đã xem xét việc tiết kiệm byte bằng cách mã hóa trong Python 3. Sau đó tôi nghĩ, nếu tôi thay đổi ngôn ngữ để cạnh tranh, tôi sẽ đổi thành Pyth. Tôi rất vui khi được thi đấu trong giải đấu phụ Python 2. Tôi viết mã bằng Python 2 mỗi ngày cho công việc, vì vậy trải nghiệm này giúp tôi làm việc tốt hơn (nhưng mã công việc của tôi không được đánh gôn!).
Logic Knight

4

PHP 64 76 77 83 84 89 byte

$_GETđược tính là đầu vào trong PHP không?
Nếu vậy, đây là nỗ lực CG đầu tiên của tôi

foreach(explode(' ',$_GET[@s])as$k=>$v)echo$k?' ':'',ucfirst($v)

Cảm ơn manatwork :)

Người ta chỉ có thể sử dụng ucwordshàm, kết quả là 21 byte:

<?=ucwords($_GET[@s])

cảm ơn Harry Mustoe-Playfair :)


Cá nhân tôi chỉ xem xét fgets(STDIN)để đọc đầu vào. Nhưng chúng tôi không có sự đồng thuận về $_GETnhững gì tôi biết.
manatwork 11/05/2015

Yup, hoạt động: D
Octfx 11/05/2015

Bạn không cần các thủ thuật để tắt các cảnh báo. Cảnh báo của bạn! Không ai quan tâm đến họ.
Ismael Miguel

Chà, không nghĩ về điều đó. Đoán tôi sẽ phải bám vào chất nền
Octfx 11/05/2015

Không cần điều đó. Đã đến lúc quên đi lời khuyên trước đây của tôi về việc loại bỏ $k=>. Đặt nó trở lại:foreach(split(' ',$_GET[@s])as$k=>$v)echo$k?' ':'',ucfirst($v);
manatwork

4

Haskell, 69

import Data.Char
main=interact$tail.scanl(!)' '
' '!c=toUpper c;_!c=c

Giải trình:

scanlnhận một hàm (a -> b -> a)và một giá trị ban đầu a, sau đó lặp qua một danh sách [b]s để tạo danh sách [a]s:

scanl (!) z [a,b,c] == [   z
                       ,   z ! a
                       ,  (z ! a) ! b
                       , ((z ! a) ! b) ! c]

Nó liên tục lấy kết quả trước đó làm đối số bên trái của hàm được truyền cho nó và một giá trị từ danh sách đầu vào làm đối số bên phải , để tạo đối số tiếp theo.

Tôi đã viết một hàm (!) :: Char -> Char -> Chartrả về ký tự bên phải mà bạn vượt qua, nhưng viết hoa nếu ký tự bên trái là ' '(dấu cách). Đối với scanl, điều này có nghĩa là: trả về giá trị từ danh sách đầu vào , nhưng viết hoa nếu kết quả trước đó là khoảng trắng. Vì vậy, scanl (!) ' ' "ab cd"trở thành:

    scanl (!) ' ' "ab cd"
==> ' ' : scanl (!) (' ' ! 'a') "b cd"
==> ' ' : scanl (!)     'A'     "b cd"
==> ' ' : 'A' : scanl (!) ('A' ! 'b') " cd"
==> ' ' : 'A' : scanl (!)     'b'     " cd"
==> ' ' : 'A' : 'b' : scanl (!) ('b' ! ' ') "cd"
==> ' ' : 'A' : 'b' : scanl (!)     ' '     "cd"
==> ' ' : 'A' : 'b' : ' ' : scanl (!) (' ' ! 'c') "d"
==> ' ' : 'A' : 'b' : ' ' : scanl (!)     'C'     "d"
==> ' ' : 'A' : 'b' : ' ' : 'C' : scanl (!) ('C' ! 'd') ""
==> ' ' : 'A' : 'b' : ' ' : 'C' : scanl (!)     'd'     ""
==> ' ' : 'A' : 'b' : ' ' : 'C' : 'd' : ""
==> " Ab Cd"

Chúng tôi cần giá trị ban đầu ' 'để viết hoa chữ cái đầu tiên, nhưng sau đó chúng tôi cắt nó ra tailđể có kết quả cuối cùng.


Tốt đẹp! Bạn có thể vui lòng giải thích nó cho tôi?
poida

Tôi đã viết một lời giải thích.
Lynn

Một số scanlví dụ khác: một , hai .
Lynn

@Mauris kudos vì đã sử dụng một thuật toán tuyệt vời như thế này ... :)
WallyWest

3

Bình thường, 20 byte

uXGHr@GH1fqd@+dzTUzz

Nhiều không gian thực sự hút. Nếu không, sẽ có một giải pháp 12 byte thực sự dễ dàng.

Dùng thử trực tuyến: Trình biên dịch / thực thi Pyth

Giải trình

                      implicit: z = input string
         f       Uz   filter [0, 1, 2, ..., len(z)-1] for elements T, which satisfy:
          qd@+dzT        " " == (" " + z)[T]
                      (this finds all indices, which should be capitalized)
u                  z  reduce, start with G = z, for H in idices ^ update G by
 XGH                     replace the Hth char of G by
    r   1                upper-case of
     @GH                 G[H]
                      implicitly print result

chỉnh sửa: 16 ký tự có thể với thuật toán @Dennis.


1
Có nhiều thứ không gian ở đó để làm cho nó khó khăn hơn nhiều ... nếu không nó sẽ là một trường hợp đơn giản của chuỗi.split ("") hoặc một cái gì đó tương tự ... Nhưng bạn đã hoàn thành tốt việc này trong 20 ký tự
WallyWest

3

CJam, 14 byte

Nó không phải là ngắn nhất, nhưng ...

qS/Sf.{\eu}s1>

Một câu trả lời khác sử dụng ý tưởng tương tự:

qS/Laf.{;eu}S*

.x chỉ thay đổi mục đầu tiên nếu một trong các tham số chỉ có một mục.


1
Xâu chuỗi f.khá khéo léo. Một biến thể 14 byte khác:qS/Sf.{\eu}S.-
Dennis

3

Lua, 64 62 61 byte

Lua là một ngôn ngữ khủng khiếp để chơi gôn, vì vậy tôi khá tự hào về bản thân mình cho môn này.

print(string.gsub(" "..io.read(),"%s%l",string.upper):sub(2))

[Dùng thử tại đây] 1 Lỗi thời, sẽ cập nhật tommorow


1
Chào mừng đến với PPCG! Chắc chắn, bạn không cần những không gian đó sau dấu phẩy?
Martin Ender

Wow, tôi rất mới với điều này, tôi thậm chí không biết không gian được tính. 62 byte!

2
Tôi cũng chỉ nhận thấy nó không hoàn toàn chính xác: bạn đang viết hoa chữ cái sau tất cả các chữ cái không, vì vậy abc_defsẽ cung cấp Abc_Def. Tuy nhiên, chỉ các chữ cái sau dấu cách sẽ được chuyển thành chữ hoa. Tin tốt là, sửa nó sẽ tiết kiệm một byte. ;)
Martin Ender

3

JAVA, 204 211 226 byte

Mục đầu tiên của tôi về CG, tôi hy vọng nó ổn:

class U{public static void main(String[]s){int i=0;char[]r=s[0].toCharArray();r[0]=Character.toUpperCase(r[0]);for(char c:r){if(c==' '&&i>0)r[i+1]=Character.toUpperCase(r[i+1]);i++;System.out.print(c);}}}

Đã lưu 7 byte nhờ @TNT


Liên quan đến các kỹ năng Java kém của tôi:public class U{public static void main(String[]s){int i=-1,j;char[]r=s[0].toCharArray();for(char c:r)if(++i==0||c==' '&&i>0)r[j=i+(i==0?0:1)]=Character.toUpperCase(r[j]);System.out.print(r);}}
manatwork 11/05/2015

1
Chào mừng đến với PPCG! Công cụ publicsửa đổi là không cần thiết để bạn có thể tiết kiệm thêm 7.
TNT

3

PHP: 76 74 ký tự

foreach($l=str_split(fgets(STDIN))as$c){echo$l?ucfirst($c):$c;$l=$c==" ";}

Chạy mẫu:

bash-4.3$ php -r 'foreach($l=str_split(fgets(STDIN))as$c){echo$l?ucfirst($c):$c;$l=$c==" ";}' <<< 'eCommerce rocks. crazyCamelCase stuff. _those  pigeon-toed shennanigans. Fiery trailblazing 345 thirty-two Roger. The quick brown fox jumped over the lazy dogs. Clancy Brown would have been cool as Lex Luthor. good_bye'
ECommerce Rocks. CrazyCamelCase Stuff. _those  Pigeon-toed Shennanigans. Fiery Trailblazing 345 Thirty-two Roger. The Quick Brown Fox Jumped Over The Lazy Dogs. Clancy Brown Would Have Been Cool As Lex Luthor. Good_bye

Thay vì ucfirst($c)sử dụng $c^' '. (Mẹo: nếu bạn viết bitwise-xormột chữ cái có khoảng trắng, nó sẽ được chuyển đổi từ chữ hoa sang chữ thường và chữ viết ngược cũng được áp dụng)
Ismael Miguel

@IsmaelMiguel, hoạt động tốt trong giải pháp của bạn khi bạn chỉ xử lý các chữ cái viết thường. Nhưng trong giải pháp của tôi, tất cả các ký tự đầu tiên được xử lý. Vì vậy, đối với thủ thuật xor (nếu không tuyệt vời), mã của tôi cũng sẽ cần một số kiểu lọc ký tự. :(
manatwork

Điều đó đã không vượt qua tâm trí của tôi. Phải có một mẹo nhỏ để kiểm tra xem đó có phải là một chữ cái hay không.
Ismael Miguel

1
Một điều bạn có thể làm là $l=str_split(fgets(STDIN)), làm giảm mã xuống 2 byte!
Ismael Miguel

1
Bây giờ tôi đang phát điên. Man, tôi đã gắn bó với sự khởi đầu đó bao lâu và bỏ lỡ nó. Cảm ơn bạn, @IsmaelMiguel.
manatwork 12/05/2015

3

C, 74 byte

a,b=1;main(){while((a=getchar())>0)b=isspace(putchar(b?toupper(a):a));}

Không giả định về bộ ký tự thời gian chạy (ASCII, EBCDIC, Baudot, ... bất cứ điều gì). Có giả định rằng EOF là âm (tôi nghĩ C đảm bảo rằng).

a,b=1;
main()
{
    while((a=getchar())>0)
        b=isspace(putchar(b?toupper(a):a));
}

a là ký tự đầu vào; b là đúng nếu ký tự cuối cùng là không gian. Bit không rõ ràng duy nhất là chúng tôi sử dụng thực tế putchartrả về ký tự được in nếu không có lỗi.


3

C # Linq - 187

Đây không phải là nơi gần với chiến thắng nhưng tôi chỉ yêu Linq quá nhiều.

namespace System{using Linq;class P{static void Main(string[]a){Console.Write(a[0].Substring(1).Aggregate(a[0][0].ToString().ToUpper(),(b,c)=>b[b.Length-1]==32?b+char.ToUpper(c):b+c));}}}


2

Bash, 61

a="${@//: / }"
a=(${a//: / })
a="${a[@]^}"
echo "${a//:/ }"

Lưu ý các dấu hai chấm chỉ đơn giản là làm cho chương trình hiển thị OK ở đây. Trong thực tế, đây có thể là một số ký tự không in được, chẳng hạn như BEL.

Đầu ra

$ ./cap1st.sh "eCommerce rocks. crazyCamelCase stuff. _those  pigeon-toed shennanigans. Fiery trailblazing 345 thirty-two Roger. The quick brown fox jumped over the lazy dogs. Clancy Brown would have been cool as Lex Luthor. good_bye"
ECommerce Rocks. CrazyCamelCase Stuff. _those  Pigeon-toed Shennanigans. Fiery Trailblazing 345 Thirty-two Roger. The Quick Brown Fox Jumped Over The Lazy Dogs. Clancy Brown Would Have Been Cool As Lex Luthor. Good_bye
$ 

Bash, 12

Đáng buồn thay, điều này không bảo tồn các không gian hàng đầu / đột biến / dấu, nhưng nếu không thì nó hoạt động:

echo "${@^}"

Đầu ra

$ ./cap1st.sh eCommerce rocks. crazyCamelCase stuff. _those  pigeon-toed shennanigans. Fiery trailblazing 345 thirty-two Roger. The quick brown fox jumped over the lazy dogs. Clancy Brown would have been cool as Lex Luthor. good_bye
ECommerce Rocks. CrazyCamelCase Stuff. _those Pigeon-toed Shennanigans. Fiery Trailblazing 345 Thirty-two Roger. The Quick Brown Fox Jumped Over The Lazy Dogs. Clancy Brown Would Have Been Cool As Lex Luthor. Good_bye
$ 

5
Nhưng đó là một nửa thách thức!
Sp3000

1
@ Sp3000 ở đó tôi đã sửa nó (với chi phí là 49 ký tự)
Chấn thương kỹ thuật số

2

Pip , 15 + 1 cho -s= 16

{IaUC:a@0a}Ma^s

Giải trình:

                  a is first cmdline arg (implicit)
            a^s   Split a on spaces
{         }M      Map this function to each element:
 Ia                 If the word is not empty,
   UC:a@0             uppercase its first character
         a          Return the word
                  Output the resulting list (implicit) joined on spaces (-s flag)

Một tính năng thú vị của Pip mà chương trình này rút ra là :toán tử meta gán. Hầu hết các ngôn ngữ giống như C đều có một số toán tử tính toán và gán: ví dụ: x*=5thực hiện điều tương tự như x=x*5. Trong Pip, tuy nhiên, bạn có thể đính :vào bất kỳ nhà điều hành và biến nó thành một nhà điều hành tính toán-and-assign. Điều này thậm chí đi cho các nhà khai thác đơn nguyên. Vì vậy, -:xtính toán -xvà gán nó trở lại x, giống như x:-xsẽ. Trong trường hợp này, UC:được sử dụng (cùng với các chuỗi có thể thay đổi của Pip) để viết hoa ký tự đầu tiên của một từ.

Chương trình lấy đầu vào từ dòng lệnh, yêu cầu một lệnh như thế này:

python3 pip.py -se "{IaUC:a@0a}Ma^s" "test teSt TEST  _test"

2

C, 125

Không phải là giải pháp ngắn nhất, nhưng tôi thực sự thích chơi gôn ở C.

char b[99];main(c){while(scanf("%[A-Za-z_-]",b)==1)islower(*b)&&(*b&=223),printf("%s",b);~(c=getchar())&&putchar(c)&&main();}

vô dụng:

char b[99];
main(c)
{
  while(scanf("%[A-Za-z_-]", b) == 1) {
    if(islower(b[0])) {
      b[0] &= 0xDF;
    }
    printf("%s", b);
  }
  if((c = getchar()) != -1) {
      putchar(c);
      main();
  }
}

Tôi không biết người sử dụng cú pháp giống như regex trong scanfviệc thực hiện các quy tắc, nhưng nó hoạt động khá độc đáo. (Chà, về mặt kỹ thuật nó không phải là một regex đầy đủ )

Một điều khác cần xem xét là mã này chỉ hoạt động cho các từ ngắn hơn 99 byte. Nhưng tôi nghĩ giải pháp này sẽ hiệu quả với hầu hết các trường hợp.


Gợi ý: & = 223 -> - = 32
edc65

2

Haskell: 127 ký tự

import Data.List
import Data.Char
i=isSpace
s a b=i a==i b
u (w:ws)=(toUpper w):ws
f w=concatMap u$groupBy s w
main=interact f

Tôi đã xuống tới 69 byte .
Lynn

2

PHP, 82

echo join(' ',array_map(function($s){return ucfirst($s);},explode(' ',$argv[1])));

Sử dụng :

$ php code.php "eCommerce rocks. crazyCamelCase stuff. _those  pigeon-toed shennanigans. Fiery trailblazing 345 thirty-two Roger. The quick brown fox jumped over the lazy dogs. Clancy Brown would have been cool as Lex Luthor. good_bye"

2

C #, 133 131

using C=System.Console;class P{static void Main(){var s=2>1;foreach(var c in C.ReadLine()){C.Write(s?char.ToUpper(c):c);s=c==32;}}}

Bạn có cần &&c!=32không Tôi không quá thành thạo C #, nhưng tôi đoán rằng việc chuyển đổi một khoảng trắng thành chữ hoa sẽ dẫn đến một khoảng trắng.
DLosc

Rất tiếc, cảm ơn - đó là từ trước khi tôi thực hiện một số thay đổi khác, tôi nghĩ vậy. Bạn đang sửa nó không cần thiết.
Blorgbeard

thử "sử dụng C = System.Console;" thay vì sử dụng hệ thống
Ewan

2

Toán học, 66 byte

Print@StringReplace[InputString[],WordBoundary~~a_:>ToUpperCase@a]

Tôi sẽ sử dụng ToCamelCase, nhưng nó không bảo tồn khoảng cách.


2

R, 139 105 byte

for(i in 1:length(p<-strsplit(readline(),"")[[1]])){if(i<2||p[i-1]==" ")p[i]=toupper(p[i])};cat(p,sep="")

Ungolfed + giải thích:

# Assign p to be a vector of the input read from stdin, split into characters

for(i in 1:length(p <- strsplit(readline(), "")[[1]])) {

    # If we're at the first iteration or the previous character was a space

    if (i < 2 || p[i-1] == " ") {

        # Convert the current character to its uppercase equivalent

        p[i] <- toupper(p[i])
    }
}

# Join the vector elements into a single string and print it to stdout
cat(p, sep = "")

R với regex, 49 41 + 30 = 71 byte

Tôi thực sự thất vọng; điều này thực sự có một số điểm tốt hơn bằng cách sử dụng các biểu thức thông thường với hình phạt.

gsub("(^.| +.)","\\U\\1",readline(),pe=T)

Điều này khớp với bất kỳ ký tự đơn nào ở đầu chuỗi hoặc theo bất kỳ số khoảng trắng nào và thay thế nó bằng một phiên bản chữ hoa của bản chụp. Lưu ý rằng việc áp dụng \\Ulà hợp pháp và không có hiệu lực đối với các chữ cái không. pe=Tđược hiểu là perl = TRUEvì nó tận dụng sự khớp một phần của các tham số hàm và từ đồng nghĩa với TRUE. Vì lý do nào, R không sử dụng biểu thức chính quy theo kiểu Perl theo mặc định.

Cảm ơn MickyT đã giúp lưu 8 byte theo cách tiếp cận regex!


Với regex của bạn, chuỗi phù hợp có thể (^.| +.). Uppercasing bất cứ điều gì là OK.
MickyT

@MickyT: Ý kiến ​​hay, cảm ơn! Chỉnh sửa để sử dụng đề xuất của bạn.
Alex A.
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.