Başlık Büyük Harfi İçin Başparmak Kuralı


30

Göre bu sitede genel bir kural tarafından tavsiye Office US Government Printing Stil Manuel DİR

Tüm kelimeleri a, a, a, by, of, on, to, to, up, and, and, and, and, başlıkları altında büyük harflerle yazınız.

Stil Kılavuzunda böyle bir öneri bulamadığım için bu doğru olmayabilir , ancak yine de bu kuralı kullanalım.


Meydan okuma

Boşluklarla sınırlandırılmış küçük harflerden oluşan bir giriş dizesi verildiğinde, dizenin büyük harflerini aşağıdaki kurallara göre çıktılar.

  • İlk ve son sözcük büyük harfle yazılır.
  • Diğer tüm kelimeler hariç büyük harfle olan bir , bir , , en , tarafından , için , içinde , arasında , üzerinde , için , yukarı , ve , olarak , ama , ya ve ne de .

Giriş dizesi en az bir kelimesini içeren ve her kelime en az bir harf ve tek karakterler içeriyor aiçin z.

Bu bir kod golf mücadelesidir, bu nedenle seçtiğiniz dilde mümkün olduğunca az byte kullanmaya çalışın. Görevi yerine getirmek için tam bir program veya işlev yazabilirsiniz.

testcases

"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
Hariç tutulan listede olsalar bile, başlangıç ​​/ bitiş kelimeleri büyük harfle yazılmalı mı? Örnekleriniz evet diyor, ancak teknik özellik sadece listede olmadıkça kelimeleri büyük harfle yazıyor ve ilk / son sözcükle ilgili hiçbir şey ifade etmiyor. İki olasılığın belirgin bir şekilde farklı olduğuna dikkat edin, biri basit bir filtredir ve ikincisi (değişmez) kenar davalarında özel davranış gerektirir.
CAD97'de

3
@ CAD97 Büyük harf kullanımı ile ilgili kurallar Alıntı değil, iki kurşun noktasıdır. Ve ilk madde işareti, “İlk ve son sözcük büyük harfle yazılır” der. ikincisi ise, ilk ve son kelimelerin her zaman büyük harfle yazıldığı anlamına gelir.
Laikoni

Bunu bir şekilde özledim. Yine de açıkladığınız için teşekkürler.
CAD

Her kelimenin en az bir harf içerdiğini belirtmenin gerçekten gerekli olduğundan emin değilim. :)
David Conrad

Yanıtlar:


11

Python 2, 118 bayt

Bak ma, regex yok!

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("'"),

Giriş, tırnak içine alınmalıdır. Çıktıda sonda boşluk var ve sonda yeni bir satır yok (Sanırım sorun yok). İdeone'deki tüm test durumlarını doğrulayın .

açıklama

Girdiyi a or anörnek olarak alalım.

Python 2'nin kullanılması `x`için kısayol reprbiz tek tırnak içinde giriş sarın: 'a or an'. Sonra boşlukları ayırırız ve kelimeleri tekrar ederiz.

Döngü içinde repr tekrar alırız . İlk ve son sözler için, bu verir "'a"ve "an'". Başka bir deyişle, verir 'or'. İkinci desene uyuyorlarsa ve kısa kelimeler listesindeyse kelimeleri büyük harf kullanmaktan kaçınmak istiyoruz. Böylece, kelime listesini dize olarak temsil edebilir "'a'an'...'up'"ve reprherhangi bir kısa kelimenin bir alt dize olacağını biliriz .

`w` in "..."Listeye endeksleme amaçları için 0ya da gibi davranabileceğimiz bir boolean değeri verir . Kısacası, baştaki, sonunda veya kısa sözcükler listesinde değilse sözcüğü başlıkta kullanırız. Aksi takdirde, onu yalnız bırakırız. Neyse ki, hala giriş gibi beklendiği gibi çalışıyor .1[w.title(), w]title()'a

Son olarak, kelimeden tek tek tırnakları çıkarır ve sonunda boşluk yazarız.


8

05AB1E , 68 61 bayt

Adnan sayesinde 7 bayt kaydedildi

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

Çevrimiçi deneyin!

açıklama

“a€¤€€€›€‹€‡€†€‚€‰€„€¾€ƒ€œ€³€—š¯“, olarak çevrilmiş bir sözlük dizesidir 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
Tamamen farkedilmeyen karakterlerden oluşan kısa bir dize ile elde etmeyi başardığınızın beni şaşırtmasından asla vazgeçmiyor. Öyleyse işe yarıyor gibi görünüyor :) +1
ElPedro

Bah! Çok yakınım ve bir karakteri tıraş etmenin bir yolunu bulamıyorum.
mbomb007

@ mbomb007: Jelly, MATL ya da fonksiyonları indekslere uygulayabilen başka bir dil gelmeden önce acele etse iyi gelir :) :) Sıkıştırılmış regex içeren bir dili hatırlıyor gibiyim ama ne dendiğini hatırlayamıyorum. Bu, hala golf oynayabilecek kadar uzun.
Emigna

1
İçin 62 bayt :)
Adnan

@Adnan: Öyle başladım ama sadece 3 karakterli kelimelerle (daha uzun sona erdi), ancak 2 karakterli kelimeleri de almayı düşünmedim ... ... ek bir bayt kurtarması ayerine ... €…onunla :) Teşekkürler!
Emigna

7

GNU sed 81 74 73 Bayt

-R için +1 içerir

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

İlk satır, her kelimenin ilk harfini büyük harf yapar. İkincisi, tüm gerekli kelimeleri küçük harflere geri döndürür.

Çevrimiçi Deneyin!


6

Retina, 69 66 bayt

Her kelimenin ilk harfini büyük harfle yazıp, ilk veya son kelime değilse, seçili kelimeleri küçük harf olarak değiştirin. Son satırın sonunda bir boşluk var.

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

Çevrimiçi deneyin

Bu aynı zamanda .ilk boşluk yerine de çalışır .

Aynı uzunlukta birçok regex var, ama artık kesmenin bir yolunu bulamıyorum ...


(Bu yaklaşım +
Pip'de

@DLosc Teşekkürler. Bunu neden göremediğimi anladım. Yaklaşmıştım.
mbomb007

3

JavaScript (ES6), 141 138 135 133 bayt

Mbomb007 sayesinde 3 bayt kurtardı

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

Test durumları


3

Jöle , 58 bayt

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

TryItOnline!veya tüm testleri çalıştırın

Nasıl?

Kelimeleri ayıran boşlukları olan sıkıştırılmış bir dize, 47bayt olur, maliyetlerini böler1 bayt için48 .

Uzunluk kelimelerinin birbirinden ayrılmamış iki sıkıştırılmış dizgisi 2ve 3(birinin sonunda 'a' varken), her biri bölmek için 40artı bayt 2ve145 bayt için birleştirmektir .

Aşağıda tarif edildiği gibi bir baz 250 numarası 32byte, daha sonra 326 tabanına 3dönüştürmek, küçük harfli alfabeye endekslemek ve3 kullanılmayan karakterine bölmek 'z'için, 41bayt.

Öyleyse, kelimelerin büyük harfle yazılmaması için aranan:
“Ð/ṃƇ¬þṄẊƙ€,⁽ṙƬ®OṪJ"ɦ3×kf3Ṙç%ġu’
:

Bu sözleri alın ve bir ayırıcı ile onlara katılın:
s="a an the at by for in of on to up and as but or nor"

Sonraki etiket 'a'olarak 1, 'b'olarak 2ayırıcı olarak sahip 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]

Bunu bir temel 26sayıya dönüştürün (kullanılan son harf 'y'artı ayırıcı için bir rakamdır, bunun için Python kodu:
n=sum(v*26**i for i,v in enumerate(x[::-1]))

Bunu bir baz 250numarasına dönüştürün (rakamlar için bir liste kullanarak):

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]

Jelly'in kod sayfasındaki bu indekslerdeki karakterleri araştırın:

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

(not: asıl uygulama iki taraflı olduğu için, ilk bönce bir 0rakamın girmesi gerekecekse)

Geri kalan:

ḲŒ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 Bayt

@Titus tarafından kaydedilen 10 Bayt

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

Önceki sürüm PHP, 174 Bayt

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

Döngüde yankılanma 10 bayt kazandırır:foreach(...)echo" "[!$k],(condition)?$v:ucfirst($v);
Titus

2

TI-Basic, 295 + 59 + 148 = 502 bayt

Şimdi hesap makinenizi aktifleştirebilirsiniz. Okul için harika :)

Ana Program, 295 bayt

Temel olarak, hepsi çok uygun kelimeleri hile Aolmazlar agibi değiştirin boşluklarla içine etmektir " A "ile " a ". Bu aynı zamanda otomatik olarak onu yapar, böylece ilk ve son sözcüklerin büyük harfle kalmaları gerekir, çünkü her iki tarafta da bir boşlukları yoktur ve bu nedenle kelimelerin hiçbiriyle eşleşmezler. (Genius, doğru mu? Ve süper uzun çünkü küçük harfler her biri iki bayt ...)

"("+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

Alt program ( prgmQ), 59 bayt:

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

Alt program ( prgmR), 148 bayt:

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 ~belirteci temsil eder 0x81ve belirteci @temsil eder 0x7F, burada daha fazla bilgi edinin .


2

Java 7, 271 259 258 bayt

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 ve test kodu:

Burada dene.

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

Çıktı:

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

Büyük, 131 129

Carusocomputing sayesinde iki bayt kurtarıldı

{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()}

Güzel, 137 yaşındaydım; sen kazandın. Çıkarın i->ve it2 bayt kaydetmek için kullanın . {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()}
Magic Octopus Urn

1
Groovy'yi tanımıyorum ama bu gerçekten ilk ve son kelimeyi büyük harf yapıyor mu?
Emigna

@Emigna son büyük harflerden birini kelimelerle başlayan kapsar.
Magic Octopus Urn

@Emigna gerçekten değil, bu şartı kaçırdım (bu son kelimenin büyük harfle yazılması gerekiyor). Telesekreteri ayarlamam gerekecek.
Krzysztof Atłasik

İki kullanım .capitalize()çok bayt alır. Takma ad yapmanın kısa bir yolu var mı .capitalize()?
Cyoce

1

C #, 305 bayt

İyileştirme için oda çok hala ama işte gitmek:

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

Ruby, 123 117 111 102 bayt

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

Tüm düzenlemeler için özür dilerim - bu sonuncusu olmalı.


1

Python, 177 bayt

Bayt tasarruf amacıyla fonksiyon formatında teslim edilir. Bu, özellikle rekabetçi bir cevap değildir, ancak gerektirmeyen repr()veya regexkandırmaya gerek duymayan bir cevaptır . Aynı zamanda versiyon-agnostiktir; Python 2 veya 3 ile çalışır.

Her ne kadar belki de kurallara uygun bir çözüm.

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 bayt

<?=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]));

Bir birleşme user59178's ve mbomb007's cevap.

her kelimenin ilk harfini büyük harf, daha sonra boşluklarla çevrili listedeki tüm kelimeleri küçük harflerle harcar.
Ne yazık ki, geri arama tam sette çalışmak zorundadır; bu 29 bayta mal olur.


işe yaramaza an and as at but by for in nor of on or the to up
Jörg Hülsermann 28:16

1

Raket 353 bayt

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

Test yapmak:

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

Çıktı:

"The Rule of Thumb for Title Capitalization"

1

Java 7, 431 317 311 bayt

114 byte için @KevinCruijssen 'e teşekkürler . 6 bayt
tasarrufu için @RosLup'a teşekkürler .

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 baytın üzerindeki ilk cevap

 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
Bir yorumda özetlemek çok fazlaydı, ancak bunu golf oynayabilirsiniz: 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 bytes ) Bir dahaki sefere ipuçları olarak neleri değiştirdiğime bir göz atmanızı öneriyorum. :) PS: Farklı bir yaklaşımla ( 259 byte ) bir cevap yolladım .
Kevin Cruijssen

1
Özellikle c.substring(0,1).toUpperCase()+c.substring(1,c.length())+" "iki kez yaptığınız şeyler , bir şekilde yeniden kullanmayı düşünmenizi sağlamalıdır. Ve sizin gibi birleştirilmiş ilklendirmelerleint , ancak bir nedenden dolayı değil String. Ayrıca, 0 veya 1 booleanolarak saklayabildiğiniz zaman ekstraya gerek yoktur intve ardından kontrol edebilirsiniz >0. Ve parantezlerden ve breakmümkün olduğunca kaçınmaya çalışırdım ; Genelde for(f=0;f<b.length;z=c.equals(b[f++])|z>0?1:0);gösterdiğim gibi onlardan kurtulmak için bir hile var . :)
Kevin Cruijssen

1
Her zaman yardımcı olmak için öğrenmek ve teşekkür çok (çok yaşa Nederland;)
Numberknot

1
Oh, bir kopyala yapıştır hatası yaptım .. Bu olmalı 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;}ve Hiç sorun değil. :) Ayrıca kod golfüne yeni başladığımda çok şey öğrendim. Sadece her genel kod öğütücünün ipucunu içeren bir liste hazırlıyorum. Ama kodum hala diğerleri tarafından golf ediliyor.
Kevin Cruijssen

1
B dizesinde [] 2 'vardır ve' tamam mı?
RosLuP

1

PHP, 117 118 112 bayt

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

Davranışını kullanır ucwords() boşluklarla çevrili ilgili sözcüklerden kaçar sonra kaçış karakterlerini siler.

Kopyaladım (a[snt]?|and|[fn]or|up|by|but|the|to|in|o[rnf])Jörg Hülsermann'ın cevabını ancak yaklaşım tamamen farklı olduğu için ayrı bir cevap olarak gönderiyorum.

düzenleme: hata Titus tarafından fark, sabitleme maliyeti 1 bayt. ayrıca: 6 bayt strtr hakkındaki faydalı yorumu sayesinde kaydedildi


strtrBunun yerine 6 bayt kaydedin str_replace. Veya kelimeleri ile hazırlayın <>ve bırakın the str_replaceve HTML çıktısını kullanın.
Titus,

Bazı durumlarda preg_filteryerine kullanabilirsiniz preg_replace. Ben senin çözüm ile denemek değil
Jörg Hülsermann

Düzenli ifade, art arda listeden iki kelime için çalışmaz; Test nice try for a start. Boşluklardan birini bir iddia ile değiştirmek bunu (+4 byte) çözer.
Titus

Maalesef test durumunda preg_filterbaşarısız olacak ve titlehiçbir şey döndürmeyecekti.
user59178

1

Saf bash - 253

(çağrılan harici program yok) - bash v4'e ihtiyaç duyuyor

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

yorumlar ile normal görünüm

#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

çıktı

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

Japt , 71 bayt

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

Çevrimiçi deneyin!

Açıklama:

£`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

En sevdiğim Japt özelliklerinden biri shoco kütüphanesini kullanan dizge sıkıştırması .

Bir dizeyi sararak sıkıştırın Oc"{string}"Oc"a an the at by for in of on to up and as but or nor"

Ardından backticks ile açın veya Od"{compressed string}"Od"a e by f up d ¿t n"


-SBu meydan okuma yayınlanmıştır sonra geçerli çözüm olmayan rekabet yani bayrak, eklenmiştir. Ancak, £...+XÅ}Saynı bayt sayısı için rekabet edebilecek olanı yapabileceğinizi düşünüyorum ( Çevrimiçi deneyin! )
ETHproductions

Shoco, Jelly'in sözlük sıkıştırma ile nasıl karşılaştırıldığını düşünüyorsunuz?
Robert Fraser

@RobertFraser Jelly karşılaştırıldığında, İngilizce kelime dizeleri sıkıştırarak çok iyi değil, ama olduğu kullanışlı bazen geliyor keyfi küçük harfler, dizeleri sıkıştırarak çok iyi.
ETHproductions

1

Saf bash - 205 192 181 bayt

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
}

Gibi jm66 cevabı tc standart girişini kabul eder.


0

Aslında , 79 bayt

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

Çevrimiçi deneyin!

Açıklama:

' ,ÿ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

Toplu iş, 323 bayt

@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%

Yorumlarla:

@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%
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.