Zgodnie z tą witryną ogólną zasadą zalecaną przez Podręcznik stylu drukowania biurowego rządu USA jest
Wielkie słowa w tytułach publikacji i dokumentów, z wyjątkiem a, an, the, at, by, in, of, on, up, i, as, ale, lub, i nor.
Może to nie być prawda, ponieważ nie mogę znaleźć takiej rekomendacji w Podręczniku stylu , ale i tak skorzystajmy z tej reguły.
Wyzwanie
Biorąc pod uwagę ciąg wejściowy składający się ze słów pisanych małymi literami oddzielonych spacjami, wypisz wielkość liter ciągu zgodnie z następującymi regułami
- Pierwsze i ostatnie słowo jest pisane wielką literą.
- Wszystkie inne słowa są kapitalizowane, z wyjątkiem , , , na , przez , na , na , na , na , na , góry , i , jak , ale , albo i nie .
Łańcuch wejściowy będzie zawierał co najmniej jedno słowo, a każde słowo zawiera co najmniej jedną literę i tylko znaki od a
do z
.
Jest to wyzwanie polegające na kodzie golfowym, więc spróbuj użyć jak najmniej bajtów w wybranym języku. Możesz napisać pełny program lub funkcję, aby wykonać zadanie.
Przypadki testowe
"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"
Odpowiedzi:
Python 2, 118 bajtów
Spójrz, nie ma wyrażeń regularnych!
Dane wejściowe muszą być ujęte w cudzysłów. Wyjście ma spację końcową i brak spacji nowej linii (zakładam, że jest w porządku). Sprawdź wszystkie przypadki testowe w Ideone .
Wyjaśnienie
Weźmy dane wejściowe
a or an
za nasz przykład.Korzystanie Python 2 za
`x`
skrót dlarepr
, możemy owinąć wejście w apostrofach:'a or an'
. Następnie dzielimy się na białe znaki i powtarzamy słowa.Wewnątrz pętli bierzemy
repr
ponownie . W przypadku pierwszego i ostatniego słowa daje to"'a"
i"an'"
. Innymi słowy, daje'or'
. Chcemy unikać wielkich liter, jeśli pasują do tego ostatniego wzorca i znajdują się na liście krótkich słów. Możemy więc przedstawić listę słów jako ciąg znaków"'a'an'...'up'"
i wiedzieć, żerepr
każde krótkie słowo będzie podłańcuchem.`w` in "..."
daje wartość logiczną, którą możemy traktować jako0
lub1
do celów indeksowania na liście[w.title(), w]
. Krótko mówiąc, w tytule wpisujemy słowo, jeśli znajduje się na początku, na końcu lub nie ma go na liście krótkich słów. W przeciwnym razie zostawiamy to w spokoju. Na szczęścietitle()
nadal działa zgodnie z oczekiwaniami z danymi wejściowymi takimi jak'a
.Na koniec usuwamy wszystkie pojedyncze cytaty ze słowa i drukujemy je z końcową spacją.
źródło
05AB1E ,
6861 bajtówZaoszczędzono 7 bajtów dzięki Adnan
Wypróbuj online!
Wyjaśnienie
“a€¤€€€›€‹€‡€†€‚€‰€„€¾€ƒ€œ€³€—š¯“
to ciąg słownika przetłumaczony jakoa an the at by for in of on to up and as but or nor
.źródło
a
zamiast€…
oszczędzać dodatkowy bajt, jeśli wiodący z tym :) Dzięki!GNU sed
81 7473 bajtówObejmuje +1 za -r
Pierwszy wiersz zawiera wielką literę pierwszej litery każdego słowa. Drugi przełącza wszystkie wymagane słowa z powrotem na małe litery.
Wypróbuj online!
źródło
Retina,
6966 bajtówWielką literę każdego słowa używaj wielkiej litery, a następnie zmień wybrane słowa na małe, jeśli nie są to pierwsze lub ostatnie słowo. Na końcu ostatniej linii jest spacja.
Wypróbuj online
Działa to również z
.
pierwszą spacją.Istnieje wiele wyrażeń regularnych o tej samej długości, ale nie mogę już znaleźć sposobu na ich przycięcie ...
źródło
+
sztuczki, aby je skrócić.)JavaScript (ES6),
141138135133 bajtówZaoszczędzono 3 bajty dzięki mbomb007
Przypadki testowe
Pokaż fragment kodu
źródło
Galaretka , 58 bajtów
TryItOnline! lub uruchom wszystkie testy
W jaki sposób?
Skompresowany ciąg znaków ze spacjami oddzielającymi słowa to
47
bajty, których podział kosztuje1
bajt dla48
bajtów.Dwa nieseparowane skompresowane ciągi słów długości
2
i3
(z literą „a” na końcu jednego) byłyby odpowiednio40
bajtami plus,2
aby je podzielić i1
połączyć,45
tworząc bajty.Jedna podstawowa liczba 250, jak opisano poniżej, to
32
bajty, a następnie3
konwersja do bazy 26,3
indeksowanie do małego alfabetu i3
dzielenie go na nieużywany znak'z'
, dla41
bajtów.Wyszukiwanie słów, które nie powinny być pisane dużymi literami:
“Ð/ṃƇ¬þṄẊƙ€,⁽ṙƬ®OṪJ"ɦ3×kf3Ṙç%ġu’
powstało w następujący sposób:
Weź te słowa i połącz je za pomocą separatora:
s="a an the at by for in of on to up and as but or nor"
Następna etykieta
'a'
jako1
,'b'
jak2
w przypadku separatora jako0
:Konwertuj to na
26
liczbę podstawową (ostatnia użyta litera jest'y'
plus cyfra dla separatora, kod Pythona to:n=sum(v*26**i for i,v in enumerate(x[::-1]))
Przekształć to w
250
numer podstawowy (używając listy cyfr):Wyszukaj znaki w tych indeksach na stronie kodowej galaretki:
(uwaga: ponieważ faktyczna implementacja jest bijectywna, gdyby
b
miał jakieś0
cyfry, trzeba by je najpierw wykonać)Reszta:
źródło
PHP, 158 bajtów
10 bajtów zapisanych przez @Titus
Poprzednia wersja PHP, 174 bajtów
źródło
foreach(...)echo" "[!$k],(condition)?$v:ucfirst($v);
TI-Basic, 295 + 59 + 148 = 502 bajtów
Teraz możesz wykorzystać swój kalkulator. Idealne do szkoły :)
Program główny, 295 bajtów
Zasadniczo, sztuczka polegająca na dopasowywaniu słów, tak aby wszystko
A
się nie stało,a
polega na umieszczeniu w nich spacji, takich jak zamień" A "
z" a "
. To również automatycznie powoduje, że pierwsze i ostatnie słowa pozostają wielkimi literami, ponieważ nie mają spacji po obu stronach, a zatem nie pasują do żadnego ze słów. (Genialne, prawda? I bardzo długie, ponieważ małe litery to dwa bajty każdy ...)Podprogram (
prgmQ
), 59 bajtów:Podprogram (
prgmR
), 148 bajtów:PS
~
reprezentuje token0x81
i@
reprezentuje token0x7F
, dowiedz się więcej tutaj .źródło
Java 7,
271259258 bajtówKod niepoznany i testowy:
Wypróbuj tutaj.
Wydajność:
źródło
Groovy,
131129Dwa bajty zaoszczędzone dzięki carusocomputing
źródło
i->
i użyj,it
aby zapisać 2 bajty.{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()
zajmują dużo bajtów. Czy istnieje krótki sposób na utworzenie aliasu.capitalize()
?C #, 305 bajtów
Wciąż dużo miejsca na ulepszenia, ale proszę bardzo:
źródło
Ruby,
123117111102 bajtówPrzepraszamy za wszystkie zmiany - powinna to być ostatnia.
źródło
Python, 177 bajtów
Dostarczone w formacie funkcji do celów zapisywania bajtów. To nie jest szczególnie konkurencyjna odpowiedź, ale taka, która nie wymaga
repr()
aniregex
oszustwa. Jest także niezależny od wersji; działa z Python 2 lub 3.Chociaż jest to być może rozwiązanie bardzo zgodne z zasadami.
źródło
PHP,
109142 bajtówPołączenie odpowiedzi user59178 i mbomb007 .
wielkie litery pierwsza litera każdego słowa, następnie małe litery wszystkich słów z listy otoczone spacjami.
Niestety, wywołanie zwrotne musi działać na całym zestawie; kosztuje to 29 bajtów.
źródło
a an and as at but by for in nor of on or the to up
Rakieta 353 bajtów
Nie golfowany:
Testowanie:
Wydajność:
źródło
Java 7,
431 317311 bajtówDzięki @KevinCruijssen za 114 bajtów.
Dzięki @RosLup za zapisanie 6 bajtów.
bez golfa
pierwsza odpowiedź powyżej 250 bajtów
źródło
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 bajtów ) Sugeruję przyjrzeć się temu, co zmieniłem jako wskazówki na następny raz. :) PS: Wysłałem odpowiedź z innym podejściem ( 259 bajtów ).c.substring(0,1).toUpperCase()+c.substring(1,c.length())+" "
które zrobiłeś dwa razy, powinny sprawić, że pomyślisz o ponownym użyciu. I połączone inicjalizacje, jak zrobiłeś poprawnie zint
, ale z jakiegoś powodu nie zString
. Nie trzeba też dodawać,boolean
kiedy można zapisać jakoint
0 lub 1, a następnie sprawdzić>0
. I starałbym się unikać nawiasów ibreak
jak najwięcej; zazwyczaj istnieje pewien sposób, aby się ich pozbyć, tak jakfor(f=0;f<b.length;z=c.equals(b[f++])|z>0?1:0);
pokazałem. :)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;}
i nie ma problemu. :) Dużo się też nauczyłem, kiedy byłem nowym golfistą. Po prostu tworzę listę z każdą ogólną wskazówką dla kodegolfa, której się uczę i czasem ją szukam / aktualizuję. Ale mój kod wciąż bardzo lubi golfiści.PHP,
117118112 bajtówWykorzystuje zachowanie
ucwords()
odpowiednich znaków otoczonych spacjami i unika ich, a następnie usuwa znaki specjalne.Skopiowałem
(a[snt]?|and|[fn]or|up|by|but|the|to|in|o[rnf])
Jörga Hülsermanna, ale ponieważ podejście jest zupełnie inne, zamieszczam ją jako osobną odpowiedź.edycja: błąd zauważony przez Tytusa, naprawienie kosztuje 1 bajt. także: 6 bajtów zapisanych dzięki jego pomocnemu komentarzowi na temat strtr
źródło
strtr
zamiaststr_replace
. Lub dodaj słowa za pomocą<>
i upuśćthe str_replace
i użyj danych wyjściowych HTML.preg_filter
zamiastpreg_replace
. Nie próbowałem tego z twoim rozwiązaniemnice try for a start
. Zastąpienie jednego ze spacji twierdzeniem rozwiązuje ten problem (+4 bajty).preg_filter
zawiedzie wtitle
przypadku testowym, nic nie zwracając.Czysty
bash
- 253(bez wywoływania zewnętrznych programów) - wymaga bash v4
normalny widok z komentarzami
wydajność
źródło
Japt , 71 bajtów
Wypróbuj online!
Wyjaśnienie:
Jedną z moich ulubionych funkcji Japt jest kompresja ciągów znaków, która korzysta z biblioteki shoco .
Możesz skompresować ciąg, zawijając go w
Oc"{string}"
→Oc"a an the at by for in of on to up and as but or nor"
Następnie dekompresuj go za pomocą strzałek wstecznych lub
Od"{compressed string}"
→Od"a e by f up d ¿t n"
źródło
-S
Flaga została dodana po to wyzwanie zostało wysłane, więc obecne rozwiązanie jest zakaz konkurowania. Myślę jednak, że możesz to zrobić£...+XÅ}S
, co konkurowałoby o tę samą liczbę bajtów ( wypróbuj online! )Czysty
bash
-205192181 bajtówPodobnie jak odpowiedź jm66
tc
akceptuje standardowe dane wejściowe.źródło
Właściwie 79 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
Partia, 323 bajty
Z komentarzami:
źródło