Laut dieser Site ist eine allgemeine Regel, die vom US Government Printing Office Style Manual empfohlen wird
Großschreibung aller Wörter in Titeln von Veröffentlichungen und Dokumenten, mit Ausnahme von a, an, at, by, for, in, on, to, up und as, but, or, and nor.
Dies mag nicht zutreffen, da ich eine solche Empfehlung im Style-Handbuch nicht finden kann , aber verwenden wir diese Regel trotzdem.
Die Herausforderung
Bei einer Eingabezeichenfolge, die aus durch Leerzeichen getrennten Wörtern in Kleinbuchstaben besteht, wird die Groß- und Kleinschreibung der Zeichenfolge gemäß den folgenden Regeln ausgegeben
- Das erste und letzte Wort wird in Großbuchstaben geschrieben.
- Alle anderen Worten werden aktiviert, mit der Ausnahme ein , ein , die , an , von , für , in , der , auf , zu , auf , und , wie , aber , oder , und noch .
Die Eingabezeichenfolge enthält mindestens ein Wort und jedes Wort enthält mindestens einen Buchstaben und nur Zeichen von a
bis z
.
Dies ist eine Code-Golf-Herausforderung. Versuchen Sie daher, so wenig Bytes wie möglich in der Sprache Ihrer Wahl zu verwenden. Sie können ein vollständiges Programm oder eine Funktion schreiben, um die Aufgabe zu erfüllen.
Testfälle
"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"
Antworten:
Python 2, 118 Bytes
Schau ma, kein Regex!
Die Eingabe muss in Anführungszeichen gesetzt werden. Die Ausgabe enthält ein Leerzeichen und keine Zeilenumbrüche (ich gehe davon aus, dass das in Ordnung ist). Überprüfen Sie alle Testfälle auf Ideone .
Erläuterung
Nehmen wir die Eingabe
a or an
als unser Beispiel.Mit Python 2 der
`x`
Abkürzung fürrepr
, wickeln wir die Eingabe in einfachen Anführungszeichen:'a or an'
. Dann teilen wir uns Leerzeichen auf und iterieren über die Wörter.Innerhalb der Schleife nehmen wir das
repr
nochmal . Für das erste und letzte Wort ergibt dies"'a"
und"an'"
. Mit anderen Worten, es gibt'or'
. Wir möchten vermeiden, Wörter in Großbuchstaben zu schreiben, wenn sie zu dem letztgenannten Muster passen und in der Liste der Kurzwörter enthalten sind. So können wir die Wortliste als Zeichenfolge darstellen"'a'an'...'up'"
und wissen, dass dierepr
eines kurzen Wortes eine Teilzeichenfolge ist.`w` in "..."
gibt einen booleschen Wert an, den wir als0
oder1
zum Indizieren in die Liste behandeln können[w.title(), w]
. Kurz gesagt, wir schreiben das Wort als Titel, ob es am Anfang, am Ende oder nicht in der Liste der Kurzwörter steht. Ansonsten lassen wir es in Ruhe. Zum Glücktitle()
klappt das mit Eingaben wie erwartet immer noch'a
.Schließlich entfernen wir einzelne Anführungszeichen aus dem Wort und drucken sie mit einem Leerzeichen nach.
quelle
05AB1E ,
6861 Bytes7 Bytes gespart dank Adnan
Probieren Sie es online!
Erläuterung
“a€¤€€€›€‹€‡€†€‚€‰€„€¾€ƒ€œ€³€—š¯“
ist eine Wörterbuchzeichenfolge übersetzt alsa an the at by for in of on to up and as but or nor
.quelle
a
anstatt€…
ein zusätzliches Byte zu speichern, wenn der Vorsprung von damit :) Danke!GNU sed
81 7473 BytesBeinhaltet +1 für -r
In der ersten Zeile wird der erste Buchstabe jedes Wortes groß geschrieben. Die zweite Option schaltet alle erforderlichen Wörter auf Kleinbuchstaben zurück.
Probieren Sie es online!
quelle
Retina,
6966 BytesSchreiben Sie den ersten Buchstaben jedes Wortes in Großbuchstaben und ändern Sie die ausgewählten Wörter in Kleinbuchstaben, wenn sie nicht das erste oder letzte Wort sind. Am Ende der letzten Zeile steht ein Leerzeichen.
Probieren Sie es online aus
Dies funktioniert auch mit einem
.
anstelle des ersten Leerzeichens.Es gibt viele reguläre Ausdrücke mit der gleichen Länge, aber ich kann sie nicht mehr zuschneiden ...
quelle
+
Trick nicht verwenden , um es zu verkürzen.)JavaScript (ES6),
141138135133 Bytes3 Bytes gespart dank mbomb007
Testfälle
Code-Snippet anzeigen
quelle
Jelly , 58 Bytes
TryItOnline! oder führen Sie alle Tests durch
Wie?
Eine komprimierte Zeichenfolge mit Leerzeichen, die die Wörter trennen
47
, ist1
byteweise und kostet Byte für48
Byte.Zwei nicht getrennte komprimierte Zeichenfolgen der Wörter der Länge
2
und3
(mit einem 'a' am Ende von einem) wären40
Bytes plus2
, um jedes zu teilen und1
sie für45
Bytes zu verbinden.Eine Basis-250-Zahl, wie unten beschrieben, besteht aus
32
Bytes, um sie dann3
in Basis-26 umzuwandeln,3
in das Kleinbuchstaben-Alphabet zu indizieren und3
auf das nicht verwendete Zeichen'z'
für41
Bytes aufzuteilen .Die Suche nach Wörtern, die nicht in Großbuchstaben geschrieben werden sollen,
“Ð/ṃƇ¬þṄẊƙ€,⁽ṙƬ®OṪJ"ɦ3×kf3Ṙç%ġu’
sah folgendermaßen aus:
Nimm diese Wörter und verbinde sie mit einem Trennzeichen:
s="a an the at by for in of on to up and as but or nor"
Nächstes Label
'a'
als1
,'b'
wie2
beim Separator als0
:Wandle dies in eine Basiszahl um
26
(der letzte verwendete Buchstabe ist'y'
plus eine Ziffer für das Trennzeichen, der Python-Code dafür ist:n=sum(v*26**i for i,v in enumerate(x[::-1]))
Wandle das in eine Basiszahl um
250
(benutze eine Liste für die Ziffern):Suchen Sie die Zeichen in diesen Indizes in Jellys Codepage:
(Anmerkung: Da die tatsächliche Umsetzung bijektiv ist, wenn
b
alle haben0
Ziffern müßte man zuerst herunterzuzutragen)Der Rest:
quelle
PHP, 158 Bytes
10 Bytes von @Titus gespeichert
Vorherige Version PHP, 174 Bytes
quelle
foreach(...)echo" "[!$k],(condition)?$v:ucfirst($v);
TI-Basic, 295 + 59 + 148 = 502 Bytes
Jetzt können Sie Ihren Taschenrechner nutzen. Ideal für die schule :)
Hauptprogramm, 295 Bytes
Grundsätzlich ist der Trick , um passende Worte , so dass alle
A
werden nichta
mit Leerzeichen umschließen, wie ersetzen" A "
mit" a "
. Dies bewirkt auch automatisch, dass das erste und das letzte Wort in Großbuchstaben geschrieben bleiben, da sie auf beiden Seiten kein Leerzeichen enthalten und daher mit keinem der Wörter übereinstimmen. (Genie, richtig? Und super lang, weil Kleinbuchstaben jeweils zwei Bytes sind ...)Unterprogramm (
prgmQ
), 59 Bytes:Unterprogramm (
prgmR
), 148 Bytes:PS steht
~
für Token0x81
und@
stellt Token dar0x7F
. Weitere Informationen finden Sie hier .quelle
Java 7,
271259258 BytesUngolfed & Testcode:
Probieren Sie es hier aus.
Ausgabe:
quelle
Groovy,
131129Zwei Bytes gespart dank Carusocomputing
quelle
i->
und verwenden Sieit
, um 2 Bytes zu speichern.{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()}
.capitalize()
verbrauchen eine Menge Bytes. Gibt es einen kurzen Weg, zu dem Sie einen Alias erstellen können.capitalize()
?C #, 305 Bytes
Es gibt noch viel Raum für Verbesserungen, aber los geht's:
quelle
Rubin,
123117111102 BytesEntschuldigung für alle Änderungen - dies sollte die letzte sein.
quelle
Python, 177 Bytes
Wird im Funktionsformat zum Speichern von Bytes geliefert. Dies ist keine besonders wettbewerbsfähige Antwort, aber es ist eine, die
repr()
oder nicht erfordertregex
trickreich ist. Es ist auch versionsunabhängig; es funktioniert mit Python 2 oder 3.Obwohl es vielleicht eine sehr regelkonforme Lösung ist.
quelle
PHP,
109142 BytesEine Fusion von user59178´s und mbomb007´s Antwort.
setzt den ersten Buchstaben jedes Wortes in Großbuchstaben und alle Wörter der Liste in Kleinbuchstaben, die von Leerzeichen umgeben sind.
Leider muss der Rückruf auf dem kompletten Satz funktionieren; das kostet 29 bytes.
quelle
a an and as at but by for in nor of on or the to up
Schläger 353 Bytes
Ungolfed:
Testen:
Ausgabe:
quelle
Java 7,
431 317311 BytesDanke an @KevinCruijssen für 114 Bytes.
Vielen Dank an @RosLup für das Speichern von 6 Bytes.
ungolfed
erste Antwort über 250 Bytes
quelle
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 ) Ich schlage vor, einen Blick darauf zu werfen, was ich als Tipps für das nächste Mal geändert habe. :) PS: Ich habe eine Antwort mit einem anderen Ansatz gepostet ( 259 Bytes ).c.substring(0,1).toUpperCase()+c.substring(1,c.length())+" "
die Sie zweimal gemacht haben, sollten Sie darüber nachdenken, sie irgendwie wiederzuverwenden. Und kombinierte Initialisierungen wie Sie richtig mit demint
, aber aus irgendeinem Grund nicht mit demString
. Außerdem ist das Extra nicht erforderlich,boolean
wenn Sie es alsint
0 oder 1 speichern und dann überprüfen können>0
. Und ich würde versuchen, Klammern undbreak
so viel wie möglich zu vermeiden ; Normalerweise gibt es einen Trick, um sie loszuwerden, wiefor(f=0;f<b.length;z=c.equals(b[f++])|z>0?1:0);
ich es gezeigt habe. :)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;}
und kein Problem. :) Ich habe auch viel gelernt, als ich noch nicht mit Code-Golfen vertraut war. Ich erstelle einfach eine Liste mit jedem allgemeinen Codegolf-Tipp, den ich lerne und schaue / aktualisiere es manchmal. Aber mein Code wird immer noch viel von anderen gespielt.PHP,
117118112 BytesBenutzt das Verhalten von
ucwords()
der relevanten Wörter, die von Leerzeichen umgeben sind, und escape-Zeichen und löscht die Escape-Zeichen.Ich habe das kopiert
(a[snt]?|and|[fn]or|up|by|but|the|to|in|o[rnf])
Antwort von Jörg Hülsermann , aber da der Ansatz völlig anders ist, veröffentliche ich sie als separate Antwort.edit: Fehler, der von Titus bemerkt wurde und 1 Byte gekostet hat. auch: 6 Bytes gespart dank seines hilfreichen Kommentars zu strtr
quelle
strtr
anstelle vonstr_replace
. Oder stellen Sie den Wörtern voran<>
und löschenthe str_replace
und verwenden Sie die HTML-Ausgabe.preg_filter
anstelle von verwendenpreg_replace
. Ich habe es mit deiner Lösung nicht versuchtnice try for a start
. Das Ersetzen eines der Leerzeichen durch eine Zusicherung löst das (+4 Bytes).preg_filter
Würde leider amtitle
Testfall scheitern und nichts zurückgeben.Pure
bash
- 253(keine externen Programme aufgerufen) - benötigt bash v4
normale Ansicht mit Kommentaren
Ausgabe
quelle
Japt , 71 Bytes
Probieren Sie es online!
Erläuterung:
Eine meiner Lieblingsfunktionen von Japt ist die String-Komprimierung, bei der die Shoco-Bibliothek verwendet wird .
Sie können eine Zeichenfolge komprimieren, indem Sie sie in
Oc"{string}"
→ einschließenOc"a an the at by for in of on to up and as but or nor"
Dann mit Backticks oder
Od"{compressed string}"
→ dekomprimierenOd"a e by f up d ¿t n"
quelle
-S
Flagge wurde hinzugefügt, nachdem diese Herausforderung veröffentlicht wurde, sodass Ihre aktuelle Lösung nicht konkurrierend ist. Ich denke jedoch, dass Sie das können£...+XÅ}S
, was im Wettbewerb um die gleichePure
bash
-205192181 BytesWie die Antwort von jm66
tc
akzeptiert die Standardeingabe.quelle
Eigentlich 79 Bytes
Probieren Sie es online!
Erläuterung:
quelle
Batch, 323 Bytes
Mit Kommentaren:
quelle