การเรนเดอร์แบบง่าย


20

มีหลายวิธีในการสร้างส่วนหัวในโพสต์บนเครือข่ายกองซ้อนแลกเปลี่ยน รูปแบบที่ใช้บ่อยที่สุด1บน PPCG น่าจะเป็น:

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

สังเกตช่องว่างหลังเครื่องหมายแฮช นอกจากนี้โปรดทราบว่าเครื่องหมายแฮชต่อท้ายจะไม่รวมอยู่

ท้าทาย:

ใช้สตริง (อาจเป็นหลายบรรทัด) เป็นอินพุตและเอาต์พุตสตริงในรูปแบบต่อไปนี้:

  • หากส่วนหัวเป็นระดับ 1 ให้เอาท์พุทแต่ละตัวอักษร 4 - 4-4 ครั้ง
  • หากส่วนหัวเป็นระดับ 2 ให้เอาท์พุทแต่ละตัวอักษร 3-by-3
  • หากส่วนหัวเป็นระดับ 3 ให้เอาท์พุทตัวอักษรแต่ละตัว 2 คูณ 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ฯลฯ สำหรับการขึ้นบรรทัดใหม่ก็โอเค
    • จะไม่มีบรรทัดที่มีเพียง#ช่องว่างตามมาด้วยช่องว่างเดียว
  • เอาต์พุตต้องถูกแสดงผ่านหลายบรรทัด คุณไม่สามารถส่งออก\nแทนที่จะขึ้นบรรทัดใหม่ตามตัวอักษร
    • ช่องว่างต่อท้ายและการขึ้นบรรทัดใหม่นั้นใช้ได้

กรณีทดสอบ:

input และ output ...จะถูกคั่นด้วยเส้นของ

# 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 ไบต์

บันทึกแล้ว 1 ไบต์ขอบคุณ @RickHitchcock - golfed regex

['^(##?#?) (.+)'[\#'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 ไบต์

บันทึกแล้ว 6 ไบต์ขอบคุณ @Shaggy

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
^# 
$%'¶$%'¶$%'¶
^## 
$%'¶$%'¶
^### 
$%'¶

ลองออนไลน์

บันทึกแล้ว 21 ไบต์ขอบคุณนีล


บันทึก 3 ไบต์โดยใช้%)บนสเตจที่สามซึ่งอนุญาตให้คุณลบ%s บนสองสเตจแรก ยังเป็นหนึ่งปกติทำให้Gหลังจาก(s (ซึ่งตอนนี้คุณจะต้องสอง) ในส่วนหัว
Neil

ยังดีกว่าคุณสามารถใช้m)หรือm(ตอนนี้บันทึก 9 ไบต์เพราะคุณสามารถลบอื่น ๆmทั้งหมด
Neil

ส่วนหัวกลายเป็นว่าไม่จำเป็น นอกจากนี้ฉันบันทึกอีก 12 ไบต์: ลองออนไลน์!
Neil

โอ้ใช่ฉันเพิ่งคุ้นเคยกับการใช้ส่วนหัวสำหรับการทดสอบหลายกรณี
mbomb007

2

MATL , 43 42 40 ไบต์

ลบ 1 ไบต์ด้วยRick Hitchcock !

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

สิ่งนี้จะส่งออกพื้นที่ต่อท้ายในแต่ละบรรทัด (อนุญาตโดยการท้าทาย) และออกด้วยข้อผิดพลาด (อนุญาตโดยค่าเริ่มต้น) หลังจากสร้าง ouput

ลองออนไลน์!

คำอธิบาย

`            % 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 ในทันที แต่ฉันเพิ่งพบวิธีที่สั้นลง 2 ไบต์โดยใช้repelem( Y"ใน MATL) kronยังคงเป็นวิธีที่สั้นที่สุดใน MATLAB
Luis Mendo


1

ถ่าน 46 ไบต์

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด Charcoal ไม่ได้ทำอินพุตสตริงของอาร์เรย์จริงๆดังนั้นฉันต้องเพิ่มความยาวของอาร์เรย์เป็นอินพุต คำอธิบาย:

FN«Sι

วนรอบจำนวนที่เหมาะสมของสายป้อน

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

สร้างอาร์เรย์ของสตริงโดยการป้อนข้อมูลและนำหน้าได้สูงสุด 2 # แล้วตัดให้มีความยาว 4 จากนั้นลองค้นหา###ในอาร์เรย์จากนั้นแปลงเป็นดัชนี 1 รายการ ผลลัพธ์นี้เป็นตัวเลขที่น้อยกว่าการย่อตัวอักษร

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

หากการย่อ / ขยายตัวอักษรเป็น 1 แล้ววนซ้ำทั้งสตริงมิฉะนั้นวนซ้ำคำต่อท้ายที่เหมาะสม (ซึ่งยากที่จะแยกใน Charcoal อย่างไม่มีเหตุผล)

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 อ๊ะแย่จัง แก้ไข
HyperNeutrino

หมายเหตุ: มันก็โอเคถ้าอินพุตมี\nแต่เอาต์พุตควรแสดงขึ้นบรรทัดใหม่ตามตัวอักษร
Stewie Griffin

@ mbomb007 อ๊ะฉันลืมใส่5-เข้าไปแล้ว ขออภัย
HyperNeutrino

@ mbomb007 คงที่
HyperNeutrino




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

JavaScript, 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 Bytes

โดยที่ 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.