มันเป็นส่วนหัว + คู่!


13

ที่เกี่ยวข้อง

นิทรรศการ

หลังจากชนะการจับฉลากดังนั้นคุณน่าจะอยู่ในอันดับต้น ๆ ของโลกและคุณก็เป็น! ล็อตเตอรี่ได้ดำเนินมาเป็นปีแล้วและคุณเป็นหนึ่งในโปรแกรมเมอร์หนึ่งร้อยคนที่ได้รับเลือกให้เข้าสู่ฐานที่มั่นดังนั้น และในที่สุดการรอคอยก็จบลง วันนี้เป็นวันที่คุณไปที่ - [ข้อความที่ยุ่งเหยิงไปหมดแล้ว]

อ๊ะ ขออภัยไม่ควรบอก

อย่างไรก็ตามในที่สุดคุณก็มาถึงเพื่อพบกับชายที่อดทนในชุดสูทสีดำพร้อมกับมีตราสัญลักษณ์ขนาดเล็กอยู่บนนั้น เขาขมวดคิ้วใส่คุณ “ คนอื่นอยู่ข้างในแล้ว” เขาพูดโดยสังเกตว่าคุณถูกระบุที่ประตู "อย่างรวดเร็ว."

คุณรีบเข้าไปข้างในตาดกลัว เกิดอะไรขึ้นในโลกนี้? เกิดอะไรขึ้นที่ SO ข้างในคุณสังเกตว่าโปรแกรมเมอร์อีก 99 คนกำลังจ้องหน้าจออย่างตั้งใจพิมพ์ คุณนั่งที่เหลือและได้รับการต้อนรับด้วยข้อความต่อไปนี้:

สวัสดีโปรแกรมเมอร์! ดูเหมือนว่าเราจะพบปัญหา ดังนั้นถูกเจาะโดยที่เราไม่รู้ (โดยส่วนตัวแล้วฉันคิดว่ามันเป็นโปรแกรมเมอร์ Pyth หรือ CJam แต่เฮ้) อย่างไรก็ตามสิ่งที่ได้รับอันตรายทั้งหมดคือบรรณาธิการ Markdown ที่จริงแล้วมันค่อนข้างมาก แต่นั่นคือสิ่งที่คุณเข้ามา
ฉันต้องการให้คุณสร้างโปรแกรม (หรือฟังก์ชั่นพวกเราไม่จู้จี้จุกจิก) ที่จะตีความไฟล์ markdown และแปลงเป็น "SO Beautifier-Arity ใหม่ของเรา รูปแบบ -Decomposer "(aka" SOBAD ") คุณต้องทำสิ่งนี้ในจำนวนไบต์ที่สั้นที่สุด - เรากำลังทำงานในระดับต่ำจนกว่าเราจะแก้ไขปัญหาการแฮ็คนี้ ขอบคุณสำหรับเวลาของคุณและขอให้โชคดี!

ด้วยความนับถือ
Maker of Stack Overflow


วัตถุประสงค์ให้ไฟล์ markdown ที่ถูกต้องเป็นอินพุตของการส่งของคุณดำเนินการและส่งออกการแปลงต่อไปนี้ในอินพุต:

(เมื่อฉันใช้+สัญลักษณ์ฉันหมายถึงตัวดำเนินการ RegExp "อย่างน้อยหนึ่งอินสแตนซ์ของอักขระก่อนหน้า" ไม่ใช่เครื่องหมายบวกตามตัวอักษร)

  • แปลงส่วนหัวระดับ 1 ทั้งหมด ( # ...หรือ...\n=+) เป็น{ ... }โดย...กลายเป็น CAPS ทั้งหมด
  • แปลงส่วนหัวระดับ 2 ทั้งหมด ( ## ...หรือ...\n-+) เป็น{{ ... }}โดยให้ทุกคำเป็นตัวพิมพ์ใหญ่
  • แปลงส่วนหัวระดับ 3 ทั้งหมด ( ### ...) เป็นตัวพิมพ์เล็ก นั่นคือตัวอักษรทั้งหมด (ตัวพิมพ์เล็กและตัวพิมพ์เล็ก) จะถูกจับคู่กับᴀʙᴄᴅᴇғɢʜɪᴊᴋʟᴍɴᴏᴘǫʀsᴛᴜᴠᴡxʏᴢแฟชั่น
  • แปลงอินสแตนซ์ตัวหนาทั้งหมด ( **...**) เป็น...โดย...เปลี่ยนเป็น CAPS ทั้งหมด
  • แปลงอินสแตนซ์ตัวเอียงทั้งหมด ( _..._) เป็น. . .ตำแหน่งที่แทรกช่องว่างระหว่างอักขระแต่ละคู่
  • เปลี่ยนรหัสอินสแตนซ์ทั้งหมด ( `...`) < ... >เพื่อ
  • แปลงอินสแตนซ์ strikethrough ทั้งหมด ( ---...---) เป็น-.-.-.-โดยที่-มีการแทรกระหว่างอักขระแต่ละคู่
  • เปลี่ยนทุกกรณีรายการลำดับเลข ( N. {a}\nN. {b} ...ซึ่งNตรงกับ regex ไม่[0-9]+) ถึง ( 1. {a}\n 2. {b}...)
  • แปลงอินสแตนซ์รายการที่ไม่เรียงลำดับทั้งหมด ( * ...\n* ...... ) เป็น ( o ...\n o ...... )

รายละเอียดเพิ่มเติม

  • อินสแตนซ์ของส่วนหัวและรายการจะพบได้ที่จุดเริ่มต้นของบรรทัดอย่างไรก็ตามอาจถูกล้อมรอบด้วยจำนวนของช่องว่าง
  • จะไม่มีการเชื่อมโยงกรณีเช่น*a_*a_นี้ไม่ถูกต้องสำหรับมาตรฐานของเราหรือจะอะไรเช่น__a__, *_a_*หรือ_*a*_ปรากฏในการป้อนข้อมูล
  • ส่วนหัวของ Multiline นั้นถูกต้องถ้าหากว่าs -หรือ=ตามหลังบรรทัดข้อความโดยตรง
  • ไม่มีส่วนหัวจะมีเอนทิตี markdown อื่น ๆ เช่น# `code` snippetไม่ใช่ข้อมูลที่ถูกต้องสำหรับวัตถุประสงค์ของเรา
  • คุณไม่จำเป็นต้องอธิบายส่วนหัวระดับ 4+
  • คุณไม่จำเป็นที่จะรักษาพื้นที่ส่วนเกิน (เช่น> 1ช่องว่าง) ในไฟล์ดังนั้นจึงมีการตกลงที่จะมีการ**hello there**ที่จะกลายเป็นแต่ไม่**hello there** **hellothere**ในทำนองเดียวกันการเว้นวรรคต่อท้ายและนำที่พบในบรรทัดไม่จำเป็นต้องรักษา
  • จะไม่มีแท็บเลเตอร์ในอินพุต
  • จะไม่มีการซ้อนรัง ตัวอย่างเช่น***...***จะไม่เกิดขึ้น
  • ช่องว่างจะตามด้วยสัญลักษณ์แสดงหัวข้อย่อย (เช่น* ...ไม่ใช่*...)
  • รายการในรายการที่เรียงลำดับและไม่เรียงลำดับจะประกอบด้วยบรรทัดเดียวเสมอ
  • คู่อักขระที่ไม่ตรงกันควรถูกละเว้น เช่น** coolและ`java::defควรจะยังคงเหมือนเดิม

วิธีการป้อนข้อมูล

อินพุตต้องเป็นหนึ่งในสิ่งต่อไปนี้:

  1. อาร์เรย์ / tuple / list / ฯลฯ ของสตริง
  2. หรือสตริงที่มีการขึ้นบรรทัดใหม่เพื่อแยกบรรทัด

ใช้ภาษาที่ใกล้เคียงที่สุดกับประเภทข้อมูลข้างต้นหากภาษาของคุณไม่รองรับ (เช่น TI-BASIC ไม่สนับสนุน (1. ) …ไม่ใช่ว่า TI-BASIC สามารถแข่งขันได้อย่างไรก็ตาม: P)

กรณีทดสอบ

}หมายถึงการป้อนข้อมูลและบรรทัดถัดไปหมายเอาท์พุท หลาย}บรรทัดมีความหมายว่าบรรทัดที่คั่นด้วยข้อความขึ้นบรรทัดใหม่

} Hello!
Hello!

} That _2 + 2 = 5_ challenge sure was **intense!**
That  2  +  2  =  5  challenge sure was INTENSE!
    // note that there are spaces also padding it

} It's `s/a/e/g` **not** `sudo g/a/e/s`, stupid.
It's < s/a/e/g > NOT < sudo g/a/e/s >

} **WHAT!** He did _WHAT?!_
WHAT! He did W H A T ? !

} _WHAT_ is undefined, here!
 W H A T  is undefined, here!

} OI)(EJDSFIJK L:JP #@*REF&WDS F*(D+S +&(SDFWEF )DSF _DSF_F #R#
OI)(EJDSFIJK L:JP #@*REF&WDS F*(D+S +&(SDFWEF )DSF  D S F F #R#

} # So, you wanna be a programmer, eh?
} ## Step 1: learn recursion
} ### Learning recursion requires learning recursion
} **Programming** is a futile task. _Leave w h i l e you still can!_
{SO YOU WANNA BE A PROGRAMMER, EH?}
{{Step 1: Learn Recursion}}
ʟᴇᴀʀɴɪɴɢ ʀᴇᴄᴜʀsɪᴏɴ ʀᴇǫᴜɪʀᴇs ʟᴇᴀʀɴɪɴɢ ʀᴇᴄᴜʀsɪᴏɴ
PROGRAMMING is a futile task.  L e a v e   w   h   i   l   e   y o u   s t i l l   c a n !  // trailing space not required

} Haha, you're a _Java_ golfer? You'd be better of with brainf***.
Haha, you're a  J a v a  golfer? You'd be better of with brainf***. // less than four asterisks, do nothing

} # Reasons why NOT to use C--:
} 1. It doesn't exist.
} 2. I don't care.
{REASONS WHY NOT TO USE C--:}
 1. It doesn't exist.
 2. I don't care.

} 1. This is a test!
} 1. <-- And this actually works in Markdown.
 1. This is a test!
 2. <-- And this actually works in Markdown. // less than three -s, ignore

} * no.
} * NOOO.
} * fine.
 o no.
 o NOOO.
 o fine.

} Python, ---34--- 3 bytes.
Python, -3-4- 3 bytes.

} ---Long line of crossed text.---
-L-o-n-g- -l-i-n-e- -o-f- -c-r-o-s-s-e-d- -t-e-x-t-.-

} ** cool!
** cool! // is not a bullet point, because a space doesn't follow the *; Isn't bold, because there is no matching **

 -- end of test cases --

โบนัส

  1. -19 ไบต์หากคุณรองรับการหลีกเลี่ยงอักขระ (เพื่อให้ถือว่าเป็น "ปกติ"); คุณอาจจะเลือกตัวหนีใด ๆ แต่ผมขอแนะนำให้หรือ\ ^โปรดทราบว่าระบบการหลบหนีในเว็บไซต์ SO นั้นแตกต่างจากสิ่งที่ฉันแนะนำ (และซับซ้อนกว่า) ดังนั้นอย่าทำ! ดังนั้นจะถือว่า`\`เป็น\แต่ผมจะต้องการให้คุณในการรักษาที่สอง`เป็นแล้วปกตินิสัยและแทนที่จะตรงกับต่อไป `ของตัวละคร

2
ข้อมูลจำเพาะอ่อนแอเกินไปสำหรับคำถามกอล์ฟ
feersum

4
ขอบคุณ downvoters ที่บอกฉันว่าฉันกำลังทำอะไรผิด มันช่วยให้ฉันทำให้คำถามนี้ดีขึ้น
Conor O'Brien

4
ฉันคิดว่ามีหลายกรณีที่การใช้การแปลงหนึ่งครั้งสามารถเปลี่ยนได้ว่าจะใช้การเปลี่ยนแปลงอื่นหรือไม่ ตัวอย่างเช่น***word***กลายเป็น* * w o r d * *หลังจากที่คุณใช้การแปลงตัวเอียงและทันใดนั้นการแปลงตัวหนาจะใช้ไม่ได้ ยังไม่ชัดเจนว่าจะจัดการเรื่องนี้อย่างไร
Rainbolt

1
@ CᴏɴᴏʀO'Bʀɪᴇɴมีจำนวนของปัญหาที่ระบุไว้ในความคิดเห็นที่มี upvotes ฉันไม่คิดว่าผู้ลงคะแนนเสียงจะละเลยการให้ข้อเสนอแนะอย่างเด็ดเดี่ยว เป็นไปได้มากที่จะลบล้างความคิดเห็นที่มีอยู่
Alex A.

1
@AlexA เมื่อ downvotes ทั้งสองเกิดขึ้นไม่มี upvotes ในความคิดเห็นไม่ได้เป็นระยะเวลาหนึ่งหลังจากนั้น
Conor O'Brien

คำตอบ:


1

Python 3 , 652 640 ไบต์

import re
def N(o):c,t,_=o.groups();x=' -'[c<'_'];return['< %s >'%t,t.upper()][c<'`']if c in'**`'else x+x.join(t)+x
def f(s):
 S=[];i=0
 while s:
  l=s.pop(0);n=set(*s[:1])
  if n<={*'=-'}and n:s=s[1:];l='#'*('-'in n)+'# '+l
  if'# '==l[:2]:l='{%s}'%l[2:].upper()
  if'## '==l[:3]:l='{{%s}}'%l[3:].title()
  if'### '==l[:4]:l=''.join('ᴀʙᴄᴅᴇғɢʜɪᴊᴋʟᴍɴᴏᴘǫʀsᴛᴜᴠᴡxʏᴢ'[ord(c)-65]if'@'<c<'['else c for c in l[4:].upper())
  l=re.sub(('(\*\*|_|---|`)(.*?)'*2)[:-5],N,re.sub(r'^\s*[*] (.*)',r' o \1',l))
  if re.match(r'\s*\d+\. ',l):i+=1;l=re.sub(r'\s*\d+\.(.*)',' %d.'%i+r'\1',l)
  else:i=0
  S+=[l]
 return S

ลองออนไลน์!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.