타이틀 대문자 화를위한 경험의 법칙 an, the, at,

이 사이트 에 따르면 미국 정부 인쇄소 스타일 매뉴얼에서 권장하는 일반적인 규칙 은 다음과 같습니다.

a, an, the, at, by, for, in, on, to, up, and, as, but, or 및 nor를 제외한 출판물 및 문서 제목의 모든 단어를 대문자로 표기하십시오.

Style Manual 에서 그러한 권장 사항을 찾을 수 없으므로 이것은 사실이 아니지만 어쨌든이 규칙을 사용합시다.


도전

공백으로 구분 된 소문자로 구성된 입력 문자열이 제공된 경우 다음 규칙에 따라 문자열의 대문자를 출력하십시오.

  • 첫 단어와 마지막 단어는 대문자입니다.
  • 다른 모든 단어를 제외하고, 대문자 , , , , 에 의해 , , , , , , 최대 , , , 하지만 , , 그리고 .

입력 문자열에는 하나 이상의 단어가 포함되며 각 단어에는 하나 이상의 문자와 a~ 사이의 문자 만 포함 됩니다 z.

이것은 코드 골프 도전이므로 선택한 언어로 가능한 적은 바이트를 사용하십시오. 과제를 완수하기 위해 전체 프로그램 또는 기능을 작성할 수 있습니다.

테스트 케이스

"the rule of thumb for title capitalization" -> "The Rule of Thumb for Title Capitalization"
"programming puzzles and code golf" -> "Programming Puzzles and Code Golf"
"the many uses of the letter a" -> "The Many Uses of the Letter A"
"title" -> "Title"
"and and and" -> "And and And"
"a an and as at but by for in nor of on or the to up" -> "A an and as at but by for in nor of on or the to Up"
"on computable numbers with an application to the entscheidungsproblem" -> "On Computable Numbers With an Application to the Entscheidungsproblem"


답변

파이썬 2, 118 바이트

엄마 좀 봐, 정규식!

for w in`input()`.split():print[w.title(),w][`w`in"'a'an'and'as'at'the'by'but'for'nor'in'of'on'or'to'up'"].strip("'"),

입력은 따옴표로 묶어야합니다. 출력에는 후행 공백이 있고 후행 줄 바꿈이 없습니다 (괜찮습니다). Ideone의 모든 테스트 사례를 확인하십시오 .

설명

입력 a or an을 예로 들어 봅시다 .

Python 2의 `x`바로 가기를 사용 repr하여 입력을 작은 따옴표로 묶습니다 'a or an'. 그런 다음 공백으로 나누고 단어를 반복합니다.

루프 내부에서 repr 다시 가져옵니다 . 첫 번째와 마지막 단어의 경우, 이것은 제공 "'a"하고 "an'". 다시 말해, 그것은을 제공합니다 'or'. 우리는 단어가 후자의 패턴에 적합하고 짧은 단어 목록에 있으면 대문자를 사용하지 않기를 원합니다. 따라서 단어 목록을 문자열로 나타낼 수 있고 짧은 단어 중 하나가 하위 문자열이 "'a'an'...'up'"된다는 것을 알 repr수 있습니다.

`w` in "..."boolean 값을 제공하며 ,리스트로 색인화 할 목적 으로 0또는이 1를 처리 할 수 ​​있습니다 [w.title(), w]. 요컨대, 단어의 시작, 끝 또는 짧은 단어 목록에없는 경우 제목을 붙입니다. 그렇지 않으면 우리는 그것을 내버려 둡니다. 다행히도 title()여전히 같은 입력에서 예상대로 작동합니다 'a.

마지막으로 단어에서 작은 따옴표를 제거하고 후행 공백으로 인쇄합니다.


답변

05AB1E , 68 61 바이트

Adnan 덕분에 7 바이트 절약

™ð¡Dg<UvyN__NXQ_“a€¤€€€›€‹€‡€†€‚€‰€„€¾€ƒ€œ€³€—š¯“#™yå&&il})ðý

온라인으로 사용해보십시오!

설명

“a€¤€€€›€‹€‡€†€‚€‰€„€¾€ƒ€œ€³€—š¯“로 번역 된 사전 문자열 a an the at by for in of on to up and as but or nor입니다.

™                          # title case input string
ð¡                         # split on spaces
Dg<U                       # store index of last word in X

vy                         # for each word
  N__                      # is it not first index?
     NXQ_                  # is it not last index
         “...“             # the compressed string
              #            # split on spaces
               ™           # convert to title case
                yå         # is current word in this list?
                  &&       # and the 3 previous conditions together
                    il     # if all are true, convert to lower case
                      }    # end loop
)ðý                        # wrap stack in list and join by spaces

답변

GNU sed 81 74 73 바이트

-r에 +1 포함

s/\b./\u&/g
:;s/.(And?|A[st]?|The|By|But|[FN]or|In|O[fnr]|To|Up) /\L&/;t

첫 줄은 모든 단어의 첫 글자를 대문자로 표시합니다. 두 번째는 필요한 모든 단어를 소문자로 다시 전환합니다.

온라인으로 사용해보십시오!


답변

레티 나, 69 66 바이트

모든 단어의 첫 글자를 대문자로 한 다음 선택한 단어가 첫 단어 나 마지막 단어가 아닌 경우 소문자로 변경하십시오. 마지막 줄 끝에 공백이 있습니다.

T`l`L`\b.
+T`L`l` (And?|A[st]?|The|By|But|[FN]or|In|O[fnr]|To|Up)

온라인으로 사용해보십시오

이것은 .첫 번째 공간 대신에 작동 합니다.

같은 길이의 정규 표현식이 많이 있지만 더 이상자를 수있는 방법을 찾을 수 없습니다 …


답변

자바 스크립트 (ES6) 141 138 135 133 바이트

mbomb007 덕분에 3 바이트 절약

s=>s.replace(/(\w+)( ?)/g,(a,w,n,i)=>i&&n&&/^(a[nst]?|the|by|in|of|on|to|up|and|but|[fn]?or)$/.exec(w)?a:a[0].toUpperCase()+a.slice(1))

테스트 사례

let f =

s=>s.replace(/(\w)(\w*)( ?)/g,(a,l,w,n,i)=>i&&n&&/^(a[nst]?|the|by|in|of|on|to|up|and|but|[fn]?or)$/.exec(l+w)?a:l.toUpperCase()+w+n)

console.log(f("the rule of thumb for title capitalization"));
console.log(f("programming puzzles and code golf"));
console.log(f("the many uses of the letter a"));
console.log(f("title"));
console.log(f("and and and"));
console.log(f("a an and as at but by for in nor of on or the to up"));
console.log(f("on computable numbers with an application to the entscheidungsproblem"));

답변

젤리 , 58 바이트

“Ð/ṃƇ¬þṄẊƙ€,⁽ṙƬ®OṪJ"ɦ3×kf3Ṙç%ġu’b26ịØaṣ”z
e€¢¬T;2Ḷ¤
ḲŒtǦK

TryItOnline! 또는 모든 테스트를 실행

방법?

단어를 분리 구역으로 압축 된 문자열이 될 47IT 비용 분할 바이트 1에 대한 바이트를 48바이트.

길이의 말씀의 두 분리되지 않은 압축 된 문자열 23각각 것 (하나의 끝 부분에 ‘A’와) 40바이트 + 2각을 분할하고 1위해, 그들과 합류하는 45바이트.

아래에 설명 된대로 하나 개의 기본 250 수는 32바이트, 다음 3,베이스 (26)로 변환 3소문자 알파벳으로 색인하고 3, 사용되지 않는 문자에 분할 'z'을 위해, 41바이트.

따라서 대문자를 사용하지 않는 단어에 대한 조회는 다음
“Ð/ṃƇ¬þṄẊƙ€,⁽ṙƬ®OṪJ"ɦ3×kf3Ṙç%ġu’
과 같이 구성되었습니다.

그 단어를 가져 와서 구분 기호로 결합하십시오.
s="a an the at by for in of on to up and as but or nor"

다음 라벨 'a'로서 1, 'b'같은 2세퍼레이터와 같이 0:

alpha = ' abcdefghijklmnopqrstuvwxyz'
x = [alpha.index(v) for v in s]
x
[1,0,1,14,0,20,8,5,0,1,20,0,2,25,0,6,15,18,0,9,14,0,15,6,0,15,14,0,20,15,0,21,16,0,1,14,4,0,1,19,0,2,21,20,0,15,18,0,14,15,18]

이것을 기본 26숫자 로 변환하십시오 (마지막으로 사용한 문자 'y'는 구분 기호의 숫자와 파이썬 코드입니다 :
n=sum(v*26**i for i,v in enumerate(x[::-1]))

250숫자를 목록을 사용하여 기본 번호 로 변환하십시오 .

b=[]
while n:
    n,d = divmod(n,250)
    b=[d]+b
b
[16,48,220,145,8,32,202,209,162,13,45,142,244,153,9,80,207,75,35,161,52,18,108,103,52,205,24,38,237,118]

젤리의 코드 페이지에서 해당 색인의 문자를 찾으십시오.

codepage = '''¡¢£¤¥¦©¬®µ½¿€ÆÇÐÑ×ØŒÞßæçðıȷñ÷øœþ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQR TUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~¶°¹²³⁴⁵⁶⁷⁸⁹⁺⁻⁼⁽⁾ƁƇƊƑƓƘⱮƝƤƬƲȤɓƈɗƒɠɦƙɱɲƥʠɼʂƭʋȥẠḄḌẸḤỊḲḶṂṆỌṚṢṬỤṾẈỴẒȦḂĊḊĖḞĠḢİĿṀṄȮṖṘṠṪẆẊẎŻạḅḍẹḥịḳḷṃṇọṛṣṭụṿẉỵẓȧḃċḋėḟġḣŀṁṅȯṗṙṡṫẇẋẏż«»‘’“”'''
r=''.join(codepage[i-1] for i in b)
r
'Ð/ṃƇ¬þṄẊƙ€,⁽ṙƬ®OṪJ"ɦ3×kf3Ṙç%ġu'

(참고 : 실제 구현은 형 용성 b이 없으므로 0숫자가 있으면 먼저 수행해야합니다)

나머지:

ḲŒtǦK - Main link: title string
Ḳ      - split on spaces
    ¦  - apply to indexes
   Ç   -     given by calling the last link (1) as a monad (with the split title string)
 Œt    -     title case (first letter of each (only) word to upper case)
     K - join on spaces

e€¢¬T;2Ḷ¤ - Link 1, find indexes to capitalise: split title string
e€        - is an element of, for €ach
  ¢       - the result of calling the last link (2) as a nilad
   ¬      - logical not
    T     - get the truthy indexes (indexes of words that are not in the list)
     ;    - concatenate with
        ¤ - nilad followed by link(s) as a nilad
      2Ḷ  - range(2) -> [0,1]
                (we always want to capitalise the first index, 1, and the last index, 0)

“Ð/ṃƇ¬þṄẊƙ€,⁽ṙƬ®OṪJ"ɦ3×kf3Ṙç%ġu’b26ịØaṣ”z - Link 2, make the word list: no arguments
“Ð/ṃƇ¬þṄẊƙ€,⁽ṙƬ®OṪJ"ɦ3×kf3Ṙç%ġu’          - the base 250 number
                                b26       - convert to base 26
                                   ị      - index into
                                    Øa    - lowercase alphabet
                                      ṣ   - split on
                                       ”z - literal 'z' (the separator 0 indexes into `z`)

답변

PHP, 158 바이트

@Titus 님이 저장 한 10 바이트

foreach($w=explode(" ",$argv[1])as$k=>$v)echo" "[!$k],$k&&$k+1<count($w)&&preg_match("#^(a[snt]?|and|[fn]or|up|by|but|the|to|in|o[rnf])$#",$v)?$v:ucfirst($v);

이전 버전 PHP, 174 바이트

foreach($w=explode(" ",$argv[1])as$k=>$v)$k&&$k+1<count($w)&&in_array($v,[a,an,the,at,by,"for",in,of,on,to,up,"and","as",but,"or",nor])?:$w[$k]=ucfirst($v);echo join(" ",$w);