Làm thế nào táo bạo là bài này?


13

Lời nói đầu

Trong đánh dấu Stack Exchange, chúng tôi sử dụng ** để in đậm văn bản. Ví dụ: đánh dấu này:

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

Hiển thị như:

Con cáo nâu nhanh nhẹn nhảy qua con chó lười .

Tất nhiên, chúng tôi sử dụng ** để đóng táo bạo là tốt. Vì vậy, ít câu trả lời sẽ được in đậm. Ví dụ:

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

Hiển thị như:

Con cáo nâu nhanh nhẹn nhảy qua con chó lười .

Tuy nhiên, nếu độ đậm không được đóng, nó hiển thị là không đậm :

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

Hiển thị như:

The quick brown fox jumps over the lazy dog.

Nếu văn bản có dấu gạch chéo ngược đơn \, thì độ đậm không có hiệu lực:

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

Hiển thị như:

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

Trailing trắng kết quả trong văn bản không được bán (lưu ý, khoảng trắng sau màu nâu là một tab duy nhất):

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

Hiển thị như:

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

Chúng ta cũng có thể sử dụng __ cho đậm, nhưng lưu ý rằng mỗi lần chỉ có thể hoạt động. Đây là một ví dụ phức tạp hơn:

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

Hiển thị như:

Con cáo nâu ** nhanh chóng nhảy qua _ con chó lười biếng **.

Câu hỏi:

Bạn có thể viết một chương trình hoặc chức năng, được đưa ra văn bản ASCII hoặc là một Stringtham số hoặc trên STDIN, nơi chỉ ký tự đặc biệt là **, __, \(ví thoát) và dấu khoảng trắng, xác định có bao nhiêu ký tự in đậm có. Giá trị này phải được in thành STDOUT hoặc trả về từ hàm của bạn. Bạn không cần phải hỗ trợ các chuỗi rất dài; Độ dài chuỗi được đảm bảo không quá 30K, đó là giới hạn cho bài đăng Stack Exchange.

Bản in đẹp:

  • Tôi có thể ném ngoại lệ / lỗi khác cho một trường hợp và trả lại bình thường cho trường hợp khác không?
    • Không. Nó phải là giá trị trả lại rõ ràng, không mơ hồ, không bị lỗi cho cả hai trường hợp. Đầu ra STDERR sẽ bị bỏ qua.
  • Là khoảng trắng ở giữa các từ được coi là đậm?
    • Đúng. **quick brown**có 11 ký tự in đậm trong đó.
  • Nếu \trong \**, nếu in đậm, nên được tính?
    • Không. Nó hiển thị là **, vì vậy nếu được in đậm, nó sẽ chỉ có 2 ký tự.
  • Hãy hoàn toàn rõ ràng: bạn có ý nghĩa gì với bao nhiêu nhân vật?
    • Tổng số ký tự sẽ được in đậm. Điều này có nghĩa **không được hiển thị nếu nó chuyển đổi văn bản, nhưng nó được hiển thị nếu không.
    • Lưu ý rằng có **thể in đậm theo nhiều cách, ví dụ: **\****> ** .
    • Đừng xem xét khả năng một số văn bản có thể được chuyển đổi thành chữ nghiêng. Các chỉ quy tắc markdown để xem xét là ** = bold *.
  • Trên Stack Exchange, HTML Bold cũng hoạt động. tức là <b> </ b>
    • Vâng, tôi biết. Đừng xem xét trường hợp này, đây là văn bản bình thường.
  • Những gì về HTML lôi kéo? ví dụ: &lt;><
    • Đây cũng nên được coi là văn bản bình thường, không có chuyển đổi thực thể HTML.
  • Tôi đã nghĩ về một ví dụ bạn không bao gồm ở trên!
    • Hàm quy tắc hoạt động chính xác như thể văn bản đã được đăng trên Stack Exchange, trong một câu trả lời (không phải bình luận), ngoại trừ các khối mã không được coi là ký tự đặc biệt . Cả bốn loại không gian và loại backtick. Nếu bạn không chắc chắn về cách hiển thị văn bản, chỉ cần ném nó vào hộp trả lời ở đâu đó dưới dạng thử nghiệm, đó là những quy tắc bạn nên tuân theo.

Ví dụ:

Đầu vào:

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

Đầu ra:

35

Đầu vào:

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

Đầu ra:

0

Đầu vào:

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

Đầu ra:

18

Đầu vào:

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

Đầu ra:

23

Đầu vào:

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

Đầu ra:

11

Lỗ hổng tiêu chuẩn bị cấm.


18chính xác cho trường hợp thử nghiệm thứ ba?
Beta Decay

@BetaDecay Đó là 7 + 11. Bạn nghĩ nó nên là gì?
durron597

Tôi đã nhận được 28 ... Tôi sẽ xem qua chương trình của mình
Beta Decay

@BetaDecay **fox__ jumps**chấm dứt sự va chạm cụ thể đó.
durron597

1
Câu hỏi dường như gợi ý rằng \**hoặc \__là các chuỗi thoát ba ký tự, nhưng trong StackExchange chỉ có các chuỗi thoát hai ký tự \*hoặc \_. Vì vậy, \***a**tạo ra một dấu sao theo sau là một đậm a. Ngoài ra còn có một lối thoát khác \\ . Chúng ta có nên xử lý cái đó không?
frageum

Câu trả lời:


5

rs , 107 byte

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

Bản demo và trường hợp thử nghiệm trực tiếp.

Đây là một điều khá ... điên rồ.

Trường hợp thử nghiệm mới nhất chưa hoạt động. WIP ...

Giải trình

\t/ 

Thay thế các tab bằng dấu cách. Chúng có cùng số lượng ký tự và các tab được sử dụng sau này như một ký tự đặc biệt.

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

Thay thế bất kỳ văn bản có độ dài Ncần được in đậm bằng Ndòng mới theo sau là văn bản gốc.

\\(\*|_)/\t

Thay thế bất kỳ sự xuất hiện của một dấu phân cách ngay trước dấu gạch chéo bằng một tab. Điều này là để đảm bảo rằng các mục như **a\***có số lượng ký tự là 2 thay vì 3.

[^\t\n]/

Xóa bất kỳ ký tự nào không phải là tab hoặc dòng mới.

\n/_

Thay thế tất cả các dòng mới với dấu gạch dưới.

\t_?/

Xóa mọi tab (đại diện cho các dấu phân cách đã thoát), cùng với bất kỳ dấu gạch dưới nào có thể đi theo chúng. Điều này có liên quan đến vấn đề trên về số lượng nhân vật với các dấu phân cách kết thúc thoát.

(_*)/(^^\1)

Thay thế chuỗi gạch dưới với chiều dài của nó. Đây là số lượng nhân vật.


**a****b**đầu ra 2, phải là 6. Xem: a **** b
durron597

1
@ durron597 Tôi hơi bối rối về cách thức hoạt động của nó. Bạn có thể thêm một lời giải thích?
kirbyfan64sos

Như tôi đã nói, chỉ cần chơi xung quanh với nó trong một khung trả lời. **** luôn luôn chỉ là các dấu hoa thị, có thể bên trong một chữ in đậm hoặc không in đậm dựa trên văn bản khác.
durron597

Vì vậy, @ kirbyfan64sos, làm thế nào đậm các bài?
mbomb007

2

Python: 133 ký tự

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))))

Điều này sẽ hoạt động giống hệt nhau trong cả Python 2 và 3. Hàm ftrả về số lượng ký tự in đậm sẽ có trong chuỗi mà nó được truyền khi được định dạng bởi hệ thống đánh dấu của Stack Overflow.

Tôi nghĩ rằng tôi nhận được hầu hết các trường hợp góc đúng (bao gồm tất cả những trường hợp được đề cập trong các bình luận cho đến nay), nhưng nó vẫn không hoàn toàn hoàn hảo. Tôi không hiểu tại sao x***x**không hiển thị *xin đậm (như ***x**vậy), vì vậy mã của tôi sẽ nhận được ít nhất một vài đầu vào sai.

Mã có bốn bước chính. Cái đầu tiên thực hiện thay thế regex cho bất kỳ dấu gạch chéo ngược nào theo sau bởi bất kỳ ký tự nào có ký tự 'x'. Bước thứ hai thay thế bất kỳ chuỗi bốn dấu sao hoặc dấu gạch dưới bằng bốn ký tự 'x'. Bước thứ ba sử dụng biểu thức chính quy findallđể tìm tất cả các khối sẽ được in nghiêng. Bước cuối cùng là một biểu thức trình tạo bên trong một sumcuộc gọi, cộng thêm độ dài của các khối đó, trừ đi 4 ký tự cho mỗi khối, vì chúng tôi không muốn bao gồm các dấu phân cách trong số đếm của chúng tôi.

Đây là một số đầu ra thử nghiệm:

>>> 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

Tôi không biết tại sao x***x**không hoạt động trong hộp đầu vào. Kỳ quái
durron597

1

JavaScript ES6, 91 byte

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

Thỏa thuận với tất cả các lối thoát trước khi ra tay, sau đó sử dụng một biểu thức thông thường. Rất nhiều tiềm năng chơi golf.

Giải trình

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

Đối với **a*b*c**điều này trả về 9, mà tôi tin là không chính xác. Số thực là 5 (hoặc 3, nếu bạn tính toán chữ nghiêng, mà theo OP bạn không nên).
Cristian Lupascu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.