Proste renderowanie przecen

20

Istnieje kilka sposobów tworzenia nagłówków we wpisach w sieci Stack Exchange. Format to najczęściej 1 używany na PPCG wydaje się być:

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

Zwróć uwagę na spację po znakach skrótu. Pamiętaj też, że końcowe znaki skrótu nie są uwzględniane.

Wyzwanie:

Weź jako dane wejściowe (być może wielowierszowy) ciąg i wyślij go w następującym formacie:

  • Jeśli nagłówek ma poziom 1, wypisz każdą literę 4 na 4 razy
  • Jeśli nagłówek ma poziom 2, wypisz każdą literę 3 na 3 razy
  • Jeśli nagłówek ma poziom 3, wypisz każdą literę 2 razy 2 razy
  • Jeśli linia nie jest nagłówkiem, wypisz ją taką, jaka jest.

Ilustrować:

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

Proste!


Zasady:

  • Musisz obsługiwać wprowadzanie przez wiele wierszy. Używanie \nitp. Dla nowych linii jest OK.
    • Nie będzie linii zawierających tylko #jedno miejsce po nim
  • Dane wyjściowe muszą być prezentowane w wielu wierszach. Nie możesz generować \nzamiast dosłownych znaków nowej linii.
    • Końcowe spacje i znaki nowej linii są prawidłowe.

Przypadki testowe:

Wejścia i wyjścia są oddzielone linią ....

# 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: Tak naprawdę nie sprawdziłem, ale myślę, że to prawda.

Stewie Griffin
źródło
Czy możemy brać dane wejściowe jako tablicę ciągów?
Ian H.

Odpowiedzi:

7

Skumulowane , 51 50 bajtów

Zaoszczędzono 1 bajt dzięki @RickHitchcock - regex golfowy

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

Wypróbuj online!

Anonimowa funkcja, która pobiera dane wejściowe ze stosu i pozostawia je na stosie.

Wyjaśnienie

['^(##?#?) (.+)'[\#'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
źródło
3

JavaScript (ES6), 111 105 bajtów

Zaoszczędź 6 bajtów dzięki @Shaggy

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

Dopasowuje 1-3 skrótów na początku łańcucha lub poprzedzony nowym wierszem, a następnie powtarza każdy znak w dopasowaniu wraz z samym dopasowaniem, na podstawie długości skrótów.

Przypadki testowe:

Rick Hitchcock
źródło
2

Siatkówka , 125 104 bajtów

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

Wypróbuj online

Zaoszczędzono 21 bajtów dzięki Neilowi.

mbomb007
źródło
Zaoszczędź 3 bajty, używając %)trzeciego etapu, który pozwala usunąć %s z pierwszych dwóch etapów. Również jeden zwykle umieszcza Gpo (nagłówku s (z których teraz będziesz potrzebować dwóch).
Neil,
Co więcej, możesz użyć m)lub, m(który teraz oszczędza 9 bajtów, ponieważ możesz następnie usunąć wszystkie pozostałe m.
Neil,
Nagłówek okazał się niepotrzebny. Zapisałem też kolejne 12 bajtów: Wypróbuj online!
Neil,
Och, tak, byłem przyzwyczajony do używania nagłówka dla wielu przypadków testowych.
mbomb007,
2

MATL , 43 42 40 bajtów

1 bajt usunięty dzięki Rickowi Hitchcockowi !

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

To generuje końcowe miejsce w każdej linii (dozwolone przez wyzwanie) i kończy się z błędem (domyślnie dozwolonym) po wygenerowaniu wyjścia.

Wypróbuj online!

Wyjaśnienie

`            % 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
źródło
Zastanawiałem się, jak najlepiej to zrobić w MATLAB… Produkt Kronecker był oczywiście najlepszym sposobem na zrobienie tego :) Fajnie!
Stewie Griffin
@StewieGriffin Kiedy zobaczyłem wyzwanie, od razu pomyślałem o produkcie Kronecker. Ale właśnie znalazłem sposób, który jest o 2 bajty krótszy przy użyciu repelem(Y" w MATL). kronjest prawdopodobnie prawdopodobnie najkrótszą drogą w MATLAB
Luis Mendo
2

Perl 5, 47 +1 (-p) bajtów

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

spróbuj online

Nahuel Fouilleul
źródło
1

Węgiel drzewny , 46 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Węgiel drzewny tak naprawdę nie wprowadza danych z tablicy ciągów, więc musiałem dodać długość tablicy jako dane wejściowe. Wyjaśnienie:

FN«Sι

Pętla nad odpowiednią liczbą ciągów wejściowych.

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

Utwórz tablicę ciągów, pobierając dane wejściowe i poprzedzając je do 2 #, następnie skracając do długości 4, a następnie spróbuj znaleźć ### w tablicy, a następnie przekonwertuj na indeksowanie 1. Powoduje to, że liczba jest o jeden mniejsza niż powiększenie litery.

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

Jeśli powiększenie liter wynosi 1, to zapętlaj cały łańcuch, w przeciwnym razie zapętlaj odpowiedni sufiks (co jest nieuzasadnione trudne do wyodrębnienia z węgla drzewnego).

G↓→↑⊕θκ→

Narysuj wielokąt wypełniony literą kończącą się w prawym górnym rogu, a następnie przejdź w prawo, gotowa na następną literę.

»D⎚

Wydrukuj wyjście i zresetuj gotowe do następnego ciągu wejściowego.

Neil
źródło
1

SOGL V0.12 , 31 28 bajtów

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

Wypróbuj tutaj! - dodano dodatkowy kod, ponieważ kod jest funkcją i pobiera dane wejściowe ze stosu (SOGL nie może przyjmować danych wejściowych wielowierszowych w przeciwnym razie: /) - inputs.value”- wypycha ten ciąg, - ocenia jako JS,F - wywołać tę funkcję

Wyjaśnienie:

¶Θ                            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
źródło
0

Proton , 130 bajtów

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

Wypróbuj online!

HyperNeutrino
źródło
Myślę, że nie wolno ci odbierać i zwracać listy linii, reguły są dość surowe: Musisz obsługiwać wprowadzanie przez wiele linii. , Dane wyjściowe muszą być prezentowane w wielu wierszach. Nie możesz wypisywać \ n zamiast dosłownych znaków nowej linii. .
Pan Xcoder,
@ Mr.Xcoder Ups, moje złe. Ustalenie.
HyperNeutrino,
Uwaga: Jest OK, jeśli wejście ma \n, ale dane wyjściowe powinny być wyświetlane dosłownie znakami nowej linii.
Stewie Griffin
@ mbomb007 Ups, zapomniałem umieścić 5-tam. Przepraszamy
HyperNeutrino,
@ mbomb007 naprawiono
HyperNeutrino
0

Python 3 , 147 bajtów

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

Wypróbuj online!

-1 bajt dzięki Mr. Xcoder

HyperNeutrino
źródło
@ mbomb007 Ups, zapomniałem umieścić 5-tam. Przepraszamy
HyperNeutrino,
0

C # (.NET Core) , 268 + 18 bajtów

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

Wypróbuj online!

Ian H.
źródło
0

Python 3 , 131 bajtów

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

Wypróbuj online!

Użyłem Python 3 w celu użycia []z wyrażeniem regularnym.

Neil
źródło
0

PHP, 122 + 1 bajtów

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

Uruchom jako potok z -nR(będzie działał na jednej linii wejściowej po drugiej) lub wypróbuj online .

Tytus
źródło
0

J , 55 bajtów

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

Nie wiem, jak sprawić, by TIO działało z J regex, więc nie mogę zapewnić działającego łącza.

Oto jak to przetestować w interpreterie J (testowane z 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.
##### ###

Symuluję ciąg wielowierszowy poprzez listę ciągów w ramkach.

Galen Iwanow
źródło
0

Python 2 , 126 124 117 bajtów

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)

Wypróbuj online!

lub

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)

Wypróbuj online!

ovs
źródło
0

JavaScript, 112 bajtów

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

tsh
źródło
Nie sądzę, że to działa #### ##.
Rick Hitchcock,
@RickHitchcock naprawiony
tsh
0

C # 4,5 158 bajtów

Gdzie i to dane wejściowe w postaci ciągu.

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
źródło