Memanfaatkan String

18

Diberikan string, gunakan huruf besar. Dengan huruf besar, maksud saya adalah conTeNT-lENgthperubahan Content-Length. Dalam contoh saya menunjukkan string dengan 2 kata dengan -sebagai batas kata. Namun saya mengharapkan Anda untuk menulis kode untuk string yang berisi sejumlah kata yang dipisahkan oleh satu karakter sebagai batas. Batas ini dapat berubah melintasi string.

Kondisi

  1. menggunakan regular expressionsini tidak diperbolehkan .
  2. mungkin ada sejumlah kata dalam kalimat (string).
  3. setiap kata akan terdiri dari Englishhuruf [a-zA-Z]apa saja.
  4. kata-kata yang berbeda dalam kalimat akan dipisahkan oleh satu karakter. Karakter ini akan hanya menjadi salah satu dari -, ., <space-character>, /, &, #. Anda dapat dengan aman berasumsi bahwa kalimat itu tidak akan mengandung karakter lain kecuali yang disebutkan.
  5. batas kata harus dipertahankan dalam output.
  6. kode menang pendek.

Misalnya program anda harus output Begin/With.Type&Contentuntuk 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"
batman
sumber
2
Apa yang Anda sebut huruf besar sebenarnya adalah transformasi ke kasing unta.
Pierre Arlaud
6
@ ArchlaudPierre Tidak, apa yang dia berikan sebagai "test case" lebih seperti case unta. Apa yang disebut kapitalisasi lebih dekat dengan Judul Kasus.
Iszi
Bisakah Anda memberikan hasil yang diharapkan untuk kasus uji? Tampaknya beberapa fungsi bawaan dapat mengasumsikan bahwa kata all-cap (seperti /CC/pada baris 2, atau -AND&pada baris 7) harus dibiarkan sendiri. Apakah ini oke, untuk tantangan ini?
Iszi
Apakah input selalu dimulai dengan sebuah kata atau mungkin dimulai dengan pemisah?
lebatsnok

Jawaban:

7

GolfScript, 36 27 19 karakter

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

Pendekatan GolfScript cukup mendasar yang bekerja untuk semua input sesuai dengan spesifikasi. Contoh-contoh dapat diuji secara online .

Howard
sumber
Keren. Penasaran apakah solusi saya paling tidak dua kali lebih profesional. :) Tapi saya yakin Anda akan mempersingkat ini beberapa kali sebelum hari berakhir.
manatwork
@manatwork Sekarang kami memiliki faktor dua ;-) Masih tidak senang dengan semua swap.
Howard
Aku tahu kamu tidak akan mengecewakanku.
manatwork
22

Python 3,22

print(input().title())

Kode ini akan mengambil string sebagai input dari stdin dan memberikan output yang dikapitalisasi ke stdout.

sebagai contoh:

memasukkan:

BEGIN/wITH.tyPe&cOnTENt

ouput:

Begin/With.Type&Content

Kode berikut untuk input multi-jalur (jika perlu)

Python 3, 46

import sys
for i in sys.stdin:print(i.title())
Wasi
sumber
while 1:print(input.title())adalah padanan yang lebih pendek untuk potongan kode terakhir.
Ramchandra Apte
1
@RamchandraApte Saya tidak yakin apakah diizinkan atau tidak. Kode Anda akan mati dengan EOFError begitu hitsnya EOF
Wasi
1
Saya pikir konsensus umum untuk golf adalah bahwa selama outputnya benar, kesalahan tidak menjadi masalah
Volatilitas
Dang; begitu saya melihat pertanyaan ini, saya memikirkan ini, tetapi Anda mengalahkan saya untuk itu. +1
Justin
+1 Saya suka ini lebih baik daripada skrip golf karena tidak terlihat seperti kecabulan.
Tim Seguine
6

Mathematica 62

Data

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

Kode

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

Pemakaian

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

"Rentang Pengguna Menerima / Panjang-Jenis Pengguna. Jenis"

f /@ tests

{"Agen Menerima / Panjang-Jenis Rentang Pengguna. Jenis",
"Jenis & Agen / Cc / Panjang Konten # Terima / Agen.Range-Cc / Konten / Kode", "Cc / Responses. Panjang # Jenis-Dengan & Pengguna / Mulai & Pengguna. Cerdas & Mulai / Terima / Cc "," Panjang # Pengguna. Jenis / Mulai & Jenis Panjang / Terima # Rentang / Kode & Dan-Terima / Konten "," Konten / Terima ",
" Mulai / Dengan. Jenis & Konten ",
" Code.Cc # Pengguna. Panjang-Pengguna -Dan & Tipe Jenis & Panjang. Tipe Pengguna. Pengguna & Dengan ",
" Rentang & Konten Dengan Tipe Tipe-Konten ",
" Mulai Kode # Pengguna # Agen. Pengguna ",
" Ketikkan Panjang "}

DavidC
sumber
-1 Itu pada dasarnya regex
CalculatorFeline
Mathematica dapat menjalankan regex secara langsung tetapi saya menggunakan sesuatu yang lain. Ini mirip dengan regex, tetapi bukan regex.
DavidC
%% %%% % %%
CalculatorFeline
6

JavaScript (94)

prompt().split(l='').map(function(a){return l='A'>l?a.toUpperCase():a.toLowerCase()}).join('')
tenang
sumber
5

PHP: 78 73 65 64 karakter

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

Input diteruskan $s . Ini beroperasi pada string sebagai array karakter.

Ini adalah mesin 2 keadaan sederhana. Itu bergantung pada urutan leksikal string, dan bahwa parser secara otomatis mengasumsikan Anda bermaksud mengetik string dalam beberapa kasus.

Status sedang disimpan $bdan diwakili sebagai nama fungsi yang perlu dipanggil pada karakter berikutnya. ucfirstdan lcfirstlebih pendek untuk mengetik dan memiliki perilaku yang identik dengan strtolower/ strtoupperpada string karakter tunggal. Juga, karena hanya berbeda satu huruf, kita dapat menggunakannya secara efisien untuk menyimpan status. Versi asli diperlukan untuk menyimpan status secara eksplisit dalam boolean.

Karena gema tidak mencetak apa pun untuk boolean false, saya menggunakan koma dan !operator untuk "menyembunyikan" tugas (yang dalam hal ini benar) dalam pernyataan gema. Ini memungkinkan saya untuk menyimpan karakter dengan menghapus {}.

Tim Seguine
sumber
Silakan gunakan markup blok kode alih-alih kode sebaris, sehingga skrip seperti Code Golf UserScript Enhancement Pack dapat menyisipkan ukuran di bawah kode. Ngomong-ngomong, dalam kode Anda ketiga karakter ruang dapat dihapus.
manatwork
Alih-alih $b=ord($c)>64;mencoba $b=$c>"@";. Atau bahkan $b=$c>=A;- AFAIR yang melempar peringatan, tetapi praktik pengkodean yang baik bukanlah kebajikan di sini.
manatwork
@Manatwork terima kasih, tidak memikirkan itu. Saya sudah melempar peringatan untuk menggunakan variabel yang belum disetel.
Tim Seguine
Hmm ... Bagaimana kalau tidak menggunakan $ b hanya sebagai flag, tetapi menyimpan nama fungsi sebenarnya di dalamnya? $b=ucfirst;foreach(str_split($s)as$c){echo$b($c);$b[0]=$c>=A?l:u;}.
manatwork
@manatwork bagus! Saya mencoba memikirkan cara untuk melakukan itu dengan fungsi. Usaha saya semua lebih besar.
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();}

Mengambil garis stdin, menerjemahkannya menjadi stdout. (Lebih suka SIGINTke EOF.)

Darren Stone
sumber
4

Powershell: 37 - 43

Bergantung pada bagaimana Anda ingin mengambil input ...

Meminta pengguna untuk input: 43

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

Ambil input dari saluran pipa: 38

(Culture).TextInfo.ToTitleCase($input)

Berikan input sebagai argumen saat menjalankan skrip: 37

(Culture).TextInfo.ToTitleCase($args)

CATATAN: Skrip di atas akan mengabaikan semua huruf besar kata, membiarkannya apa adanya. Jika ini perlu diperhitungkan, input harus dipaksa huruf kecil sebelum konversi Judul Kasus. Ini menambahkan 10 karakter ke metode pertama, dan 12 ke dua lainnya.

(Culture).TextInfo.ToTitleCase((read-host).ToLower())
(Culture).TextInfo.ToTitleCase("$input".ToLower())
(Culture).TextInfo.ToTitleCase("$args".ToLower())
Iszi
sumber
Tidak berfungsi sesuai spesifikasi. Coba foo:bar.
Mormegil
@ Mormegil Yang mana? Versi read-host, setidaknya, berfungsi dengan baik untuk saya. Saya mengujinya terhadap semua kasus uji dalam pertanyaan dan mereka semua kembali seperti yang diharapkan kecuali untuk kasus-kasus khusus yang saya posting dalam komentar untuk pertanyaan itu.
Iszi
:(titik dua) tidak terdaftar sebagai pemisah kata dalam aturan # 4, oleh karena itu, AFAICS, foo:barharus menghasilkan Foo:bar, bukan Foo:Bar . Tapi itu hanya saya (cukup ketat) membaca spesifikasi.
Mormegil
2
@ Mormegil Nah, ini rapi. Sepertinya spek itu di-tweak untuk menyelesaikan ambiguitas itu, sementara pada saat yang sama tidak membatalkan jawaban ini.
Iszi
1
Anda bisa mengganti get-culturedengan culture; lihat codegolf.stackexchange.com/a/778/1308
Danko Durbić
4

Java - 209 karakter

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

Saya menambahkan baris baru hanya untuk keterbacaan.

Benar Lembut
sumber
3

R, 143 116

Sebuah solusi yang agak lama mungkin tapi di sini kita mulai:

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

Sedikit ungolfed dan menjelaskan:

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

Edit : 116 karakter

Tantangan utama di sini adalah membuat vektor substr. Inilah cara lain yang tidak terlalu bertele-tele.

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

Bertakuk:

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
    }

Pemakaian:

> f("aGeNT ACcEpT/LEngTh-tYPe USeR raNgE.TyPe")
Agent Accept/Length-Type User Range.Type
plannapus
sumber
Anda dapat menyimpan beberapa karakter. Karena hanya aterdiri dari karakter huruf kecil, tidak perlu memeriksa kecocokan dengan huruf besar LETTERS.
Sven Hohenstein
@SvenHohenstein memang, terima kasih!
plannapus
Satu lagi: Anda bisa menggantinya TRUEdengan T.
Sven Hohenstein
Awalnya saya punya tolowernanti.
plannapus
OK, ini satu lagi ;-) Anda dapat mengganti mapply(substr,tolower(x),n,n) dengan strsplit(tolower(x),"")[[1]]untuk menyimpan satu karakter.
Sven Hohenstein
3

Befunge 98 - 24 45

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

Menulis ini melukai otak saya.

Ini membutuhkan input melalui ~dan jika karakter sebelumnya adalah salah satu dari pemisah (atau jika tidak ada karakter sebelumnya), itu dijalankan

:'``!3*j' -;

Cuplikan ini mengambil karakter, dan jika nilai ascii lebih besar atau sama dengan a, ia mengurangi 32 dari itu, sehingga mengubahnya menjadi huruf besar. Jika kurang dari itu a, 3*jlewati penyesuaian. Setelah itu, ia melewatkan bagian selanjutnya. Bagian ini menangani perubahan dari huruf besar ke huruf kecil (saya yakin itu dapat digabungkan dengan bagian berikutnya; Saya hanya tidak yakin bagaimana):

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

Karakter dicetak ( ,), maka ini memeriksa jika karakter adalah salah satu batasan:

'/`!

Ini pada dasarnya membandingkan karakter dengan nilai ascii dari /. Jika karakter bukan batas, kode mendorong 12sehingga akan melewati penyesuaian kapitalisasi di waktu berikutnya. #melompati program akhir:, @dan jika akhir input tercapai, ~mengirimkan eksekusi kode kembali ke @, mengakhiri program.

Justin
sumber
3

Ruby: 60 51 50 47 karakter

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

Contoh dijalankan:

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
manatwork
sumber
1
Bukankah l==l.swapcasesama dengan l<?0(tidak diuji)? Setidaknya untuk input yang diizinkan untuk tugas ini.
Howard
Iya. Sekarang batman itu menekankan bahwa tidak ada pemisah yang harus diharapkan, memang itu lebih pendek. Terima kasih, @Howard.
manatwork
2

C # - 110

Pemrosesan berbasis-negara-mesin sederhana:

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

(dimana xitustring huruf besar)

dan tentu saja, jika Anda ingin membosankan (setelah spesifikasinya diperbarui), Anda bisa menggunakannya

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

atau, dengan semua boilerplate yang membosankan:

class C{static void Main(string[]a){System.Console.WriteLine(new System.Globalization.CultureInfo(9).TextInfo.ToTitleCase(a[0]));}}
Mormegil
sumber
Nah, tidak akan dikompilasi karena C # bukan bahasa scripting dan Anda perlu merangkum ini di kelas.
Pierre Arlaud
2
Kata siapa? 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"Tetapi jika Anda benar-benar peduli dengan pelat tungku yang membosankan, tambahkan 112 karakternya.
Mormegil
1
Anda dapat memotong publicdan string[]adari
pelat ketel
Oh ya, Anda benar public, tapi saya butuh argumen, karena itulah yang saya proses ...
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
sumber
Anda tidak perlu (... di )sekitar kondisi ternary. Bahkan lebih, Anda tidak perlu terner kedua: function(c){o+=q?c.toLowerCase():c.toUpperCase(),q='@'<c}.
manatwork
2

Keempat, 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

Keluaran yang diterjemahkan ditulis stdoutsaat dibaca stdin.

Darren Stone
sumber
1
"Kalau begitu pancarkan lagi" berima dengan sebagainya!
kucing
2

Befunge-98 (29), C (65)

Karena metode / algoritma hampir sama, saya memasukkan kedua versi dalam posting yang sama. Keduanya bergantung pada melacak apakah karakter terakhir adalah simbol atau huruf, untuk mengetahui apakah huruf kecil atau tidak.

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);}
FireFly
sumber
2

05AB1E , 1 byte

Kode:

Penjelasan:

™   # Implicit input which is converted to title case.

Cobalah online!

Adnan
sumber
That's pretty cool :-)
batman
1

Excel VBA-11 characters

In the Immediate window

?[Proper()]

VBscript

Set xlapp = CreateObject("excel.application")
wscript.echo xlapp.Evaluate("Proper(""BeGin/wITH.tyPE&conTeNt"")"
brettdj
sumber
Could you provide some help on usage? I get “Compile error: External name not defined”. (In Word 2013 on the Developer tab I clicked Visual Basic, then in Visual Basic for Application I copy-pasted your code in the Immediate window and pressed Enter.)
manatwork
@manatwork I should have clarified it was in Excel. You can do this from Word but the path is longer as you need to automate Excel.
brettdj
1
Cool. Works perfectly when VBA is started from Excel 2013.
manatwork
Works in directly in Excel as well: =PROPER(A1), also 11 bytes
Wernisch
1

AWK, 113 103 bytes

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

This works fine for single line content, but for multiline input a couple inits need to be added

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

It would be nice if we could take advantage of the automatic splitting of a record into fields and modifying said fields, but we would then lose our field separators. :(

I know this isn't the golfiest of answers and this is a rather old question, but I feel that AWK is underrepresented in the answer-space of CG :)

(Thanks @manatwork for testing the code, it should work now :) Also changed the flow but kept the byte-count the same, by replacing some ; with newlines.)

Robert Benson
sumber
1
Are you sure? None of the codes seems to produce the required output neither with gawk, mawk or original-awk. (Tested on Ubuntu.)
manatwork
It was written using gawk on an RHEL6 box, but then transcribed to a windows box. There could very well be a transcription issue. I'll try testing after work when I can do testing and posting on the same machine.... I think I see the issue, anyway. l=0 should be L=0
Robert Benson
Hopefully it works now, @manatwork . Thanks for the testing. :)
Robert Benson
1
Now seems to work correctly. Not checked all test cases, but seems to be possible to reduce it a bit: {for(l=split($0,a,$0="");i<=l;s=a[++i]){$0=$0(L?toupper(s):tolower(s));L=index("-. /&#",s)}}1.
manatwork
I like your use of changing $0 and the 1 label to avoid the print command are things I haven't thought of doing. I'll have to keep it in mind for future golfing :)
Robert Benson
1

PHP (> v5.4.32) - 25 chars

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

Explanation:

  • ucwords() is a built-in PHP function

  • First parameter $a is the input

  • Second parameter is delimeters (non-alphabet chatacters found in test cases)

  • Return/echo/print is assumed due to use of <?= ?>

Links:

jpl42
sumber
1
Hi and welcome to the site! I think at the moment this is a snippet which isn't allowed by default, but you can get 41 bytes as a full program using -R: Try it online! or 42 using arguments: Try it 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

Try the SELECT version in SQL Server 2012 here.

Replace "foo" with the input string. The char count is for a zero-length string. This code traverses the string using an index, uppercasing or lowercasing the character at that position based on the previous character.

Muqo
sumber
0

JavaScript (Node.js), 70 bytes

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

Try it online!

I am sure this can be golfed further.

Note :

Takes input via f(string)() , the last are required but perform nothing.

Muhammad Salman
sumber
0

Powershell, 77 75 bytes

This solution fully meets the task rules (even ambiguous example foo:bar).

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

See also the Powershell solution with builtin function ToTitleCase from @Iszi.

Explained test script:

$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"
}

Output:

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
sumber
0

QBasic, 74 bytes

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

Bytes are counted in CP-437; is a single byte (character code 20).

The input method here is a bit strange: characters are typed one at a time, and their capitalization is converted before they are displayed. So when you type in aGeNT, it appears on screen as Agent. Hitting Enter ends the program.

DLosc
sumber
0

Python 3, 122 bytes

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

Try it online!

Not a great score, but I wanted to try it without builtin string operations for case changing.

Matthew Jensen
sumber
-2

PHP - 23 characters

mb_convert_case($w, 2);

It needs php_mbstring to work

mattecapu
sumber
1
On my 5.3.26 mb_convert_case("BeGin/wITH.tyPE&conTeNt", 2); returns “Begin/with.type&content”, not “Begin/With.Type&Content”.
manatwork