Tantangan
Saya sedang membaca Panduan Gaya Java Google beberapa hari yang lalu dan menemukan algoritma mereka untuk mengubah sembarang string menjadi notasi camelCase. Dalam tantangan ini Anda harus menerapkan algoritma ini karena Anda tidak ingin melakukan semua hal ini di kepala Anda ketika Anda menulis kiriman Java Anda yang super kompetitif ke tantangan kode-golf.
Catatan: Saya membuat beberapa penyesuaian kecil pada algoritma. Anda harus menggunakan yang ditentukan di bawah ini.
Algoritma
Anda mulai dengan string input sembarang dan menerapkan operasi berikut untuk itu:
- Hapus semua apostrof
`'
- Bagi hasil menjadi kata-kata dengan membelah
- karakter yang bukan alfanumerik dan bukan digit
[^a-zA-Z0-9]
- Huruf besar yang dikelilingi oleh huruf kecil di kedua sisi.
abcDefGhI jk
misalnya hasil panenabc Def Ghi jk
- karakter yang bukan alfanumerik dan bukan digit
- Huruf kecil setiap kata.
- Huruf besar pertama dari setiap kata kecuali kata pertama.
- Gabungkan semua kata kembali bersama.
Catatan tambahan
- Input hanya akan berisi ASCII yang dapat dicetak.
- Jika digit adalah huruf pertama dalam sebuah kata, biarkan seperti apa adanya dan jangan kapitalisasi sesuatu yang lain dalam kata ini.
- Input akan selalu memiliki setidaknya satu karakter.
Aturan
- Fungsi atau program lengkap diizinkan.
- Aturan default untuk input / output.
- Celah standar berlaku.
- Ini adalah kode-golf , sehingga byte-count terendah akan menang. Tiebreak adalah pengiriman sebelumnya.
Uji kasus
"Programming Puzzles & Code Golf" -> "programmingPuzzlesCodeGolf" "Permintaan HTTP XML" -> "xmlHttpRequest" "mendukung IPv6 di iOS?" -> "supportIpv6OnIos" "SomeThing w1th, apo'strophe's dan 'punc] tuation" -> "someThingW1thApostrophesAndPuncTuation" "nothing special" -> "nothingSpecial" "5pecial ca5e" -> "5pecialCa5e" "1337" -> "1337" "1337-spEAk" -> "1337Speak" "whatA mess" -> "whataMess" "abcD" -> "abcd" "a" -> "a" "B" -> "b"
Selamat Coding!
snake_case
&PascalCase
snake_case
karena Python, tentu saja. FORTH juga memilikiFORTHCASE
dan APL memilikiunreadable in any case
ApostropheS
di output.Jawaban:
Retina , 56 byte
Hitungan byte mengasumsikan penyandian ISO 8859-1.
Cobalah online!
Penjelasan
Ini mengimplementasikan spesifikasi secara harfiah:
Hapus tanda kutip dan backticks.
Pisahkan string di sekitar karakter non-kata (dalam regex ini juga tidak termasuk angka dan garis bawah), atau garis bawah atau posisi yang memiliki huruf kecil di kiri dan dan huruf besar, huruf kecil di kanan. Ini akan membuat beberapa segmen kosong ketika ada dua karakter non-huruf, non-digit berturut-turut, atau lebih penting di awal string. Kami menyingkirkan mereka yang memiliki
_
opsi. Di sini, "pemisahan" berarti menempatkan setiap bagian yang tersisa pada barisnya sendiri.Konversikan semuanya menjadi huruf kecil.
Konversi setiap karakter yang terjadi setelah linefeed ke huruf besar. Ini dengan mudah akan melewatkan kata pertama karena tidak ada linefeed di depannya.
Singkirkan semua umpan baris untuk menyatukan semuanya kembali.
sumber
Thing
meskipun seharusnya.Java,
198190 byte+3 byte karena saya lupa bahwa
\W+
==[^a-zA-Z0-9_]+
dan saya harus mencocokkan[^a-zA-Z0-9]+
-11 byte terima kasih kepada user20093 -
?:
bukanif
/else
Karena, Jawa.
Ini adalah lambda. Sebut seperti ini:
Versi yang dapat dibaca:
sumber
_
sebagai pembatas token.JavaScript (ES6),
156154152148145141140 byteTerima kasih @Neil (6 byte), @ETHproduksi (3 byte), dan @ edc65 (7 byte)
Menghapus tanda kutip, kemudian melakukan penggantian untuk membagi pada karakter khusus / sebelum modal dikelilingi, kemudian menggabungkan dengan casing yang tepat. Sayangnya,
toLowerCase()
dantoUpperCase()
sangat panjang dan sulit untuk dihindari di sini ...sumber
b.slice(i>0)
berhembus keluar dari air, tetapi sementara itu regex pertandingan saya/[A-Z]?([a-z0-9]|[0-9A-Z]{2,})+([A-Z](?![a-z]))?/g
tampaknya menghemat 2 byte darireplace
pendekatan Anda yang cerdik .replace
secara langsung:replace(/[a-z](?=[A-Z][a-z])/g,'$& ')
match...map
dapat diganti denganreplace
a=>a.replace(/`|'/g,'').replace(/[a-z](?=[A-Z][a-z])/g,'$& ').replace(/[\W_]*([a-z0-9]+)[\W_]*/gi,(_,b,i)=>(i?b[0].toUpperCase():'')+b.slice(i>0).toLowerCase())
b=>a+=(a?b[0].toUpperCase():'')+b.slice(!!a).toLowerCase()
yang saya percaya menghemat 4 byte lagi.vim,
696866vim lebih pendek dari Perl ?! Gila apa ini?
Terima kasih kepada Neil karena melihat keystroke yang tidak berguna!
sumber
:s
memiliki%
tetapi mengapa inkonsistensi dalam dua yang pertama?:%j<cr>
sama dan lebih pendek. 2. Itu menambahkan spasi di antara garis.Mathematica 10.1, 101 bytes
Menggunakan yang tidak berdokumen
ToCamelCase
, yang berfungsi serupa denganCapitalize
tetapi menyetel karakter lain menjadi huruf kecil.sumber
ToCamelCase[n_,m_]:=n<>Capitalize/@m
benar Sepertinya begitu. Dan mengapa digunakanPrepend
saat#~ToCamelCase~{##2}
bekerja?ToCamelCase::argx: ToCamelCase called with 2 arguments; 1 argument is expected.
ToCamelCase[n_]:=""<>Capitalize/@n
?Julia,
9889 byteIni adalah fungsi anonim yang menerima string dan mengembalikan string. Untuk menyebutnya, tetapkan ke variabel.
Pendekatan di sini adalah sama seperti di Doorknob ini Perl jawaban :
replace
apostrof dan tanda kutip mundur dengan string kosong,split
ke dalam sebuah array pada ekspresi reguler yang cocok dengan kasus yang diperlukan,map
yangucfirst
fungsi lebih array ke huruf besar huruf pertama dari setiap elemen,join
array kembali menjadi string, danlcfirst
hasilnya untuk mengubah karakter pertama menjadi huruf kecil.sumber
end
sintaksisnya. Mungkin saya hanya akan menggunakan fungsi anonim untuk semuanya, maka saya tidak perlu mengetikend
: DPerl 67 + 1 = 68 byte
Membutuhkan
-p
bendera, dan-l
untuk multi baris:Bagaimana itu bekerja:
sumber
Perl,
878078 byteByte ditambahkan untuk
-p
bendera.Pertama, kami menggunakan
y///
operator transliterasi untukd
menghapus semua'`
karakter dalam input:Kemudian muncul daging kode:
(pisahkan string input
$_
di lokasi yang sesuai, menggunakan fancy\K
di string pertandingan untuk mengecualikan bagian sebelumnya dari pertandingan yang sebenarnya)(petakan setiap bagian dari string dan buat seluruh string menjadi huruf kecil, kemudian buat karakter pertama dari string yang diubah menjadi huruf besar)
(gabung dengan string kosong dan tetapkan kembali ke garis bawah ajaib
$_
, yang akan dicetak pada bagian akhir)Akhirnya, kami mengurangi huruf pertama
dengan mencocokkan regexnya dan menggunakandengan builtin, menghemat 2 byte dari metode sebelumnya:\l
dalam string penggantiTerima kasih kepada @ MartinBüttner untuk 7 byte (
[^a-zA-Z\d]
->\W|_
)!sumber
\K
...;)Lua, 127 Bytes
Menerima string dari stdin dan mengembalikan hasil camelized.
Mungkin masih akan mencari solusi yang lebih baik karena menyimpan segala sesuatu dalam suatu variabel terasa tidak efisien.
Tetapi bagaimanapun juga, cukup sederhana secara umum:
Ini adalah keindahan yang menyelamatkan saya sedikit byte. gmatch akan membagi string berdasarkan pola:
%w+
yang hanya mengambil alfanumerik.Setelah itu operasi string sederhana. string.upper, string.lower dan selesai.
sumber
PHP,
145122133 byteSimpan ke file, panggilan dari CLI.
Mengambil input dari argumen baris perintah tunggal; melarikan diri kutipan dan ruang kosong jika perlu.
kerusakan
lcfirst
diizinkan untuk mengurangi ini menjadi satu perintah, menghemat 23 byte.Memperbaiki apostrof biaya 11 byte untuk penggantian kasus tambahan.
sumber
Kotlin , 160 Bytes
Tujuan saya adalah menjadi Scala, "alternatif Jawa" yang lain, jadi saya agak senang dengan hasil saya. Saya mencuri regex dari Jawa jawaban .
Uji dengan:
sumber
\W|_|(?<=[a-z])(?=[A-Z][a-z])
atau sedikit memodifikasi misalnya.[\W_]+
fun String.a()=replace(Regex("['`]"),"").split(Regex("[\\W_]+|(?<=[a-z])(?=[A-Z][a-z])")).joinToString(""){it.toLowerCase().capitalize()}.decapitalize()
Scala,
181170144Penguji:
Props untuk CAD97 dan permintaan maaf untuk Nathan Merrill :)
sumber
[^a-zA-Z0-9]+
dengan[\\W_]+
.C 272 karakter
Program C meneruskan string ke camelCase dalam tanda kutip sebagai argumen 1. Ada banyak tentang gotcha dalam pernyataan masalah ini ...
sumber
#include<string.h>
untukstrlen
,strtok
dantoupper
, dan#include<ctype.h>
untukisalnum
../camel "Programming Puzzles & Code Golf"
di cygwin (dikompilasi dengan gcc 3.4.4), saya mengertiprogrammingPuzzlesCodeEGolf
. Output yang sama dengan 5.3.0.JavaScript, 123 byte
Versi yang mudah dibaca
Hapus apostrof, buat huruf kecil karakter pertama, huruf kecil karakter terakhir, dan setiap pengelompokan beberapa huruf besar, cocok dengan grup 1 atau lebih karakter non-alfanumerik + 1 karakter lainnya, ganti dengan huruf terakhir yang ditulis dengan huruf kapital.
[r = "ganti"] trik dari solusi Mrw247.
sumber