โพสต์นี้เป็นตัวหนาแค่ไหน?


13

คำนำ

ใน markdown Exchange Exchange เราใช้ ** เพื่อแยกข้อความ ตัวอย่างเช่น markdown นี้:

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

แสดงผลเป็น:

สุนัขจิ้งจอกรวดเร็วกระโดดสีน้ำตาลมากกว่าขี้เกียจสุนัข

แน่นอนเราใช้ ** เพื่อปิดความกล้าหาญเช่นกัน ดังนั้นคำตอบที่น้อยลงจะเป็นตัวหนา ตัวอย่างเช่น:

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

แสดงผลเป็น:

รวดเร็วสุนัขจิ้งจอกสีน้ำตาลกระโดดข้ามขี้เกียจสุนัข

อย่างไรก็ตามหากความหนาไม่ได้ปิดมันจะทำให้ไม่เป็นตัวหนา :

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

แสดงผลเป็น:

สุนัขจิ้งจอกสีน้ำตาล ** กระโดดข้ามสุนัขขี้เกียจ

หากข้อความนั้นมีเครื่องหมายแบ็กสแลชเดียว\ความหนาจะไม่มีผลเช่น:

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

แสดงผลเป็น:

** สุนัขจิ้งจอกสีน้ำตาลอย่างรวดเร็วกระโดดข้ามสุนัขขี้เกียจ **

ผลการค้นหาช่องว่างสีขาวต่อท้ายเป็นข้อความที่ไม่มีตัวหนา (หมายเหตุช่องว่างสีขาวหลังสีน้ำตาลเป็นแท็บเดียว):

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

แสดงผลเป็น:

** สุนัขจิ้งจอกสีน้ำตาล ** กระโดดข้ามสุนัขขี้เกียจไป **

นอกจากนี้เรายังสามารถใช้ __ เป็นตัวหนาได้เช่นกัน แต่โปรดทราบว่าสามารถใช้งานได้ครั้งละหนึ่งรายการเท่านั้น นี่คือตัวอย่างที่ซับซ้อนมากขึ้น:

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

แสดงผลเป็น:

รวดเร็ว **สีน้ำตาลfox__ กระโดด over__ the__ สุนัข ** ขี้เกียจ

คำถาม:

คุณอาจจะเขียนโปรแกรมหรือฟังก์ชั่นได้รับข้อความ ASCII ไม่ว่าจะเป็นStringข้อโต้แย้งหรือบน STDIN ที่เฉพาะอักขระพิเศษ**, __, \(หนี) และต่อท้ายช่องว่างกำหนดจำนวนตัวอักษรตัวหนามี ค่านี้ควรพิมพ์เป็น STDOUT หรือส่งคืนจากฟังก์ชันของคุณ คุณไม่จำเป็นต้องสนับสนุนสตริงที่ยาวมาก ๆ ความยาวสตริงรับประกันได้ไม่เกิน30Kซึ่งเป็นข้อ จำกัด สำหรับการโพสต์แลกเปลี่ยนแลกเปลี่ยน

พิมพ์ดี:

  • ฉันสามารถโยนข้อยกเว้น / ข้อผิดพลาดอื่นสำหรับกรณีหนึ่งและส่งคืนตามปกติสำหรับกรณีอื่นได้หรือไม่
    • ไม่ต้องเป็นค่าส่งคืนที่ชัดเจนโปร่งใสไม่ผิดพลาดสำหรับทั้งสองกรณี เอาต์พุต STDERR จะถูกละเว้น
  • มีการเว้นวรรคระหว่างคำที่ถือว่าเป็นตัวหนาหรือไม่?
    • ใช่. **quick brown**มีตัวหนา 11 ตัว
  • ควรนับการเข้า\ใน\**หากเป็นตัวหนาหรือไม่
    • ไม่มันแสดงผลเป็น ** ดังนั้นหากควรเป็นตัวหนาจะมีเพียง 2 ตัวอักษร
  • ชัดเจนมาก: คุณมีความหมายว่าตัวละครกี่ตัว?
    • อักขระทั้งหมดที่จะแสดงตัวหนา ซึ่งหมายความว่า**จะไม่ถูกเรนเดอร์หากแปลงข้อความ แต่จะถูกเรนเดอร์ถ้าไม่แปลง
    • หมายเหตุว่ามันเป็นไปได้ที่จะทำให้**เป็นตัวหนาในหลายวิธีเช่น**\****-> **
    • อย่าพิจารณาความเป็นไปได้ที่ข้อความบางส่วนสามารถแปลงเป็นตัวเอียง เพียงกฎ markdown ที่ต้องพิจารณาคือ** = * หนา
  • ในการแลกเปลี่ยนแบบกองซ้อน HTML Bold ก็ใช้ได้เช่นกัน เช่น <b> </b>
    • ใช่ฉันรู้แล้ว อย่าพิจารณากรณีนี้ข้อความนี้เป็นข้อความปกติ
  • สิ่งที่เกี่ยวกับ HTML เข้าร่วม? เช่น&lt;-><
    • สิ่งเหล่านี้ควรได้รับการพิจารณาว่าเป็นข้อความปกติไม่มีการแปลงเอนทิตี HTML
  • ฉันเคยคิดถึงตัวอย่างที่คุณไม่ได้กล่าวถึงข้างต้น!
    • กฎระเบียบที่ทำงานตรงเช่นถ้าข้อความที่ถูกโพสต์บนกองตลาดหลักทรัพย์ในคำตอบ (ไม่ได้แสดงความคิดเห็น) ยกเว้นว่าบล็อกรหัสไม่ถือว่าเป็นตัวอักษรพิเศษ ทั้งประเภทพื้นที่สี่และประเภท backtick หากคุณไม่แน่ใจเกี่ยวกับวิธีการแสดงข้อความเพียงแค่ใส่ลงในกล่องคำตอบเพื่อทดสอบซึ่งเป็นกฎที่คุณควรปฏิบัติ

ตัวอย่าง:

การป้อนข้อมูล:

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

เอาท์พุท:

35

การป้อนข้อมูล:

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

เอาท์พุท:

0

การป้อนข้อมูล:

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

เอาท์พุท:

18

การป้อนข้อมูล:

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

เอาท์พุท:

23

การป้อนข้อมูล:

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

เอาท์พุท:

11

ช่องโหว่มาตรฐานถูกแบน


เป็น18ที่ถูกต้องสำหรับกรณีทดสอบที่สาม?
Beta Decay

@BetaDecay มันคือ 7 + 11. คุณคิดว่ามันควรจะเป็นอะไร?
durron597

ฉันได้รับ 28 ... ฉันจะตรวจสอบโปรแกรมของฉัน
Beta Decay

@BetaDecay **fox__ jumps**ยกเลิกการกำหนดรูปแบบนั้นโดยเฉพาะ
durron597

1
คำถามที่ดูเหมือนว่าจะแนะนำว่า\**หรือ\__สามตัวอักษรลำดับหนี แต่ใน StackExchange มีเพียงสองตัวอักษรลำดับหนีหรือ\* \_ดังนั้นผลิตเครื่องหมายดอกจันตามด้วยตัวหนา\***a** aนอกจากนี้ยังมีการหลบหนีอีกครั้ง, \\ . เราควรจัดการกับสิ่งนั้นหรือไม่?
feersum

คำตอบ:


5

อาร์เอส , 107 ไบต์

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

กรณีสาธิตและการทดสอบสด

นี่มันบ้ามาก ...

กรณีทดสอบล่าสุดยังไม่สามารถใช้งานได้ WIP ...

คำอธิบาย

\t/ 

แทนที่แท็บด้วยช่องว่าง พวกมันมีจำนวนตัวอักษรเท่ากันและจะใช้แท็บในภายหลังเป็นอักขระพิเศษ

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

แทนที่ข้อความที่มีความยาวNซึ่งควรเป็นตัวหนาด้วยNบรรทัดใหม่แล้วตามด้วยข้อความต้นฉบับ

\\(\*|_)/\t

แทนที่ตัวคั่นใด ๆ ที่เกิดขึ้นทันทีด้วยเครื่องหมายทับด้วยแท็บ นี่คือเพื่อให้แน่ใจว่ารายการเช่น**a\***มีจำนวนตัวอักษร 2 แทน 3

[^\t\n]/

ลบตัวละครที่ไม่ใช่แท็บหรือการขึ้นบรรทัดใหม่

\n/_

แทนที่บรรทัดใหม่ทั้งหมดด้วยขีดล่าง

\t_?/

ลบแท็บใด ๆ (ซึ่งแสดงถึงตัวคั่นที่ใช้ค่า Escape) พร้อมกับขีดล่างใด ๆ ที่อาจติดตามได้ สิ่งนี้เกี่ยวข้องกับการนับจำนวนอักขระที่กล่าวถึงข้างต้นด้วยตัวคั่นสิ้นสุดที่ใช้ Escape

(_*)/(^^\1)

แทนที่ลำดับขีดล่างด้วยความยาว นี่คือการนับตัวละคร


**a****b**ผลลัพธ์ 2 ควรเป็น 6 ดู: a **** b
durron597

1
@ durron597 ฉันสับสนเล็กน้อยว่าควรทำงานอย่างไร คุณสามารถเพิ่มคำอธิบายได้ไหม?
kirbyfan64sos

เหมือนที่ฉันพูดเพียงแค่เล่นกับมันในบานหน้าต่างคำตอบ **** เป็นเพียงเครื่องหมายดอกจันเสมอซึ่งสามารถเป็นตัวหนาหรือไม่อยู่ในตัวหนาตามข้อความอื่น ๆ
durron597

ดังนั้น, @ kirbyfan64sos, โพสต์นี้หนาแค่ไหน?
mbomb007

2

Python: 133 ตัวอักษร

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

สิ่งนี้ควรใช้งานได้เหมือนกันทั้งใน Python 2 และ 3 ฟังก์ชั่นfจะคืนค่าจำนวนตัวอักษรหนาที่จะอยู่ในสตริงที่ถูกส่งผ่านเมื่อจัดรูปแบบโดยระบบ Markdown ของ Stack Overflow

ฉันคิดว่าฉันได้รับมุมที่ถูกต้องที่สุด (รวมถึงทุกคนที่กล่าวถึงในความคิดเห็นจนถึงตอนนี้) แต่มันก็ยังไม่สมบูรณ์แบบ ฉันไม่เข้าใจว่าทำไมx***x**ไม่แสดงเป็น*xตัวหนา (เช่น***x**นั้น) ดังนั้นโค้ดของฉันจะป้อนอย่างน้อยสองสามอย่างผิด

รหัสมีสี่ขั้นตอนหลัก วิธีแรกคือการแทนที่ regex ของแบ็กสแลชใด ๆ ตามด้วยอักขระใด ๆ ที่มีอักขระ 'x' ขั้นตอนที่สองเข้ามาแทนที่ลำดับของเครื่องหมายดอกจันสี่อันหรือขีดล่างด้วยอักขระ 'x' สี่ตัว ขั้นตอนที่สามใช้ regex findallเพื่อค้นหาบล็อคทั้งหมดที่จะทำให้เป็นตัวเอียง ขั้นตอนสุดท้ายคือนิพจน์ตัวสร้างภายในการsumโทรซึ่งจะเพิ่มความยาวของบล็อกเหล่านั้นลบ 4 อักขระจากแต่ละตัวเนื่องจากเราไม่ต้องการรวมตัวคั่นในการนับของเรา

นี่คือผลการทดสอบบางส่วน:

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

ฉันไม่รู้ว่าทำไมx***x**ไม่ทำงานในกล่องป้อนข้อมูล Bizarre
durron597

1

JavaScript ES6, 91 ไบต์

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

จัดการกับการหลบหนีทั้งหมดก่อนถึงมือจากนั้นใช้การแสดงออกปกติ ศักยภาพการเล่นกอล์ฟมากมาย

คำอธิบาย

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

สำหรับ**a*b*c**ผลตอบแทน 9 ซึ่งฉันเชื่อว่าไม่ถูกต้อง จำนวนจริงคือ 5 (หรือ 3 ถ้าคุณคำนึงถึงตัวเอียงซึ่งตาม OP คุณไม่ควร)
Cristian Lupascu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.