Kết xuất đánh dấu đơn giản


20

Có một số cách để tạo tiêu đề trên các bài đăng trên mạng Stack Exchange. Định dạng phổ biến nhất được sử dụng 1 trên PPCG dường như là:

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

Lưu ý không gian sau dấu băm. Ngoài ra, lưu ý rằng dấu băm kéo không được bao gồm.

Thử thách:

Lấy một chuỗi (có thể là đa dòng) làm đầu vào và xuất chuỗi theo định dạng sau:

  • Nếu tiêu đề là cấp 1, thì hãy xuất mỗi chữ cái 4 lần 4
  • Nếu tiêu đề là cấp 2, thì hãy xuất mỗi chữ cái 3 lần 3 lần
  • Nếu tiêu đề là cấp 3, thì hãy xuất từng chữ cái 2 lần
  • Nếu một dòng không phải là một tiêu đề thì xuất nó như nó là.

Để minh họa:

--- 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 giản như thế!


Quy tắc:

  • Bạn phải hỗ trợ đầu vào trên nhiều dòng. Sử dụng \nvv cho dòng mới là OK.
    • Sẽ không có dòng nào chỉ chứa một dấu #vết theo sau bởi một khoảng trắng
  • Đầu ra phải được trình bày qua nhiều dòng. Bạn không thể xuất ra \nthay vì dòng mới.
    • Không gian lưu trữ và dòng mới là OK.

Các trường hợp thử nghiệm:

Đầu vào và đầu ra được phân tách bằng một dòng ....

# 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: Tôi chưa thực sự kiểm tra, nhưng tôi nghĩ đó là sự thật.


Chúng ta có thể lấy đầu vào là một chuỗi chuỗi không?
Ian H.

Câu trả lời:


7

Xếp chồng lên nhau , 51 50 byte

Đã lưu 1 byte nhờ @RickHitchcock - regex đánh gôn

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

Hãy thử trực tuyến!

Hàm ẩn danh nhận đầu vào từ ngăn xếp và để nó trên ngăn xếp.

Giải trình

['^(##?#?) (.+)'[\#'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 byte

Đã lưu 6 byte nhờ @Shaggy

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

Ghép các băm 1-3 ở đầu chuỗi hoặc trước một dòng mới, sau đó lặp lại từng ký tự trong trận đấu cùng với chính trận đấu, dựa trên độ dài của băm.

Các trường hợp thử nghiệm:


2

Võng mạc , 125 104 byte

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

Dùng thử trực tuyến

Đã lưu 21 byte nhờ Neil.


Lưu 3 byte bằng cách sử dụng %)ở giai đoạn thứ ba cho phép bạn loại bỏ %s ở hai giai đoạn đầu tiên. Ngoài ra, người ta thường đặt Gsau (s (trong đó bây giờ bạn sẽ cần hai) trong tiêu đề.
Neil

Vẫn tốt hơn, bạn có thể sử dụng m)hoặc m(hiện tiết kiệm 9 byte vì sau đó bạn có thể xóa tất cả các ms khác .
Neil

Các tiêu đề hóa ra là không cần thiết. Ngoài ra, tôi đã lưu thêm 12 byte: Hãy thử trực tuyến!
Neil

Ồ, vâng tôi chỉ quen với việc sử dụng tiêu đề cho nhiều trường hợp thử nghiệm.
mbomb007

2

MATL , 43 42 40 byte

Xóa 1 byte nhờ Rick Hitchcock !

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

Điều này tạo ra một khoảng trắng ở mỗi dòng (được thử thách cho phép) và thoát với một lỗi (được mặc định cho phép) sau khi tạo ra thông số.

Hãy thử trực tuyến!

Giải trình

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

Tôi đã tự hỏi cách tốt nhất để làm điều này trong MATLAB là ... sản phẩm của Kronecker dĩ nhiên là cách tốt nhất để làm điều đó :) Thật tuyệt!
Stewie Griffin

@StewieGriffin Khi thấy thử thách tôi đã nghĩ ngay đến sản phẩm Kronecker. Nhưng tôi chỉ tìm thấy một cách ngắn hơn 2 byte bằng cách sử dụng repelem( Y"trong MATL). kroncó lẽ vẫn là con đường ngắn nhất trong MATLAB
Luis Mendo


1

Than , 46 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Than không thực sự làm đầu vào mảng chuỗi, vì vậy tôi đã phải thêm chiều dài mảng làm đầu vào. Giải trình:

FN«Sι

Lặp lại số chuỗi đầu vào thích hợp.

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

Tạo một chuỗi các chuỗi bằng cách lấy đầu vào và tiền tố lên tới 2 #, sau đó cắt ngắn thành 4, sau đó thử tìm ###trong mảng, sau đó chuyển đổi thành chỉ mục 1. Điều này dẫn đến một số nhỏ hơn một lần so với thu phóng chữ cái.

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

Nếu thu phóng chữ là 1 thì lặp qua toàn bộ chuỗi nếu không lặp qua hậu tố thích hợp (rất khó để trích xuất trong Than).

G↓→↑⊕θκ→

Vẽ một đa giác chứa đầy chữ cái kết thúc ở góc trên bên phải, và sau đó di chuyển sang phải để sẵn sàng cho chữ cái tiếp theo.

»D⎚

In đầu ra và thiết lập lại sẵn sàng cho chuỗi đầu vào tiếp theo.


1

SOGL V0.12 , 31 28 byte

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

Hãy thử nó ở đây! - thêm mã được thêm vào vì mã là một hàm và lấy đầu vào trên ngăn xếp (SOGL không thể lấy đầu vào đa dòng theo cách khác: /) - inputs.value”- đẩy chuỗi đó, - đánh giá là JS, F- gọi hàm đó

Giải trình:

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

Proton , 130 byte

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

Hãy thử trực tuyến!


Tôi nghĩ rằng bạn không được phép nhận và trả về một danh sách các dòng, các quy tắc khá nghiêm ngặt: Bạn phải hỗ trợ đầu vào trên nhiều dòng. , Đầu ra phải được trình bày qua nhiều dòng. Bạn không thể xuất \ n thay vì dòng mới. .
Ông Xcoder

@ Mr.Xcoder Rất tiếc, xấu của tôi. Sửa chữa.
HyperNeutrino

Lưu ý: Sẽ ổn nếu đầu vào có \n, nhưng đầu ra phải được hiển thị với các dòng mới.
Stewie Griffin

@ mbomb007 Rất tiếc tôi quên đặt 5-trong đó. Xin lỗi
HyperNeutrino

@ mbomb007 đã được sửa
HyperNeutrino


0

C # (.NET Core) , 268 + 18 byte

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

Hãy thử trực tuyến!


0

Python 3 , 131 byte

from re import*
print(sub("^(#+) (.*?)$",lambda x:((sub('(.)',r'\1'*(5-len(x[1])),x[2])+'\n')*(5-len(x[1])))[:-1],input(),flags=M))

Hãy thử trực tuyến!

Tôi đã sử dụng Python 3 để sử dụng []với regex.


0

PHP, 122 + 1 byte

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

Chạy dưới dạng ống với -nR(sẽ hoạt động trên một dòng đầu vào sau một dòng khác) hoặc thử trực tuyến .


0

J , 55 byte

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

Tôi không biết cách làm cho TIO hoạt động với J regex, vì vậy tôi không thể cung cấp liên kết hoạt động.

Dưới đây là cách kiểm tra trình thông dịch J (được thử nghiệm với 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.
##### ###

Tôi mô phỏng một chuỗi nhiều dòng thông qua một danh sách các chuỗi được đóng hộp.



0

JavaScript, 112 byte

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


Tôi không nghĩ rằng điều này làm việc cho #### ##.
Rick Hitchcock

@RickHitchcock đã sửa
tsh

0

C # 4,5 158 byte

Trong đó i là đầu vào dưới dạng một chuỗ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();}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.