Einfaches Abschriften-Rendering

20

Es gibt verschiedene Möglichkeiten, Header für Posts im Stack Exchange-Netzwerk zu erstellen. Das Format , das die meisten ist gewöhnlich 1 auf PPCG verwendet zu sein scheint:

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

Beachten Sie das Leerzeichen nach den Rautezeichen. Beachten Sie außerdem, dass nachfolgende Hash-Marken nicht enthalten sind.

Herausforderung:

Nehmen Sie eine (möglicherweise mehrzeilige) Zeichenfolge als Eingabe und geben Sie die Zeichenfolge in folgendem Format aus:

  • Wenn der Header Level 1 ist, wird jeder Buchstabe 4 mal 4 ausgegeben
  • Wenn der Header Level 2 ist, wird jeder Buchstabe 3 mal 3 ausgegeben
  • Wenn der Header Level 3 ist, wird jeder Buchstabe 2-mal ausgegeben
  • Wenn eine Zeile keine Kopfzeile ist, geben Sie sie so aus, wie sie ist.

Um zu veranschaulichen:

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

So einfach ist das!


Regeln:

  • Sie müssen die Eingabe über mehrere Zeilen unterstützen. Die Verwendung von \netc. für Zeilenumbrüche ist in Ordnung.
    • Es wird keine Zeile geben, in der nur ein #Leerzeichen folgt
  • Die Ausgabe muss mehrzeilig erfolgen. Sie können \nanstelle von wörtlichen Zeilenumbrüchen keine Ausgaben vornehmen.
    • Leerzeichen und Zeilenumbrüche sind in Ordnung.

Testfälle:

Eingabe und Ausgabe sind durch eine Linie von getrennt ....

# 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: Ich habe nicht wirklich nachgesehen, aber ich denke es ist wahr.

Stewie Griffin
quelle
Dürfen wir Eingaben als String-Array annehmen?
Ian H.

Antworten:

7

Gestapelt , 51 bis 50 Bytes

Dank @RickHitchcock - golfed regex 1 Byte gespart

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

Probieren Sie es online!

Anonyme Funktion, die Eingaben vom Stapel entgegennimmt und auf dem Stapel belässt.

Erläuterung

['^(##?#?) (.+)'[\#'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
Conor O'Brien
quelle
3

JavaScript (ES6), 111 bis 105 Byte

6 Bytes gespart dank @Shaggy

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

Stimmt mit 1-3 Hashes am Anfang der Zeichenfolge überein oder mit einer vorangestellten neuen Zeile, und wiederholt dann jedes Zeichen in der Übereinstimmung zusammen mit der Übereinstimmung selbst, basierend auf der Länge der Hashes.

Testfälle:

Rick Hitchcock
quelle
2

Retina , 125 104 Bytes

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

Probieren Sie es online aus

21 Bytes dank Neil gespart.

mbomb007
quelle
Sparen Sie 3 Bytes, indem Sie %)in der dritten Stufe verwenden, um die %s in den ersten beiden Stufen zu entfernen . Außerdem fügt man normalerweise Gdie (Nachkommastellen (von denen Sie jetzt zwei benötigen) in die Kopfzeile ein.
Neil
Besser noch, du kannst m)oder verwenden, m(was jetzt 9 Bytes spart, weil du dann alle anderen ms entfernen kannst .
Neil
Der Header stellte sich als unnötig heraus. Außerdem habe ich noch 12 Bytes gespart: Online ausprobieren!
Neil
Oh ja, ich war es einfach gewohnt, den Header für mehrere Testfälle zu verwenden.
mbomb007
2

MATL , 43 42 40 Bytes

1 Byte entfernt dank Rick Hitchcock !

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

Dadurch wird in jeder Zeile ein Leerzeichen nachgestellt (gemäß der Abfrage zulässig) und nach der Ausgabe ein Fehler ausgegeben (standardmäßig zulässig).

Probieren Sie es online!

Erläuterung

`            % 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)
Luis Mendo
quelle
Ich habe mich gefragt, wie das in MATLAB am besten funktioniert ... Kronecker-Produkt war natürlich die beste Möglichkeit dafür :) Schön!
Stewie Griffin
@StewieGriffin Als ich die Herausforderung sah, dachte ich sofort an das Kronecker-Produkt. Aber ich habe gerade einen Weg gefunden, der mit repelem( Y"in MATL) 2 Byte kürzer ist . kronist wohl immer noch der kürzeste Weg in MATLAB
Luis Mendo
2

Perl 5, 47 + 1 (-p) Bytes

s/^##?#? //;$.=6-("@+"||5);$_=s/./$&x$./ger x$.

versuche es online

Nahuel Fouilleul
quelle
1

Kohle , 46 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Da Charcoal keine String-Array-Eingabe ausführt, musste ich die Array-Länge als Eingabe hinzufügen. Erläuterung:

FN«Sι

Durchlaufen Sie die entsprechende Anzahl von Eingabezeichenfolgen.

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

Erstellen Sie ein Array von Zeichenfolgen, indem Sie die Eingabe nehmen und bis zu 2 #s voranstellen, dann auf Länge 4 kürzen, dann versuchen, ###im Array zu suchen , und dann in 1-Indizierung konvertieren. Dies ergibt eine Zahl, die um eins kleiner ist als der Buchstabe zoom.

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

Wenn der Buchstabe zoom 1 ist, schleifen Sie über die gesamte Zeichenfolge, andernfalls über das entsprechende Suffix (das in Charcoal unangemessen schwer zu extrahieren ist).

G↓→↑⊕θκ→

Zeichnen Sie ein Polygon, das mit dem Buchstaben in der oberen rechten Ecke endet, und bewegen Sie sich dann nach rechts, um den nächsten Buchstaben zu erhalten.

»D⎚

Drucken Sie die Ausgabe und setzen Sie sie für die nächste Eingabezeichenfolge zurück.

Neil
quelle
1

SOGL V0.12 , 31 28 Bytes

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

Probieren Sie es hier aus! - Zusätzlicher Code hinzugefügt, da der Code eine Funktion ist und Eingaben auf dem Stack akzeptiert (SOGL kann ansonsten keine mehrzeiligen Eingaben akzeptieren: /). - Diese inputs.value”Zeichenfolge pushen. - Als JS auswerten. F- Diese Funktion aufrufen

Erläuterung:

¶Θ                            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
dzaima
quelle
0

Proton , 130 Bytes

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

Probieren Sie es online!

HyperNeutrino
quelle
Ich denke, Sie dürfen keine Zeilenliste empfangen und zurücksenden, die Regeln sind sehr streng: Sie müssen die Eingabe über mehrere Zeilen unterstützen. , Die Ausgabe muss mehrzeilig erfolgen. Sie können keine \ n statt wörtlicher Zeilenumbrüche ausgeben. .
Mr. Xcoder
@ Mr.Xcoder Hoppla, mein böser. Festsetzung.
HyperNeutrino
Hinweis: Es ist in Ordnung, wenn die Eingabe hat \n, aber die Ausgabe sollte mit wörtlichen Zeilenumbrüchen angezeigt werden.
Stewie Griffin
@ mbomb007 Whoops ich habe vergessen das 5-da rein zu stellen . Entschuldigung
HyperNeutrino
@ mbomb007 behoben
HyperNeutrino
0

Python 3 , 147 Bytes

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

Probieren Sie es online!

-1 Byte danke an Herrn Xcoder

HyperNeutrino
quelle
@ mbomb007 Whoops ich habe vergessen das 5-da rein zu stellen . Entschuldigung
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;};

Probieren Sie es online!

Ian H.
quelle
0

Python 3 , 131 Bytes

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

Probieren Sie es online!

Ich habe Python 3 verwendet, um es []mit Regex zu verwenden.

Neil
quelle
0

PHP, 122 + 1 Bytes

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

Laufen Sie als Pipe mit -nR(funktioniert auf einer Eingabezeile nach der anderen) oder versuchen Sie es online .

Titus
quelle
0

J , 55 Bytes

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

Ich weiß nicht, wie TIO mit J Regex funktioniert, daher kann ich keinen funktionierenden Link bereitstellen.

So testen Sie es im J-Interpreter (getestet mit 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.
##### ###

Ich simuliere eine mehrzeilige Zeichenfolge durch eine Liste von geschachtelten Zeichenfolgen.

Galen Ivanov
quelle
0

Python 2 , 126 124 117 Bytes

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)

Probieren Sie es online!

oder

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)

Probieren Sie es online!

ovs
quelle
0

JavaScript, 112 Bytes

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

tsh
quelle
Ich glaube nicht, dass das funktioniert #### ## .
Rick Hitchcock
@ RickHitchcock behoben
tsh
0

C # 4.5 158 Bytes

Wobei i die Eingabe in Form eines Strings ist.

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();}
supermeerkat
quelle