Menurut situs ini aturan umum yang direkomendasikan oleh Manual Gaya Kantor Percetakan Pemerintah AS adalah
Mengapitalisasi semua kata dalam judul publikasi dan dokumen, kecuali a, a, the, at, oleh, untuk, pada, pada, pada, ke, atas, dan, seperti, tetapi, atau, dan juga tidak.
Ini mungkin tidak benar karena saya tidak dapat menemukan rekomendasi seperti itu di Manual Gaya , tetapi mari kita tetap menggunakan aturan ini.
Tantangan
Diberikan string input yang terdiri dari kata-kata huruf kecil yang dibatasi oleh spasi, menghasilkan kapitalisasi string sesuai dengan aturan berikut
- Kata pertama dan terakhir ditulis dengan huruf besar.
- Semua kata lain dikapitalisasi, kecuali a , an , the , at , oleh , untuk , di , dari , pada , ke , atas , dan , seperti , tetapi , atau , dan juga tidak .
String input akan mengandung setidaknya satu kata dan setiap kata berisi setidaknya satu huruf dan hanya karakter dari a
hingga z
.
Ini adalah tantangan kode golf, jadi coba gunakan sesedikit mungkin byte dalam bahasa pilihan Anda. Anda dapat menulis program lengkap atau fungsi untuk menyelesaikan tugas.
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"
Jawaban:
Python 2, 118 byte
Lihat bu, jangan regex!
Masukan harus dibungkus dengan tanda kutip. Output memiliki ruang trailing dan tidak ada trailing newline (saya berasumsi tidak apa-apa). Verifikasi semua kasus uji pada Ideone .
Penjelasan
Mari kita ambil input
a or an
sebagai contoh kita.Menggunakan Python 2 ini
`x`
shortcut untukrepr
, kami membungkus masukan dalam tanda kutip tunggal:'a or an'
. Kemudian kami berpisah pada spasi putih dan beralih ke kata-kata.Di dalam loop, kita ambil
repr
lagi . Untuk kata-kata pertama dan terakhir, ini memberi"'a"
dan"an'"
. Dengan kata lain, itu memberi'or'
. Kami ingin menghindari penggunaan huruf besar jika sesuai dengan pola yang terakhir dan ada dalam daftar kata-kata pendek. Jadi kita dapat mewakili daftar kata sebagai string"'a'an'...'up'"
dan tahu bahwarepr
kata pendek apa pun akan menjadi substring.`w` in "..."
memberikan nilai boolean, yang dapat kita perlakukan sebagai0
atau1
untuk keperluan pengindeksan ke dalam daftar[w.title(), w]
. Singkatnya, kita beri judul huruf besar kata jika itu di awal, di akhir, atau tidak dalam daftar kata-kata pendek. Kalau tidak, kita biarkan saja. Untungnya,title()
masih berfungsi seperti yang diharapkan dengan input suka'a
.Akhirnya, kami menghapus tanda kutip tunggal dari kata dan mencetaknya dengan spasi tambahan.
sumber
05AB1E ,
6861 byteDisimpan 7 byte berkat Adnan
Cobalah online!
Penjelasan
“a€¤€€€›€‹€‡€†€‚€‰€„€¾€ƒ€œ€³€—š¯“
adalah string kamus yang diterjemahkan sebagaia an the at by for in of on to up and as but or nor
.sumber
a
daripada€…
menyimpan byte tambahan juga jika lead dari dengan itu :) Terima kasih!GNU sed
81 7473 BytesTermasuk +1 untuk -r
Baris pertama menggunakan huruf besar untuk setiap kata. Yang kedua mengalihkan semua kata yang diperlukan kembali ke huruf kecil.
Cobalah secara Online!
sumber
Retina,
6966 byteGunakan huruf besar pada huruf pertama dari setiap kata, lalu ubah kata yang dipilih menjadi huruf kecil jika itu bukan kata pertama atau terakhir. Ada ruang di ujung baris terakhir.
Cobalah online
Ini juga berfungsi dengan a
.
bukan ruang pertama.Ada banyak regex dengan panjang yang sama, tetapi saya tidak dapat menemukan cara untuk memotongnya lagi ...
sumber
+
trik untuk mempersingkatnya.)JavaScript (ES6),
141138135133 byteDisimpan 3 byte berkat mbomb007
Uji kasus
Tampilkan cuplikan kode
sumber
Jelly , 58 byte
TryItOnline! atau jalankan semua tes
Bagaimana?
Sebuah string terkompresi dengan spasi yang memisahkan kata-kata adalah
47
byte, membaginya dengan1
byte, untuk48
byte.Dua string terkompresi yang tidak terpisahkan dari kata-kata panjang
2
dan3
(dengan 'a' di akhir satu) masing-masing akan menjadi40
byte plus2
untuk membelah masing-masing dan1
untuk bergabung dengan mereka, untuk45
byte.Satu nomor basis 250 seperti yang dijelaskan di bawah ini adalah
32
byte, kemudian3
untuk mengkonversi ke basis 26,3
untuk mengindeks ke dalam huruf kecil dan3
untuk membaginya pada karakter yang tidak digunakan'z'
,, untuk41
byte.Jadi, pencarian kata-kata untuk tidak menggunakan huruf besar:
“Ð/ṃƇ¬þṄẊƙ€,⁽ṙƬ®OṪJ"ɦ3×kf3Ṙç%ġu’
dibentuk seperti:
Ambil kata-kata itu dan bergabunglah dengan pemisah:
s="a an the at by for in of on to up and as but or nor"
Label selanjutnya
'a'
sebagai1
,'b'
seperti2
dengan pemisah sebagai0
:Konversikan ini menjadi angka dasar
26
(huruf terakhir yang digunakan adalah'y'
angka plus untuk pemisah, kode Python untuk ini adalah:n=sum(v*26**i for i,v in enumerate(x[::-1]))
Ubah itu menjadi
250
nomor dasar (menggunakan daftar untuk digit):Cari karakter pada indeks-indeks tersebut dalam codepage jelly:
(catatan: karena implementasi aktual bersifat bijektif, jika
b
memiliki0
digit, seseorang harus menurunkannya terlebih dahulu)Sisanya:
sumber
PHP, 158 Bytes
10 Bytes disimpan oleh @Titus
PHP versi sebelumnya, 174 Bytes
sumber
foreach(...)echo" "[!$k],(condition)?$v:ucfirst($v);
TI-Basic, 295 + 59 + 148 = 502 byte
Sekarang Anda dapat memanfaatkan kalkulator Anda. Bagus untuk sekolah :)
Program Utama, 295 byte
Pada dasarnya, trik untuk mencocokkan kata-kata sehingga semua
A
tidak menjadia
adalah untuk melampirkan dengan spasi, seperti ganti" A "
dengan" a "
. Ini juga secara otomatis membuatnya sehingga kata pertama dan terakhir tetap dikapitalisasi, karena mereka tidak memiliki ruang di kedua sisi dan dengan demikian tidak akan cocok dengan salah satu kata. (Genius, kan? Dan super panjang karena huruf kecil masing-masing dua byte ...)Subprogram (
prgmQ
), 59 byte:Subprogram (
prgmR
), 148 byte:PS
~
mewakili token0x81
dan@
mewakili token0x7F
, pelajari lebih lanjut di sini .sumber
Java 7,
271259258 byteTidak digabungkan & kode uji:
Coba di sini.
Keluaran:
sumber
Groovy,
131129Dua byte disimpan berkat carusocomputing
sumber
i->
dan gunakanit
untuk menyimpan 2 byte.{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()
mengambil banyak byte. Adakah cara singkat untuk membuat alias.capitalize()
?C #, 305 byte
Masih banyak ruang untuk perbaikan tetapi di sini Anda mulai:
sumber
Ruby,
123117111102 bytesSorry for all the edits - this should be the last one.
sumber
Python, 177 bytes
Delivered in function format for byte saving purposes. This is not an especially competitive answer, but it is one that doesn't require
repr()
orregex
trickery. It is also version-agnostic; it works with Python 2 or 3.Though it is perhaps a very by-the-rules solution.
sumber
PHP,
109142 bytesA merger of user59178´s and mbomb007´s answer.
uppercases the first letter of every word, then lowercases all words from the list surrounded by spaces.
Unfortunately, the callback has to operate on the complete set; this costs 29 bytes.
sumber
a an and as at but by for in nor of on or the to up
Racket 353 bytes
Ungolfed:
Testing:
Output:
sumber
Java 7,
431 317311 bytesThanks to @KevinCruijssen for 114 bytes.
Thanks to @RosLup for saving 6 bytes.
ungolfed
first answer above 250 bytes
sumber
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) I suggest taking a look at what I changed as tips for next time. :) PS: I've posted an answer with a different approach (259 bytes).c.substring(0,1).toUpperCase()+c.substring(1,c.length())+" "
which you did twice should make you think about re-using it somehow. And combined initializations like you did correctly with theint
, but for some reason not with theString
. Also, no need for the extraboolean
when you can store at as anint
0 or 1 and then check it>0
. And I would try to avoid brackets andbreak
as much as possible; usually there is a trick to get rid of them, like thefor(f=0;f<b.length;z=c.equals(b[f++])|z>0?1:0);
I've showed. :)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;}
And no problem. :) I also learned a lot when I was new to code-golfing. I just make a list with every general codegolf tip I learn and look/update it sometimes. But my code still gets golfed by others a lot.PHP,
117118112 bytesUses the behaviour of
ucwords()
and escapes the relevant words that are surrounded by spaces then deletes the escape characters.I copied the
(a[snt]?|and|[fn]or|up|by|but|the|to|in|o[rnf])
from Jörg Hülsermann's answer but as the approach is completely different I'm posting it as a separate answer.edit: bug noticed by Titus, fixing it cost 1 byte. also: 6 bytes saved thanks to his helpful comment about strtr
sumber
strtr
instead ofstr_replace
. Or prepend the words with<>
and dropthe str_replace
and use HTML output.preg_filter
instead ofpreg_replace
. I have not try it with your solutionnice try for a start
. Replacing one of the spaces with an assertion solves that (+4 bytes).preg_filter
would fail on thetitle
test case, returning nothing.Pure
bash
- 253(no external programs called) - needs bash v4
normal view with comments
output
sumber
Japt, 71 bytes
Try it online!
Explanation:
One of my favorite Japt features is its string compression, which uses the shoco library.
You can compress a string by wrapping it in
Oc"{string}"
→Oc"a an the at by for in of on to up and as but or nor"
Then decompressing it with backticks or
Od"{compressed string}"
→Od"a e by f up d ¿t n"
sumber
-S
flag was added after this challenge was posted, so your current solution is non-competing. However, I think you can do£...+XÅ}S
, which would be competing for the same byte-count (Try it online!)Pure
bash
-205192181 bytesLike jm66's answer
tc
accepts standard input.sumber
Actually, 79 bytes
Try it online!
Explanation:
sumber
Batch, 323 bytes
With comments:
sumber