ใช้ประโยชน์สตริง


18

กำหนดสตริงให้ใช้ประโยชน์ โดยมูลค่าผมหมายถึงการเปลี่ยนแปลงconTeNT-lENgth Content-Lengthในตัวอย่างฉันแสดงสตริงที่มี 2 คำด้วย-เป็นขอบเขตคำ อย่างไรก็ตามฉันคาดว่าคุณจะเขียนโค้ดสำหรับสตริงที่มีจำนวนคำใด ๆ ที่คั่นด้วยอักขระตัวเดียวเป็นขอบเขต ขอบเขตนี้อาจเปลี่ยนแปลงไปตามสายอักขระ

เงื่อนไข

  1. ใช้regular expressionsเป็นที่ไม่ได้รับอนุญาต
  2. อาจมีจำนวนคำใด ๆ ในประโยค (สตริง)
  3. แต่ละคำจะประกอบด้วยEnglishตัวอักษร[a-zA-Z]ของกรณีใด ๆ
  4. คำที่แตกต่างในประโยคจะถูกคั่นด้วยอักขระเดียว ตัวนี้จะเพียงเป็นหนึ่งในใด ๆ-, ., <space-character>, /, ,& #คุณสามารถสรุปได้อย่างปลอดภัยว่าประโยคนั้นจะไม่มีตัวละครอื่นยกเว้นตัวที่กล่าวถึง
  5. ขอบเขตของคำควรได้รับการเก็บรักษาไว้ในผลลัพธ์
  6. รหัสที่สั้นที่สุดชนะ

ตัวอย่างเช่นโปรแกรมของคุณควรเอาท์พุทสำหรับBegin/With.Type&ContentBeGin/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
สิ่งที่คุณเรียกว่าการใช้อักษรตัวพิมพ์ใหญ่คือการเปลี่ยนเป็นอูฐ
Pierre Arlaud

6
@ArlaudPierre ไม่สิ่งที่เขาได้รับในฐานะ "กรณีทดสอบ" เป็นเหมือนกรณีอูฐ สิ่งที่ถูกเรียกว่าการใช้อักษรตัวพิมพ์ใหญ่ใกล้กับชื่อเรื่องของคดี
Iszi

คุณช่วยเตรียมผลการทดสอบที่คาดไว้สำหรับเคสทดสอบได้หรือไม่? ดูเหมือนว่าบางฟังก์ชั่นในตัวอาจสันนิษฐานได้ว่าคำตัวพิมพ์ใหญ่ทั้งหมด (เช่น/CC/ในบรรทัดที่ 2 หรือ-AND&ในบรรทัดที่ 7) ควรถูกทิ้งไว้ตามลำพัง ไม่เป็นไรสำหรับความท้าทายนี้
Iszi

อินพุตเริ่มต้นด้วยคำเสมอหรืออาจเริ่มต้นด้วยตัวคั่นหรือไม่?
lebatsnok

คำตอบ:


7

GolfScript, 36 27 19 ตัวละคร

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

วิธี GolfScript ขั้นพื้นฐานที่ค่อนข้างใช้งานได้กับอินพุตทั้งหมดตามข้อกำหนด ตัวอย่างสามารถทดสอบออนไลน์ได้


เย็น. อยากรู้ว่าวิธีแก้ปัญหาของฉันอย่างน้อยสองเท่าในฐานะมืออาชีพหรือไม่ :) แต่ฉันมั่นใจว่าคุณจะสั้นลงหลายครั้งก่อนวันที่จะสิ้นสุด
จัดการ

@ การจัดการตอนนี้เรามีสอง ;-) ยังไม่พอใจกับการแลกเปลี่ยนทั้งหมด
Howard

ฉันรู้ว่าคุณจะไม่ทำให้ผิดหวัง
จัดการ

22

Python 3,22

print(input().title())

รหัสนี้จะรับสตริงเป็นอินพุตจาก stdin และให้เอาต์พุตเป็นตัวพิมพ์ใหญ่เป็น stdout

ตัวอย่างเช่น:

การป้อนข้อมูล:

BEGIN/wITH.tyPe&cOnTENt

ouput:

Begin/With.Type&Content

รหัสต่อไปนี้ใช้สำหรับอินพุตหลายบรรทัด (หากจำเป็น)

Python 3, 46

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

while 1:print(input.title())เทียบเท่ากับรหัสชิ้นสุดท้ายที่สั้นกว่า
Ramchandra Apte

1
@RamchandraApte ฉันไม่แน่ใจว่าอนุญาตหรือไม่ รหัสของคุณจะตายด้วยEOFErrorทันทีที่มันฮิตEOF
Wasi

1
ฉันคิดว่าฉันทามติทั่วไปสำหรับสนามกอล์ฟคือตราบใดที่ผลลัพธ์ถูกต้องข้อผิดพลาดไม่สำคัญ
ความผันผวน

แดง; ทันทีที่ฉันเห็นคำถามนี้ฉันคิดถึงสิ่งนี้ แต่คุณเอาชนะฉันได้ +1
Justin

+1 ฉันชอบสิ่งนี้ดีกว่า Golfscript หนึ่งเพราะมันดูไม่ลามก
Tim Seguine

6

Mathematica 62

ข้อมูล

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]&

การใช้

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

"ตัวแทนผู้ใช้ที่ยอมรับ / ความยาวประเภทช่วงประเภท"

f /@ tests

{"Agent Accept / Length-Type User Range.Type",
"Type & Agent / Cc / ความยาวเนื้อหา # ยอมรับ / AgentRange-Cc / เนื้อหา / รหัส", "Cc / Responce.Length # Type-With & User / Begin & User.Agent & Begin / ยอมรับ / Cc "," ความยาว # ผู้ใช้ประเภท / เริ่มต้นและความยาวประเภท / ยอมรับ # ช่วง / รหัส & และ - ยอมรับ / เนื้อหา "," เนื้อหา / ยอมรับ ",
" เริ่มต้น / With.Type & เนื้อหา ",
" Code.Cc # ผู้ใช้ - และประเภทประเภท & ความยาว ผู้ใช้ประเภทผู้ใช้& ด้วย ",
" ช่วงและเนื้อหาที่มีประเภทประเภทเนื้อหา ",
" เริ่มต้นรหัส # ผู้ใช้ # ตัวแทนผู้ใช้ ",
" ความยาวประเภท "}


-1 นั่นคือ regex โดยทั่วไป
CalculatorFeline

Mathematica สามารถรัน regex โดยตรง แต่ฉันใช้อย่างอื่น มันคล้ายกับ regex แต่ไม่ใช่ regex
DavidC

%% %%% % %%
CalculatorFeline


5

PHP: 78 73 65 64 ตัวอักษร

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

$sการป้อนข้อมูลจะถูกส่งใน มันทำงานบนสตริงเป็นอาร์เรย์ของตัวละคร

มันเป็นเครื่องจักร 2 สถานะที่เรียบง่าย มันขึ้นอยู่กับการเรียงลำดับของคำศัพท์และตัวแยกวิเคราะห์จะถือว่าคุณตั้งใจจะพิมพ์สตริงในบางกรณีโดยอัตโนมัติ

สถานะจะถูกเก็บไว้ใน$bและจะถูกแสดงเป็นชื่อของฟังก์ชั่นที่จะต้องมีการเรียกตัวละครตัวต่อไป ucfirstและlcfirstสั้นกว่าในการพิมพ์และมีพฤติกรรมเหมือนกันกับstrtolower/ strtoupperบนสตริงอักขระเดี่ยว นอกจากนี้เนื่องจากพวกเขาแตกต่างกันเพียงตัวอักษรเดียวเราจึงสามารถใช้พวกเขาได้อย่างมีประสิทธิภาพเพื่อเก็บสถานะ รุ่นเดิมจำเป็นต้องใช้ในการจัดเก็บสถานะอย่างชัดเจนในบูลีน

เนื่องจาก echo ไม่ได้พิมพ์อะไรสำหรับ boolean false ฉันจึงใช้คอมม่าและ!โอเปอเรเตอร์เพื่อ "ซ่อน" การมอบหมาย (ซึ่งในกรณีนี้คือความจริง) ในคำสั่ง echo {}นี้ได้รับอนุญาตให้ฉันไปบันทึกตัวอักษรโดยการเอา


โปรดใช้รหัสบล็อกมาร์กอัปแทนรหัสแบบอินไลน์ดังนั้นสคริปต์เช่นCode Golf UserScript Enhancement Packสามารถใส่ขนาดด้านล่างของรหัสได้ โดยวิธีการในรหัสของคุณทั้งสามช่องว่างสามารถลบตัวอักษร
จัดการ

แทนที่จะลอง$b=ord($c)>64; $b=$c>"@";หรือแม้กระทั่ง$b=$c>=A;- AFAIR ที่ส่งสัญญาณเตือน แต่การเขียนโค้ดที่ดีไม่ใช่คุณธรรมที่นี่
จัดการ

@ การจัดการขอบคุณไม่คิดอย่างนั้น ฉันขว้างคำเตือนสำหรับการใช้ตัวแปรที่ยังไม่ได้ตั้งค่าอยู่แล้ว
Tim Seguine

อืม…แล้วถ้าไม่ใช้ $ b เหมือนเป็นธง แต่เก็บชื่อฟังก์ชั่นจริงไว้ในนั้น $b=ucfirst;foreach(str_split($s)as$c){echo$b($c);$b[0]=$c>=A?l:u;}.
จัดการ

@ การจัดการที่ดี! ฉันพยายามคิดวิธีที่จะทำเช่นนั้นกับฟังก์ชั่น ความพยายามของฉันทั้งหมดใหญ่กว่า
Tim Seguine


4

PowerShell: 37 - 43

ขึ้นอยู่กับว่าคุณต้องการรับอินพุต ...

แจ้งผู้ใช้ให้ป้อนข้อมูล: 43

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

ใช้อินพุตจากไพพ์ไลน์: 38

(Culture).TextInfo.ToTitleCase($input)

ระบุอินพุตเป็นอาร์กิวเมนต์เมื่อเรียกใช้สคริปต์: 37

(Culture).TextInfo.ToTitleCase($args)

หมายเหตุ:สคริปต์ด้านบนจะไม่สนใจคำที่มีตัวพิมพ์ใหญ่ทั้งหมด หากจำเป็นต้องคำนึงถึงสิ่งนี้อินพุตจะถูกบังคับให้เป็นตัวพิมพ์เล็กก่อนการแปลงตัวพิมพ์ชื่อเรื่อง วิธีนี้จะเพิ่ม 10 อักขระในวิธีแรกและอีก 12 อักขระสำหรับอีกสองวิธี

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

ไม่ทำงานตามข้อกำหนด ลองfoo:barดู
Mormegil

@Memegil อันไหน? อย่างน้อยรุ่นโฮสต์สำหรับอ่านก็ใช้งานได้ดีสำหรับฉัน ฉันทดสอบกับทุกกรณีทดสอบในคำถามและพวกเขาทั้งหมดกลับมาตามที่คาดไว้ยกเว้นกรณีพิเศษที่ฉันโพสต์ในความคิดเห็นคำถาม
Iszi

:(ลำไส้ใหญ่) ไม่ได้ระบุว่าเป็นตัวคั่นคำในกฎ # 4 จึง AFAICS, foo:barจะส่งผลให้Foo:bar, ไม่ Foo:Barแต่นั่นเป็นเพียงการอ่านสเปคของฉัน (ค่อนข้างเข้มงวด)
Mormegil

2
@Memegil ดีนี้เรียบร้อย ดูเหมือนว่าข้อมูลจำเพาะได้รับการปรับแต่งเพื่อแก้ไขความกำกวมนั้นในขณะเดียวกันก็ไม่ทำให้คำตอบนี้ใช้ไม่ได้
Iszi

1
คุณสามารถแทนที่get-cultureด้วยculture; ดูcodegolf.stackexchange.com/a/778/1308
Danko Durbić

4

Java - 209 ตัวอักษร

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);}}}

ฉันเพิ่มบรรทัดใหม่เฉพาะเพื่อให้สามารถอ่านได้


3

R, 143 116

ทางออกอาจจะยาวไปหน่อย แต่เรามาที่นี่:

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="")}

ungolfed เล็กน้อยและอธิบาย:

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="")
    }

แก้ไข : 116 ตัวอักษร

ความท้าทายหลักที่นี่คือการ substrvectorize นี่เป็นอีกวิธีที่ละเอียดน้อยกว่า

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="")}

เยื้อง:

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
    }

การใช้งาน:

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

คุณสามารถบันทึกตัวละครบางตัว ตั้งแต่aconsits LETTERSของตัวอักษรตัวพิมพ์เล็กเท่านั้นไม่ต้องมีการตรวจสอบสำหรับการแข่งขันกับตัวพิมพ์ใหญ่
Sven Hohenstein

@SvenHohenstein แน่นอนขอบคุณ!
plannapus

อีกที่หนึ่ง: คุณสามารถแทนที่ด้วยTRUE T
Sven Hohenstein

แต่เดิมฉันมีในtolowerภายหลัง
plannapus

ตกลงนี่เป็นอีกหนึ่ง ;-) คุณสามารถแทนที่mapply(substr,tolower(x),n,n) ด้วยstrsplit(tolower(x),"")[[1]]เพื่อบันทึกอักขระหนึ่งตัว
Sven Hohenstein

3

Befunge 98 - 24 45

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

การเขียนสิ่งนี้ทำร้ายสมองของฉัน

สิ่งนี้จะรับอินพุต~และถ้าอักขระก่อนหน้าเป็นหนึ่งในตัวคั่น (หรือหากไม่มีอักขระก่อนหน้า) มันจะดำเนินการ

:'``!3*j' -;

ตัวอย่างนี้ใช้ตัวอักษรและหากค่า ascii มากกว่าหรือเท่ากับaมันจะลบ 32 จากมันจึงเปลี่ยนเป็นตัวพิมพ์ใหญ่ หากน้อยกว่าaให้3*jข้ามการปรับค่านั้น หลังจากนั้นก็ข้ามส่วนถัดไป ส่วนนี้จัดการการเปลี่ยนแปลงจากตัวพิมพ์ใหญ่เป็นตัวพิมพ์เล็ก (ฉันแน่ใจว่ามันสามารถรวมเข้ากับส่วนถัดไปได้ฉันไม่แน่ใจเหมือนกัน):

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

อักขระถูกพิมพ์ ( ,) จากนั้นจะตรวจสอบว่าอักขระนั้นเป็นหนึ่งในขอบเขต:

'/`!

มันเป็นพื้นเปรียบเทียบตัวละครกับค่า ASCII /ของ หากตัวละครไม่ได้เป็นขอบเขตรหัสจะกด12เพื่อที่จะข้ามการปรับตัวพิมพ์ใหญ่ในครั้งถัดไป #ข้ามโปรแกรมสิ้นสุด: @และหากถึงจุดสิ้นสุดของอินพุตให้~ส่งการเรียกใช้โค้ดกลับไปที่@สิ้นสุดโปรแกรม


3

Ruby: 60 51 50 47 ตัวอักษร

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

วิ่งตัวอย่าง:

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
ไม่l==l.swapcaseเหมือนกับl<?0(ไม่ผ่านการทดสอบ) หรือ อย่างน้อยสำหรับอินพุตที่ได้รับอนุญาตสำหรับงานนี้
Howard

ใช่. ตอนนี้นายทหารคนนั้นย้ำว่าไม่ต้องมีตัวคั่นอื่น ๆ ขอบคุณ @Howard
จัดการ

2

C # - 110

การประมวลผลบนพื้นฐานของเครื่องจักร จำกัด อันเรียบง่าย:

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

(ที่xเป็นstringที่จะใช้ประโยชน์)

และแน่นอนถ้าคุณต้องการเบื่อ (หลังจากอัพเดตสเปคแล้ว) คุณสามารถใช้

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

หรือทั้งหมดที่น่าเบื่อสำเร็จรูป:

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

ไม่ได้จะไม่คอมไพล์เพราะ C # ไม่ใช่ภาษาสคริปต์และคุณจำเป็นต้องสรุปในคลาส
Pierre Arlaud

2
พูดว่าใคร 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"แต่ถ้าคุณสนใจแผ่นที่น่าเบื่อจริงๆให้เพิ่มตัวละคร 112 ตัว
Mormegil

1
คุณสามารถตัดpublicและstring[]aจากส่วน
ควบ

ใช่แล้วคุณพูดถูก publicแต่ฉันต้องการข้อโต้แย้งเพราะนั่นคือสิ่งที่ฉันดำเนินการ…
Mormegil

2

Javascript 102

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

คุณไม่จำเป็นต้อง(... )รอบเงื่อนไขที่สาม ยิ่งกว่านั้นคุณไม่จำเป็นต้องใช้ไตรภาคที่สอง: function(c){o+=q?c.toLowerCase():c.toUpperCase(),q='@'<c}.
จัดการ

2

ออกมา, 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

เอาท์พุทที่แปลจะถูกเขียนลงในขณะที่มันอ่านจากstdoutstdin


1
"แล้วปล่อยอีกครั้ง" บทกวีไปด้วย!
แมว

2

Befunge-98 (29), C (65)

เนื่องจากวิธีการ / อัลกอริทึมเหมือนกันฉันจึงรวมทั้งสองเวอร์ชันไว้ในโพสต์เดียวกัน ทั้งคู่พึ่งพาการติดตามว่าตัวละครตัวสุดท้ายเป็นสัญลักษณ์หรือตัวอักษรเพื่อที่จะรู้ว่าตัวอักษรพิมพ์เล็กหรือไม่

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

Excel VBA-11 อักขระ

ในหน้าต่าง Immediate

?[Proper()]

VBscript

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

คุณให้ความช่วยเหลือในการใช้งานได้ไหม? ฉันได้รับ“ ข้อผิดพลาดในการคอมไพล์: ไม่ได้ระบุชื่อภายนอก” (ใน Word 2013 บนแท็บนักพัฒนาฉันคลิก Visual Basic จากนั้นใน Visual Basic สำหรับแอปพลิเคชันที่ฉันคัดลอกวางรหัสของคุณในหน้าต่างทันทีและกด Enter)
จัดการ

@ การจัดการฉันควรจะชี้แจงว่ามันเป็นใน Excel คุณสามารถทำได้จาก Word แต่เส้นทางยาวขึ้นตามที่คุณต้องการโดยอัตโนมัติ Excel
brettdj

1
เย็น. ทำงานได้อย่างสมบูรณ์แบบเมื่อ VBA เริ่มต้นจาก Excel 2013
ระหว่าง

ทำงานได้โดยตรงใน Excel เช่นกัน: =PROPER(A1)11 ไบต์เช่นกัน
Wernisch

1

AWK, 113 103 ไบต์

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

วิธีนี้ใช้งานได้ดีสำหรับเนื้อหาบรรทัดเดียว แต่สำหรับการป้อนข้อมูลแบบหลายบรรทัดต้องเพิ่ม inits สองครั้ง

{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}

มันจะดีถ้าเราสามารถใช้ประโยชน์จากการแยกบันทึกโดยอัตโนมัติลงในช่องและปรับเปลี่ยนเขตข้อมูลดังกล่าว แต่เราจะสูญเสียตัวแยกสนามของเรา :(

ฉันรู้ว่านี่ไม่ใช่คำตอบที่เล่นกอล์ฟที่สุดและนี่เป็นคำถามที่ค่อนข้างเก่า แต่ฉันรู้สึกว่า AWK มีบทบาทสำคัญในคำตอบของ CG :)

(ขอบคุณ @manatwork สำหรับการทดสอบโค้ดมันควรจะทำงานได้แล้วตอนนี้ :) เปลี่ยน flow แต่เก็บ byte-count ไว้เหมือนเดิมโดยแทนที่บางอัน;ด้วย newlines)


1
คุณแน่ใจไหม? ไม่มีของรหัสที่ดูเหมือนว่าจะผลิตออกที่จำเป็นต้องใช้ค่ากับgawk, หรือmawk original-awk(ผ่านการทดสอบบน Ubuntu)
จัดการ

มันถูกเขียนโดยใช้gawkบนกล่อง RHEL6 แต่คัดลอกไปยังกล่องหน้าต่าง อาจมีปัญหาการถอดความได้เป็นอย่างดี ฉันจะลองทดสอบหลังเลิกงานเมื่อฉันสามารถทำการทดสอบและโพสต์บนเครื่องเดียวกัน .... ฉันคิดว่าฉันเห็นปัญหาอยู่แล้ว l=0ควรเป็นL=0
Robert Benson

หวังว่ามันจะทำงานได้ในตอนนี้ @manatwork ขอบคุณสำหรับการทดสอบ :)
Robert Benson

1
ดูเหมือนว่าจะทำงานอย่างถูกต้อง ไม่ได้ตรวจสอบกรณีทดสอบทั้งหมด {for(l=split($0,a,$0="");i<=l;s=a[++i]){$0=$0(L?toupper(s):tolower(s));L=index("-. /&#",s)}}1แต่ดูเหมือนว่าจะเป็นไปได้ที่จะลดความมันบิต:
จัดการ

ฉันชอบที่คุณใช้การเปลี่ยนแปลง$0และ1ฉลากเพื่อหลีกเลี่ยงprintคำสั่งเป็นสิ่งที่ฉันไม่ได้คิดทำ ฉันจะต้องจำไว้สำหรับการเล่นกอล์ฟในอนาคต :)
โรเบิร์ตเบนสัน

1

PHP (> v5.4.32) - 25 ตัวอักษร

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

คำอธิบาย:

  • ucwords () เป็นฟังก์ชัน PHP ในตัว

  • พารามิเตอร์แรก$aคืออินพุต

  • พารามิเตอร์ที่สองคือ delimeters (พบ chatacters ที่ไม่ใช่ตัวอักษรในกรณีทดสอบ)

  • ผลตอบแทน / echo / พิมพ์จะถือว่าเนื่องจากการใช้ <?= ?>

ลิงค์:


1
สวัสดีและยินดีต้อนรับสู่เว็บไซต์! ฉันคิดว่าตอนนี้เป็นข้อมูลโค้ดที่ไม่ได้รับอนุญาตตามค่าเริ่มต้น แต่คุณสามารถรับ 41 ไบต์เป็นโปรแกรมแบบเต็มโดยใช้-R: ลองออนไลน์! หรือ 42 ใช้อาร์กิวเมนต์: ลองออนไลน์!
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

ลองรุ่น SELECT ใน SQL Server 2012 ที่นี่

แทนที่ "foo" ด้วยสตริงอินพุต จำนวนถ่านใช้สำหรับสตริงที่มีความยาวเป็นศูนย์ รหัสนี้จะสำรวจสตริงโดยใช้ดัชนีโดยใช้ตัวพิมพ์ใหญ่หรือพิมพ์เล็กอักขระที่ตำแหน่งนั้นตามอักขระก่อนหน้า


0

JavaScript (Node.js) , 70 ไบต์

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

ลองออนไลน์!

ฉันมั่นใจว่านี่จะสามารถเล่นกอล์ฟต่อไปได้

บันทึก :

ใช้อินพุตผ่านf(string)()ส่วนสุดท้ายจำเป็นต้องมี แต่ไม่ต้องดำเนินการใด ๆ


0

Powershell, 77 75 ไบต์

โซลูชันนี้เป็นไปตามกฎของงานอย่างสมบูรณ์ (แม้แต่ตัวอย่างที่ไม่ชัดเจนfoo:bar)

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

ดูเพิ่มเติมที่โซลูชัน Powershell พร้อมฟังก์ชัน builtTitTitleCaseจาก @Iszi

สคริปต์ทดสอบที่อธิบาย:

$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"
}

เอาท์พุท:

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 ไบต์

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

ไบต์ถูกนับในCP-437 ;เป็นไบต์เดียว (รหัสอักขระ 20)

วิธีการป้อนข้อมูลที่นี่ค่อนข้างแปลก: ตัวอักษรถูกพิมพ์ทีละตัวและตัวพิมพ์ใหญ่ของพวกเขาจะถูกแปลงก่อนที่จะแสดง ดังนั้นเมื่อคุณพิมพ์ในนั้นจะปรากฏบนหน้าจอaGeNT Agentการกดปุ่มEnterจบโปรแกรม


0

Python 3 , 122 ไบต์

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

ลองออนไลน์!

ไม่ใช่คะแนนที่ยอดเยี่ยม แต่ฉันต้องการที่จะลองโดยไม่ต้องใช้สายอักขระในตัวเพื่อเปลี่ยนกรณี


-2

PHP - 23 ตัวอักษร

mb_convert_case ($ w, 2);

มันต้องการ php_mbstring ในการทำงาน


1
ใน 5.3.26 ของฉันmb_convert_case("BeGin/wITH.tyPE&conTeNt", 2);คืนค่า“ เริ่มต้น / with.type & content” ไม่ใช่“ เริ่มต้น / With.Type & เนื้อหา”
จัดการ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.