简单的降价渲染


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在换行符中使用etc.是可以的。
    • 不会有仅包含一个#后跟一个空格的行
  • 输出必须在多行中显示。您可能不会输出\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.17年

Answers:


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

视网膜125104字节

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

在线尝试

感谢Neil,节省了21个字节。


%)在第三阶段使用来节省3个字节,这允许您%在前两个阶段中删除。另外一个常放G(S IN的头(就是你现在就需要两个)。
尼尔

更好的是,您可以使用m)m(现在节省9个字节,因为您可以删除所有其他ms。
尼尔

标题原来是不必要的。另外,我还保存了12个字节:在线尝试!
尼尔

哦,是的,我只是习惯于将标头用于多个测试用例。
mbomb007 '17

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中执行此操作的最佳方法是... Kronecker产品当然是执行此操作的最佳方法:)太好了!
Stewie Griffin

@StewieGriffin当我看到挑战时,立即想到了Kronecker产品。但是我刚刚发现一种使用repelemY"在MATL中)短2个字节的方法。kron仍然可能是MATLAB中最短的方法
Luis Mendo


1

木炭,46字节

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

在线尝试!链接是详细版本的代码。木炭实际上并不做字符串数组输入,因此我不得不将数组长度添加为输入。说明:

FN«Sι

循环输入适当数量的输入字符串。

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

通过输入并最多添加2个前缀来创建一个字符串###数组,然后将其截断为长度4,然后尝试在数组中查找,然后转换为1索引。这样得出的数字比字母缩放少一个。

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

如果字母zoom为1,则循环遍历整个字符串,否则循环遍历相应的后缀(在木炭中难以合理提取)。

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先生17年

@ Mr.Xcoder糟糕,我不好。定影。
HyperNeutrino

注意:如果输入具有\n,就可以了,但是输出应该用文字换行符显示。
Stewie Griffin

@ mbomb007哎呀,我忘了把它5-放在那里。抱歉
HyperNeutrino

@ mbomb007已修复
HyperNeutrino

0

Python 3,147字节

def f(x):
	for l in x.split("\n"):L=l.find(" ");print(L>3or L+len(l.lstrip("#"))-len(l)and l or"\n".join(["".join(c*(5-L)for c in l[L+1:])]*(5-L)))

在线尝试!

-1字节感谢Xcoder先生


@ mbomb007哎呀,我忘了把它5-放在那里。抱歉
HyperNeutrino

0

C#(.NET Core),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

Python 3 3,131字节

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

在线尝试!

我使用Python 3以便[]与正则表达式一起使用。


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#)}.)]

我不知道如何使TIO与J regex一起使用,因此我无法提供有效的链接。

这是在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

Python 2中126个 124 117字节

while 1:l=raw_input();i=l.find(' ');v=5-i*(l[:i]in'###');exec"print[l,''.join(c*v for c in l[i+1:])][v<5];"*(v>4or v)

在线尝试!

要么

while 1:l=raw_input();i=l.find(' ');t=''<l[:i]in'###';exec"print[l,''.join(c*(5-i)for c in l[i+1:])][t];"*(t<1or 5-i)

在线尝试!


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();}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.