Anda telah disewa untuk menulis beberapa kode untuk aplikasi pengambilan dikte, yang mengambil input suara dari sumber yang diucapkan, mem-parsingnya sebagai kata-kata, dan menuliskannya di layar.
Manajemen tidak benar-benar mempercayai Anda dengan semua kekuatan yang ada di proyek ini — Anda dikenal hanya duduk-duduk dan bermain golf sepanjang hari alih-alih melakukan pekerjaan Anda, sayangnya — jadi mereka hanya memberi Anda tugas yang sangat sederhana untuk dilakukan: putar Kalimat dengan Tanda baca diselingi menjadi kalimat yang diformat dengan benar, di mana 'diformat dengan benar' didefinisikan di bawah ini.
Kalimat adalah serangkaian input. A Word adalah sekelompok karakter non-spasi yang bisa menular. Tanda baca adalah kata yang karakter pertamanya adalah
^
.Sebuah huruf besar ditulis dengan huruf besar jika huruf pertama dari kata tersebut bukan huruf kecil (kata dengan huruf besar cocok dengan regex
/[^a-z].*/
).Kata pertama dari Kalimat harus ditulis dengan huruf besar.
A
^COMMA
adalah karakter koma,
dan memiliki spasi berikut tetapi tidak sebelumnya.aaa ^COMMA bbb
menjadiaaa, bbb
.A
^COLON
adalah tanda koma:
.A
^SEMICOLON
adalah tanda koma;
.A
^PERIOD
adalah tanda koma.
. Kata berikut a^PERIOD
harus ditulis dengan huruf besar .A
^BANG
adalah periode yang terlihat seperti!
.A
^DASH
adalah karakter tanda hubung-
dan memiliki spasi sebelum dan sesudahnya.A
^HYPHEN
juga karakter dasbor-
tetapi tidak memiliki spasi mengikuti atau mendahului.An
^EMDASH
adalah tanda hubung (bukan tanda hubung!) Yang dieja--
.An
^OPENQUOTE
adalah karakter kutipan"
yang memiliki ruang mendahului tetapi tidak mengikuti. Kata berikut^OPENQUOTE
harus ditulis dengan huruf besar . Jika suatu^OPENQUOTE
didahului oleh kata yang bukan tanda baca, tambahkan a^COMMA
antara kata itu dan^OPENQUOTE
. Jika a^OPENQUOTE
didahului oleh Tanda Baca yang membuat kata berikutnya menjadi kapital, ini melompati^OPENQUOTE
ke kata berikutnya.A
^CLOSEQUOTE
adalah digraf,"
yang memiliki spasi mengikuti tetapi tidak mendahului. Jika^CLOSEQUOTE
didahului oleh^COMMA
,^PERIOD
atau^BANG
, bahwa Tanda Baca menghilang dan^CLOSEQUOTE
dieja,"
,."
atau!"
masing-masing. Jika Tanda baca yang hilang menentukan huruf besar, huruf besar itu masih harus muncul pada kata berikutnya yang tersedia.Ruang awal atau akhir dalam hasil akhir penuh harus dihilangkan, dan string apa pun dari dua ruang atau lebih dalam satu baris harus diciutkan menjadi karakter spasi tunggal.
Kasus apa pun yang tidak dicakup di atas (misalnya
^COMMA ^COMMA
atau^SEMICOLON ^CLOSEQUOTE
atau^UNDEFINEDPUNCTUATION
) tidak akan terjadi pada input yang terbentuk dengan baik dan dengan demikian perilaku tidak terdefinisi.
Tim pengembangan memberi tahu Anda tentang hal-hal berikut:
Proyek ini sedang ditulis dalam bahasa [ bahasa Anda di sini] , dan harus sesingkat mungkin sehingga membutuhkan ruang sesedikit mungkin ketika itu merupakan aplikasi untuk Android / iPhone. Anda mencoba menjelaskan bahwa itu bukan cara kerja pengembangan aplikasi, tetapi mereka tidak mendengarkan. Tapi hei, kebetulan sekali! Anda adalah pegolf luar biasa dalam [bahasa Anda di sini] !
Aplikasi tidak akan memiliki izin akses web apa pun, dan tidak akan ada pustaka yang diinstal yang melakukan pemformatan ini untuk Anda. Anda mungkin dapat meyakinkan pimpinan tim untuk mengizinkan Anda perpustakaan regex jika ada untuk bahasa Anda, jika Anda merasa perlu.
Dukungan untuk kutipan bersarang yang menggunakan tanda kutip ganda / tunggal dengan benar direncanakan untuk versi aplikasi yang lebih baru, tetapi bukan versi yang sedang Anda kerjakan sekarang, jadi jangan khawatir.
Manajemen adalah penggemar berat pengembangan yang digerakkan oleh pengujian, dan tim pengembang telah membuat beberapa keyboard monyet yang malang menulis beberapa tes untuk bagian program Anda: (baris baru ditambahkan agar mudah dibaca, perlakukan sebagai ruang)
Memasukkan:
hello ^COMMA world ^BANG
Keluaran:
Hello, world!
Memasukkan:
once upon a time ^COMMA there was a horse ^PERIOD that horse cost me $50 ^PERIOD ^OPENQUOTE eat your stupid oats ^COMMA already ^BANG ^CLOSEQUOTE I told the horse ^PERIOD the horse neighed back ^OPENQUOTE no ^CLOSEQUOTE and died ^PERIOD THE END
Keluaran:
Once upon a time, there was a horse. That horse cost me $50. "Eat your stupid oats, already!" I told the horse. The horse neighed back, "No," and died. THE END
Memasukkan:
begin a ^PERIOD b ^COMMA c ^COLON d ^SEMICOLON e ^BANG f ^HYPHEN g ^DASH h ^EMDASH i ^OPENQUOTE j ^PERIOD ^OPENQUOTE k ^SEMICOLON ^OPENQUOTE l ^CLOSEQUOTE m ^BANG ^CLOSEQUOTE n ^PERIOD 0x6C6F6C end
Keluaran:
Begin a. B, c: d; e! F-g - h--i, "j. "K; "l," m!" N. 0x6C6F6C end
Ini adalah kode golf: skor terendah menang. Anda dapat menulis fungsi dari satu argumen string, atau program membaca dari STDIN dan menulis ke STDOUT.
sumber
prompt()
?Jawaban:
JavaScript:
653 611 547 514487 byteYa ampun. Brendan Eich Saya sangat menyesal untuk ini.
PS: Saya telah menambahkan spasi putih untuk keterbacaan, tetapi menghapus semua ruang putih yang diijinkan menghasilkan jumlah byte yang terdaftar.
Secara teoritis saya dapat mempersingkat beberapa bagian seperti
-e-
ke sesuatu seperti-e
atau-e
, tetapi itu dapat menyebabkan masalah jika kata sebelumnya berakhir dengan, atau kata berikut dimulai dengan huruf 'e' (atau kata mana yang saya putuskan untuk digunakan). Saya kira saya bisa menggunakan karakter ASCII. Saya akan melihat itu.487 FF22 + Hanya
514 FF22 + Hanya
547 FF22 + Hanya
611 FF 22+ Hanya
653 lintas browser
Bagaimana itu bekerja:
JSFiddle (untuk solusi lintas-browser 653 byte)
JSFiddle (untuk solusi 595 FF 22+ saja )
JSFiddle (untuk solusi 547 FF 22+ saja )
JSFiddle (untuk solusi 514 FF 22+ saja )
JSFiddle (untuk solusi 487 FF 22+ saja )
Ini adalah pertama kalinya saya harus menulis JS yang menggunakan lebih dari satu regex, dan biasanya regex saya sudah ditentukan sebelumnya.
Saya akan terus memotong byte sebanyak yang saya bisa.
sumber
c.replace(/\^((COMMA)|(SEMICOLON)|(COLON)|(PERIOD)|(BANG))/g,(m,_,a,b,c,d,e)=>a?',':b?';':c?':':d?'.':'!'))
... dan seterusnya. Sintaks panah pendek, tetapi bahkan 'fungsi' harus menyimpan karakter yang sama=>
s untuk membuatnya bekerja, tetapi menggunakan panah menyelamatkan saya 40 byte!PHP, 412 byte
(Tidak disatukan di sini untuk kejelasan; lihat ideone untuk versi golf .)
Fungsi preg_replace () PHP akan menerima argumen array, yang cukup berguna di sini. Saya pikir kode berikut melakukan semua yang diperlukan. Setidaknya melewati semua kasus uji.
sumber