ใช้อักษรตัวแรกของป้อนคำให้พิมพ์ใหญ่


34

อันนี้ค่อนข้างเร็ว แต่ฉันแน่ใจว่าคุณจะชอบ

Codegolf เป็นโปรแกรมที่จะป้อนข้อมูลในรูปแบบของประโยคและให้ผลลัพธ์ด้วยตัวอักษรตัวแรกในแต่ละคำ

กฎ:

  1. ข้อมูลที่ส่งอาจไม่อยู่ในรูปแบบของฟังก์ชัน ดังนั้นไม่:

    function x(y){z=some_kind_of_magic(y);return z;} เป็นคำตอบสุดท้ายของคุณ ... รหัสของคุณจะต้องแสดงว่ามันต้องใช้อินพุตและให้เอาต์พุต

  2. รหัสจะต้องรักษาอักษรตัวใหญ่อื่น ๆ ที่มีการป้อนข้อมูล ดังนั้น

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

    จะถูกแสดงผลเป็น

    ECommerce And EBusiness Are Cool, Don't You Agree, Richard III?
    
  3. บางคนอาจจะคิดว่า "ง่ายฉันจะใช้ regex!" และการใช้ regex ดั้งเดิมในภาษากอล์ฟที่คุณเลือกจะมีโทษ 30 ตัวซึ่งจะถูกนำไปใช้กับการนับรหัสสุดท้ายของคุณ ปีศาจหัวเราะ

  4. "คำ" ในกรณีนี้คือสิ่งที่คั่นด้วยช่องว่าง ดังนั้นจึงpalate cleanserมีสองคำในขณะที่pigeon-toedถือว่าเป็นหนึ่งคำ if_you_love_her_then_you_should_put_a_ring_on_itถือเป็นหนึ่งคำ ถ้าเป็นคำเริ่มต้นด้วยอักขระที่ไม่ใช่ตัวอักษรเป็นคำที่เก็บรักษาไว้ดังนั้นหลังจากการแสดงผลยังคงเป็น_this _this(ความรุ่งโรจน์ถึง Martin Buttner สำหรับชี้กรณีทดสอบนี้ออก)

    • 4b ไม่มีการรับประกันว่าคำในวลีอินพุตจะถูกคั่นด้วยช่องว่างเดียว
  5. กรณีทดสอบ (โปรดใช้เพื่อทดสอบรหัสของคุณ):

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

    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
    
  6. นี่คือรหัสกอล์ฟรหัสที่สั้นที่สุดชนะ ...

โชคดี...


1
สิ่งที่เกี่ยวกับช่องว่างในตอนท้ายของบรรทัด? เราต้องอนุรักษ์พวกเขาหรือไม่? เราสามารถเพิ่มได้ไหมถ้ามันตอบสนองความต้องการของเรา?
เดนนิส

2
เดนนิสโปรดเก็บช่องว่างจากอินพุต ...
WallyWest

3
! = TitleCase ปิดกั้นมัน! c # แพ้อีกครั้ง!
Ewan

1
@ Tim พื้นที่สองครั้งก่อนที่นกพิราบเท้าเป็นที่ถูกต้อง เขาพูดเพื่อรักษาระยะห่าง
mbomb007

2
แยกคำอะไร ช่องว่างใด ๆ (แท็บบรรทัดใหม่ ฯลฯ ) หรือแค่ช่องว่าง?
Steven Rumbalski

คำตอบ:


21

CJam, 15 13 ไบต์

Lq{_eu?_S-}/;

ลองใช้ออนไลน์ในล่าม CJam

pseudocode

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)

อักขระที่ดัดแปลงทั้งหมด C จะถูกทิ้งไว้บนสแต็กดังนั้นจะถูกพิมพ์เมื่อออก


3
ประณามสิ่งนี้ฉลาด D:
Martin Ender

ฉันต้องยอมรับว่าการเอาชนะใครบางคนโดย 4 ตัวอักษรในภาษา codegolf นั้นเป็นเรื่องที่ทำได้สำเร็จ ... ทำได้ดีมาก
WallyWest

12
@WallyWest: ภาษากอล์ฟสามารถสร้างความประทับใจได้ว่าพวกเขาเล่นกอล์ฟด้วยตัวเอง แต่ฉันรับรองว่าพวกเขาไม่ชอบ TMTOWTDI นั้นเป็นจริงสำหรับทุกภาษาและโดยเฉพาะอย่างยิ่งสำหรับผู้ที่มีบิวด์อินจำนวนมาก บางครั้งคุณชนะบางครั้งคุณจะสูญเสียและบางครั้งคุณรู้สึกว่าคุณได้รับการตีโดยรถบรรทุก
Dennis

13

CSS 2.1, 49

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

คำอธิบาย :

  • attrฟังก์ชั่นจะเข้าจากt(ข้อความ) แอตทริบิวต์ HTML
  • การป้อนข้อมูลที่เป็นตัวพิมพ์ใหญ่โดยการตั้งค่าไปtext-transformcapitalize
  • เอาท์พุทมีให้เป็นเนื้อหาที่สร้างโดยใช้contentสถานที่ให้บริการในองค์ประกอบหลอก::after

ตัวอย่างโค้ดที่รันได้ :

: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>

หมายเหตุ : CSS 2.1ระบุลักษณะการทำงานที่ต้องการ: capitalizeพิมพ์ตัวอักษรตัวแรกของแต่ละคำ อย่างไรก็ตามCSS3ตัวพิมพ์ใหญ่ครั้งแรกหน่วยจดหมายพิมพ์ของแต่ละคำ ดังนั้นข้อมูลโค้ดด้านบนจะไม่ทำงานอย่างถูกต้องทั้งใน IE เก่าซึ่งไม่ได้ติดตาม CSS 2.1; หรือบนเบราว์เซอร์ที่สอดคล้องกับใหม่ซึ่งติดตาม CSS3


โอ้นี่ฉลาด!
IQAndreas

1
(เลวร้ายเกินไปเกี่ยวกับ_thoseปัญหาในเบราว์เซอร์ CSS3 แต่ฉันยัง upvoting เนื่องจากวิธีการที่ไม่ซ้ำกันในการแก้ปัญหา)
IQAndreas

@Oriol "โอ้นี่ช่างฉลาดจริง ๆ !" แน่นอน! ขออภัย IQAndreas ฉันต้องขอยืมความคิดเห็นของคุณที่นี่ ... นี่เป็นวิธีที่ชาญฉลาดในการแก้ปัญหา ... ฉันจะต้องใช้ประโยชน์จากวิธีการนี้ ...
WallyWest

10

Javascript ( ES6 ), 77 ไบต์

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

แสดงความคิดเห็น

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
)

จะเกิดอะไรขึ้นหากคำว่าคั่นด้วยช่องว่างหลายช่อง? [4b]
Caek

3
@Caek x&&มันจัดการโดย สตริงว่างเปล่าเป็นเท็จดังนั้น&&วงจรสั้นและส่งกลับตัวถูกดำเนินการทางซ้ายคือสตริงว่าง ช่องว่างจะถูกเก็บรักษาไว้
nderscore

เยี่ยมมากขอบคุณสำหรับคำอธิบาย อาจช่วยให้ฉันคิดออกว่าฉันจะทำให้มันทำงานได้อย่างไร
Caek

สิ่งนี้จะใช้ประโยชน์จากตัวละครที่ไม่ใช่ Ascii ดังนั้นåจะกลายเป็นÅ!
สิงห์

9

Perl, 13 ไบต์

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

9 ไบต์บวก 4 ไบต์สำหรับ040p(สมมติว่าฉันตีความกฎการเรียกใช้พิเศษอย่างถูกต้อง)

-040ตั้งค่าตัวคั่นเรคคอร์ดอินพุต$/เป็นพื้นที่เดียวดังนั้นพื้นที่จะถูกสงวนไว้ \uลำดับหนีแปลงตัวอักษรถัดไปพิมพ์ชื่อเรื่อง


เยี่ยมมากพูดถึงเกียรติสำหรับการใช้บรรทัดคำสั่ง!
WallyWest

7

CJam, 17 15 ไบต์

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

ทดสอบที่นี่

การใช้งาน spec อย่างตรงไปตรงมา ใช้ประโยชน์จากสิ่งใหม่{}&เพื่อหลีกเลี่ยงข้อผิดพลาดสำหรับการเว้นวรรคติดต่อกัน

สองไบต์บันทึกโดยเดนนิส


สิ่งที่ยอดเยี่ยม! CJam ส่วนใหญ่เป็นเพียงภาษากอล์ฟหรือมีแอปพลิเคชันเชิงพาณิชย์ที่ใช้งานได้จริงหรือไม่?
WallyWest

6
@WallyWest ไม่ใช่แค่ภาษากอล์ฟ แน่นอนว่ามันไม่มีแอพพลิเคชั่นเชิงพาณิชย์แต่ฉันใช้มันเป็นครั้งคราวสำหรับสคริปต์แบบโยนทิ้งอย่างรวดเร็ว (เพราะมันมีบิวด์อินมากมายและถ้าคุณรู้ว่าคุณกำลังทำอะไรอยู่ อักขระเพิ่ม;))
Martin Ender

คุณสามารถบันทึกสองสามไบต์โดยการเพิ่มช่องว่างกับแต่ละคำ ขึ้นอยู่กับคำตอบของ OP สำหรับคำถามของฉันสิ่งนี้จะช่วยให้คุณได้ทั้ง 14 หรือ 12 ไบต์
เดนนิส

@Dennis Oh ใช่แล้วฉันกำลังเล่นกับมัน แต่ไม่ได้พิจารณาเพียงเพิ่มเข้าไปก่อนที่จะดึงตัวละครตัวแรกออกมา ฉันจะเปลี่ยนพรุ่งนี้ขอขอบคุณ!
Martin Ender

@Dennis ขอขอบคุณฉันเปลี่ยนมัน แต่ฉันไม่แน่ใจว่าคุณหมายถึงเวอร์ชัน 14 ไบต์อะไร หากคุณกำลังพูดถึงการเว้นที่สอง+นั่นจะเป็นการแบ่งถ้าอินพุตมีช่องว่างต่อท้าย
Martin Ender

7

C, 64 63 ไบต์

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

แก้ไข: คอมไพเลอร์บางส่วน (เช่นเสียงดังกราว) ไม่ชอบพารามิเตอร์ int แทน argv ดังนั้นฉันจึงย้ายมันไปเป็นตัวแปรทั่วโลก จำนวนไบต์ยังคงเหมือนเดิม ขอบคุณที่คลื่นไส้ ossifrage สำหรับการสังเกต ลงไปที่ 63 ไบต์ขอบคุณเดนนิส

Ungolfed:

int a;

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

ค่อนข้างตรงไปตรงมา: ถ้า a เป็นเท็จตัวละครจะถูกแปลงเป็นตัวพิมพ์ใหญ่ มันถูกตั้งค่าหลังจากอ่านช่องว่าง: c - '' เป็นเท็จเฉพาะเมื่อ c == '' toupper () ไม่สนใจทุกสิ่งที่ไม่ใช่ตัวอักษรตัวเล็กดังนั้นสัญลักษณ์และช่องว่างหลายช่องจึงใช้ได้ -1 มีการตั้งค่าบิตทั้งหมดดังนั้นเมื่อ getchar () ส่งกลับ -1 ผู้ประกอบการ NOT ทำให้มันเป็นศูนย์และวงหยุด a ถูกประกาศเป็นตัวแปรโกลบอลดังนั้นจึงเป็น initializd เป็นศูนย์ (false) สิ่งนี้ทำให้มั่นใจได้ว่าคำแรกเป็นตัวพิมพ์ใหญ่


1
while(~(c=getchar())- ฉันชอบมัน. เสียงดังกังวานจะไม่รวบรวมสิ่งนี้จริง ๆ แต่คุณสามารถนับจำนวนตัวละครเดียวกันได้c;main(a){...}
squeamish ossifrage

1
หากคุณสลับการประกาศaและcและคำสั่งของผู้ประกอบการที่ประกอบไปด้วยคุณสามารถแทนที่==ด้วย-เพื่อบันทึกหนึ่งไบต์
เดนนิส

คุณพูดถูก
Andrea Biondo

ดี! +1 โปรแกรมจะทำงานเหมือนกันเมื่อใช้while(!(c = getchar()))ใช่ไหม
Spikatrix

1
@Cool Guy: ไม่, bitwise ~และ logical !นั้นไม่เหมือนกัน ใน C สิ่งใดที่ไม่เป็นศูนย์ถือว่าเป็นจริงดังนั้นสภาพของคุณจะเป็นเช่นwhile((c = getchar()) == 0)ใดซึ่งแน่นอนว่าจะไม่ทำงาน ตัวดำเนินการระดับบิตไม่ใช่~ค่าที่ลบค่าบิต ในการแบ่งลูป~cต้องเป็นศูนย์: นั่นหมายความว่าบิตทั้งหมดต้องเป็นหนึ่งดังนั้นเมื่อถูกทำให้เป็นโมฆะมันจะกลายเป็นศูนย์ทั้งหมด ค่านั้น (สำหรับ 32bit int) คือ0xFFFFFFFFซึ่งหากลงนามคือ-1(EOF)
Andrea Biondo

7

Python 3, 59 56 ไบต์

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

ขอบคุณ @Reticality เป็นเวลา 3 ไบต์


3
แล้วไงprint(end=f*c.upper()or c)ล่ะ ที่จะประหยัด 4 ไบต์

@Reatity โอ้ว้าวฉันไม่รู้ว่าคุณสามารถพิมพ์เปล่าได้โดยใช้แค่ ARG ขอบคุณ!
Sp3000

7

Perl เวอร์ชัน <5.18, 30 27 26 25

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

24ตัวอักษรสำหรับ+1-n

\uทำให้ตัวอักษรถัดไปในสตริงตัวพิมพ์ใหญ่ @ThisSuitIsBlackNot ไม่ได้ชี้ให้เห็นว่าประหยัดได้ 1 ไบต์ ucfirstก่อนที่เราจะได้ใช้ฟังก์ชั่น

จากperldocs ,

ในกรณีพิเศษอีกอันแบ่งการจำลองพฤติกรรมเริ่มต้นของเครื่องมือบรรทัดคำสั่ง awk เมื่อรูปแบบถูกละเว้นหรือสตริงตัวอักษรประกอบด้วยอักขระช่องว่างเดียว (เช่น '' หรือ "\ x20" แต่ไม่ใช่เช่น / /) ในกรณีนี้ช่องว่างนำหน้าใน EXPR ใด ๆ จะถูกลบออกก่อนที่จะเกิดการแยกและรูปแบบจะได้รับการปฏิบัติเสมือนว่ามันเป็น / \ s + /; โดยเฉพาะนี่หมายความว่าช่องว่างที่ต่อเนื่องกัน (ไม่ใช่แค่อักขระช่องว่างเดียว) ถูกใช้เป็นตัวคั่น อย่างไรก็ตามการดูแลรักษาแบบพิเศษนี้สามารถหลีกเลี่ยงได้โดยการระบุรูปแบบ / / แทนสตริง "" ดังนั้นการอนุญาตให้ใช้อักขระช่องว่างเดียวเป็นตัวคั่นได้ ในกรณีก่อนหน้า Perls กรณีพิเศษนี้ถูก จำกัด ให้ใช้ธรรมดา "" เป็นอาร์กิวเมนต์รูปแบบที่จะแยกใน Perl 5.18

เนื่องจาก$"ประเมินเป็นพื้นที่นี่จะรักษาพื้นที่ เนื่องจากเราต้องการตั้งค่า$,ให้เป็นอักขระเว้นวรรคและป้อนอักขระเว้นวรรคลงในการแยก @nutki จึงชี้ให้เห็นว่าเราสามารถทำทั้งสองอย่างเป็นอินพุตเพื่อแยก นั่นช่วยประหยัด 3 ไบต์จากสิ่งที่เรามีมาก่อนซึ่งเป็นการตั้งค่าครั้งแรก$,และจากนั้นป้อนข้อมูล$"เพื่อแยก

การใช้,สำหรับแผนที่แทนที่จะ{}บันทึกไบต์เพิ่มเติมตามที่ @ alexander-brett ชี้ให้เห็น

ทำงานด้วย:

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
บันทึก 1 ไบต์ด้วย...map"\u$_",split...
alexander-brett

@ alexander-brett ขอบคุณ! ฉันอัพเดตคำตอบแล้ว
hmatt1

5

> <> (ปลา) , 39 ไบต์

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

วิธี:

  • ใช้ถ่านตัวหนึ่งและพิมพ์ใหญ่ถ้าอยู่ในช่วงให้a-zพิมพ์ออกมา (รหัสจากซ้ายไปขวาสำหรับส่วนนี้คือi::'backquote')$'{'(*' '*+)
  • ถ้าถ่านนำเสนอนี้เป็นถ่าน EOF แล้วออกอื่นพิมพ์
  • ถ้าถ่านนำสุดท้ายคือถ่านพื้นที่แล้วไป 1 จุดอื่นใช้ตัวอักษรใหม่และไปที่จุดที่ 2

5

JAVA ขนาด 273 ไบต์

แก้ไข

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

นี่เป็นคำตอบแรกของฉันใน PCG ไม่แน่ใจว่านี่เป็นที่ยอมรับหรือไม่
Atul Kumbhar

ยินดีต้อนรับบนเรือ! คุณอาจลองลบช่องว่างออกและใช้อักขระเดี่ยวสำหรับชื่อตัวแปร มีเคล็ดลับอื่น ๆสำหรับการเล่น JAVAเช่นกัน
nderscore

ขอบคุณ @ ขีดล่างสำหรับคำใบ้ฉันได้แก้ไขคำตอบของฉันโดยใช้เคล็ดลับ
Atul Kumbhar

ดูดีขึ้น! ฉันยังเพิ่มจำนวนไบต์ในโพสต์ของคุณ
nderscore

1
@TuukkaX เขาไม่ได้publicอยู่ข้างหน้าclass.. และถ้าคุณหมายความว่าเขาสามารถลบสิ่งที่publicอยู่ข้างหน้าออกได้static void main(...คุณก็ผิดถ้าเขาเปลี่ยนclassไปเป็นinterfaceและใช้ Java 8+
Kevin Cruijssen

5

JavaScript (โซลูชัน regex) - 104 ไบต์

บางคนต้องกัดกระสุนและโพสต์โซลูชัน RegEx! 74 ตัวอักษรรวมทั้งบทลงโทษ +30 ตัว:

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

หรือถ้าคุณต้องการอ่านและทำความเข้าใจกับรหัสในรูปแบบที่ไม่ได้บีบอัด:

//     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
ฉลาด ... แต่แน่นอนว่าคุณได้จ่ายราคาด้วยการลงโทษ 30 ตัวอักษร ... ฉันถอดหมวกของคุณเพื่อกัดกระสุน ...
WallyWest

4

Python 2, 73 ไบต์

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

โปรแกรมนี้ใช้อักษรตัวพิมพ์ใหญ่หากนำหน้าด้วยช่องว่าง (โดยมี kludge สำหรับอักขระตัวแรกในสตริง) มันขึ้นอยู่กับ.upper()วิธีสตริงที่จะลงทุนอย่างถูกต้อง


2
คุณสามารถบันทึก 2 ไบต์ด้วยการย้ายไปยัง Python 3 (-4 raw_input=> input, +2 print=> print())
Steven Rumbalski

ขอบคุณสตีเวน ฉันได้พิจารณาการประหยัดเป็นไบต์ด้วยการเข้ารหัสใน Python 3 ฉันคิดว่าถ้าฉันเปลี่ยนภาษาเพื่อให้สามารถแข่งขันได้ฉันจะเปลี่ยนเป็น Pyth ฉันมีความสุขที่ได้ลงแข่งขันใน Python 2 sub-league ฉันเขียนรหัสใน Python 2 ทุกวันเพื่อการทำงานดังนั้นประสบการณ์นี้ทำให้ฉันดีขึ้นในงานของฉัน (แต่รหัสงานของฉันไม่ได้เล่นกอล์ฟ!)
Logic Knight

4

PHP 64 76 77 83 84 89ไบต์

ไม่$_GETนับเป็น input ใน PHP?
ถ้าใช่นี่คือความพยายาม CG ครั้งแรกของฉัน

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

ขอบคุณ manatwork :)

เราสามารถใช้ucwordsฟังก์ชั่นนี้ซึ่งจะส่งผลให้ 21 ไบต์:

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

ขอบคุณ Harry Mustoe-Playfair :)


ส่วนตัวฉันพิจารณาเฉพาะfgets(STDIN)การอ่านอินพุต แต่เราไม่มีความเห็นพ้องต้องกัน$_GETเท่าที่ฉันรู้
ผลิต

ใช่แล้วนั่นใช้ได้: D
Octfx

คุณไม่จำเป็นต้องมีลูกเล่นเพื่อปิดคำเตือน พวกเขากำลังเตือน! ไม่มีใครสนใจพวกเขา
Ismael Miguel

ไม่คิดอย่างนั้น เดาว่าฉันจะต้องติดกับ
สารตั้งต้น

ไม่จำเป็นสำหรับสิ่งนั้น $k=>มันเป็นช่วงเวลาเพียงแค่จะลืมคำแนะนำก่อนหน้านี้ของฉันในการลบ นำกลับมาใช้:foreach(split(' ',$_GET[@s])as$k=>$v)echo$k?' ':'',ucfirst($v);
ผลิต

4

Haskell, 69

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

คำอธิบาย:

scanlรับฟังก์ชั่น(a -> b -> a)และค่าเริ่มต้นaจากนั้นวนซ้ำรายการ[b]s เพื่อสร้างรายการ[a]s:

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

มันใช้ผลก่อนหน้านี้ซ้ำแล้วซ้ำอีกเป็นอาร์กิวเมนต์ซ้ายของฟังก์ชันที่ส่งไปยังฟังก์ชันและค่าจากรายการอินพุตเป็นอาร์กิวเมนต์ที่ถูกต้องเพื่อสร้างอาร์กิวเมนต์ถัดไป

ฉันเขียนฟังก์ชัน(!) :: Char -> Char -> Charที่ส่งคืนอักขระที่ถูกต้องที่คุณผ่านมันไป แต่จะใช้ตัวพิมพ์ใหญ่ถ้าตัวอักษรด้านซ้ายเป็น' '(ช่องว่าง) สำหรับscanlนี่หมายถึง: ส่งคืนค่าจากรายการอินพุตแต่ใช้ประโยชน์ถ้าผลลัพธ์ก่อนหน้าคือช่องว่าง ดังนั้นscanl (!) ' ' "ab cd"กลายเป็น:

    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"

เราต้องการค่าเริ่มต้น' 'เพื่อใช้อักษรตัวแรกให้เป็นตัวพิมพ์ใหญ่ แต่จากนั้นเราก็ตัดมันออกtailเพื่อให้ได้ผลลัพธ์สุดท้าย


ดี! คุณช่วยอธิบายให้ฉันฟังได้ไหม
poida

ฉันเขียนคำอธิบาย
ลินน์

บางมากขึ้นscanlตัวอย่าง: หนึ่ง , สอง
Lynn

@Mauris รุ่งโรจน์สำหรับการใช้อัลกอริธึมที่ยอดเยี่ยมเช่นนี้ ... :)
WallyWest

3

Pyth, 20 ไบต์

uXGHr@GH1fqd@+dzTUzz

ช่องว่างหลายอันนี้แย่จริงๆ มิฉะนั้นจะมีวิธีแก้ปัญหา 12 ไบต์ที่ง่ายมาก

ลองใช้งานออนไลน์: Pyth Compiler / Executor

คำอธิบาย

                      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

แก้ไข: 16 chars เป็นไปได้ด้วย @Dennis algorithm


1
สิ่งที่มีหลายช่องว่างคือการทำให้มันมีความท้าทายมากขึ้น ... ไม่อย่างนั้นมันจะเป็นเรื่องง่าย ๆ ของ string.split ("") หรือสิ่งที่คล้ายกัน ... แต่คุณทำได้ดีในการทำ 20 ตัวอักษร
WallyWest

3

CJam, 14 ไบต์

มันไม่สั้น แต่ ...

qS/Sf.{\eu}s1>

อีกคำตอบที่ใช้แนวคิดที่คล้ายกัน:

qS/Laf.{;eu}S*

.x เปลี่ยนเฉพาะรายการแรกหากหนึ่งในพารามิเตอร์มีเพียงหนึ่งรายการเท่านั้น


1
ผูกมัดfและ.แยบยลสวย อีก 14 ไบต์ตัวแปร:qS/Sf.{\eu}S.-
เดนนิส

3

Lua, 64 62 61 ไบต์

Lua เป็นภาษาที่น่ากลัวสำหรับเล่นกอล์ฟดังนั้นฉันค่อนข้างภูมิใจในตัวเองสำหรับอันนี้

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

[ลองที่นี่] 1ล้าสมัยจะอัปเดตพรุ่งนี้


1
ยินดีต้อนรับสู่ PPCG! แน่นอนคุณไม่ต้องการช่องว่างเหล่านั้นหลังจากจุลภาค?
Martin Ender

ว้าวฉันยังใหม่กับเรื่องนี้ฉันไม่รู้ด้วยซ้ำว่ามีการเว้นวรรค 62 ไบต์!

2
ฉันยังเพิ่งสังเกตเห็นว่ามันไม่ถูกต้องทั้งหมด: คุณกำลังพะวงตัวอักษรหลังจากที่ทุกตัวอักษรที่ไม่ใช่เพื่อจะให้abc_def Abc_Defอย่างไรก็ตามควรใช้ตัวอักษรหลังช่องว่างเป็นตัวพิมพ์ใหญ่เท่านั้น ข่าวดีก็คือการแก้ไขจะช่วยประหยัดไบต์ ;)
Martin Ender

3

JAVA, 204 211 226 ไบต์

รายการแรกของฉันเกี่ยวกับ CG ฉันหวังว่ามันจะดี:

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

บันทึกแล้ว 7 ไบต์ด้วย @TNT


เกี่ยวข้องกับทักษะ Java ที่แย่ของฉัน: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);}}
จัดการ

1
ยินดีต้อนรับสู่ PPCG! publicปรับปรุงไม่จำเป็นเพื่อให้คุณสามารถบันทึกอีก 7
TNT

3

PHP: 76 74 ตัวอักษร

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

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

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

แทนการใช้ucfirst($c) $c^' '(เคล็ดลับ: หากคุณbitwise-xorใช้ตัวอักษรที่มีช่องว่างมันจะถูกแปลงจากตัวพิมพ์ใหญ่เป็นตัวพิมพ์เล็กและ oposite จะใช้เช่นกัน)
Ismael Miguel

@IsmaelMiguel ที่ทำงานได้ดีในโซลูชันของคุณเมื่อคุณประมวลผลตัวอักษรพิมพ์เล็กเท่านั้น แต่ในโซลูชันของฉันมีการประมวลผลอักขระตัวแรกทั้งหมด ดังนั้นสำหรับแฮคเกอร์ (ที่ยอดเยี่ยมมาก) รหัสของฉันก็จะต้องมีการกรองประเภทตัวอักษร :(
จัดการ

ที่ไม่ได้ใจของฉัน จะต้องมีเคล็ดลับในระดับบิตเพื่อตรวจสอบว่ามันเป็นตัวอักษรหรือไม่
Ismael Miguel

1
สิ่งหนึ่งที่คุณสามารถทำได้คือ$l=str_split(fgets(STDIN))ลดขนาดโค้ดลง 2 ไบต์!
Ismael Miguel

1
ตอนนี้ฉันกำลังจะโกรธ มนุษย์นานแค่ไหนที่ฉันติดดาวเพื่อเริ่มต้นและพลาดมัน ขอบคุณ @IsmaelMiguel
ผลิต

3

C, 74 ไบต์

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

ไม่มีข้อสมมติฐานเกี่ยวกับชุดอักขระขณะใช้งาน (ASCII, EBCDIC, Baudot, ... อะไรก็ตาม) สมมติว่า EOF เป็นลบ (ฉันคิดว่า C รับประกันได้)

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

a คืออักขระอินพุต; b เป็นจริงถ้าอักขระตัวสุดท้ายเป็นช่องว่าง บิตที่ไม่ชัดเจนเท่านั้นคือเราใช้ข้อเท็จจริงที่putcharส่งคืนอักขระที่พิมพ์หากไม่มีข้อผิดพลาด


3

C # Linq - 187

ที่นี่ไม่มีที่ไหนใกล้จะชนะ แต่ฉันรัก Linq มากเกินไป

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

3

เป็นกลุ่ม, 11 , 10 ไบต์

qqvUW@qq@q

คำอธิบาย:

qq           #Start recording in register 'q'
  vU        #Make the character under the cursor uppercase
     W       #Move forward a WORD
      @q     #recursively call macro 'q'
        q    #stop recording
         @q  #Call the recursive macro

ฉันจะได้รับเหรียญทองสำหรับเดนนิส outgolfing หรือไม่?



2

Bash, 61

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

โปรดสังเกตว่าเครื่องหมายโคลอนเป็นเพียงการทำให้โปรแกรมแสดงผลได้ที่นี่ ในความเป็นจริงสิ่งเหล่านี้อาจเป็นอักขระที่ไม่สามารถพิมพ์ได้เช่น BEL

เอาท์พุต

$ ./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

น่าเศร้าที่สิ่งนี้ไม่ได้รักษาช่องว่างนำหน้า / mutliple / ท้าย แต่อย่างอื่นทำงาน:

echo "${@^}"

เอาท์พุต

$ ./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
แต่นั่นเป็นความท้าทายครึ่งหนึ่ง!
Sp3000

1
@ Sp3000 ฉันแก้ไขมัน (ที่ราคา 49 ตัวอักษร)
Digital Trauma

2

Pip , 15 + 1 สำหรับ-s= 16

{IaUC:a@0a}Ma^s

คำอธิบาย:

                  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)

ฟีเจอร์หนึ่งที่น่าสนใจของ Pip ที่โปรแกรมนี้ใช้คือ:meta-operator ที่ได้รับมอบหมาย ส่วนใหญ่ C-เช่นภาษามีชุดของผู้ประกอบการคำนวณและกำหนดบางอย่างเช่นจะเป็นสิ่งเดียวกับx*=5 x=x*5ใน Pip แต่คุณสามารถตรึง:บนใด ๆผู้ประกอบการและทำให้มันกลายเป็นผู้ประกอบการคำนวณและกำหนด สิ่งนี้จะไปสำหรับผู้ประกอบการเอก ดังนั้น-:xคำนวณ-xและกำหนดกลับไปxเช่นเดียวกับx:-xจะ ในกรณีUC:นี้ใช้ (ร่วมกับสตริงที่ไม่แน่นอนของ Pip) เพื่อพิมพ์อักขระตัวแรกของคำ

โปรแกรมรับอินพุตจากบรรทัดคำสั่งต้องการการเรียกใช้ดังนี้:

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

2

C, 125

ไม่ใช่ทางออกที่สั้นที่สุด แต่ฉันชอบกอล์ฟในซี

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

ungolfed:

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

ฉันไม่ทราบว่าเมื่อใช้scanfซินแทกซ์เหมือน regex ในขณะที่กฎระเบียบ แต่มันทำงานได้ค่อนข้างดี (ดีทางเทคนิคไม่ใช่regex เต็ม )

สิ่งอื่นที่ควรพิจารณาคือรหัสนี้ใช้ได้กับคำที่สั้นกว่า 99 ไบต์เท่านั้น แต่ฉันคิดว่าวิธีนี้จะได้ผลในกรณีส่วนใหญ่


คำแนะนำ: & = 223 -> - = 32
edc65


2

PHP, 82

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

การใช้งาน:

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

คุณต้องการ&&c!=32ไหม ฉันไม่คล่องแคล่วเกินไปใน C # แต่ฉันเดาว่าการแปลงช่องว่างเป็นผลลัพธ์ตัวพิมพ์ใหญ่ในช่องว่าง
DLosc

อ๊ะขอบคุณ - นั่นคือก่อนที่ฉันจะทำการเปลี่ยนแปลงอื่น ๆ ฉันคิดว่า คุณถูกต้องมันไม่จำเป็น
Blorgbeard

ลอง "ใช้ C = System.Console;" แทนการใช้ระบบ
Ewan

2

Mathematica, 66 ไบต์

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

ฉันจะใช้ToCamelCaseแต่ก็ไม่ได้รักษาระยะห่าง


2

R, 139 105 ไบต์

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

คำอธิบาย Ungolfed +:

# 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 กับ regex, 49 41 + 30 = 71 ไบต์

ฉันโดนกระแทกจริงๆ จริง ๆ แล้วมีคะแนนดีกว่าโดยใช้นิพจน์ทั่วไปที่มีบทลงโทษ

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

สิ่งนี้จะจับคู่อักขระเดี่ยวใด ๆ ที่จุดเริ่มต้นของสตริงหรือตามหลังช่องว่างจำนวนใด ๆ และแทนที่ด้วยการจับภาพตัวพิมพ์ใหญ่ โปรดทราบว่าการใช้\\Uนั้นถูกต้องและไม่มีผลต่อตัวอักษรที่ไม่ใช่ pe=Tถูกตีความว่าเป็นเพราะมันใช้ประโยชน์จากอาร์เอสจับคู่บางส่วนของพารามิเตอร์ฟังก์ชั่นและคำพ้องความหมายสำหรับperl = TRUE TRUEไม่ว่าด้วยเหตุผลใดก็ตาม R จะไม่ใช้นิพจน์ปกติของ Perl ตามค่าเริ่มต้น

ขอบคุณ MickyT ที่ช่วยประหยัด 8 ไบต์ในวิธีการ regex!


ด้วย regex (^.| +.)ของการจับคู่สายที่อาจจะ การเพิ่มตัวเลือกอะไรก็โอเค
MickyT

@MickyT: ความคิดที่ดีขอบคุณ! แก้ไขเพื่อใช้ข้อเสนอแนะของคุณ
Alex A.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.