Seberapa berani pos ini?

13

Pembukaan

Dalam penurunan harga Stack Exchange, kami menggunakan ** untuk menebalkan teks. Misalnya, penurunan harga ini:

The **quick brown fox jumps over the lazy** dog.

Render sebagai:

The cepat rubah cokelat melompat di atas malas anjing.

Tentu saja, kami menggunakan ** untuk menutup keberanian juga. Jadi lebih sedikit jawabannya akan berani. Sebagai contoh:

The **quick** brown fox jumps over the **lazy** dog.

Render sebagai:

The cepat rubah cokelat melompat di atas malas anjing.

Namun, jika boldness tidak ditutup, itu menjadikannya tidak berani :

The **quick brown fox jumps over the lazy dog.

Render sebagai:

** Rubah cokelat cepat melompati anjing malas.

Jika teks memiliki garis miring terbalik tunggal \, keberanian tidak berlaku, baik:

The \**quick brown fox jumps over the lazy dog.**

Render sebagai:

** Rubah cokelat cepat melompati anjing malas. **

Trailing white space menghasilkan teks yang tidak dicetak tebal (perhatikan, spasi putih setelah cokelat adalah satu tab):

The** quick** brown fox jumps over the lazy dog.**

Render sebagai:

** Cepat ** rubah cokelat melompati anjing malas. **

Kita juga dapat menggunakan __ untuk huruf tebal, tetapi perhatikan bahwa hanya satu yang dapat aktif sekaligus. Berikut ini contoh yang lebih rumit:

The __quick**__ brown **fox__ jumps** over__ the__ lazy **dog.

Render sebagai:

The cepat ** coklat fox__ melompat over__ the__ anjing ** malas.

Pertanyaan:

Anda dapat menulis sebuah program atau fungsi, mengingat teks ASCII baik sebagai Stringargumen atau STDIN, di mana satu-satunya karakter khusus **, __, \(untuk melarikan diri) dan trailing spasi, menentukan berapa banyak karakter yang berani ada. Nilai ini harus dicetak ke STDOUT atau dikembalikan dari fungsi Anda. Anda tidak perlu mendukung string yang sangat panjang; Panjang string dijamin tidak lebih dari 30K, yang merupakan batas untuk posting Stack Exchange.

Cetak halus:

  • Bisakah saya melempar pengecualian / kesalahan lain untuk satu kasus, dan kembali secara normal untuk yang lain?
    • Tidak. Ini harus berupa nilai pengembalian yang jelas, tidak ambigu, tidak salah untuk kedua kasus. Output STDERR akan diabaikan.
  • Apakah spasi di antara kata-kata dianggap berani?
    • Iya. **quick brown**memiliki 11 karakter tebal di dalamnya.
  • Haruskah \dalam \**, jika tebal, dihitung?
    • Tidak. Ini merender sebagai **, jadi jika harus dicetak tebal hanya 2 karakter.
  • Menjadi sangat jelas: apa yang Anda maksud dengan jumlah karakter
    • Total karakter yang akan dicetak tebal. Ini berarti bahwa **ini tidak diberikan jika mengubah teks, tetapi diberikan jika tidak.
    • Perhatikan bahwa dimungkinkan untuk dibuat **tebal dengan beberapa cara, misalnya **\****-> ** .
    • Jangan mempertimbangkan kemungkinan bahwa beberapa teks dapat dikonversi menjadi miring. Satu- satunya aturan penurunan harga yang harus dipertimbangkan adalah ** = tebal *.
  • Di Stack Exchange, HTML Bold juga berfungsi. yaitu <b> </b>
    • Ya saya sadar. Jangan pertimbangkan hal ini, ini adalah teks normal.
  • Bagaimana dengan HTML? misalnya &lt;-><
    • Ini juga harus dianggap sebagai teks normal, tidak ada konversi entitas HTML.
  • Saya telah memikirkan contoh yang tidak Anda bahas di atas!
    • Aturan berfungsi persis seperti jika teks diposting di Stack Exchange, dalam jawaban (bukan komentar), kecuali bahwa blok kode tidak dianggap sebagai karakter khusus . Baik tipe ruang empat dan tipe backtick. Jika Anda tidak yakin tentang bagaimana teks harus diterjemahkan, cukup masukkan ke kotak jawaban di suatu tempat sebagai ujian, itulah aturan yang harus Anda ikuti.

Contoh:

Memasukkan:

The **quick brown fox jumps over the lazy** dog.

Keluaran:

35

Memasukkan:

The **quick brown fox jumps over the lazy dog.

Keluaran:

0

Memasukkan:

The __quick**__ brown **fox__ jumps** over__ the__ lazy **dog.

Keluaran:

18

Memasukkan:

The __quick\____ brown fox **jumps over\** the** lazy \**dog.

Keluaran:

23

Memasukkan:

The****quick brown fox****jumps over **the****lazy** dog.

Keluaran:

11

Celah Standar dilarang.

durron597
sumber
Apakah 18benar untuk kasus uji ketiga?
Beta Decay
@ BetaDecay Ini 7 + 11. Menurut Anda apa yang seharusnya?
durron597
Saya mendapatkan 28 ... Saya akan memeriksa program saya
Beta Decay
@BetaDecay **fox__ jumps**mengakhiri bold tertentu.
durron597
1
Pertanyaannya sepertinya menyarankan bahwa ada tiga \**atau \__beberapa urutan karakter, tetapi di StackExchange hanya ada dua urutan karakter \*atau \_. Sehingga \***a**menghasilkan tanda bintang diikuti oleh huruf tebal a. Ada juga pelarian lain \\ ,. Haruskah kita menangani yang itu?
feersum

Jawaban:

5

rs , 107 byte

\t/ 
(?<!\\)((\*|_){2})((?=\S)(?!\2)(\\\2|.)*?)?(?<=\S)\1/(\n)^^((^^\3))\3
\\(\*|_)/\t
[^\t\n]/
\n/_
\t_?/
(_*)/(^^\1)

Demo langsung dan uji kasus.

Ini hal yang cukup gila ...

Kasing uji terbaru belum berfungsi. WIP ...

Penjelasan

\t/ 

Ganti tab dengan spasi. Mereka memiliki jumlah karakter yang sama, dan tab digunakan nanti sebagai karakter khusus.

(?<!\\)((\*|_){2})((?=\S)(?!\2)(\\\2|.)*?)?(?<=\S)\1/(\n)^^((^^\3))\3

Ganti teks dengan panjang apa pun Nyang harus dicetak tebal dengan Nbaris baru diikuti oleh teks asli.

\\(\*|_)/\t

Ganti setiap pembatas yang segera didahului dengan garis miring dengan tab. Ini untuk memastikan bahwa entri suka **a\***memiliki jumlah karakter 2 bukannya 3.

[^\t\n]/

Hapus karakter apa pun yang bukan tab atau baris baru.

\n/_

Ganti semua baris baru dengan garis bawah.

\t_?/

Hapus semua tab (yang mewakili pembatas yang lolos), bersama dengan setiap garis bawah yang mungkin mengikuti mereka. Ini terkait dengan masalah jumlah karakter di atas dengan pembatas akhir yang lolos.

(_*)/(^^\1)

Ganti urutan garis bawah dengan panjangnya. Ini adalah jumlah karakter.

kirbyfan64sos
sumber
**a****b**output 2, seharusnya 6. Lihat: a **** b
durron597
1
@ durron597 Saya sedikit bingung bagaimana itu seharusnya bekerja. Bisakah Anda menambahkan penjelasan?
kirbyfan64sos
Seperti yang saya katakan, mainkan saja di panel jawaban. **** selalu hanya asterik, yang bisa di dalam huruf tebal atau tidak di dalam huruf tebal berdasarkan teks lainnya.
durron597
Jadi, @ kirbyfan64sos, bagaimana berani adalah pos?
mbomb007
2

Python: 133 karakter

import re
f=lambda s:sum(len(x[0])-4for x in re.findall(r'(([_*])\2\S.*?\2\2+)',re.sub(r'([_*])\1\1\1','xxxx',re.sub(r'\\.','x',s))))

Ini harus bekerja secara identik di kedua Python 2 dan 3. Fungsi fmengembalikan jumlah karakter tebal yang akan berada di string yang dilewatkan ketika diformat oleh sistem penurunan harga Stack Overflow.

Saya pikir saya mendapatkan sebagian besar kasus sudut kanan (termasuk semua yang disebutkan dalam komentar sejauh ini), tetapi masih belum sepenuhnya sempurna. Saya tidak mengerti mengapa x***x**tidak membuat *xhuruf tebal (seperti ***x**halnya), jadi kode saya akan mendapatkan setidaknya beberapa input yang salah.

Kode ini memiliki empat langkah utama. Yang pertama melakukan penggantian regs backslash diikuti oleh karakter apa pun dengan karakter 'x'. Langkah kedua menggantikan setiap urutan empat asterix atau garis bawah dengan empat karakter 'x'. Langkah ketiga menggunakan regex findalluntuk menemukan semua blok yang akan dicetak miring. Langkah terakhir adalah ekspresi generator di dalam sumpanggilan, yang menambah panjang blok-blok itu, mengurangi 4 karakter dari masing-masing, karena kami tidak ingin menyertakan pembatas dalam hitungan kami.

Inilah beberapa hasil tes:

>>> f('The **quick brown fox jumps over the lazy** dog.')
35
>>> f('The **quick brown fox jumps over the lazy dog.')
0
>>> f('The \**quick brown fox jumps over the lazy dog.**')
0
>>> f('The** quick** brown fox jumps over the lazy dog.**')
0
>>> f('The __quick\____ brown fox **jumps over\** the** lazy \**dog.')
23
>>> f('The****quick brown fox****jumps over **the****lazy** dog.')
11
>>> f('\***a**')
1
>>> f('x***x**') # this one doesn't match the Stack Overflow input box
2
Blckknght
sumber
Saya tidak tahu mengapa x***x**tidak bekerja di kotak input. Aneh
durron597
1

JavaScript ES6, 91 byte

s=>(o=0,s.replace(/\\(.)\1/g,'..').replace(/(\*\*|__)(?=\S)(.*?\S)\1/g,l=>o+=l.length-4),o)

Berurusan dengan semua lolos sebelumnya, lalu gunakan ekspresi reguler. Banyak potensi bermain golf.

Penjelasan

s=>( // Function with argument s
  o=0, // Set var "o" to 0
  s.replace( // Replace...
    /\\(.)\1/g,  // Matches \ followed by two the same characters. g means "global"
    ".." // Replace with two arbitrary characters
  ).replace( // Replace again...
     /(\*\*|__) // Match ** or __, store in "group 1"
       (?=\S)   // Make sure next character isn't whitespace
       (.*?\S)\1  // Match all characters until "group 1".
                  // Make sure last character isn't whitespace
     /g, l=> // Take the match...
       o+= // Increase o by...
         l.length // the length of the match
         - 4 // minus 4 to account for ** and __
  ), o) // Return o
Downgoat
sumber
Untuk **a*b*c**ini mengembalikan 9, yang saya percaya tidak benar. Hitungan sebenarnya adalah 5 (atau 3, jika Anda mempertimbangkan huruf miring, yang menurut OP Anda tidak boleh).
Cristian Lupascu