간단한 마크 다운 렌더링


20

Stack Exchange 네트워크의 게시물에 헤더를 만드는 방법에는 여러 가지가 있습니다. 가장 일반적입니다 형식 1 PPCG에 사용되는 것 같다 :

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

해시 표시 뒤의 공백에 유의하십시오. 또한 후미 해시 마크는 포함되지 않습니다.

도전:

(여러 줄로 된) 문자열을 입력으로 사용하여 다음 형식으로 문자열을 출력하십시오.

  • 헤더가 레벨 1 인 경우 각 문자를 4x4 회 출력
  • 헤더가 레벨 2 인 경우 각 문자를 3x3 회 출력
  • 헤더가 레벨 3 인 경우 각 문자를 2x2로 출력
  • 행이 헤더가 아닌 경우 그대로 출력하십시오.

설명하기 위해 :

--- 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개행에 등을 사용하는 것은 좋습니다.
    • #뒤에 공백이 하나만 포함 된 줄은 없습니다
  • 출력은 여러 줄로 표시되어야합니다. \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 : 실제로 확인하지는 않았지만 사실 이라고 생각 합니다.


입력을 문자열 배열로 가져올 수 있습니까?
Ian 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

자바 스크립트 (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 바이트가 절약되었습니다.


첫 번째 두 단계 %)에서 %s 를 제거 할 수있는 세 번째 단계에서 3 바이트를 절약하십시오 . 또한 하나는 일반적으로 헤더에 s G뒤에 ((두 개가 필요 합니다) 넣습니다 .
Neil

더 나은 방법으로, m)또는 m(다른 바이트를 모두 제거 할 수 있기 때문에 9 바이트를 절약 하거나 사용할 수 있습니다 m.
Neil

헤더가 불필요한 것으로 판명되었습니다. 또한 12 바이트를 더 저장 했습니다. 온라인으로 사용해보십시오!
Neil

예, 방금 여러 테스트 사례에 헤더를 사용하는 데 익숙했습니다.
mbomb007

2

MATL , 43 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 에서이 작업을 수행하는 가장 좋은 방법은 무엇인지 궁금했습니다 ... Kronecker 제품은 물론 가장 좋은 방법이었습니다 :) Nice!
Stewie Griffin

@StewieGriffin 도전을 보았을 때 나는 즉시 Kronecker 제품을 생각했습니다. 그러나 방금 repelem( Y"MATL에서)를 사용하여 2 바이트 더 짧은 방법을 찾았습니다 . kronMATLAB에서 가장 짧은 방법은 아마도 여전히
루이스 Mendo


1

, 46 바이트

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 숯은 실제로 문자열 배열 입력을 수행하지 않으므로 배열 길이를 입력으로 추가해야했습니다. 설명:

FN«Sι

적절한 수의 입력 문자열을 반복합니다.

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

입력을 받고 최대 2 # 접두사를 사용한 다음 길이 4로 자른 다음 ###배열에서 찾은 다음 1 인덱싱으로 변환하여 문자열 배열을 만듭니다 . 이로 인해 문자 확대 / 축소보다 1이 적습니다.

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

문자 확대 / 축소가 1이면 전체 문자열을 반복하고 그렇지 않으면 적절한 접미사를 반복합니다 (차콜에서 추출하기가 부적절합니다).

G↓→↑⊕θκ→

오른쪽 상단에 끝나는 문자로 채워진 다각형을 그린 후 다음 문자를 위해 오른쪽으로 이동하십시오.

»D⎚

출력을 인쇄하고 다음 입력 문자열에 대한 준비를 재설정하십시오.


1

SOGL V0.12 , 31 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을 출력 할 수 없습니다. .
Mr. Xcoder

@ Mr.Xcoder Whoops, 내 나쁜. 고정.
HyperNeutrino

참고 : 입력에이 있으면 정상 \n이지만 출력에 리터럴 개행이 표시되어야합니다.
Stewie Griffin

@ mbomb007 내가 5-거기 에 넣는 것을 잊었다 . 미안
HyperNeutrino

@ mbomb007 fixed
HyperNeutrino


0

C # (. NET 코어) , 268 + 18 바이트

n=>{var r="";for(int l=0,c;l<n.Length;l++){var m=n[l];var s=m.Split(' ');var y=s[0];if(!y.All(x=>x==35)|y.Length>3|s.Length<2)r+=m+'\n';else for(int i=0,k=y.Length;i<5-k;i++){for(c=1;c<m.Length-k;)r+=new string(m.Substring(k,m.Length-k)[c++],5-k);r+='\n';}}return r;};

온라인으로 사용해보십시오!



0

PHP, 122 + 1 바이트

for($y=$z=" "==$s[$i=strspn($s=$argn,"#")]&&$i?5-$i++:1+$i=0;$y--;print"
")for($k=$i;~$c=$s[$k++];)echo str_pad($c,$z,$c);

파이프로 실행 -nR하거나 (한 입력 라인에서 차례로 작동) 온라인으로 시도하십시오 .


0

J , 55 바이트

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

J 정규식으로 TIO를 작동시키는 방법을 모르므로 작동하는 링크를 제공 할 수 없습니다.

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

자바 스크립트, 112 바이트

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


나는 이것이 효과가 없다고 생각한다 #### ##.
Rick Hitchcock

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