Membalikkan setiap kata dalam satu baris dalam vim

9

Tugas Anda adalah membuat skrip vim atau memberikan urutan penekanan tombol yang akan beroperasi pada satu baris teks dengan hingga 140 karakter ASCII yang dapat dicetak (di mana saja dalam file, dengan kursor mulai dari mana saja di baris) dan membalikkan setiap spasi- string yang dipisahkan dalam kalimat sambil menjaga string dalam urutan yang sama.

Misalnya, input:

roF emos nosaer m'I gnisu a retcarahc-041 timil no siht noitseuq neve hguoht ti t'nseod evlovni .rettiwT RACECAR  

harus kembali:

For some reason I'm using a 140-character limit on this question even though it doesn't involve Twitter. RACECAR  

Script dengan karakter paling sedikit, atau urutan penekanan tombol paling sedikit, untuk mencapai hasil ini adalah pemenangnya.

Joe Z.
sumber
1
"Untuk keperluan pertanyaan ini, ini hanya vim" tampaknya sewenang-wenang pembatasan bahasa seperti memposting tantangan golf kode normal dan hanya meminta jawaban dalam C. ( Dan saya tampaknya tidak sendirian dengan pendapat ini. )
Martin Ender
27
Mengapa RACECAR tidak dibalik?
orlp
3
Karena itu palindrom. Coba balikkan sendiri.
Joe Z.
2
Wow, saya bodoh. Derp.
orlp
7
@ atau Lol. Saya pikir Anda bercanda.
mbomb007

Jawaban:

9

28 25 24 penekanan tombol

:se ri<CR>^qqct <C-r>"<Esc>f l@qq@q

Makro rekursif, saya berasumsi bahwa Ctrl- rdihitung sebagai satu keystroke.

Bagian tersulit adalah memastikan makro tetap pada baris yang sama dan tidak menghancurkan sisa file.

orlp
sumber
Anda bisa menggunakan cEalih-alih ct , jika itu tidak mengakhiri makro. Tapi Anda bisa menggunakan Walih-alih f lmenyimpan 2 pukulan.
Caek
@Caek Salah x2. Coba tebak apa yang cEterjadi ketika kursor berada di awal a retcarahc-041? Dan coba tebak apa yang Wterjadi ketika kita berada di ujung garis?
orlp
Catat modalnya E. huruf kecil eakan pergi sampai garis putus-putus, modal Eakan pergi ke ruang berikutnya. Saya hanya mencoba untuk mengonfirmasi.
Caek
coba: :set ri<Enter>^qqct <C-r>"<Esc>W@qq@quntuk 23.
Caek
@Caek Itu tidak akan berhasil. Dan mengenai E, saya tahu apa fungsinya. Saya merujuk yang cE<C-r><Esc>akan berubah a retcarahc-041menjadi 140-character a, AKA itu akan bertukar kata-kata.
orlp
3

24 penekanan tombol

ma:s/ /\r/g
V'a:!rev
gvJ

Saya tahu pertanyaan ini sudah sangat lama, tetapi saya suka vimgolf jadi saya tidak bisa tidak mengirim jawaban pada salah satu dari beberapa tantangan khusus vim di situs. Ditambah lagi solusi ini diikat dengan Orlp's.

Seperti yang dikatakan Orlp, bagian tersulit adalah memastikan bahwa sisa buffer tidak dimodifikasi. Jika bukan karena batasan itu, kita bisa melakukan:

:s/ /\r/g
!{rev
V}J

(19 penekanan tombol) tetapi kita perlu sedikit lebih banyak untuk menjaganya agar tetap aman. Ini mengasumsikan lingkungan unix.

James
sumber