Saya ingin mencoba jenis baru tantangan golf regex, yang meminta Anda untuk menyelesaikan tugas komputasi nontrivial dengan apa pun selain penggantian regex. Untuk membuat ini lebih mungkin dan lebih sedikit dari tugas, Anda akan diizinkan untuk menerapkan beberapa pergantian, satu demi satu.
Tantangan
Kami akan mulai dengan sederhana: diberi string yang berisi dua bilangan bulat positif, sebagai angka desimal dipisahkan oleh a ,
, menghasilkan string yang berisi jumlah mereka, juga sebagai angka desimal. Jadi, sangat sederhana
47,987
harus berubah menjadi
1034
Jawaban Anda harus bekerja untuk bilangan bulat positif sewenang-wenang.
Format
Setiap jawaban harus merupakan urutan langkah substitusi, setiap langkah yang terdiri dari regex dan string pengganti. Secara opsional, untuk masing-masing langkah dalam urutan, Anda dapat memilih untuk mengulangi substitusi hingga string berhenti berubah. Ini adalah contoh pengiriman (yang tidak menyelesaikan masalah di atas):
Regex Modifiers Replacement Repeat?
\b(\d) g |$1 No
|\d <none> 1| Yes
\D g <empty> No
Diberikan input 123,456
, pengajuan ini akan memproses input sebagai berikut: substitusi pertama diterapkan sekali dan menghasilkan:
|123,|456
Sekarang substitusi kedua diterapkan dalam satu lingkaran sampai string berhenti berubah:
1|23,|456
11|3,|456
111|,|456
111|,1|56
111|,11|6
111|,111|
Dan terakhir, substitusi ketiga diterapkan sekali:
111111
Perhatikan bahwa kriteria terminasi untuk loop adalah apakah string berubah, bukan apakah regex menemukan kecocokan. (Yaitu, itu mungkin juga berakhir jika Anda menemukan kecocokan tetapi penggantinya identik dengan kecocokan.)
Mencetak gol
Skor utama Anda akan menjadi jumlah langkah substitusi dalam kiriman Anda. Setiap penggantian yang berulang akan dihitung untuk 10 langkah. Jadi contoh di atas akan memberi skor 1 + 10 + 1 = 12
.
Dalam kasus seri (tidak terlalu tidak mungkin), skor sekunder adalah jumlah dari semua langkah. Untuk setiap langkah tambahkan regex ( tanpa pembatas), pengubah dan string substitusi. Untuk contoh di atas ini akan menjadi (6 + 1 + 3) + (3 + 0 + 2) + (2 + 1 + 0) = 18
.
Aturan Lain-lain
Anda dapat menggunakan rasa regex (yang harus Anda tunjukkan), tetapi semua langkah harus menggunakan rasa yang sama. Selain itu, Anda tidak boleh menggunakan fitur apa pun dari bahasa host flavour, seperti callback pengganti atau e
pengubah Perl , yang mengevaluasi kode Perl. Semua manipulasi harus terjadi secara eksklusif melalui penggantian regex.
Perhatikan bahwa itu tergantung pada rasa dan pengubah Anda apakah setiap penggantian tunggal menggantikan semua kejadian atau hanya satu saja. Misalnya jika Anda memilih aroma ECMAScript, satu langkah secara default hanya akan menggantikan satu kejadian, kecuali jika Anda menggunakan g
pengubah. Di sisi lain, jika Anda menggunakan .NET flavor, setiap langkah akan selalu menggantikan semua kejadian.
Untuk bahasa yang memiliki metode substitusi berbeda untuk penggantian tunggal dan global (mis. Ruby sub
vs. gsub
), asumsikan bahwa penggantian tunggal adalah default dan memperlakukan penggantian global seperti g
pengubah.
Pengujian
Jika rasa yang Anda pilih adalah .NET atau ECMAScript, Anda dapat menggunakan Retina untuk menguji kiriman Anda (saya diberitahu, ini juga berfungsi pada Mono). Untuk rasa lain, Anda mungkin harus menulis sebuah program kecil dalam bahasa host yang menggunakan substitusi secara berurutan. Jika ya, harap sertakan program pengujian ini dalam jawaban Anda.