Łańcuch wielkich liter

18

Biorąc pod uwagę ciąg, wielkie litery. Przez wielkie litery mam na myśli conTeNT-lENgthzmiany w Content-Length. W przykładzie pokazałem ciąg z 2 wyrazami z -jako granicą słowa. Jednak oczekuję, że napiszesz kod dla ciągu zawierającego dowolną liczbę słów oddzielonych pojedynczym znakiem jako granicę. Granica ta może się zmieniać w całym ciągu.

Warunki

  1. używanie nieregular expressions jest dozwolone .
  2. w zdaniu (łańcuchu) może znajdować się dowolna liczba słów.
  3. każde słowo będzie się składać z Englishliter [a-zA-Z]dowolnego przypadku.
  4. różne słowa w zdaniu zostaną oddzielone pojedynczym znakiem. Postać ta będzie tylko być jednym z -, ., <space-character>, /, &, #. Możesz bezpiecznie założyć, że zdanie nie będzie zawierało żadnej innej postaci oprócz wymienionych.
  5. na wyjściu należy zachować granice słów.
  6. najkrótszy kod wygrywa.

Na przykład program powinien wypisać Begin/With.Type&Contentna BeGin/wITH.tyPE&conTeNt.

Some test cases:
 "aGeNT ACcEpT/LEngTh-tYPe USeR raNgE.TyPe" 
 "type&AgeNt/CC/COnteNt lEnGth#acCePT/AgeNt.RAnGe-Cc/contEnt/cODe" 
 "cc/rEspoNCe.lEngtH#tYpE-witH&UsEr/bEgIN&uSer.AGEnT&begIn/aCCEPt/Cc" 
 "lENgTH#USeR.tYpE/BeGiN&LENGth tYpe/ACCEpt#rANge/codE&AnD-ACCepT/ConTenT" 
 "contENT/ACcEpT" 
 "BeGin/wITH.tyPE&conTeNt"
 "Code.cc#User.lenGTh-USer-AND&tyPE TypE&leNgtH.tYPe usER.UseR&with" 
 "RaNgE&COnTeNT WITh CoNTENT-TypE tyPe"
 "BEgin COdE#uSeR#aGeNt.USeR"
 "TypE LENGth"
ordynans
źródło
2
To, co nazywasz wielką literą, jest tak naprawdę transformacją do wielbłąda.
Pierre Arlaud,
6
@ArlaudPierre Nie, to, co podaje jako „przypadki testowe”, bardziej przypomina skrzynkę wielbłąda. To, co nazywa się wielką literą, jest bliższe tytułowi.
Iszi
Czy możesz podać oczekiwany wynik dla przypadków testowych? Wydaje się, że niektóre wbudowane funkcje mogą zakładać, że słowa pisane wielkimi literami (jak /CC/w wierszu 2 lub -AND&w wierszu 7) powinny zostać pozostawione same. Czy to w porządku w przypadku tego wyzwania?
Iszi
Czy wprowadzanie zawsze zaczyna się od słowa, czy może zaczyna się od separatora?
lebatsnok

Odpowiedzi:

7

GolfScript, 36 27 19 znaków

0\{95&+.47>32*\}%\;

Całkiem podstawowe podejście do GolfScript, które działa dla wszystkich danych wejściowych zgodnie ze specyfikacją. Przykłady można przetestować online .

Howard
źródło
Chłodny. Byłem ciekawy, czy moje rozwiązanie jest co najmniej dwa razy bardziej profesjonalne. :) Ale jestem pewien, że skrócisz to kilka razy przed końcem dnia.
manatwork
@manatwork Teraz mamy współczynnik dwa ;-) Nadal niezadowolony ze wszystkich swapów.
Howard,
Wiedziałem, że mnie nie zawiedziesz.
manatwork
22

Python 3,22

print(input().title())

Ten kod pobierze ciąg jako dane wejściowe ze standardowego wejścia i przekaże standardowe wyjście na standardowe wyjście.

na przykład:

Wejście:

BEGIN/wITH.tyPe&cOnTENt

wyjście:

Begin/With.Type&Content

Poniższy kod dotyczy wejść wieloliniowych (w razie potrzeby)

Python 3, 46

import sys
for i in sys.stdin:print(i.title())
Czy byłem
źródło
while 1:print(input.title())jest krótszym odpowiednikiem ostatniego fragmentu kodu.
Ramchandra Apte
1
@RamchandraApte Nie jestem pewien, czy jest to dozwolone czy nie. Twój kod umrze z EOFError, gdy tylko trafi do EOF
Wasi
1
Myślę, że ogólny konsensus dla golfów jest taki, że dopóki wyniki są prawidłowe, błędy nie mają znaczenia
Zmienność
Dang; jak tylko zobaczyłem to pytanie, pomyślałem o tym, ale pobiłeś mnie. +1
Justin
+1 Podoba mi się to bardziej niż golfowy, ponieważ nie wygląda to na nieprzyzwoite.
Tim Seguine
6

Mathematica 62

Dane

tests={"aGeNT ACcEpT/LEngTh-tYPe USeR raNgE.TyPe","type&AgeNt/CC/COnteNt lEnGth#acCePT/AgeNt.RAnGe-Cc/contEnt/cODe","cc/rEspoNCe.lEngtH#tYpEwitH&UsEr/bEgIN&uSer.AGEnT&begIn/aCCEPt/Cc","lENgTH#USeR.tYpE/BeGiN&LENGth tYpe/ACCEpt#rANge/codE&AnD-ACCepT/ConTenT","contENT/ACcEpT","BeGin/wITH.tyPE&conTeNt","Code.cc#User.lenGTh-USer-AND&tyPE TypE&leNgtH.tYPe usER.UseR&with","RaNgE&COnTeNT WITh CoNTENT-TypE tyPe","BEgin COdE#uSeR#aGeNt.USeR","TypE LENGth"}

Kod

StringReplace[ToLowerCase@#,WordBoundary~~x_:>ToUpperCase@x]&

Stosowanie

f["aGeNT ACcEpT/LEngTh-tYPe USeR raNgE.TyPe"]

„Agent Accept / Length-Type User Range.Type”

f /@ tests

{„Agent Accept / Length-Type User Range.Type”,
„Type & Agent / Cc / Content Length # Accept / Agent.Range-Cc / Content / Code”, „Cc / Responce.Length # Type-With & User / Begin & User.Agent & Begin / Accept / Cc ”,„ Length # User.Type / Begin & Length Type / Accept # Range / Code & And-Accept / Content ”,„ Content / Accept ”,
„ Begin / With.Type & Content ”,
„ Code.Cc # User.Length-User -A i typ Typ i długość.Typ Użytkownik.Użytkownik i z ”,
„ Zasięg i treść z typem treści ”,
„ Rozpocznij kod # Użytkownik # Agent.User ”,
„ Typ długości ”}

DavidC
źródło
-1 To w zasadzie wyrażenie regularne
CalculatorFeline
Mathematica może uruchamiać wyrażenia regularne bezpośrednio, ale użyłem czegoś innego. Jest podobny do wyrażenia regularnego, ale nie jest wyrażeniem regularnym.
DavidC
%% %%% % %%
CalculatorFeline
6

JavaScript (94)

prompt().split(l='').map(function(a){return l='A'>l?a.toUpperCase():a.toLowerCase()}).join('')
miętówka
źródło
5

PHP: 78 73 65 64 znaków

$b=ucfirst;foreach(str_split($s)as$c)echo$b($c),!$b[0]=$c<A?u:l;

Dane wejściowe są przekazywane $s. Działa na łańcuch jako tablica znaków.

Jest to prosta maszyna 2-stanowa. Opiera się na leksykalnej kolejności ciągów, a parser automatycznie zakłada, że ​​w niektórych przypadkach zamierzałeś wpisać ciąg.

Stan jest zapisywany $bi jest reprezentowany jako nazwa funkcji, którą należy wywołać dla następnego znaku. ucfirsti lcfirstsą krótsze do pisania i mają identyczne zachowanie jak strtolower/ strtoupperna ciągach pojedynczych znaków. Ponadto, ponieważ różnią się tylko jedną literą, możemy je skutecznie wykorzystać do przechowywania stanu. Oryginalna wersja musiała jawnie przechowywać stan w logice.

Ponieważ echo nie wypisuje niczego dla fałszu logicznego, użyłem przecinka i !operatora, aby „ukryć” przypisanie (które w tym przypadku jest prawdziwe) w instrukcji echo. To pozwoliło mi uratować postać poprzez usunięcie {}.

Tim Seguine
źródło
Zamiast kodu wbudowanego użyj znaczników bloku kodu, aby skrypty, takie jak Code Golf UserScript Enhancement Pack, mogły wstawić rozmiar poniżej kodu. Nawiasem mówiąc, w kodzie można usunąć wszystkie 3 znaki spacji.
manatwork
Zamiast $b=ord($c)>64;próbować $b=$c>"@";. Lub nawet $b=$c>=A;- AFAIR, który rzuca ostrzeżenie, ale dobre praktyki kodowania nie są tutaj zaletą.
manatwork
@manatwork dzięki, nie myślałem o tym. I tak już rzucam ostrzeżenie o używaniu zmiennej nieustawionej.
Tim Seguine,
Hmm… Co powiesz na nie używanie $ b tylko jako flagi, ale przechowywanie w nim rzeczywistej nazwy funkcji? $b=ucfirst;foreach(str_split($s)as$c){echo$b($c);$b[0]=$c>=A?l:u;}.
manatwork
@manatwork świetnie! Próbowałem wymyślić sposób, aby to zrobić za pomocą tej funkcji. Moje próby były większe.
Tim Seguine,
4

C, 83

n;main(c){c=getchar();putchar(c>96?n?c:(n=c-32):c&64?n?c+32:(n=c):(n=0,c));main();}

Przyjmuje wiersze stdin, tłumaczy je na stdout. (Preferuje SIGINTsię EOF).

Darren Stone
źródło
4

PowerShell: 37–43

W zależności od tego, jak chcesz wziąć wkład ...

Monituj użytkownika o wprowadzenie: 43

(Culture).TextInfo.ToTitleCase((read-host))

Pobieraj dane z rurociągu: 38

(Culture).TextInfo.ToTitleCase($input)

Podaj dane wejściowe jako argument podczas uruchamiania skryptu: 37

(Culture).TextInfo.ToTitleCase($args)

UWAGA: Powyższe skrypty zignorują słowa pisane wielkimi literami, pozostawiając je bez zmian. Jeśli trzeba to uwzględnić, dane wejściowe należy wymusić pisaniem małymi literami przed konwersją przypadku tytułowego. Dodaje to 10 znaków do pierwszej metody i 12 do pozostałych dwóch.

(Culture).TextInfo.ToTitleCase((read-host).ToLower())
(Culture).TextInfo.ToTitleCase("$input".ToLower())
(Culture).TextInfo.ToTitleCase("$args".ToLower())
Iszi
źródło
Nie działa zgodnie ze specyfikacją. Spróbować foo:bar.
Mormegil,
@Mormegil Który? Przynajmniej wersja read-host działa dla mnie dobrze. Przetestowałem to na wszystkich testowych przypadkach w pytaniu i wszystkie wróciły zgodnie z oczekiwaniami, z wyjątkiem specjalnych przypadków, które zamieściłem w komentarzu do pytania.
Iszi
:(dwukropek) nie jest wymieniony jako separator słów w regule # 4, dlatego też AFAICS, foo:barpowinno wynikać Foo:bar, nie Foo:Bar . Ale to tylko moja (dość ścisła) lektura specyfikacji.
Mormegil,
2
@Mormegil Cóż, to jest miłe. Wygląda na to, że specyfikacja została poprawiona, aby rozwiązać tę dwuznaczność, jednocześnie nie unieważniając tej odpowiedzi.
Iszi
1
Możesz zastąpić get-cultureprzez culture; patrz codegolf.stackexchange.com/a/778/1308
Danko Durbić
4

Java - 209 znaków

class C{
public static void main(String[]a){
for(String b:a){
char[]k=b.toLowerCase().toCharArray();
for(int i=-1;i<k.length;i++){if(i<0||"-. /&#".indexOf(k[i])>=0)k[++i]=(char)(k[i]-32);}
System.out.println(k);}}}

Dodałem znaki nowej linii tylko dla czytelności.

True Soft
źródło
3

R, 143 116

Rozwiązanie może trochę długie, ale zaczynamy:

f=function(x){a=sapply(1:nchar(x),function(y)substr(tolower(x),y,y));d=c(1,which(!a%in%letters)+1);a[d]=toupper(a[d]);cat(a,sep="")}

Nieco golfa i wyjaśniono:

f <- function(x){
    #Split the string in characters and "lower-case" everything
    a <- sapply(1:nchar(x),function(y)substr(tolower(x),y,y))
    #Select the first character and each character following a 
    #character that doesn't belong to lower case alphabet
    d <- c(1,which(!a%in%letters)+1)
    #Make those ones uppercase.
    a[d] <- toupper(a[d])
    #Output (stdout) while pasting them back together.
    cat(a,sep="")
    }

Edycja : 116 znaków

Głównym wyzwaniem jest wektoryzacja substr. Oto inny mniej szczegółowy sposób.

f=function(x){n=1:nchar(x);a=mapply(substr,tolower(x),n,n);d=c(T,!a%in%letters);a[d]=toupper(a[d]);cat(a[n],sep="")}

Zębaty:

f <- function(x){
    n <- 1:nchar(x)
    a <- mapply(substr,tolower(x),n,n)
    d <- c(T,!a%in%letters) #This has been simplified as well
    a[d] <- toupper(a[d])
    cat(a[n],sep="") #Because a is now 1 char longer than x, need to subset a
    }

Stosowanie:

> f("aGeNT ACcEpT/LEngTh-tYPe USeR raNgE.TyPe")
Agent Accept/Length-Type User Range.Type
plannapus
źródło
Możesz zapisać niektóre postacie. Ponieważ askłada się tylko z małych liter, nie ma potrzeby sprawdzania zgodności z dużymi literami LETTERS.
Sven Hohenstein,
@ SvenHohenstein rzeczywiście, dzięki!
plannapus,
Jeszcze jedno: można zamienić TRUEz T.
Sven Hohenstein,
Pierwotnie miałem tolowerpóźniej.
plannapus,
OK, oto jeszcze jeden ;-) Można wymienić mapply(substr,tolower(x),n,n) z strsplit(tolower(x),"")[[1]]uratować jeden znak.
Sven Hohenstein,
3

Befunge 98 - 24 45

~\j:'``!3*j' -;:'``b*j:'/`!3*j' +#;:,'/`!jc#@

Pisanie tego zraniło mój mózg.

To pobiera dane wejściowe ~i jeśli poprzedni znak był jednym z separatorów (lub jeśli nie było wcześniejszego znaku), wykonuje się

:'``!3*j' -;

Ten fragment kodu przyjmuje postać, a jeśli jego wartość ascii jest większa lub równa a, odejmuje od niej 32, zmieniając w ten sposób na wielkie litery. Jeśli jest mniej niża , 3*jpomija regulację. Następnie pomija następną część. Ta część obsługuje zmianę wielkich i małych liter (jestem pewien, że można ją połączyć z następną częścią; po prostu nie jestem pewien jak):

:'``b*j:'/`!3*j' +#;

Znak jest drukowany (, ), a następnie sprawdza, czy znak jest jedną z granic:

'/`!

Zasadniczo porównuje znak do wartości ascii /. Jeśli znak nie jest granicą, kod przesuwa się, 12aby następnym razem pominąć dostosowanie wielkich liter. #przeskakuje program końcowy: @a jeśli osiągnięty zostanie koniec danych wejściowych, ~przesyła wykonanie kodu z powrotem do @, kończąc program.

Justin
źródło
3

Rubin: 60 51 50 47 znaków

$_.downcase.chars{|c|$><<$/=$/<?0?c.upcase: c}

Przykładowy przebieg:

bash-4.1$ for line in "${test[@]}"; do printf '%-75s | %s\n' "$line" "$( ruby -ne '$_.downcase.chars{|c|$><<$/=$/<?0?c.upcase: c}' <<< "$line" )"; done
aGeNT ACcEpT/LEngTh-tYPe USeR raNgE.TyPe                                    | Agent Accept/Length-Type User Range.Type
type&AgeNt/CC/COnteNt lEnGth#acCePT/AgeNt.RAnGe-Cc/contEnt/cODe             | Type&Agent/Cc/Content Length#Accept/Agent.Range-Cc/Content/Code
cc/rEspoNCe.lEngtH#tYpE-witH&UsEr/bEgIN&uSer.AGEnT&begIn/aCCEPt/Cc          | Cc/Responce.Length#Type-With&User/Begin&User.Agent&Begin/Accept/Cc
lENgTH#USeR.tYpE/BeGiN&LENGth tYpe/ACCEpt#rANge/codE&AnD-ACCepT/ConTenT     | Length#User.Type/Begin&Length Type/Accept#Range/Code&And-Accept/Content
contENT/ACcEpT                                                              | Content/Accept
BeGin/wITH.tyPE&conTeNt                                                     | Begin/With.Type&Content
Code.cc#User.lenGTh-USer-AND&tyPE TypE&leNgtH.tYPe usER.UseR&with           | Code.Cc#User.Length-User-And&Type Type&Length.Type User.User&With
RaNgE&COnTeNT WITh CoNTENT-TypE tyPe                                        | Range&Content With Content-Type Type
BEgin COdE#uSeR#aGeNt.USeR                                                  | Begin Code#User#Agent.User
TypE LENGth                                                                 | Type Length
człowiek w pracy
źródło
1
Czy to nie l==l.swapcaseto samo co l<?0(nie testowane)? Przynajmniej dla danych wejściowych dozwolonych dla tego zadania.
Howard,
Tak. Teraz, gdy batman podkreślił, że nie można oczekiwać żadnych innych separatorów, w rzeczywistości jest to krótsze. Dziękuję, @Howard.
manatwork
2

C # - 110

Proste przetwarzanie oparte na maszynie skończonej:

x.Aggregate(new{b=1>0,r=""},(s,c)=>new{b="-. /&#".Contains(c),r=s.r+(s.b?Char.ToUpper(c):Char.ToLower(c))}).r

(gdzie xjest stringkapitalizacja)

i oczywiście, jeśli chcesz się nudzić (po aktualizacji specyfikacji), możesz użyć

new CultureInfo(9).TextInfo.ToTitleCase(x)

lub z całą nudną płytą grzewczą:

class C{static void Main(string[]a){System.Console.WriteLine(new System.Globalization.CultureInfo(9).TextInfo.ToTitleCase(a[0]));}}
Mormegil
źródło
Nie, nie skompiluje się, ponieważ C # nie jest językiem skryptowym i musisz to zawrzeć w klasie.
Pierre Arlaud,
2
Mówi kto? Microsoft (R) Roslyn C# Compiler version 1.2.20906.1 Loading context from 'CSharpInteractive.rsp'. Type "#help" for more information. > "foobar".Aggregate(new{b=1>0,r=""},(s,c)=>new{b="-. /&#".Contains(c),r=s.r+(s.b?Char.ToUpper(c):Char.ToLower(c))}).r "Foobar"Ale jeśli naprawdę zależy Ci na nudnym bojlerze, dodaj 112 znaków.
Mormegil,
1
Możesz wyciąć publici string[]az
płyty kotłowej
O tak, masz rację public, ale potrzebuję argumentów, ponieważ to właśnie przetwarzam ...
Mormegil,
2

JavaScript 102

prompt().split(o=q='').map(function(c){o+=(q)?c.toLowerCase():c.toUpperCase(),q=('A'>c)?0:1})
alert(o)
wolfhammer
źródło
Nie potrzebujesz ()wokół trójskładnika. Co więcej, nie musisz drugi trójskładnikowej: function(c){o+=q?c.toLowerCase():c.toUpperCase(),q='@'<c}.
manatwork
2

Dalej, 135

: s swap ;
: c 1 begin key dup 96 > if s if 32 - then 0 s 
else dup 64 > if s 0= if 32 + then 0 s then else 1 s then then emit again ; c

Przetłumaczone dane wyjściowe są zapisywane stdoutpodczas odczytu stdin.

Darren Stone
źródło
1
„następnie wyemituj ponownie” rymuje się z naprzód!
kot
2

Befunge-98 (29), C (65)

Ponieważ metoda / algorytm jest prawie taka sama, umieszczam obie wersje w tym samym poście. Oba polegają na śledzeniu, czy ostatni znak był symbolem czy literą, aby wiedzieć, czy litera ma być mała, czy nie.

Befunge-98 (29)
#@~:'0` #v_,0>
',++@'% '<   ^
C (65)
c,d;main(){for(;~(c=getchar());d=c>48)putchar(c<48?c:c&95|32*d);}
Robaczek świętojański
źródło
2

05AB1E , 1 bajt

Kod:

Wyjaśnienie:

™   # Implicit input which is converted to title case.

Wypróbuj online!

Adnan
źródło
To całkiem fajne :-)
batman
1

Znaki Excel VBA-11

W oknie Natychmiastowe

?[Proper()]

VBscript

Set xlapp = CreateObject("excel.application")
wscript.echo xlapp.Evaluate("Proper(""BeGin/wITH.tyPE&conTeNt"")"
brettdj
źródło
Czy możesz udzielić pomocy w zakresie użytkowania? Pojawia się komunikat „Błąd kompilacji: nie zdefiniowano nazwy zewnętrznej”. (W Word 2013 na karcie Deweloper kliknąłem Visual Basic, a następnie w Visual Basic for Application
wkleiłem
@manatwork Powinienem był wyjaśnić, że to było w Excelu. Możesz to zrobić w programie Word, ale ścieżka jest dłuższa, ponieważ musisz zautomatyzować program Excel.
brettdj
1
Chłodny. Działa idealnie, gdy VBA jest uruchamiany z Excela 2013.
manatwork
Działa również bezpośrednio w programie Excel: =PROPER(A1)również 11 bajtów
Wernisch
1

AWK, 113 103 bajty

{for(;++i<=split($0,a,"");){s=a[i]
O=O (L?tolower(s):toupper(s))
L=1
if(index("-. /&#",s))L=0}print O}

Działa to dobrze w przypadku zawartości jednowierszowej, ale w przypadku wprowadzania wielowierszowego należy dodać kilka inits

{O=""
for(L=0;++i<=split($0,a,"");){s=a[i]
O=O (L?tolower(s):toupper(s))
L=1
if(index("-. /&#",s))L=0}print O}

Byłoby miło, gdybyśmy mogli skorzystać z automatycznego podziału rekordu na pola i zmodyfikować wspomniane pola, ale stracilibyśmy wtedy nasze separatory pól. :(

Wiem, że nie jest to najbardziej golfowa z odpowiedzi i jest to dość stare pytanie, ale czuję, że AWK jest niedostatecznie reprezentowany w przestrzeni odpowiedzi CG :)

(Dzięki @manatwork za testowanie kodu, powinno działać teraz :) Zmieniłem również przepływ, ale utrzymałem tę samą liczbę bajtów, zastępując niektóre ;znakami nowej linii.)

Robert Benson
źródło
1
Jesteś pewny? Żaden z kodów nie wydaje wymaganego wyniku ani z gawk, mawkani original-awk. (Testowane na Ubuntu.)
manatwork
Został napisany przy użyciu gawkna pudełku RHEL6, ale następnie został przepisany na okno systemu Windows. Bardzo dobrze może występować problem z transkrypcją. Spróbuję przetestować po pracy, kiedy będę mógł przetestować i opublikować na tym samym komputerze ... Wydaje mi się, że i tak widzę problem. l=0powinien byćL=0
Robert Benson
Mam nadzieję, że teraz działa, @manatwork. Dzięki za testowanie. :)
Robert Benson
1
Teraz wydaje się działać poprawnie. Nie sprawdzeniu wszystkich przypadków testowych, ale wydaje się możliwe, aby zmniejszyć to kawałek: {for(l=split($0,a,$0="");i<=l;s=a[++i]){$0=$0(L?toupper(s):tolower(s));L=index("-. /&#",s)}}1.
manatwork
Podoba mi się to, że używasz zmiany $0i 1etykiety, aby uniknąć printpolecenia, to rzeczy, o których nie myślałem. Będę musiał pamiętać o tym podczas przyszłego golfa :)
Robert Benson
1

PHP (> v5.4.32) - 25 znaków

<?=ucwords($a,'-. /&#')?>

Wyjaśnienie:

  • ucwords () to wbudowana funkcja PHP

  • Pierwszy parametr $ato wejście

  • Drugi parametr to delimetry (znaki nie alfabetyczne znalezione w przypadkach testowych)

  • Zakłada się powrót / echo / wydruk z powodu użycia <?= ?>

Spinki do mankietów:

jpl42
źródło
1
Witam na stronie! Myślę, że w tej chwili jest to fragment, który domyślnie nie jest dozwolony, ale możesz uzyskać 41 bajtów jako pełny program, używając -R: Wypróbuj online! lub 42 przy użyciu argumentów: Wypróbuj online!
Dom Hastings
0

T-SQL, 179

DECLARE @T VARCHAR(MAX)='foo',@X VARCHAR(2),@ INT=0WHILE @<LEN(@T)SELECT @X=SUBSTRING(@T,@,2),@+=1,@T=STUFF(@T,@,1,IIF(@X LIKE'[a-Z]_',LOWER(RIGHT(@X,1)),UPPER(RIGHT(@X,1))))PRINT @T

Wypróbuj wersję SELECT w SQL Server 2012 tutaj .

Zamień „foo” na ciąg wejściowy. Liczba znaków dotyczy łańcucha zerowej długości. Ten kod przechodzi przez ciąg znaków, używając indeksu, górnego lub dolnego znaku w tej pozycji w oparciu o poprzedni znak.

Muqo
źródło
0

JavaScript (Node.js) , 70 bajtów

c=>a=>c.split``.map(b=>a="A">a?b.toUpperCase():b.toLowerCase()).join``

Wypróbuj online!

Jestem pewien, że można to jeszcze pograć w golfa.

Uwaga :

Pobiera dane wejściowe przez f(string)(), ostatnie są wymagane, ale nie wykonują niczego.

Muhammad Salman
źródło
0

PowerShell, 77 75 bajtów

To rozwiązanie w pełni spełnia zasady zadania (nawet dwuznaczny przykład foo:bar).

-join($args|% t*y|%{"$_"|%('ToU*r','ToL*r')[+$l];$l=!('# -./&'|% Co*s $_)})

Zobacz także rozwiązanie Powershell z wbudowaną funkcją ToTitleCase firmy @Iszi.

Wyjaśniony skrypt testowy:

$f = {

-join(
$args|% t*y|%{                   # for each char from input string
    "$_"|%('ToU*r','ToL*r')[+$l] # evaluate ToUpper or ToLower method depend on $l (lower) value
                                 # Note the variable $l is not defined for a first char
                                 # so it evaluates toUpper for the first char 
    $l=!('# -./&'|% Co*s $_)     # golfed form for $l=!'# -./&'.Contains($_) expression
                                 # =0 if the current char is specified separator (toUpper for next char)
}                                # =1 otherwise (toLower for next char)
)                                # finally, join all chars to a result string

}

@(
    ,('foo:bar'                                                                 ,'Foo:bar')
    ,('aGeNT ACcEpT/LEngTh-tYPe USeR raNgE.TyPe'                                ,'Agent Accept/Length-Type User Range.Type')
    ,('type&AgeNt/CC/COnteNt lEnGth#acCePT/AgeNt.RAnGe-Cc/contEnt/cODe'         ,'Type&Agent/Cc/Content Length#Accept/Agent.Range-Cc/Content/Code')
    ,('cc/rEspoNCe.lEngtH#tYpE-witH&UsEr/bEgIN&uSer.AGEnT&begIn/aCCEPt/Cc'      ,'Cc/Responce.Length#Type-With&User/Begin&User.Agent&Begin/Accept/Cc')
    ,('lENgTH#USeR.tYpE/BeGiN&LENGth tYpe/ACCEpt#rANge/codE&AnD-ACCepT/ConTenT' ,'Length#User.Type/Begin&Length Type/Accept#Range/Code&And-Accept/Content')
    ,('contENT/ACcEpT'                                                          ,'Content/Accept')
    ,('BeGin/wITH.tyPE&conTeNt'                                                 ,'Begin/With.Type&Content')
    ,('Code.cc#User.lenGTh-USer-AND&tyPE TypE&leNgtH.tYPe usER.UseR&with'       ,'Code.Cc#User.Length-User-And&Type Type&Length.Type User.User&With')
    ,('RaNgE&COnTeNT WITh CoNTENT-TypE tyPe'                                    ,'Range&Content With Content-Type Type')
    ,('BEgin COdE#uSeR#aGeNt.USeR'                                              ,'Begin Code#User#Agent.User')
    ,('TypE LENGth'                                                             ,'Type Length')
) | % {
    $s,$e = $_
    $r = &$f $s
    "$($r-ceq$e): $r"
}

Wynik:

True: Foo:bar
True: Agent Accept/Length-Type User Range.Type
True: Type&Agent/Cc/Content Length#Accept/Agent.Range-Cc/Content/Code
True: Cc/Responce.Length#Type-With&User/Begin&User.Agent&Begin/Accept/Cc
True: Length#User.Type/Begin&Length Type/Accept#Range/Code&And-Accept/Content
True: Content/Accept
True: Begin/With.Type&Content
True: Code.Cc#User.Length-User-And&Type Type&Length.Type User.User&With
True: Range&Content With Content-Type Type
True: Begin Code#User#Agent.User
True: Type Length
mazzy
źródło
0

QBasic, 74 bajty

1c$=LCASE$(INPUT$(1))
IF f=0THEN c$=UCASE$(c$)
f=c$>"@
?c$;
IF""<c$GOTO 1

Bajty są liczone w CP-437 ; jest pojedynczym bajtem (kod znaku 20).

Metoda wprowadzania jest tutaj nieco dziwna: znaki są wpisywane pojedynczo, a ich wielkie litery są konwertowane przed ich wyświetleniem. Kiedy więc wpiszesz aGeNT, pojawi się na ekranie jako Agent. Trafienie Enterkończy program.

DLosc
źródło
0

Python 3 , 122 bajty

lambda s:''.join(chr(ord(c)+[[0,0],[0,32],[-32,0]][('@'<c<'[')-('`'<c<'{')]['@'<p<'['or'`'<p<'{'])for c,p in zip(s,'-'+s))

Wypróbuj online!

Nie jest to świetny wynik, ale chciałem go wypróbować bez wbudowanych operacji na łańcuchach do zmiany wielkości liter.

Matthew Jensen
źródło
-2

PHP - 23 znaki

mb_convert_case ($ w, 2);

Do działania potrzebuje php_mbstring

mattecapu
źródło
1
Na moim 5.3.26 mb_convert_case("BeGin/wITH.tyPE&conTeNt", 2);zwraca „Begin / with.type & content”, a nie „Begin / With.Type & Content”.
manatwork