Viết hoa chuỗi


18

Cho một chuỗi, viết hoa nó. Bằng cách viết hoa, tôi có nghĩa là conTeNT-lENgththay đổi Content-Length. Trong ví dụ tôi chỉ ra chuỗi có 2 từ với -ranh giới từ. Tuy nhiên tôi hy vọng bạn viết mã cho chuỗi chứa bất kỳ số từ được phân cách bởi một đơn nhân vật như ranh giới. Ranh giới này có thể thay đổi trên chuỗi.

Điều kiện

  1. sử dụng regular expressionsđược không được phép .
  2. có thể có bất kỳ số lượng từ trong một câu (chuỗi).
  3. mỗi từ sẽ bao gồm các Englishchữ cái [a-zA-Z]của bất kỳ trường hợp nào.
  4. các từ khác nhau trong câu sẽ được phân tách bằng một ký tự. Nhân vật này sẽ chỉ được bất kỳ một trong những -, ., <space-character>, /, &, #. Bạn có thể cho rằng câu đó sẽ không chứa bất kỳ ký tự nào khác ngoại trừ những câu được đề cập.
  5. ranh giới từ nên được bảo tồn trong đầu ra.
  6. mã ngắn nhất thắng.

Ví dụ chương trình của bạn nên đầu ra Begin/With.Type&Contentcho BeGin/wITH.tyPE&conTeNt.

Some test cases:
 "aGeNT ACcEpT/LEngTh-tYPe USeR raNgE.TyPe" 
 "type&AgeNt/CC/COnteNt lEnGth#acCePT/AgeNt.RAnGe-Cc/contEnt/cODe" 
 "cc/rEspoNCe.lEngtH#tYpE-witH&UsEr/bEgIN&uSer.AGEnT&begIn/aCCEPt/Cc" 
 "lENgTH#USeR.tYpE/BeGiN&LENGth tYpe/ACCEpt#rANge/codE&AnD-ACCepT/ConTenT" 
 "contENT/ACcEpT" 
 "BeGin/wITH.tyPE&conTeNt"
 "Code.cc#User.lenGTh-USer-AND&tyPE TypE&leNgtH.tYPe usER.UseR&with" 
 "RaNgE&COnTeNT WITh CoNTENT-TypE tyPe"
 "BEgin COdE#uSeR#aGeNt.USeR"
 "TypE LENGth"

2
Những gì bạn gọi là viết hoa thực sự là một sự chuyển đổi sang trường hợp lạc đà.
Pierre Arlaud

6
@ArlaudPierre Không, những gì anh ấy đưa ra là "trường hợp thử nghiệm" giống như trường hợp lạc đà. Cái được gọi là viết hoa gần với Trường hợp Tiêu đề.
Iszi

Bạn có thể vui lòng cung cấp đầu ra dự kiến ​​cho các trường hợp thử nghiệm? Có vẻ như một số chức năng tích hợp có thể cho rằng các từ toàn chữ hoa (như /CC/trong dòng 2 hoặc -AND&dòng 7) nên được để yên. Điều này có ổn không, cho thử thách này?
Iszi

Đầu vào luôn bắt đầu bằng một từ hay nó có thể bắt đầu bằng dấu phân cách?
lebatsnok

Câu trả lời:


7

GolfScript, 36 27 19 ký tự

0\{95&+.47>32*\}%\;

Một cách tiếp cận GolfScript khá cơ bản, hoạt động cho tất cả các đầu vào theo đặc điểm kỹ thuật. Các ví dụ có thể được kiểm tra trực tuyến .


Mát mẻ. Đã tò mò liệu giải pháp của tôi ít nhất là gấp đôi như một chuyên gia. :) Nhưng tôi chắc chắn bạn sẽ rút ngắn điều này vài lần trước khi ngày kết thúc.
manatwork 17/12/13

@manatwork Bây giờ chúng ta có một yếu tố hai ;-) Vẫn không hài lòng với tất cả các giao dịch hoán đổi.
Howard

Tôi biết bạn sẽ không làm tôi thất vọng.
manatwork

22

Con trăn 3,22

print(input().title())

Mã này sẽ lấy một chuỗi làm đầu vào từ stdin và cung cấp đầu ra viết hoa cho thiết bị xuất chuẩn.

ví dụ:

đầu vào:

BEGIN/wITH.tyPe&cOnTENt

thông báo:

Begin/With.Type&Content

Đoạn mã sau dành cho đầu vào nhiều dòng (nếu cần)

Trăn 3, 46

import sys
for i in sys.stdin:print(i.title())

while 1:print(input.title())là một tương đương ngắn hơn cho đoạn mã cuối cùng.
Ramowderra Apte

1
@RamframraApte Tôi không chắc là nó có được phép hay không. Mã của bạn sẽ chết với EOFError ngay khi mã đó chạm vào EOF
Wasi

1
Tôi nghĩ rằng sự đồng thuận chung cho các golf là miễn là đầu ra là chính xác, lỗi không thành vấn đề
Biến động

Đăng; Ngay khi tôi thấy câu hỏi này, tôi đã nghĩ về điều này, nhưng bạn đã đánh bại tôi. +1
Justin

+1 Tôi thích cái này hơn bản golf vì nó không giống như một thứ tục tĩu.
Tim Seguine

6

Toán học 62

Dữ liệu

tests={"aGeNT ACcEpT/LEngTh-tYPe USeR raNgE.TyPe","type&AgeNt/CC/COnteNt lEnGth#acCePT/AgeNt.RAnGe-Cc/contEnt/cODe","cc/rEspoNCe.lEngtH#tYpEwitH&UsEr/bEgIN&uSer.AGEnT&begIn/aCCEPt/Cc","lENgTH#USeR.tYpE/BeGiN&LENGth tYpe/ACCEpt#rANge/codE&AnD-ACCepT/ConTenT","contENT/ACcEpT","BeGin/wITH.tyPE&conTeNt","Code.cc#User.lenGTh-USer-AND&tyPE TypE&leNgtH.tYPe usER.UseR&with","RaNgE&COnTeNT WITh CoNTENT-TypE tyPe","BEgin COdE#uSeR#aGeNt.USeR","TypE LENGth"}

StringReplace[ToLowerCase@#,WordBoundary~~x_:>ToUpperCase@x]&

Sử dụng

f["aGeNT ACcEpT/LEngTh-tYPe USeR raNgE.TyPe"]

"Phạm vi người dùng chấp nhận / Loại độ dài. Loại"

f /@ tests

{"Chấp nhận đại lý / Phạm vi người dùng loại dài. Loại",
"Loại & đại lý / Cc / Độ dài nội dung # Chấp nhận / Đại lý.Range-Cc / Nội dung / Mã", "Cc / Responce.Lipse # Type-With & User / Begin & User.Agent & Begin / Chấp nhận / Cc "," Độ dài # Người dùng. Loại / Loại bắt đầu & Độ dài / Chấp nhận # Phạm vi / Mã & Và-Chấp nhận / Nội dung "," Nội dung / Chấp nhận ",
" Bắt đầu / Với.Type & Nội dung ",
" Code.Cc # Người dùng. -Và & Loại & Độ dài. Loại người dùng. Người dùng & Với ",
" Phạm vi & Nội dung với Loại loại nội dung ",
" Mã bắt đầu # Người dùng # Tác nhân. Người dùng ",
" Độ dài loại "}


-1 Về cơ bản là regex
CalculatorFeline

Mathematica có thể chạy regex trực tiếp nhưng tôi đã sử dụng một cái gì đó khác. Nó tương tự như regex, nhưng nó không phải là regex.
DavidC

%% %%% % %%
Máy

6

JavaScript (94)

prompt().split(l='').map(function(a){return l='A'>l?a.toUpperCase():a.toLowerCase()}).join('')

5

PHP: 78 73 65 64 ký tự

$b=ucfirst;foreach(str_split($s)as$c)echo$b($c),!$b[0]=$c<A?u:l;

Đầu vào được truyền vào $s . Nó hoạt động trên chuỗi như một mảng các ký tự.

Nó là một máy 2 trạng thái đơn giản. Nó phụ thuộc vào thứ tự từ vựng của các chuỗi và trình phân tích cú pháp tự động giả định rằng bạn muốn nhập một chuỗi trong một số trường hợp.

Trạng thái đang được lưu trữ trong $bvà đang được biểu diễn dưới dạng tên của hàm cần được gọi trên ký tự tiếp theo. ucfirstlcfirstngắn hơn để gõ và có hành vi giống hệt với strtolower/ strtouppertrên các chuỗi ký tự đơn. Ngoài ra, vì chúng chỉ khác nhau bởi một chữ cái, chúng ta có thể sử dụng chúng một cách hiệu quả để lưu trữ trạng thái. Phiên bản gốc cần thiết để lưu trữ trạng thái rõ ràng trong boolean.

Vì echo không in bất cứ điều gì cho boolean false, tôi đã sử dụng dấu phẩy và !toán tử để "ẩn" phép gán (trong trường hợp này là trung thực) trong câu lệnh echo. Điều này cho phép tôi lưu một nhân vật bằng cách loại bỏ {}.


Vui lòng sử dụng đánh dấu khối mã thay vì mã nội tuyến, vì vậy các tập lệnh như Gói cải tiến người dùng Code Golf có thể chèn kích thước bên dưới mã. Nhân tiện, trong mã của bạn, tất cả 3 ký tự khoảng trắng có thể được loại bỏ.
manatwork 29/12/13

Thay vì $b=ord($c)>64;cố gắng $b=$c>"@";. Hoặc thậm chí $b=$c>=A;- AFAIR đưa ra cảnh báo, nhưng thực hành mã hóa tốt không phải là một ưu điểm ở đây.
manatwork 29/12/13

@manatwork cảm ơn, đã không nghĩ về điều đó. Tôi đã đưa ra một cảnh báo cho việc sử dụng một biến unset nào.
Tim Seguine

Điều gì về việc không sử dụng $ b chỉ như một cờ, nhưng lưu trữ tên hàm thực sự trong đó? $b=ucfirst;foreach(str_split($s)as$c){echo$b($c);$b[0]=$c>=A?l:u;}.
manatwork 29/12/13

@manatwork tuyệt vời! Tôi đã cố gắng nghĩ cách để làm điều đó với chức năng. Những cố gắng của tôi đều lớn hơn.
Tim Seguine

4

C, 83

n;main(c){c=getchar();putchar(c>96?n?c:(n=c-32):c&64?n?c+32:(n=c):(n=0,c));main();}

Đưa các dòng trên stdin, dịch chúng sangstdout . (Thích SIGINTđể EOF.)


4

Quyền hạn: 37 - 43

Tùy thuộc vào cách bạn muốn lấy đầu vào ...

Nhắc người dùng nhập liệu: 43

(Culture).TextInfo.ToTitleCase((read-host))

Lấy đầu vào từ đường ống: 38

(Culture).TextInfo.ToTitleCase($input)

Cung cấp đầu vào dưới dạng đối số khi chạy tập lệnh: 37

(Culture).TextInfo.ToTitleCase($args)

LƯU Ý: Các tập lệnh trên sẽ bỏ qua tất cả các từ mũ, để nguyên như vậy. Nếu điều này cần được tính đến, đầu vào nên được buộc thành chữ thường trước khi chuyển đổi Trường hợp tiêu đề. Điều này thêm 10 ký tự cho phương thức đầu tiên và 12 ký tự cho hai phương thức còn lại.

(Culture).TextInfo.ToTitleCase((read-host).ToLower())
(Culture).TextInfo.ToTitleCase("$input".ToLower())
(Culture).TextInfo.ToTitleCase("$args".ToLower())

Không hoạt động theo đặc điểm kỹ thuật. Hãy thử foo:bar.
Mormegil 17/12/13

@Mormegil Cái nào? Phiên bản máy chủ đọc, ít nhất, hoạt động tốt với tôi. Tôi đã kiểm tra nó chống lại tất cả các trường hợp kiểm tra trong câu hỏi và tất cả chúng đều trả lại như mong đợi ngoại trừ các trường hợp đặc biệt tôi đã đăng trong nhận xét cho câu hỏi.
Iszi

:(dấu hai chấm) không được liệt kê dưới dạng phân tách từ trong quy tắc số 4, do đó, AFAICS, foo:barsẽ dẫn đến Foo:bar, không Foo:Bar . Nhưng đó chỉ là cách đọc (khá nghiêm ngặt) của tôi về đặc tả kỹ thuật.
Mormegil 17/12/13

2
@Mormegil Chà, cái này gọn gàng. Có vẻ như thông số kỹ thuật đã được điều chỉnh để giải quyết sự mơ hồ đó, đồng thời không làm mất hiệu lực câu trả lời này.
Iszi

1
Bạn có thể thay thế get-culturebằng culture; xem codegolf.stackexchange.com/a/778/1308
Danko Durbić 18/12/13

4

Java - 209 ký tự

class C{
public static void main(String[]a){
for(String b:a){
char[]k=b.toLowerCase().toCharArray();
for(int i=-1;i<k.length;i++){if(i<0||"-. /&#".indexOf(k[i])>=0)k[++i]=(char)(k[i]-32);}
System.out.println(k);}}}

Tôi đã thêm các dòng mới chỉ để đọc.


3

R, 143 116

Một giải pháp hơi dài có thể nhưng ở đây chúng tôi đi:

f=function(x){a=sapply(1:nchar(x),function(y)substr(tolower(x),y,y));d=c(1,which(!a%in%letters)+1);a[d]=toupper(a[d]);cat(a,sep="")}

Hơi vô duyên và giải thích:

f <- function(x){
    #Split the string in characters and "lower-case" everything
    a <- sapply(1:nchar(x),function(y)substr(tolower(x),y,y))
    #Select the first character and each character following a 
    #character that doesn't belong to lower case alphabet
    d <- c(1,which(!a%in%letters)+1)
    #Make those ones uppercase.
    a[d] <- toupper(a[d])
    #Output (stdout) while pasting them back together.
    cat(a,sep="")
    }

Biên tập : 116 ký tự

Thách thức chính ở đây là vector hóa substr. Đây là một cách ít dài dòng hơn.

f=function(x){n=1:nchar(x);a=mapply(substr,tolower(x),n,n);d=c(T,!a%in%letters);a[d]=toupper(a[d]);cat(a[n],sep="")}

Thụt lề:

f <- function(x){
    n <- 1:nchar(x)
    a <- mapply(substr,tolower(x),n,n)
    d <- c(T,!a%in%letters) #This has been simplified as well
    a[d] <- toupper(a[d])
    cat(a[n],sep="") #Because a is now 1 char longer than x, need to subset a
    }

Sử dụng:

> f("aGeNT ACcEpT/LEngTh-tYPe USeR raNgE.TyPe")
Agent Accept/Length-Type User Range.Type

Bạn có thể lưu một số ký tự. Vì achỉ có các ký tự chữ thường, nên không cần kiểm tra các kết quả khớp với chữ hoa LETTERS.
Sven Hohenstein

@SvenHohenstein thực sự, cảm ơn!
plannapus

Một số khác: Bạn có thể thay thế TRUEbằng T.
Sven Hohenstein

Ban đầu tôi đã có tolowersau này.
plannapus

OK, đây là một khác ;-) Bạn có thể thay thế mapply(substr,tolower(x),n,n) với strsplit(tolower(x),"")[[1]]để lưu một ký tự.
Sven Hohenstein

3

Befunge 98 - 24 45

~\j:'``!3*j' -;:'``b*j:'/`!3*j' +#;:,'/`!jc#@

Viết cái này làm tổn thương não tôi.

Điều này đưa đầu vào qua ~và nếu ký tự trước là một trong các dấu phân cách (hoặc nếu không có ký tự trước), thì nó thực thi

:'``!3*j' -;

Đoạn mã này lấy ký tự và nếu giá trị ascii của nó lớn hơn hoặc bằng a, nó sẽ trừ 32 từ nó, do đó thay đổi nó thành chữ hoa. Nếu nó nhỏ hơn a, 3*jbỏ qua điều chỉnh. Sau đó, nó bỏ qua phần tiếp theo. Phần này xử lý việc thay đổi từ chữ hoa sang chữ thường (tôi chắc chắn nó có thể được hợp nhất với phần tiếp theo; tôi chỉ không chắc làm thế nào):

:'``b*j:'/`!3*j' +#;

Ký tự được in ( ,), sau đó kiểm tra xem ký tự có phải là một trong các ranh giới không:

'/`!

Về cơ bản, nó so sánh ký tự với giá trị ascii của /. Nếu ký tự không phải là một ranh giới, mã sẽ đẩy 12để nó sẽ bỏ qua điều chỉnh viết hoa trong lần tiếp theo. #bỏ qua chương trình kết thúc: @và nếu kết thúc đầu vào đạt được, ~sẽ gửi mã thực thi trở lại @, kết thúc chương trình.


3

Ruby: 60 51 50 47 ký tự

$_.downcase.chars{|c|$><<$/=$/<?0?c.upcase: c}

Chạy mẫu:

bash-4.1$ for line in "${test[@]}"; do printf '%-75s | %s\n' "$line" "$( ruby -ne '$_.downcase.chars{|c|$><<$/=$/<?0?c.upcase: c}' <<< "$line" )"; done
aGeNT ACcEpT/LEngTh-tYPe USeR raNgE.TyPe                                    | Agent Accept/Length-Type User Range.Type
type&AgeNt/CC/COnteNt lEnGth#acCePT/AgeNt.RAnGe-Cc/contEnt/cODe             | Type&Agent/Cc/Content Length#Accept/Agent.Range-Cc/Content/Code
cc/rEspoNCe.lEngtH#tYpE-witH&UsEr/bEgIN&uSer.AGEnT&begIn/aCCEPt/Cc          | Cc/Responce.Length#Type-With&User/Begin&User.Agent&Begin/Accept/Cc
lENgTH#USeR.tYpE/BeGiN&LENGth tYpe/ACCEpt#rANge/codE&AnD-ACCepT/ConTenT     | Length#User.Type/Begin&Length Type/Accept#Range/Code&And-Accept/Content
contENT/ACcEpT                                                              | Content/Accept
BeGin/wITH.tyPE&conTeNt                                                     | Begin/With.Type&Content
Code.cc#User.lenGTh-USer-AND&tyPE TypE&leNgtH.tYPe usER.UseR&with           | Code.Cc#User.Length-User-And&Type Type&Length.Type User.User&With
RaNgE&COnTeNT WITh CoNTENT-TypE tyPe                                        | Range&Content With Content-Type Type
BEgin COdE#uSeR#aGeNt.USeR                                                  | Begin Code#User#Agent.User
TypE LENGth                                                                 | Type Length

1
Không l==l.swapcasegiống như l<?0(không được kiểm tra)? Ít nhất là cho đầu vào được phép cho nhiệm vụ này.
Howard

Đúng. Bây giờ người dơi nhấn mạnh rằng không có sự phân tách nào phải được mong đợi, thực sự đó là ngắn hơn. Cảm ơn bạn, @Howard.
manatwork 17/12/13

2

C # - 110

Một xử lý đơn giản dựa trên trạng thái máy hữu hạn:

x.Aggregate(new{b=1>0,r=""},(s,c)=>new{b="-. /&#".Contains(c),r=s.r+(s.b?Char.ToUpper(c):Char.ToLower(c))}).r

(Ở đâu xstring để tận dụng)

và tất nhiên, nếu bạn muốn nhàm chán (sau khi thông số kỹ thuật được cập nhật), bạn có thể sử dụng

new CultureInfo(9).TextInfo.ToTitleCase(x)

hoặc, với tất cả các mẫu soạn sẵn nhàm chán:

class C{static void Main(string[]a){System.Console.WriteLine(new System.Globalization.CultureInfo(9).TextInfo.ToTitleCase(a[0]));}}

Không, sẽ không biên dịch vì C # không phải là ngôn ngữ kịch bản và bạn cần gói gọn điều này trong một lớp.
Pierre Arlaud

2
Nói ai? Microsoft (R) Roslyn C# Compiler version 1.2.20906.1 Loading context from 'CSharpInteractive.rsp'. Type "#help" for more information. > "foobar".Aggregate(new{b=1>0,r=""},(s,c)=>new{b="-. /&#".Contains(c),r=s.r+(s.b?Char.ToUpper(c):Char.ToLower(c))}).r "Foobar"Nhưng nếu bạn thực sự quan tâm đến cái nồi hơi nhàm chán, hãy thêm 112 ký tự của nó.
Mormegil 17/12/13

1
Bạn có thể cắt publicstring[]atừ
nồi hơi

Ồ vâng, bạn đúng public, nhưng tôi cần những lý lẽ, vì đó là những gì tôi xử lý chuyện
Mormegil 18/12/13

2

Javascript 102

prompt().split(o=q='').map(function(c){o+=(q)?c.toLowerCase():c.toUpperCase(),q=('A'>c)?0:1})
alert(o)

Bạn cần không (... )xung quanh tình trạng ternary. Thậm chí nhiều hơn, bạn không cần ternary thứ hai : function(c){o+=q?c.toLowerCase():c.toUpperCase(),q='@'<c}.
manatwork 30/12/13

2

Viết tắt, 135

: s swap ;
: c 1 begin key dup 96 > if s if 32 - then 0 s 
else dup 64 > if s 0= if 32 + then 0 s then else 1 s then then emit again ; c

Đầu ra được dịch được ghi vào stdoutkhi nó đọc từ stdin.


1
"rồi lại phát ra" vần với!
mèo

2

Befunge-98 (29), C (65)

Vì phương thức / thuật toán khá giống nhau, tôi bao gồm cả hai phiên bản trong cùng một bài. Cả hai đều dựa vào việc theo dõi xem ký tự cuối cùng là ký hiệu hay chữ cái, để biết có nên viết thường một chữ cái hay không.

Befunge-98 (29)
#@~:'0` #v_,0>
',++@'% '<   ^
C (65)
c,d;main(){for(;~(c=getchar());d=c>48)putchar(c<48?c:c&95|32*d);}


1

VBA-11 ký tự

Trong cửa sổ ngay lập tức

?[Proper()]

Bản thảo

Set xlapp = CreateObject("excel.application")
wscript.echo xlapp.Evaluate("Proper(""BeGin/wITH.tyPE&conTeNt"")"

Bạn có thể cung cấp một số trợ giúp về việc sử dụng? Tôi nhận được lỗi Biên dịch: Tên bên ngoài không được xác định. (Trong Word 2013 trên tab Nhà phát triển, tôi đã nhấp vào Visual Basic, sau đó trong Visual Basic cho Ứng dụng, tôi đã sao chép mã của bạn trong cửa sổ Ngay lập tức và nhấn Enter.)
manatwork 29/12/13

@manatwork Tôi đã làm rõ nó trong Excel. Bạn có thể làm điều này từ Word nhưng đường dẫn dài hơn vì bạn cần tự động hóa Excel.
brettdj

1
Mát mẻ. Hoạt động hoàn hảo khi VBA được bắt đầu từ Excel 2013.
manatwork 29/12/13

Cũng hoạt động trực tiếp trong Excel : =PROPER(A1), cũng 11 byte
Wernisch

1

AWK, 113 103 byte

{for(;++i<=split($0,a,"");){s=a[i]
O=O (L?tolower(s):toupper(s))
L=1
if(index("-. /&#",s))L=0}print O}

Điều này hoạt động tốt đối với nội dung một dòng, nhưng đối với đầu vào nhiều dòng, cần thêm một vài điểm

{O=""
for(L=0;++i<=split($0,a,"");){s=a[i]
O=O (L?tolower(s):toupper(s))
L=1
if(index("-. /&#",s))L=0}print O}

Sẽ thật tuyệt nếu chúng ta có thể tận dụng việc tự động chia bản ghi thành các trường và sửa đổi các trường đã nói, nhưng sau đó chúng ta sẽ mất các dấu tách trường. :

Tôi biết đây không phải là câu trả lời hay nhất và đây là một câu hỏi khá cũ, nhưng tôi cảm thấy AWK không được thể hiện trong không gian trả lời của CG :)

(Cảm ơn @manatwork đã kiểm tra mã, nó sẽ hoạt động ngay bây giờ :) Cũng thay đổi luồng nhưng vẫn giữ nguyên số đếm byte, bằng cách thay thế một số ;bằng dòng mới.)


1
Bạn có chắc không? Không có mã nào có vẻ tạo ra đầu ra cần thiết cả gawk, mawkhoặc original-awk. (Đã thử nghiệm trên Ubuntu.)
manatwork 30/03/2016

Nó được viết bằng cách sử dụng gawktrên hộp RHEL6, nhưng sau đó được sao chép sang hộp cửa sổ. Rất có thể có một vấn đề sao chép. Tôi sẽ thử kiểm tra sau khi làm việc khi tôi có thể kiểm tra và đăng trên cùng một máy .... Tôi nghĩ dù sao tôi cũng thấy vấn đề. l=0nên làL=0
Robert Benson

Hy vọng nó hoạt động ngay bây giờ, @manatwork. Cảm ơn đã thử nghiệm. :)
Robert Benson

1
Bây giờ dường như hoạt động chính xác. Không kiểm tra tất cả các trường hợp thử nghiệm, nhưng dường như có thể giảm nó một chút : {for(l=split($0,a,$0="");i<=l;s=a[++i]){$0=$0(L?toupper(s):tolower(s));L=index("-. /&#",s)}}1.
manatwork 30/03/2016

Tôi thích việc bạn thay đổi $01nhãn để tránh printlệnh là những điều tôi chưa từng nghĩ đến. Tôi sẽ phải ghi nhớ điều đó cho việc chơi gôn trong tương lai :)
Robert Benson

1

PHP (> v5.4.32) - 25 ký tự

<?=ucwords($a,'-. /&#')?>

Giải trình:

  • ucwords () là một hàm PHP tích hợp

  • Tham số đầu tiên $alà đầu vào

  • Tham số thứ hai là dấu phân cách (ký tự không phải bảng chữ cái được tìm thấy trong trường hợp thử nghiệm)

  • Trả về / echo / print được giả định do sử dụng <?= ?>

Liên kết:


1
Xin chào và chào mừng đến với trang web! Tôi nghĩ tại thời điểm này đây là một đoạn mã không được phép theo mặc định, nhưng bạn có thể nhận được 41 byte dưới dạng một chương trình đầy đủ bằng cách sử dụng -R: Dùng thử trực tuyến! hoặc 42 bằng cách sử dụng đối số: Hãy thử trực tuyến!
Dom Hastings

0

T-SQL, 179

DECLARE @T VARCHAR(MAX)='foo',@X VARCHAR(2),@ INT=0WHILE @<LEN(@T)SELECT @X=SUBSTRING(@T,@,2),@+=1,@T=STUFF(@T,@,1,IIF(@X LIKE'[a-Z]_',LOWER(RIGHT(@X,1)),UPPER(RIGHT(@X,1))))PRINT @T

Hãy thử phiên bản CHỌN trong SQL Server 2012 tại đây .

Thay thế "foo" bằng chuỗi đầu vào. Số char là cho một chuỗi có độ dài bằng không. Mã này đi qua chuỗi bằng cách sử dụng một chỉ mục, ghi đè hoặc hạ thấp ký tự ở vị trí đó dựa trên ký tự trước đó.


0

JavaScript (Node.js) , 70 byte

c=>a=>c.split``.map(b=>a="A">a?b.toUpperCase():b.toLowerCase()).join``

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

Tôi chắc chắn rằng điều này có thể được chơi golf hơn nữa.

Ghi chú :

Đưa đầu vào qua f(string)(), cuối cùng là bắt buộc nhưng không thực hiện được gì.


0

Quyền hạn, 77 75 byte

Giải pháp này đáp ứng đầy đủ các quy tắc nhiệm vụ (thậm chí ví dụ mơ hồ foo:bar).

-join($args|% t*y|%{"$_"|%('ToU*r','ToL*r')[+$l];$l=!('# -./&'|% Co*s $_)})

Xem thêm giải pháp Powershell với chức năng dựng sẵn ToTitleCase từ @Iszi.

Kịch bản kiểm tra giải thích:

$f = {

-join(
$args|% t*y|%{                   # for each char from input string
    "$_"|%('ToU*r','ToL*r')[+$l] # evaluate ToUpper or ToLower method depend on $l (lower) value
                                 # Note the variable $l is not defined for a first char
                                 # so it evaluates toUpper for the first char 
    $l=!('# -./&'|% Co*s $_)     # golfed form for $l=!'# -./&'.Contains($_) expression
                                 # =0 if the current char is specified separator (toUpper for next char)
}                                # =1 otherwise (toLower for next char)
)                                # finally, join all chars to a result string

}

@(
    ,('foo:bar'                                                                 ,'Foo:bar')
    ,('aGeNT ACcEpT/LEngTh-tYPe USeR raNgE.TyPe'                                ,'Agent Accept/Length-Type User Range.Type')
    ,('type&AgeNt/CC/COnteNt lEnGth#acCePT/AgeNt.RAnGe-Cc/contEnt/cODe'         ,'Type&Agent/Cc/Content Length#Accept/Agent.Range-Cc/Content/Code')
    ,('cc/rEspoNCe.lEngtH#tYpE-witH&UsEr/bEgIN&uSer.AGEnT&begIn/aCCEPt/Cc'      ,'Cc/Responce.Length#Type-With&User/Begin&User.Agent&Begin/Accept/Cc')
    ,('lENgTH#USeR.tYpE/BeGiN&LENGth tYpe/ACCEpt#rANge/codE&AnD-ACCepT/ConTenT' ,'Length#User.Type/Begin&Length Type/Accept#Range/Code&And-Accept/Content')
    ,('contENT/ACcEpT'                                                          ,'Content/Accept')
    ,('BeGin/wITH.tyPE&conTeNt'                                                 ,'Begin/With.Type&Content')
    ,('Code.cc#User.lenGTh-USer-AND&tyPE TypE&leNgtH.tYPe usER.UseR&with'       ,'Code.Cc#User.Length-User-And&Type Type&Length.Type User.User&With')
    ,('RaNgE&COnTeNT WITh CoNTENT-TypE tyPe'                                    ,'Range&Content With Content-Type Type')
    ,('BEgin COdE#uSeR#aGeNt.USeR'                                              ,'Begin Code#User#Agent.User')
    ,('TypE LENGth'                                                             ,'Type Length')
) | % {
    $s,$e = $_
    $r = &$f $s
    "$($r-ceq$e): $r"
}

Đầu ra:

True: Foo:bar
True: Agent Accept/Length-Type User Range.Type
True: Type&Agent/Cc/Content Length#Accept/Agent.Range-Cc/Content/Code
True: Cc/Responce.Length#Type-With&User/Begin&User.Agent&Begin/Accept/Cc
True: Length#User.Type/Begin&Length Type/Accept#Range/Code&And-Accept/Content
True: Content/Accept
True: Begin/With.Type&Content
True: Code.Cc#User.Length-User-And&Type Type&Length.Type User.User&With
True: Range&Content With Content-Type Type
True: Begin Code#User#Agent.User
True: Type Length

0

QBasic, 74 byte

1c$=LCASE$(INPUT$(1))
IF f=0THEN c$=UCASE$(c$)
f=c$>"@
?c$;
IF""<c$GOTO 1

Byte được tính bằng CP-437 ;là một byte đơn (mã ký tự 20).

Phương thức nhập liệu ở đây hơi lạ: các ký tự được nhập cùng một lúc và viết hoa của chúng được chuyển đổi trước khi chúng được hiển thị. Vì vậy, khi bạn nhập aGeNT, nó xuất hiện trên màn hình như Agent. Đánh Enterkết thúc chương trình.


0

Python 3 , 122 byte

lambda s:''.join(chr(ord(c)+[[0,0],[0,32],[-32,0]][('@'<c<'[')-('`'<c<'{')]['@'<p<'['or'`'<p<'{'])for c,p in zip(s,'-'+s))

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

Không phải là một điểm số tuyệt vời, nhưng tôi muốn thử nó mà không cần các hoạt động chuỗi dựng sẵn để thay đổi trường hợp.


-2

PHP - 23 ký tự

mb_convert_case ($ w, 2);

Nó cần php_mb chuỗi để hoạt động


1
Vào ngày 5.3,26 của tôi, mb_convert_case("BeGin/wITH.tyPE&conTeNt", 2);trả về Bắt đầu / with.type & nội dung, chứ không phải Bắt đầu / With.Type & Nội dung.
manatwork
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.