シンプルなマークダウンレンダリング


20

Stack Exchangeネットワーク上の投稿にヘッダーを作成する方法はいくつかあります。PPCGで最も一般的に使用される形式は次のようです1

# Level one header
## Level two header
### Level three header

ハッシュマークの後のスペースに注意してください。また、末尾のハッシュマークは含まれないことに注意してください。

チャレンジ:

(おそらく複数行の)文字列を入力として受け取り、次の形式で文字列を出力します。

  • ヘッダーがレベル1の場合、各文字を4 x 4回出力します
  • ヘッダーがレベル2の場合、各文字を3 x 3回出力します
  • ヘッダーがレベル3の場合、各文字を2 x 2回出力します
  • 行がヘッダーでない場合は、そのまま出力します。

説明する:

--- Level 1 ---
# Hello
--- Output---
HHHHeeeelllllllloooo    
HHHHeeeelllllllloooo
HHHHeeeelllllllloooo
HHHHeeeelllllllloooo

--- Level 2 ---
## A B C def
--- Output ---
AAA   BBB   CCC   dddeeefff
AAA   BBB   CCC   dddeeefff
AAA   BBB   CCC   dddeeefff

--- Level 3 ---
### PPCG!
--- Output---
PPPPCCGG!!
PPPPCCGG!!

そのような単純な!


ルール:

  • 複数行にわたる入力をサポートする必要があります。\n改行などに使用しても問題ありません。
    • #後に1つのスペースのみが続く行はありません。
  • 出力は複数行に渡って表示する必要があります。\nリテラル改行の代わりに出力することはできません。
    • 末尾のスペースと改行は問題ありません。

テストケース:

入力と出力はの行で区切られ...ます。

# This is a text
with two different
### headers!
........................................................    
TTTThhhhiiiissss    iiiissss    aaaa    tttteeeexxxxtttt
TTTThhhhiiiissss    iiiissss    aaaa    tttteeeexxxxtttt
TTTThhhhiiiissss    iiiissss    aaaa    tttteeeexxxxtttt
TTTThhhhiiiissss    iiiissss    aaaa    tttteeeexxxxtttt
with two different
hheeaaddeerrss!!
hheeaaddeerrss!!

This input has
## trailing hash marks ##
#and a hash mark without a space after it.
........................................................    
This input has
tttrrraaaiiillliiinnnggg   hhhaaassshhh   mmmaaarrrkkksss   ######
tttrrraaaiiillliiinnnggg   hhhaaassshhh   mmmaaarrrkkksss   ######
tttrrraaaiiillliiinnnggg   hhhaaassshhh   mmmaaarrrkkksss   ######
#and hash marks without a space after it.

# This ## is ### strange
#### ###
........................................................
TTTThhhhiiiissss    ########    iiiissss    ############    ssssttttrrrraaaannnnggggeeee
TTTThhhhiiiissss    ########    iiiissss    ############    ssssttttrrrraaaannnnggggeeee
TTTThhhhiiiissss    ########    iiiissss    ############    ssssttttrrrraaaannnnggggeeee
TTTThhhhiiiissss    ########    iiiissss    ############    ssssttttrrrraaaannnnggggeeee
#### ###

Multiple


### newlines! # 
:)
........................................................    
Multiple


nneewwlliinneess!!  ##
nneewwlliinneess!!  ##
:)

Line with only a hash mark:
#
### ^ Like that!
........................................................    
Line with only a hash mark:
#
^^  LLiikkee  tthhaatt!!
^^  LLiikkee  tthhaatt!!

1:まだチェックしていませんが、本当だと思います。


入力を文字列配列として取得できますか?
イアンH.

回答:


7

スタック51 50バイト

@RickHitchcockのおかげで1バイト節約-ゴルフ正規表現

['^(##?#?) (.+)'[\#'5\-@k CS k*k rep LF#`]3/mrepl]

オンラインでお試しください!

スタックから入力を受け取り、スタックに残す匿名関数。

説明

['^(##?#?) (.+)'[\#'5\-@k CS k*k rep LF#`]3/mrepl]
[                                            mrepl]   perform multiline replacement
 '^(##?#?) (.+)'                                     regex matching headers
                [                        ]3/         on each match:
                 \#'                                   count number of hashes
                    5\-                                5 - (^)
                       @k                              set k to number of repetitions
                          CS                           convert the header to a char string
                             k*                        repeat each char `k` times
                               k rep                   repeat said string `k` times
                                     LF#`              join by linefeeds

3

JavaScript(ES6)、111 105バイト

@Shaggyのおかげで6バイト節約

s=>s.replace(/^(##?#?) (.+)/gm,(_,a,b)=>`
${b.replace(/./g,e=>e.repeat(l=5-a.length))}`.repeat(l).trim())

文字列の先頭または改行の前に1〜3個のハッシュをマッチさせ、ハッシュの長さに基づいてマッチ内の各文字とマッチ自体を繰り返します。

テストケース:


2

網膜125の 104バイト

m(`(?<=^# .*).
$0$0$0$0
(?<=^## .*).
$0$0$0
(?<=^### .*).
$0$0
^# 
$%'¶$%'¶$%'¶
^## 
$%'¶$%'¶
^### 
$%'¶

オンラインで試す

Neilのおかげで21バイト節約されました。


3 %)番目のステージで使用して3バイトを節約します。これにより%、最初の2つのステージでs を削除できます。また、通常G(s の後に(今は2つ必要になります)をヘッダーに入れます。
ニール

さらに良いことに、他のをすべて削除できるため、m)またはm(を使用して9バイトを節約できますm
ニール

ヘッダーは不要であることが判明しました。また、さらに12バイト保存しました。オンラインで試してみてください。
ニール

ああ、ええ、複数のテストケースにヘッダーを使用することに慣れていました。
mbomb007

2

MATL43 42 40バイト

Rick Hitchcockのおかげで1バイトが削除されました!

`j[]y'^##?#? 'XXgn:(2M4:QP&mt~+t&Y"0YcDT

これにより、各行に末尾のスペースが出力され(チャレンジで許可されます)、出力の生成後にエラーで終了します(デフォルトで許可されます)。

オンラインでお試しください!

説明

`            % Do...while loop
  j          %   Input a line as unevaluated string
  []         %   Push empty array
  y          %   Duplicate from below: push input line again
  '^##?#? '  %   Push string for regexp pattern
  XX         %   Regexp. Returns cell array with the matched substrings
  g          %   Get cell array contents: a string, possibly empty
  n          %   Length, say k. This is the title level plus 1, or 0 if no title
  :(         %   Assign the empty array to the first k entries in the input line
             %   This removing those entries from the input
  2M         %   Push k again
  4:QP       %   [1 2 3 4], add 1 , flip: pushes [5 4 3 2]
  &m         %   Push index of k in that array, or 0 if not present. This gives
             %   4 for k=2 (title level 1), 3 for k=3 (tile level 2), 2 for k=2
             %   (title level 1), and 0 for k=0 (no title). The entry 5 in the
             %   array is only used as placeholder to get the desired result.
  t~+        %   Duplicate, negate, add. This transforms 0 into 1
  t&Y"       %   Repeat each character that many times in the two dimensions
  0Yc        %   Postpend a column of char 0 (displayed as space). This is 
             %   needed in case the input line was empty, as MATL doesn't
             %   display empty lines
  D          %   Display now. This is needed because the program will end with
             %   an error, and so implicit display won't apply
  T          %   True. This is used as loop condition, to make the loop infinite
             % End (implicit)

MATLABでこれを行う最良の方法は何だろうと思っていました...もちろん、クロネッカー製品がそれを行う最良の方法でした:)いいね!
スティーヴィーグリフィン

@StewieGriffinチャレンジを見たとき、すぐにクロネッカー製品について考えました。しかし、repelemY"MATLで)2バイト短い方法を見つけました。kronはおそらくMATLABでおそらく最も短い方法です
ルイスメンドー


1

、46バイト

FN«Sι≔⊕⌕E³…⁺×#κι⁴### θF⎇θ✂ι⁻⁵θLι¹ι«G↓→↑⊕θκ→»D⎚

オンラインでお試しください!リンクは、コードの詳細バージョンです。Charcoalは実際には文字列配列の入力を行わないため、入力として配列の長さを追加する必要がありました。説明:

FN«Sι

適切な数の入力文字列をループします。

≔⊕⌕E³…⁺×#κι⁴### θ

入力を取得し、先頭に2つの#を付けて文字列の配列を作成し、長さ4に切り捨ててから###、配列内で検索して1インデックスに変換します。これにより、文字ズームよりも1つ少ない数値が得られます。

F⎇θ✂ι⁻⁵θLι¹ι«

文字ズームが1の場合、文字列全体をループします。そうでない場合は、適切な接尾辞をループします(Charcoalで抽出するのは不当に困難です)。

G↓→↑⊕θκ→

右上隅で終わる文字で満たされた多角形を描画し、次の文字の準備ができて右に移動します。

»D⎚

出力を印刷し、次の入力文字列に備えてリセットします。


1

SOGL V0.1231の 28 バイト

¶Θ{■^##?#? øβlF⁄κ6κ5%:GI*∑∙P

ここで試してみてください!-コードが関数であり、スタックで入力を受け取るため、追加のコードが追加されます(そうでなければ、SOGLは複数行の入力を受け取ることはできません:/)-- inputs.value”その文字列をプッシュします-JSとして評価Fします-その関数を呼び出します

説明:

¶Θ                            split on newlines
  {                           for each item
   ■^##?#?                      push "^##?#? "
           øβ                   replace that as regex with nothing
             l                  get the new strings length
              F⁄                get the original strings length
                κ               and subtract from the original length the new strings length
                 6κ             from 6 subtract that
                   5%           and modulo that by 5 - `6κ5%` together transforms 0;2;3;4 - the match length to 1;4;3;2 - the size
                     :          duplicate that number
                      G         and get the modified string ontop
                       I        rotate it clockwise - e.g. "hello" -> [["h"],["e"],["l"],["l"],["o"]]
                        *       multiply horizontally by one copy of the size numbers - e.g. 2: [["hh"],["ee"],["ll"],["ll"],["oo"]]
                         ∑      join that array together - "hheelllloo"
                          ∙     and multiply vertiaclly by the other copy of the size number: ["hheelllloo","hheelllloo"]
                           P    print, implicitly joining by newlines

0

プロトン、130バイト

x=>for l:x.split("\n"){L=l.find(" ")print(L>3or L+len(l.lstrip("\#"))-len(l)?l:"\n".join(["".join(c*(5-L)for c:l[L+1to])]*(5-L)))}

オンラインでお試しください!


行のリストを受け取って返すことは許可されていないと思います。ルールは非常に厳格です。複数行にわたる入力をサポートする必要があります。出力は複数行に渡って提示する必要があります。リテラル改行の代わりに\ nを出力することはできません。
ミスターXcoder

@ Mr.Xcoderおっと、悪いね。修正。
ハイパーニュートリノ

注:入力にが含まれて\nいても問題ありませんが、出力はリテラルの改行で表示する必要があります。
スティーヴィーグリフィン

@ mbomb007私5-はそこに入れるのを忘れました。ごめんなさい
-HyperNeutrino

@ mbomb007修正
-HyperNeutrino





0

J、55バイト

([:{:@,'^##?#? 'rxmatch])((1 1 4 3 2{~[)([:|:[$"0#)}.)]

TIOをJ正規表現で動作させる方法がわからないため、動作するリンクを提供できません。

Jインタープリターでテストする方法は次のとおりです(J804でテスト済み)

   f=.([:{:@,'^##?#? 'rxmatch])((1 1 4 3 2{~[)([:|:[$"0#)}.)]
   txt=.'# Hello'; '## A B C def'; '### PPCG!'; '#and a hash mark without a space after it.'; '##### ###'
   ; f each txt

HHHHeeeelllllllloooo                      
HHHHeeeelllllllloooo                      
HHHHeeeelllllllloooo                      
HHHHeeeelllllllloooo                      
AAA   BBB   CCC   dddeeefff               
AAA   BBB   CCC   dddeeefff               
AAA   BBB   CCC   dddeeefff               
PPPPCCGG!!                                
PPPPCCGG!!                                
#and a hash mark without a space after it.
##### ###

ボックス化された文字列のリストを通じて複数行の文字列をシミュレートします。



0

JavaScript、112バイト

x=>x.replace(/^(##?#?) (.*)/mg,(_,n,w)=>(t=>Array(t).fill(w.replace(/./g,c=>c.repeat(t))).join`
`)(5-n.length))


これはうまくいかないと思う#### ##
リックヒッチコック

@RickHitchcock修正
-tsh

0

C#4.5 158バイト

ここで、iは文字列形式の入力です。

int l,m,t,s=0;while(i[s]=='#'){s++;};t=s>0?4-s+1:1;for(l=0;l<t;l++){foreach(char c in i.Skip(s>0?s+1:0))for(m=0;m<t;m++)Console.Write(c);Console.WriteLine();}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.