JavaScript ES6, 70 68 66 64 byte
Disimpan 2 byte berkat @Kevin Lau - bukan Kenny
Disimpan 2 byte berkat @ Cᴏɴᴏʀ O'Bʀɪᴇɴ
s=>s.replace(/[A-Z]/gi,l=>l+l[`to${l<"a"?"Low":"Upp"}erCase`]())
Penjelasan
Ini menggunakan benar-benar hacky:
l[`to${l<"a"?"Low":"Upp"}erCase`]()
yang ungolfed adalah:
l[`to${
l < "a" ?
"Low" :
"Upp"
}erCase`]()
Pada dasarnya l < "a"
memeriksa apakah titik kode huruf kurang dari titik kode a
(oleh karena itu menjadi huruf besar). Jika itu akan dilakukan to + Low + erCase
yang menjadi l['toLowerCase']()
dan membuat karakter huruf kecil. `
kutipan memungkinkan pemformatan string sehingga pada dasarnya Anda dapat memikirkan:
`to${l < "a" ?"Low" : "Upp"}erCase`
sebagai: "to" + (l<"a" ? "Low" : "Upp") + "erCase"
yang menghasilkan fungsi untuk memanggil (membuat string huruf besar atau kecil). Kami menempatkan ini dalam tanda kurung siku [ ... ]
yang memungkinkan kami mengakses properti yang diberi namanya sebagai string. Ini mengembalikan fungsi yang sesuai dan kemudian kita sebut saja.