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

文頭はすでに大文字になっていることを仮定しています。

;; 最初 #/\b\w/ としてハマった。

1
2
3
(use srfi-13)
(define (main args)
  (print (regexp-replace-all #/\W\w/ (cadr args) (compose string-upcase (cut <> 0)))))

標準入力で与えた文字列を変換して標準出力に返します。

実行例:

% gosh capitalize.scm
LL day and night
LL Day And Night

Lisp は Golf に向かないのですが、頑張って1文字にしてみました(遠くから見てください)。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
           (letrec
             ((a(#0=
              lambda(
               c)(cond
                #1=((memv
                 c'(#\tab
                  #\return 
                   #\newline
                  #\space))#2=
                 (#3=write-char 
              c)b)(else  #2#a))))
            (b(#0#(c)(    |cond|#1#
          ((<= 97(#4=       char->ucs
        c)122)(#3#            (ucs->char
      (-(#4#c)32)              ))a)(else
    #2#a)))))(                   port-fold(
#0#(|c|p)(p|c|)                 )|b|read-char))

stdin → stdout
;他の言語みたいに#/\b./でうまくいかないのは何故?
1
(use srfi-13)(print(regexp-replace-all #/(\w)(\w*)/(read-line)(rec,quote #`",(string-upcase'1),'2")))

> ;他の言語みたいに#/\b./でうまくいかないのは何故?

マニュアルにもあるのですが、 Gauche の regexp-replace-all は「文字列でマッチした部分の後ろの部分に ついて再帰的に自分自身を適用」するからです。 ^ の場合のときのことは覚えていたんですが \b でも問題になるんですねえ。


Index

Feed

Other

Link

Pathtraq

loading...