challenge LL Golf Hole 2 - 文字列に含まれる単語の最初の文字を大文字にする

文字列に含まれる単語について、それぞれの単語の最初の文字を大文字にしてください。

たとえば、"LL future" と与えられたときは "LL Future" と出力する。"LL day and night" と与えられたときは "LL Day And Night" と出力する。

与えられる文字列はリテラルで表記する、標準入力で与えられる、引数で与えられるなどは自由とします。

余力のあるものはこのプログラムを短くしてみたり、短くしてみたり、短くしてください。

※LL Future実行委員の高野光弘です。この出題は LL Future公式の出題であり、優れたものについてはLL Golfのセッションでご紹介させていただくかもしれません。ご理解の上、ご投稿ください。また、LL Futureのチケットは現在も発売中です。よろしければ、メインイベントの方にもぜひご参加ください。

1
ruby -e "p 'LL day and night'.scan(/(\w)(\w*)/).map{|a|a.shift.upcase + a.to_s}.join(' ')"

Posted feedbacks - C

VCEE2008でコンパイルできました。
LL Future
LL Day And Night
Hello, I Am A Cat
1
2
3
4
5
6
7
f(char *s){*s=toupper(*s);while(*++s)if(*(s-1)==' ')*s=toupper(*s);}

main(){
    char *s1="LL future",*s2="LL day and night",*s3="hello, i am a cat";
    f(s1);f(s2);f(s3);
    printf("%s\n%s\n%s\n",s1,s2,s3);
}

参考ページに影響を受けてみた。入出力込みで84byte

1
a;main(){char*s=gets(&a);for(;*s;s++)if(&a==s||*(s-1)==' ')*s=toupper(*s);puts(&a);}

ちまちま^^; 81byte

1
a;main(){char*s=gets(&a);for(;*s;s++)putchar(&a==s||*(s-1)==' '?toupper(*s):*s);}

Cygwin gcc3.4.4で確認

1
main(a,b){for(;(b=getchar())>0;)a=putchar(b>96&a<33?b-32:b);}

だんだん凶悪に…55byte
1
b;main(a){b=getchar();main(putchar(b>96&a<33?b-32:b));}

スタックオーバーフローで止まるのはダメ?
(うちのパソコンだと5万回くらいで終了。ただしゴミが出まくる)

putcharとgetcharのつづりをこれ以上短くできないのが痛いです。
やけくそで外道版も書いてみました。
1
2
3
4
5
●止まらない問題修正版(56byte)
b;main(a){b=getchar();~b&&main(putchar(b-a>64?b-32:b));}

●外道版(45byte)
main(){system("perl -pe\"s/\\b./\\U$&/g\"");}

外道版はUnix系なら後2byte短くなるんじゃないかと思ってみたり
1
2
/*●外道版(43byte)*/
main(){system("perl -pe's/\\b./\\U$&/g'");}

54B
1
n;main(o){n=getchar();~n&&main(putchar(o<33?n&95:n));}

記号入りでも文字化けしないようにしてみた。135bytes.

1
2
#include<stdio.h>
main(int c,char**v){char*s=*++v;do*s-=((!(s-*v&&*(s-1)-32))*((*s-97|122-*s)>0))<<5;while(*++s);puts(*v);return 0;}

Index

Feed

Other

Link

Pathtraq

loading...