शीर्षक पूंजीकरण के लिए अंगूठे का नियम


30

इस साइट के अनुसार अमेरिकी सरकार मुद्रण कार्यालय शैली मैनुअल द्वारा अनुशंसित एक सामान्य नियम है

प्रकाशनों और दस्तावेजों के शीर्षक में सभी शब्दों को कैपिटलाइज़ करें, a, a, a, at, by, for, in, on, to, up, और, जैसे, लेकिन, या, और न ही।

यह सच नहीं हो सकता है क्योंकि मैं स्टाइल मैनुअल में ऐसी सिफारिश नहीं पा रहा हूं , लेकिन चलो इस नियम का उपयोग करें।


चुनौती

निम्न स्थितियों के अनुसार सीमांकित इनपुट स्ट्रिंग को देखते हुए, निम्नलिखित नियमों के अनुसार स्ट्रिंग के कैपिटलाइज़ेशन का उत्पादन करते हैं

  • पहला और अंतिम शब्द पूंजीकृत है।
  • अन्य सभी शब्द बड़ा किया जाता है, सिवाय इसके कि एक , एक , , पर , द्वारा , के लिए , में , की , पर , करने के लिए , ऊपर , और , के रूप में , लेकिन , या , और न ही

इनपुट स्ट्रिंग में कम से कम एक शब्द होगा और प्रत्येक शब्द में कम से कम एक अक्षर और से केवल वर्ण होते 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"

1
शब्दों की शुरुआत / समाप्ति को पूंजीकरण में किया जाना चाहिए, भले ही वे बहिष्करण सूची में हों? आपके उदाहरण हाँ कहते हैं, लेकिन कल्पना केवल शब्दों को कैपिटलाइज़ करती है जब तक कि वे सूची में नहीं हैं, और पहले / अंतिम शब्द के बारे में कुछ भी नहीं। ध्यान दें कि दो संभावनाएं अलग-अलग हैं, एक साधारण फिल्टर और दूसरा (शाब्दिक) किनारे के मामलों में विशेष व्यवहार की आवश्यकता है।
सीएडी 97

3
@ CAD97 पूंजीकरण के नियम दो बुलेट पॉइंट हैं, उद्धरण नहीं। और पहला बुलेट पॉइंट कहता है "पहला और अंतिम शब्द कैपिटल में है।" और दूसरा कहता है "अन्य सभी शब्दों को पूंजीकृत किया जाता है, सिवाय ..." पहले और अंतिम शब्दों का अर्थ हमेशा पूंजीकृत होता है।
लैकोनी

मुझे याद आया, किसी तरह। फिर भी, स्पष्ट करने के लिए धन्यवाद।
16:97 पर CAD97

मुझे यकीन नहीं है कि यह निर्दिष्ट करना आवश्यक है कि प्रत्येक शब्द में कम से कम एक अक्षर हो। :)
डेविड कॉनराड

जवाबों:


11

पायथन 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को हमारे उदाहरण के रूप में लेते हैं ।

के लिए पायथन 2 के `x`शॉर्टकट का उपयोग करते हुए repr, हम इनपुट को सिंगल कोट्स में लपेटते हैं 'a or an':। फिर हम शब्दों पर व्हॉट्सएप और इट्रेट पर विभाजित होते हैं।

लूप के अंदर, हम repr फिर से लेते हैं । पहले और आखिरी शब्दों के लिए, यह देता है "'a"और "an'"। दूसरे शब्दों के लिए, यह देता है 'or'। यदि वे बाद के पैटर्न को फिट करते हैं और शॉर्ट-वर्ड की सूची में हैं, तो हम शब्दों को बड़ा करने से बचना चाहते हैं। तो हम स्ट्रिंग के रूप में शब्द सूची का प्रतिनिधित्व कर सकते हैं "'a'an'...'up'"और जान सकते हैं कि reprकिसी भी संक्षिप्त शब्द का विकल्प होगा।

`w` in "..."एक बूलियन मूल्य देता है, जिसे हम सूची में अनुक्रमण के प्रयोजनों के रूप में 0या इलाज कर सकते हैं । संक्षेप में, हम इस शब्द को शीर्षक देते हैं यदि यह शुरुआत में है, अंत में है, या छोटे शब्दों की सूची में नहीं है। अन्यथा, हम इसे अकेला छोड़ देते हैं। सौभाग्य से, अभी भी इनपुट जैसे की अपेक्षा के साथ काम करता है ।1[w.title(), w]title()'a

अंत में, हम शब्द से किसी भी एक उद्धरण को छीन लेते हैं और इसे अनुगामी स्थान के साथ प्रिंट करते हैं।


8

05AB1E , 68 61 बाइट्स

अदनान की बदौलत 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

2
यह मुझे कभी नहीं विस्मित करता है कि आप मुझे क्या-क्या पहचाने जाते हैं, यह पूरी तरह से अपरिचित वर्णों के एक छोटे से स्ट्रिंग के साथ होता है। ऐसा लगता है कि यह फिर काम करता है :) +1
ElPedro

बाह! मैं बहुत करीब हूं, और मुझे एक चरित्र को शेव करने का तरीका नहीं मिल रहा है।
mbomb007

@ mbomb007: जेली, MATL या कुछ अन्य भाषा से पहले जल्दी करो जो सूचकांकों के लिए फ़ंक्शंस लागू कर सकती है और इसे हरा सकती है :) मुझे लगता है कि एक भाषा को संकुचित रेगेक्स के साथ भी याद है, लेकिन यह याद नहीं किया जा सकता कि इसे क्या कहा गया था। यह काफी लंबा है कि यह अभी भी गोल्फ हो सकता है।
इमिग्ना

1
के लिए 62 बाइट्स :)
अदनान

@ अदनान: मैंने ऐसा ही शुरू किया, लेकिन केवल 3-चार शब्दों के साथ (जो लंबे समय तक समाप्त हुआ), लेकिन मैंने 2-चार शब्दों को भी लेने पर विचार नहीं किया ... aइसके बजाय €…एक अतिरिक्त बाइट बचाता है और साथ ही साथ इसके साथ :) धन्यवाद!
एमिग्ना

7

GNU sed 81 74 73 बाइट्स

+1 शामिल -r के लिए

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

पहली पंक्ति हर शब्द के पहले अक्षर को बड़ा करती है। दूसरा आवश्यक शब्दों के सभी को वापस लोअरकेस में बदल देता है।

इसे ऑनलाइन आज़माएं!


6

रेटिना, 69 66 बाइट्स

हर शब्द के पहले अक्षर को कैपिटलाइज़ करें, फिर चुने हुए शब्दों को लोअरकेस में बदलें यदि वे पहले या अंतिम शब्द नहीं हैं। अंतिम पंक्ति के अंत में एक स्थान है।

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

इसे ऑनलाइन आज़माएं

यह भी .पहले स्थान के बजाय काम करता है।

वहाँ एक ही लंबाई के साथ कई regexes हैं, लेकिन मुझे अब इसे ट्रिम करने का कोई तरीका नहीं मिल रहा है ...


(यह दृष्टिकोण पिप में 69 बाइट्स का भी है, लेकिन मैं +इसे छोटा करने के लिए ट्रिक का उपयोग नहीं कर सकता ।)
DLosc

@DLosc धन्यवाद Idk क्यों मैंने वह नहीं देखा। मैं क़रीब था।
mbomb007

3

जावास्क्रिप्ट (ईएस 6), 141 138 135 133 बाइट्स

सहेजे गए 3 बाइट्स mbomb007 के लिए धन्यवाद

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

परीक्षण के मामलों


3

जेली , 58 बाइट्स

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

TryItOnline! या सभी परीक्षण चलाएं

कैसे?

शब्दों को अलग करने वाले रिक्त स्थान के साथ एक संकुचित स्ट्रिंग 47बाइट्स होगा 1, 48बाइट्स के लिए यह बाइट को विभाजित करता है ।

लंबाई के शब्दों के दो अविभाजित संकुचित तार 2और 3(एक के अंत में एक 'ए') क्रमशः 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`)

2

PHP, 158 बाइट्स

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);

लूप में गूँजने से 10 बाइट्स बचते हैं:foreach(...)echo" "[!$k],(condition)?$v:ucfirst($v);
टाइटस

2

टीआई-बेसिक, 295 + 59 + 148 = 502 बाइट्स

अब आप अपने कैलकुलेटर पर पूंजी लगा सकते हैं। स्कूल के लिए महान :)

मुख्य कार्यक्रम, 295 बाइट्स

मूल रूप से, शब्दों से मेल खाने की चाल सभी के Aलिए नहीं aहै, जैसे कि रिक्त स्थान के साथ संलग्न " A "करना " a "। यह भी स्वचालित रूप से ऐसा करता है ताकि पहले और अंतिम शब्द पूंजीकृत रहें, क्योंकि उनके पास दोनों तरफ एक जगह नहीं है और इस प्रकार किसी भी शब्द से मेल नहीं खाएगा। (प्रतिभा, सही और सुपर लंबी क्योंकि लोअरकेस अक्षर दो बाइट्स प्रत्येक हैं ...)

"("+Ans+")→Str1
"@A ~ a@An ~ an@The ~ the@At ~ at@By ~ by@For ~ for@In ~ in@Of ~ of@On ~ on@To ~ to@Up ~ up@And ~ and@As ~ as@But ~ but@Or ~ or@Nor ~ nor@→Str2
For(I,2,length(Ans
If "@"=sub(Str2,I-1,1
Then
" "+Str1+"~"+sub(Str2,I,inString(Str2,"@",I)-I)+" "
prgmQ
Ans→Str1
End
End

उपप्रोग्राम ( prgmQ), 59 बाइट्स:

Ans→Str9
inString(Ans,"~
sub(Str9,Ans,length(Str9)-Ans+1→Str8
Str9
prgmR
Repeat Str9=Ans+Str8
Ans+Str8→Str9
prgmR
End

उपप्रोग्राम ( prgmR), 148 बाइट्स:

Ans→Str0
inString(Ans,"~→Z
inString(Str0,"~",Ans+1→Y
inString(sub(Str0,1,Z-1),sub(Str0,Z+1,Ans-Z-1→X
sub(Str0,1,-1+inString(Str0,"~
If X
sub(Str0,1,X-1)+sub(Str0,Y+1,length(Str0)-Y)+sub(Str0,X+length(sub(Str0,Z+1,Y-Z-1)),Z-X-length(sub(Str0,Z+1,Y-Z-1

PS ~टोकन 0x81का @प्रतिनिधित्व करता है और टोकन का प्रतिनिधित्व करता है 0x7F, यहां और जानें ।


2

जावा 7, 271 259 258 बाइट्स

String c(String x){String a[]=x.split(" "),s=" ",r=w(a[0])+s;for(int i=0,l=a.length-1;i<l;r+=(!s.matches("^(a[nst]?|the|by|in|of|on|to|up|and|but|[fn]?or)$")|i==l?w(s):s)+" ")s=a[++i];return r;}String w(String w){return(char)(w.charAt(0)-32)+w.substring(1);}

Ungolfed और परीक्षण कोड:

इसे यहाँ आज़माएँ।

class M{
  static String c(String x){
    String a[] = x.split(" "),
           s = " ",
           r = w(a[0]) + s;
    for(int i = 0, l = a.length-1; i < l; r += (!s.matches("^(a[nst]?|the|by|in|of|on|to|up|and|but|[fn]?or)$") | i == l
                                                 ? w(s)
                                                 : s)   + " "){
      s = a[++i];
    }
    return r;
  }

  static String w(String w) {
    return (char)(w.charAt(0) - 32) + w.substring(1);
  }

  public static void main(String[] a){
    System.out.println(c("the rule of thumb for title capitalization"));
    System.out.println(c("programming puzzles and code golf"));
    System.out.println(c("the many uses of the letter a"));
    System.out.println(c("title"));
    System.out.println(c("and and and"));
    System.out.println(c("a an and as at but by for in nor of on or the to up"));
    System.out.println(c("on computable numbers with an application to the entscheidungsproblem"));
  }
}

आउटपुट:

The Rule of Thumb for Title Capitalization 
Programming Puzzles and Code Golf 
The Many Uses of the Letter A 
Title 
And and And 
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 

1

ग्रूवी, 131 129

दो बाइट्स ने कारुसोकोम्प्यूटिंग के लिए धन्यवाद बचाया

{it.split()*.with{a->a in "a an the at by for in of on to up and as but or nor".split()?a:a.capitalize()}.join(" ").capitalize()}

अच्छा, मैं 137 पर था; तुम जीते। इसे निकालें i->और it2 बाइट्स को बचाने के लिए उपयोग करें। {it.split()*.with{a->a in "a an the at by for in of on to up and as but or nor".split()?a:a.capitalize()}.join(" ").capitalize()}
मैजिक ऑक्टोपस Urn

1
मैं Groovy नहीं जानता, लेकिन क्या यह वास्तव में पहले और अंतिम शब्द को कैपिटलाइज़ करता है?
इमिग्ना

@Eignigna अंतिम कैपिटल कवर एक शब्द के साथ शुरू होता है।
मैजिक ऑक्टोपस Urn

@ एमिग्ना वास्तव में नहीं, मैं उस आवश्यकता को याद कर रहा था (उस अंतिम शब्द को पूंजीकृत करने की आवश्यकता है)। मुझे अपनी अन्वेषक को समायोजित करने की आवश्यकता होगी।
Krzysztof Atłasik

दो का उपयोग करता .capitalize()है बहुत से बाइट्स लेते हैं। क्या कोई छोटा रास्ता है जिससे आप एक उपनाम बना सकते हैं .capitalize()?
साइओस

1

सी #, 305 बाइट्स

अभी भी सुधार के लिए बहुत सारे कमरे हैं लेकिन यहाँ आप जाते हैं:

s=>{;var b=s.Split(' ');b[0]=((char)(b[0][0]-32))+b[0].Substring(1);int i=0,n=b.Length;for(;++i<n;)if(!"a,an,the,at,by,for,in,of,on,to,up,and,as,but,or,nor".Split(',').Contains(b[i]))b[i]=((char)(b[i][0]-32))+b[i].Substring(1);b[n-1]=((char)(b[n-1][0]-32))+b[n-1].Substring(1);return string.Join(" ",b);};

1

रूबी, 123 117 111 102 बाइट्स

->s{s.gsub(/ .|^./,&:upcase).gsub(/ (A[nts]?|The|By|In|To|Up|And|But|[NF]or|O[rnf])(?= )/,&:downcase)}

सभी संपादन के लिए क्षमा करें - यह अंतिम होना चाहिए।


1

पायथन, 177 बाइट्स

बाइट बचत उद्देश्यों के लिए फ़ंक्शन प्रारूप में वितरित किया गया। यह विशेष रूप से प्रतिस्पर्धी उत्तर नहीं है, लेकिन यह एक है जिसकी आवश्यकता नहीं है repr()याregex प्रवंचना । यह संस्करण-अज्ञेयवाद भी है; यह पायथन 2 या 3 के साथ काम करता है।

हालांकि यह शायद एक बहुत ही नियमबद्ध समाधान है।

def t(s):
 w="a an the the at by for in of on to up and as but or nor".split()
 l=[(s.title(),s)[s in w]for s in s.split()]
 for x in(0,-1):l[x]=l[x].title()
 return' '.join(l)

1

PHP, 109 142 बाइट्स

<?=preg_replace_callback("# (A[snt]?|And|[FN]or|Up|By|But|The|To|In|O[rnf])(?= )#",function($m){return strtolower($m[0]);},ucwords($argv[1]));

User59178´s और mbomb007 .s का विलय उत्तर ।

हर शब्द के पहले अक्षर को अपरकेस करता है, फिर रिक्त स्थान से घिरी सूची से सभी शब्दों को नीचे कर देता है।
दुर्भाग्य से, कॉलबैक को पूरे सेट पर संचालित करना पड़ता है; इसकी कीमत 29 बाइट्स है।


यह काम नहीं करताa an and as at but by for in nor of on or the to up
Jörg Hülsermann

1

रैकेट 353 बाइट्स

(define(cap i)(set! i(string-append i))(define c(string-ref i 0))(string-set! i 0(if(char-upper-case? c)c(integer->char(-(char->integer c)32))))i)
(let*((ex(list"a""an""the""at""by""for""in""of""on""to""up""and""as""but""or""and""nor"))(sl(string-split s)))
(string-join(for/list((i sl)(n(in-naturals)))(cond[(= n 0)(cap i)][(member i ex)i][(cap i)]))))

Ungolfed:

(define (f s)

  (define (cap i)                 ; sub-fn to capitalize first letter of a word
    (set! i (string-append i))
    (define c (string-ref i 0))
    (string-set! i 0
                 (if (char-upper-case? c)
                     c
                     (integer->char (-(char->integer c)32))))
    i)

  (let* ((ex (list "a""an""the""at""by""for""in""of""on""to""up""and""as""but""or""and""nor"))
         (sl (string-split s)))
    (string-join
     (for/list
         ((i sl)
          (n (in-naturals)))
       (cond
         [(= n 0) (cap i)]
         [(member i ex) i]
         [(cap i)]
         )))))

परिक्षण:

(f "the rule of thumb for title capitalization")

आउटपुट:

"The Rule of Thumb for Title Capitalization"

1

जावा 7, 431 317 311 बाइट्स

114 बाइट्स के लिए @KevinCruijssen को धन्यवाद । 6 बाइट
बचाने के लिए @RosLup को धन्यवाद ।

String c(String s){String v="",x,l[]=s.split(" "),b[]={"a","an","the","at","but,"by","for","in","of","on","to","‌​up","as","or","and","nor"};int i=0,f=0,z=0;for(String c:l){for(f=0;f<b.length;z=c.equals(b[f++])|z>0?1:0);x=(char)(c.charAt(0)-32)+c.substring(1);v+=(z>0?i<1|i>l.length-2?x:c:x)+" ";i++;}return v;}

ungolfed

250 बाइट्स के ऊपर पहला उत्तर

 static String c(String s) {
      String v = "", x, l[] = s.split(" "),
b[]={"a","an","the","at","by","for","in","of","on","to",
                                         "‌​up","and","as","or","nor","but"};
    int i , f , z = i = f = 0;
    for (String c : l) {

   for (f = 0; f < b.length; z = c.equals( b[f++] ) | z > 0 ? 1 : 0);
        x = (char)(c.charAt(0) - 32) + c.substring(1);

        v += (z > 0 ? i < 1 | i > l.length - 2 ? x : c : x) + " ";
        i++;
   }
    return v;
    }

1
यह एक टिप्पणी में संक्षेप में बहुत अधिक था, लेकिन आप इसे इस पर गोल्फ कर सकते हैं: String f(String s){String v="",x,l[]=s.split(" "),b[]={"a","an","the","at","by","for","in","of","on","to","up","and","as","but","or","and","nor"};int i=0,f=0,z=0;for(String c:l){for(f=0;f<b.length;z=c.equals(b[f++])|z>0?1:0);x=(char)(c.charAt(0)-32)+c.substring(1);v+=z>0?i<1|i++==l.length-1?x:c:x)+" ";}return v;}( 314 बाइट्स ) मैं सुझाव देता हूं कि मैं अगली बार के लिए टिप्स के रूप में क्या बदल गया। :) PS: मैंने एक अलग दृष्टिकोण ( 259 बाइट्स ) के साथ उत्तर पोस्ट किया है ।
केविन क्रूज़सेन

1
विशेष रूप से ऐसी चीजें c.substring(0,1).toUpperCase()+c.substring(1,c.length())+" "जो आपने दो बार कीं, उन्हें आपको किसी तरह फिर से उपयोग करने के बारे में सोचना चाहिए। और संयुक्त इनिशियलाइज़ेशन जैसे कि आपने सही तरीके से किया है int, लेकिन किसी कारण से नहीं String। इसके अलावा, अतिरिक्त की कोई आवश्यकता नहीं है booleanजब आप int0 या 1 के रूप में स्टोर कर सकते हैं और फिर इसे जांचें >0। और मैं कोष्ठक और breakयथासंभव यथासंभव बचने की कोशिश करूंगा ; आम तौर पर उनमें से छुटकारा पाने के लिए एक चाल है, जैसे for(f=0;f<b.length;z=c.equals(b[f++])|z>0?1:0);मैंने दिखाया है। :)
केविन क्रूज़सेन

1
हमेशा सीखने के लिए बहुत कुछ और हमेशा उपयोगी रहने के लिए धन्यवाद (लंबे समय तक जीवित रहने वाले नीदरलैंड);
नंबरनोट

1
ओह, मैंने एक कॉपी-पेस्ट त्रुटि की है .. यह यह होना चाहिए String c(String s){String v="",x,l[]=s.split(" "),b[]={"a","an","the","at","by","for","in","of","on","to","up","and","as","but","or","and","nor"};int i=0,f=0,z=0;for(String c:l){for(f=0;f<b.length;z=c.equals(b[f++])|z>0?1:0);x=(char)(c.charAt(0)-32)+c.substring(1);v+=(z>0?i<1|i++>l.length-2?x:c:x)+" ";}return v;}और कोई समस्या नहीं। :) मैंने भी बहुत कुछ सीखा जब मैं कोड-गोल्फिंग में नया था। मैं बस हर सामान्य कोडगॉल्फ टिप के साथ एक सूची बनाता हूं जो मैं सीखता हूं और कभी-कभी इसे देखता / अपडेट करता हूं। लेकिन मेरा कोड अभी भी दूसरों द्वारा बहुत अधिक गोल्फ हो गया है।
केविन क्रूज़सेन

1
स्ट्रिंग बी में [] 2 हैं और 'क्या यह ठीक है?
रोजलुपी

1

पीएचपी, 117 118 112 बाइट्स

<?=strtr(ucwords(preg_replace("# (?=(a[snt]?|and|[fn]or|up|by|but|the|to|in|o[rnf]) )#","!",$argv[1])),'!',' ');

के व्यवहार का उपयोग करता है ucwords()और प्रासंगिक शब्दों से बचता है जो रिक्त स्थान से घिरे होते हैं फिर पलायन पात्रों को हटाते हैं।

मैंने (a[snt]?|and|[fn]or|up|by|but|the|to|in|o[rnf])Jörg Hülsermann के उत्तर से कॉपी की , लेकिन जैसा कि दृष्टिकोण पूरी तरह से अलग है मैं इसे एक अलग उत्तर के रूप में पोस्ट कर रहा हूं।

संपादित करें: टाइटस द्वारा बग को देखा गया, इसे 1 बाइट फिक्स करना। यह भी: 6 बाइट्स ने स्ट्रेट के बारे में उनकी उपयोगी टिप्पणी के लिए धन्यवाद बचाया


strtrइसके बजाय 6 बाइट्स बचाएं str_replace। या HTML आउटपुट के साथ शब्दों को <>छोड़ें the str_replaceऔर उनका उपयोग करें।
टाइटस

कुछ मामलों में आप preg_filterइसके बजाय उपयोग कर सकते हैं preg_replace। मैंने इसे आपके समाधान के साथ
आज़माया नहीं है

Regex एक पंक्ति में सूची से दो शब्दों के लिए काम नहीं करेगा; परीक्षण nice try for a start। एक स्थान के साथ एक स्थान को बदलकर हल किया जाता है (+4 बाइट्स)।
टाइटस

दुर्भाग्य से preg_filter, titleपरीक्षण के मामले में विफल रहा, कुछ भी नहीं लौटाया।
user59178

1

शुद्ध bash - 253

(कोई बाहरी कार्यक्रम नहीं कहा जाता है) - बैश v4 की जरूरत है

declare -A b;for x in A An The At By For In Of On To Up And As But Or Nor;do b[$x]=1;done
while read -a w;do
n=${#w[@]};o[0]=${w[0]^}
for((i=1;i<n-1;i++)){
g=${w[$i]^};((${b[$g]}))&&o+=(${g,,})||o+=($g);}
((n>1))&&o[$n]=${w[-1]^}
echo ${o[@]};o=()
done

टिप्पणियों के साथ सामान्य दृश्य

#create the "blacklist"
declare -A b
for w in A An The At By For In Of On To Up And As But Or Nor
do
    b[$x]=1
done

# logic:
# read each line (split by words) into array
# and each word is assigned capitalized to the new output array
# but the blacklisted ones

#read each line to array w (split on spaces)
while read -a w
do
    n=${#w[@]}         # get the number of words
    o[0]=${w[0]^}          # copy the capitalized word1
    for((i=1 ; i<n-1 ; i++)) { # loop over 2 up to last -1 words

        g=${w[$i]^}    # for the given word
        # check if it is in the blacklisted ones
        # if yes - convert to lowercase, if not leave as it is
        # and append to the output array
        (( ${b[$g]} )) && o+=(${g,,}) || o+=($g)
    }
    # capitalize the last word if here is more words
    (( n>1 )) && o[$n]=${w[-1]^}
    # make a line from the words
    echo ${o[@]}
    o=() #cleanup
done

उत्पादन

Title
And and And
The Rule of Thumb for Title Capitalization
Programming Puzzles and Code Golf
The Many Uses of the Letter A
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

1

जाप , 71 बाइट्स

£`a  e  by f     up d  ¿t  n`¸aX >0©Y¦0©YĦZl ?X:Xg u +XÅ}S

इसे ऑनलाइन आज़माएं!

स्पष्टीकरण:

£`a  e  by f     up d  ¿t  n`¸aX >0©Y¦0©YĦZl ?X:Xg u +XÅ}S
£`...`qS aX >0&&Y!=0&&Y!=UqS l -1?X:Xg u +Xs1}S

£                                            }S   // Split at spaces and map each item X by this function:
 `...`                                            //  Backticks are used to decompress strings
      qS                                          //  Split the decompressed string at spaces.
         aX >J                                    //  If this contains X
              &&Y!=0                              //  and the index is non-zero (it's not the first word)
                    &&Y!=UqS l -1                 //  and the index is not the length of the input -1 (it's not the last word),
                                 ?X               //  return X.
                                   :Xg u +Xs1     //  Else, return X capitalized. (Literally X[0].toUpperCase() + X.slice(1))
                                             }S   // Rejoin with spaces

मेरी पसंदीदा Japt विशेषताओं में से एक इसकी स्ट्रिंग संपीड़न है, जो कि shoco लाइब्रेरी का उपयोग करती है

आप इसे Oc"{string}"→ में लपेटकर एक स्ट्रिंग को संपीड़ित कर सकते हैंOc"a an the at by for in of on to up and as but or nor"

फिर इसे बैकटिक्स या Od"{compressed string}"→ के साथ डिकम्प्रेस करनाOd"a e by f up d ¿t n"


-Sके बाद इस चुनौती पोस्ट किया गया झंडा जोड़ दिया गया है, तो अपने वर्तमान समाधान गैर प्रतिस्पर्धा है। हालांकि, मुझे लगता है कि आप कर सकते हैं £...+XÅ}S, जो एक ही बाइट-काउंट के लिए प्रतिस्पर्धा कर रहा होगा ( इसे ऑनलाइन आज़माएं! )
ETHproductions

आपकी राय में जेली के शब्दकोश संपीड़न के साथ शोटो की तुलना कैसे की जाती है?
रॉबर्ट फ्रेजर

@RobertFraser जेली की तुलना में, यह अंग्रेजी शब्दों के तार को संपीड़ित करने में बहुत अच्छा नहीं है, लेकिन यह मनमाने ढंग से निचले अक्षरों के तारों को संपीड़ित करने में बहुत अच्छा है, जो कभी-कभी काम में आता है।
ETHproductions

1

शुद्ध bash - 205 192 181 बाइट्स

tc(){
while read -a x
do x=(${x[@]^})
for ((i=1;i<${#x[@]}-1;i++))
do
case "${x[i]}" in
A|A[nts]|The|By|[FN]or|In|O[fnr]|To|Up|And|But)x[i]=${x[i],};;
esac
done
echo ${x[@]}
done
}

जैसे jm66 का उत्तर tc मानक इनपुट को स्वीकार करता है।


0

दरअसल , 79 बाइट्स

' ,ÿsd@p@`;0"A0An0The0At0By0For0In0Of0On0To0Up0And0As0But0Or0Nor"síu'ù*ƒ`Moq' j

इसे ऑनलाइन आज़माएं!

स्पष्टीकरण:

' ,ÿsd@p@`;0"longstring"síu'ù*ƒ`Moq' j
' ,ÿs                                   title case input, split on spaces
     d@p@                               pop first and last words to stack
         `;0"longstring"síu'ù*ƒ`M       for every word except the first and last:
          ;0"longstring"s                 duplicate word, split the long string on 0s
                         íu               1-based index of word in list (0 if not found)
                           'ù*            "ù"*(index)
                              ƒ           execute the resulting string as a function (lowercases word if it's in the list)
                                 oq' j  put the first and last word back in the list, join with spaces

0

बैच, 323 बाइट्स

@echo off
set s=
for %%w in (@%*@)do call:w %%w
echo%s%
exit/b
:w
for %%s in (a an the at by for in of on to up and as but or nor)do if %%s==%1 set s=%s% %1&exit/b
set w=%1
set w=%w:@=%
set f=%w:~0,1%
for %%c in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)do call set f=%%f:%%c=%%c%%
set s=%s% %f%%w:~1%

टिप्पणियों के साथ:

@echo off
rem Start with an empty output string
set s=
rem Wrap the parameters in @ signs to identify the first and last words 
for %%w in (@%*@) do call :w %%w
rem Ignore the leading space when printing the result
echo%s%
exit/b
:w
rem Check whether this is a word that we don't change
for %%s in (a an the at by for in of on to up and as but or nor) do if %%s==%1 set s=%s% %1&exit/b
set w=%1
rem Delete any @ signs from the first and last words
set w=%w:@=%
rem Get the first character
set f=%w:~0,1%
rem Case insensitively replace each upper case letter with itself
for %%c in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do call set f=%%f:%%c=%%c%%
rem Concatenate with the rest of the word
set s=%s% %f%%w:~1%
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.