Ini header + ganda!

13

Terkait

Eksposisi

Setelah memenangkan undian SO, Anda bisa berada di puncak dunia, dan Anda berada di puncak! Undian telah berlangsung selama satu tahun, sekarang, dan Anda adalah satu dari seratus programmer yang dipilih untuk masuk ke dalam benteng SO. Dan akhirnya, penantian berakhir. Hari ini adalah hari Anda pergi ke - [hasil teks kabur].

Aduh. Maaf, seharusnya tidak memberi tahu.

Bagaimanapun, Anda akhirnya tiba untuk bertemu seorang pria berwajah tabah dalam setelan hitam dengan lambang SO kecil di atasnya. Dia mengerutkan keningmu. "Yang lain sudah di dalam," katanya, mencatat bahwa kamu telah diidentifikasi di gerbang. "Segera."

Anda bergegas masuk, sedikit ketakutan. Apa yang sebenarnya terjadi? Apa yang salah pada SO? Di dalam, Anda mengamati 99 programmer lain sedang menatap layar mereka, mengetik. Anda mengambil kursi yang tersisa, dan disambut dengan pesan berikut:

Halo, programmer! Tampaknya kami mengalami masalah; SO telah ditembus, oleh siapa kita tidak tahu. (Secara pribadi, saya menduga itu adalah programmer Pyth atau CJam, tapi hei.) Namun, semua yang dirugikan adalah editor Markdown. Sebenarnya, itu cukup banyak, tetapi di situlah Anda masuk.
Saya ingin Anda membuat program (atau fungsi, kami tidak pilih-pilih) yang akan menafsirkan file penurunan harga dan mengonversinya ke "SO Beautifier-Arity" baru kami -Decomposer "(alias" SOBAD ") format. Anda harus melakukan ini dalam jumlah byte terpendek - kami menjalankan pada saat downdown sampai kami menyelesaikan masalah peretasan ini. Terima kasih atas waktu Anda, dan semoga sukses!

Hormat kami,
Pembuat Stack Overflow


Objective Diberikan file penurunan harga yang valid sebagai input untuk kiriman Anda, melakukan dan output transformasi berikut pada input:

(Ketika saya menggunakan +simbol, maksud saya operator RegExp "satu atau lebih contoh karakter sebelumnya", bukan tanda plus literal.)

  • Ubah semua tajuk Level 1 ( # ...atau ...\n=+) menjadi { ... }, dengan ...menjadi SEMUA CAPS.
  • Ubah semua tajuk Level 2 ( ## ...atau ...\n-+) menjadi {{ ... }}, dengan setiap kata menggunakan huruf kapital
  • Ubah semua header Level 3 ( ### ...) menjadi huruf kecil; artinya, semua huruf (tidak peka huruf besar kecil) dipetakan sesuai ᴀʙᴄᴅᴇғɢʜɪᴊᴋʟᴍɴᴏᴘǫʀsᴛᴜᴠᴡxʏᴢmode masing-masing.
  • Ubah semua instance berani ( **...**) menjadi ..., dengan ...menjadi ALL CAPS.
  • Ubah semua instance italic ( _..._) menjadi. . . , tempat spasi telah disisipkan di antara setiap pasangan karakter.
  • Ubah semua instance kode ( `...`) menjadi < ... >.
  • Ubah semua instance dicoret ( ---...---) menjadi -.-.-.-, di mana a -telah disisipkan di antara setiap pasangan karakter.
  • Transform semua daftar contoh bernomor ( N. {a}\nN. {b} ...di mana Ncocok dengan regex [0-9]+) ke ( 1. {a}\n 2. {b}...)
  • Ubah semua instance daftar yang tidak terurut ( * ...\n* ......) menjadi ( o ...\n o ......)

Keterangan lebih lanjut

  • Contoh header dan daftar hanya akan ditemukan di awal baris, namun, mereka mungkin dikelilingi oleh sejumlah spasi putih.
  • Akan ada ada terkait kasus, misalnya, *a_*a_tidak berlaku untuk standar kami, juga akan sesuatu seperti __a__, *_a_*, atau _*a*_muncul dalam sebuah masukan.
  • Header multiline valid jika dan hanya jika -atau =s secara langsung mengikuti baris teks.
  • Header tidak akan berisi entitas penurunan harga lainnya. Misalnya, # `code` snippetbukan input yang valid untuk tujuan kita
  • Anda tidak harus memperhitungkan tajuk Level 4+
  • Anda tidak harus menyimpan spasi berlebih (yaitu > 1spasi) di dalam file, jadi tidak masalah **hello there**untuk menjadi **hello there**tetapi tidak **hellothere**. Demikian pula, jejak dan ruang terdepan yang ditemukan pada garis tidak harus dilestarikan
  • Tabulator tidak akan ditemukan di input.
  • TIDAK AKAN ADA INSTAN YANG TERKAIT. Misalnya, ***...***tidak akan pernah terjadi.
  • Sebuah ruang akan selalu mengikuti titik peluru yang tidak berurutan (Misalnya, * ...tidak*... )
  • Daftar item dalam daftar yang dipesan dan tidak berurutan akan selalu terdiri dari satu baris.
  • Pasangan karakter yang tidak cocok harus diabaikan. Misalnya, ** cooldan `java::defharus tetap sama.

Metode input

Input harus salah satu dari yang berikut:

  1. Array / tuple / daftar / dll. string.
  2. ATAU string yang berisi baris baru untuk memisahkan baris.

Gunakan bahasa Anda yang setara dengan tipe data yang disebutkan di atas jika bahasa Anda tidak mendukungnya. (Misalnya, TI-BASIC tidak mendukung (1.) ... bukan berarti TI-BASIC dapat bersaing, bagaimanapun: P).

Uji kasus

A }menandakan input, dan baris berikutnya menandakan output. Beberapa }s menandakan baris teks yang dipisahkan baris baru.

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

Bonus

  1. -19 byte jika Anda mendukung pelolosan karakter (sehingga mereka diperlakukan sebagai "normal"); Anda dapat memilih karakter pelarian, tapi saya sarankan \atau ^. Perhatikan bahwa sistem pelolosan pada situs SO berbeda dari apa yang saya sarankan (dan lebih rumit), jadi jangan lakukan itu! SO akan memperlakukan `\`sebagai \, tetapi saya ingin Anda memperlakukan yang kedua `sebagai karakter biasa, dan sebagai gantinya cocok dengan karakter berikutnya ` .
Conor O'Brien
sumber
2
Spek terlalu lemah untuk pertanyaan golf.
feersum
4
Terima kasih, para downvoter, karena memberi tahu saya apa yang salah saya lakukan. Ini sangat membantu saya membuat pertanyaan ini lebih baik.
Conor O'Brien
4
Saya pikir ada kasus di mana penerapan satu transformasi dapat mengubah apakah transformasi lain berlaku. Misalnya, ***word***menjadi * * w o r d * *setelah Anda menerapkan transformasi miring, dan tiba-tiba transformasi tebal tidak berlaku. Tidak jelas bagaimana menangani ini.
Rainbolt
1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Ada sejumlah masalah yang dicatat dalam komentar, yang memiliki upvotes. Saya tidak berpikir downvoters sengaja mengabaikan untuk memberikan umpan balik; mereka cenderung hanya meningkatkan umpan balik yang ada.
Alex A.
1
@AlexA. Ketika kedua downvotes terjadi, tidak ada upvotes ada di komentar, tidak untuk periode sesudahnya.
Conor O'Brien

Jawaban:

1

Python 3 , 652 640 byte

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

Cobalah online!

TFeld
sumber