이 사이트 에 따르면 미국 정부 인쇄소 스타일 매뉴얼에서 권장하는 일반적인 규칙 은 다음과 같습니다.
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
방법?
단어를 분리 구역으로 압축 된 문자열이 될 47
IT 비용 분할 바이트 1
에 대한 바이트를 48
바이트.
길이의 말씀의 두 분리되지 않은 압축 된 문자열 2
과 3
각각 것 (하나의 끝 부분에 ‘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);