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

改造。

1
ruby -pe'gsub!(/\w+/){$&.capitalize}'

RUBY_VERSION #=> "1.8.6"

1
"LL day and night".split.map{|i| i[0].chr.upcase + i[1..-1] }.join(' ')

Infernoシェルです。
1行に詰め込みすぎている気がします。

短くするために、以下の特徴を使っています。
1. コマンド引数は空白区切りの配列になる
2. 配列をechoすると空白区切りになる
3. sliceの文字数は、上限を超えてもかまわない

このため、空白の数は保持しません。

% sh uc LL day and night
% sh uc hello, i am a cat
1
2
3
4
load string

apply {b=($b ${toupper ${slice 0 1 $1}}^${$slice 1 ${len $1} $1})} $*
echo $b

$sliceになってました。$は要らないです。
1
2
3
4
load string

apply {b=($b ${toupper ${slice 0 1 $1}}^${slice 1 ${len $1} $1})} $*
echo $b

Lazy Kで。666byte

$ echo "LL day and night" |lazy hole2.lazy
LL Day And Night
1
2
3
4
5
6
7
8
9
s(s`k(sii(s`k`s(s`ks(s`k`si(ss`si`kk)))(s`k`s`kk(s(s`ks(s`k`s`k(ss(s(ss`k(s(
sii)i))(ss`ki))(s`ksk)(s`k`sik))(s`k`s`kk(s(s`ks(s`kk(sii)))`k(si`k`ki)))))(
s`k`s(s(si`kk)`k(s`k`sik))(s`k`s`kk(s`k`si(s`kk(s`kk(s(s`ks(s`kk(sii)))`k(s(
s`ks(s`k`si(s`kk(s`k(s(s`k(s(ss(ss`ss)(ss`ki))s(s`ksk)(s(sii)i(s(s`ksk)i))(s
`k`sik))(s`kk(s(s(si`k(s`k`sik))(s`kk(s`k(sii(s(s`ks(s`k`s(si`k`kk)(s`k`s`k`
s(s`ksk)(s(s`ks(s`kk(sii)))`k(si`kI)))))`k`k`ki))(s`k(si(s(s(sii)i)`k(si`kI)
)(s(s`ksk)i))(s(si`k(s`k`sik))`k`k`ki)))))(s`k(ss(s(ss`ki)(ss(ss(ss`ss(ss`ki
)))))(s`ksk)(s`k`sik))k))))(s(si`k(s`k`sik))k))(si`kk)))))(s`kk(si`k`ki)))))
))))))))(s`k`s(si`k(s(s`ksk)(s(sii)i)(s(s`ksk)i)))k))`k`ki

全く短くする気の無い俺が来ましたよ。とりあえず構文解析です。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
options {
    JDK_VERSION = "1.5";
    STATIC = false;
}
PARSER_BEGIN(LLGolfHole2)
public class LLGolfHole2 {
    public static void main(String a[])throws Exception {
        new LLGolfHole2(System.in).parse();
    }
}
PARSER_END(LLGolfHole2)

TOKEN : { <SPACE:([" ","\r","\t","\n"])*> | <CHAR:~[]> }

void parse():{}{
    (word() | space())* <EOF>
}
void word():{ Token c; }{
    c = <CHAR> { System.out.print(c.image.toUpperCase()); }
    (LOOKAHEAD(1) c = <CHAR> { System.out.print(c.image); })*
}
void space():{ Token s; }{
    s = <SPACE> { System.out.print(s.image); }
}

先ほどshebang版も投稿しましたが, 1.8.7ならこっちの方が短いですね.

1
ruby -pe'gsub /\b./,&:upcase'

せっかくGrassをLLで紹介させて頂ける機会を頂いたので、ひとつくらいはお題を解いてサンプルコードを投下しておこうと思いますw

文字列は標準入力から読み込んで、半角スペースのみ単語区切り文字として認識します。ASCIIコード前提。詳細はコード中のコメントをご覧下さい。

ベタ書きでチューニングしていないので、もっと短くできるはず。たぶん。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
1wwWWwv
足し算wwwwWWWwwWwwWWWWWWwwwwWwwv
かけ算wwwWWWwWWWwv
定数とかWWwww2Wwwww3WWw4WWww9WWWww
13WWWWWWWwwWww26WWWWWWWWWwWww
169WWWWWWWWwww空白Wwwwwwwwwwwwwww
wWwwwwwwwwwwwwwwwww14WWWWWWWWWW
WWwwwwww16WWWWWWWWWWWWwwwwwwww
ww32WWWWWWWWWWWWWWWWwWww224WW
WWWWWWWWWWWWWWWwwwwWwwww33WWW
WWWWWWWWWWWWWWWwwwAWwwwwwwwww
wwwwwwwwwwwwwwwWwwwwwwwwwv
偽wwv
3つ目取り出しwwwv
三つ組みwwwwWwwwwWwwwwWwwwwv
大文字かどうか判定するループの中身wwwWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWwwW
WWwwwwWWWwwwWwwWWWWWWWWwwwwwww
WwwwwwWwwwv
ループの中身その2wWwwv
大文字かどうか判定するぜwWWWWwWwwwwwwwwWww
wwwwwwWWWWWWWWWWWWWWWWWWWWWW
wwwwwWwwWwwwwwwwwwwv
語の中にいるときwwWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWwWWWwwwv
語の先頭にいるときwWWWWWWWWWWWWwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwWwwWWWWW
wWwwWwwwwwWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWwWWWWWWW
Wwwwwwwwwv
EOFってのはどんな文字を受け取っても真を返す関数だっぜwv
wwwWWWWwwv
空白文字のときwwwWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWwWWWWwww
wwwwv
空白文字じゃないときwwwWWwWWWWwv
空白文字かEOFのときwwwWwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwWwwwwwwwWw
wwwwwwWwwwwwwWwwwwwwWwwwwwwv
メインループww一文字読み込んでWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWwwwwwwWWWwww空白文字かどうか判定WWww
wwwwwwwwwwwwwwwwwwwwwwwwwWwwwwwwWww
wwwwwwWwwwwWwwwwwwwWwwwwwwwv
メインwWWwwWwwwwwwwww

Lazy K で 630 byte。

Lazy K のソースに付属している Lazy K コンパイラを使って以下のソースを Lazy-K に
変形し、適当に整形しました。

(load "./lazier.scm")
(load "./prelude.scm")
(load "./prelude-numbers.scm")

(lazy-def '(pred n)
          '(lambda(f x)
             (n (lambda(a b)(b (a f))) (k x) i)))
(lazy-def '(sub32 x) '(32 pred x))

(lazy-def '(islower x)
          '(car (x cdr (97 (cons #f) (26 (cons #t) (list-of #f) )))))

(lazy-def '(title f x)
          '(cons (car x)
                 (f
                   (and (= 32 (car x)) (islower (car (cdr x)))
                        (cons (sub32 (car (cdr x))) (cdr(cdr x)))
                        (cdr x)))))
(print-as-unlambda (laze '(Y title)))
1
2
3
4
5
6
7
8
9
sii(s`k(s`k`s(s`ks(s`k`si(ss`si`kk)))(s`k`s`kk(s(s`ksk)`k(s(s(s(s(s`k(si`kk)
(s(s(si`kk)`k(si`k`ki))`k(s(s`ksk)i(s(sii)i(s(s`ksk)i)(s`k`s(si`k`ki)k))(s(s
i`kk)`k(sii(s`k(s`k`s(si`k`ki)k)(sii)))))))(s(s(s(s(si`k`ki)`kk)`k(si`k`ki))
`k(s(sii)i(s(s`ksk)i)`s(s`ksk)(s(sii)`s(s`ksk)(s(s`ksk)i))(s`k`s(si`k`ki)k)(
s(s`ksk)(s(s`ksk)i(s(s`ksk)(sii(s(s`ksk)i))))(s`k`s(si`kk)k)(sii(s`k(s`k`s(s
i`k`ki)k)(sii))))))`kk))`k`ki)(s(s`ks(s`k`si(s`kk(s`k(s(s`ksk)i(s(sii)i(s(s`
ksk)i)(s(s`ks(s`k`s`ks(s(s`ks(s`k`s`ks(s`k`s`kk(s(s`ksk)`k(s`k`s`k`si(s`k`s`
kk(s`k`sik)))))))`k`kk)))`k`k`ki)))(s(si`k`ki)`kk)))))(s`kk(s(si`k`ki)`k`ki)
)))(si`k`ki)))))(sii))

Index

Feed

Other

Link

Pathtraq

loading...