Narysuj duży ASCII X

20

Problem

Zainspirowany poprzednim wyzwaniem, robiąc coś podobnego

Biorąc pod uwagę dodatnie dane nwyjściowe liczb całkowitych, kształt ma następujący wzór:

wejście n=1:

* *
 *
* *

wejście n=2:

**  **
 ****
  **
 ****
**  **

wejście n=3:

***   ***
 *** ***
  *****
   ***
  *****
 *** ***
***   ***

i tak dalej...

Ma następujące właściwości:

n*2+1 wysokie linie

„ramiona” są nszerokie, chyba że się łączą

linia środkowa jest nszeroka

jeśli nnawet linie powyżej i poniżej środka są n*2szerokie

jeśli njest nieparzyste, linie powyżej i poniżej środka są n*2-1szerokie

Zasady

  • Końcowe znaki nowej linii są akceptowane
  • Obowiązują standardowe luki
  • Najkrótsze bajty wygrywają
  • Wyjściem może być wydruk lub ciąg lub tablica ciągów

Edycje

  • n=0 nie trzeba się tym zajmować
  • Dozwolone spacje końcowe
LiefdeWen
źródło
2
Czy jest w porządku, jeśli dane wyjściowe mają 1zamiast *i 0zamiast spacji?
JungHwan Min
Czy nasze wzorce mogą być indeksowane 0?
Leaky Nun
@JungHwanMin Pozwolę na to, ale wtedy nie będziesz mógł wygrać, może być zachwiany, jeśli jesteś najbardziej pozytywnie oceniany.
LiefdeWen
@LeakyNun 0 Zindeksowane jest w porządku
LiefdeWen

Odpowiedzi:

9

Węgiel drzewny , 13 12 bajtów

Dzięki @ErikTheOutgolfer za bajt

FN«PX⁺*×*Iθ→

Wypróbuj online!

To moja pierwsza w historii odpowiedź na węgiel drzewny i jestem prawie pewien, że nie jest tak dobrze zagrana w golfa, ale pomyślałem, że zacznę gdzieś.

 FN«            # For input() (i in range(0,input()))
     P           # Print
       X          # In an 'X' shape
        ⁺*×*Iθ   # '*'+'*'*int(first_input)
               →  # Move the cursor right one
nmjcman101
źródło
Możesz użyć dla -1.
Erik the Outgolfer,
@EriktheOutgolfer Wiedziałem, że musi być na to sposób! Dziękuję Ci!
nmjcman101
I tak, wydaje się, że jest tak golfowy, jak to tylko możliwe.
Erik the Outgolfer,
@EriktheOutgolfer W każdym razie nie było wcześniej :)
nmjcman101
1
@thomasrutter Charcoal ma własną niestandardową stronę kodową z 256 bajtami , gdzie każdy z tych znaków ma 1 bajt. Więc nie jest zakodowany w ASCII, gdzie niektóre z tych znaków rzeczywiście miałyby wiele bajtów. nmjcman101 +1 btw. Próbowałem wczoraj również mojej pierwszej odpowiedzi na węgiel drzewny, ale tak naprawdę to nie wyszło w ciągu kilku minut, które miałem przed powrotem do domu z pracy. Więc mnie pobiłeś. Nauczyłem się kilku rzeczy z twojej odpowiedzi, więc dziękuję za to.
Kevin Cruijssen
13

MATL , 16 bajtów

EQXyG:Y+tP+g42*c

Wypróbuj online!

Wyjaśnienie

Rozważ dane wejściowe 2jako przykład. Zawartość stosu pokazano poniżej, a nowsze.

EQ    % Implicitly input n. Push 2*n+1
      %   STACK: 5
Xy    % Identity matrix of that size
      %   STACK: [1 0 0 0 0;
                  0 1 0 0 0;
                  0 0 1 0 0;
                  0 0 0 1 0;
                  0 0 0 0 1]
G:    % Push [1 2 ... n]
      %   STACK: [1 0 0 0 0;
                  0 1 0 0 0;
                  0 0 1 0 0;
                  0 0 0 1 0;
                  0 0 0 0 1],
                 [1 2]
Y+    % 2D convolution, extending size
      %   STACK: [1 2 0 0 0 0;
                  0 1 2 0 0 0;
                  0 0 1 2 0 0;
                  0 0 0 1 2 0;
                  0 0 0 0 1 2]
tP+   % Duplicate, flip vertically, add
      %   STACK: [1 2 0 0 2 1;
                  0 1 2 1 2 0;
                  0 0 1 4 0 0;
                  0 1 2 1 2 0;
                  1 2 0 0 1 2]
g     % Convert to logical
      %   STACK: [1 1 0 0 1 1;
                  0 1 1 1 1 0;
                  0 0 1 1 0 0;
                  0 1 1 1 1 0;
                  1 1 0 0 1 1]
42*   % Multiply by 42.
      %   STACK: [42 42  0  0 42 42;
                   0 42 42 42 42  0;
                   0  0 42 42  0  0;
                   0 42 42 42 42  0;
                  42 42  0  0 42 42]
c     % Convert to char. Char 42 is '*'. Char 0 is displayed as space
      %   STACK: ['**  **';
                  ' **** ';
                  '  **  ';
                  ' **** ';
                  '**  **']
Luis Mendo
źródło
Jesteś szybszy ode mnie ...
Leaky Nun
@LeakyNun Bardzo rzadko :-)
Luis Mendo
Chciałbym, żeby Jelly miał splot 2D ... Musiałem dołączyć 0 w każdym rzędzie, a następnie zastosować wektoryzowaną sumę ...
Leaky Nun
1
@LeakyNun Wiesz, co mówią o
Luis Mendo
1
@LuisMendo W moim sercu jesteś zwycięzcą za korzystanie z konwolucji, przywołuje takie miłe wspomnienia.
LiefdeWen
9

Galaretka , 15 bajtów

Ḥ‘Ḷ⁶ẋ;€”*ẋ$»Ṛ$Y

Wypróbuj online!

Erik the Outgolfer
źródło
Bardzo dobrze. 8 bajtów za mną.
Leaky Nun
@LeakyNun Proste podejście bardzo pomaga.
Erik the Outgolfer,
Bardzo fajne podejście
Jonathan Allan
@JonathanAllan Tak, szczególnie jeśli uczysz się »wektoryzacji ...
Erik the Outgolfer
1
Naprawdę podoba mi się twoja nazwa użytkownika! Ale chciałbym, żebyś użył zamiast tego „vi” lub „vim”, abyś mógł wybrać „Erik the vi King” ... (tutaj fan Monty Pythona ...)
Olivier Dulac
4

V , 18 17 bajtów

Zapisano bajt dzięki sztuczce wejściowej @ DJMcMayhem.

Àé*ÄJÀälÀñ2ÙÀl2x>

Wypróbuj online!

Wyjaśnienie

Àé*ÄJÀäl

To wstawia [n]*'*'+[n]*' '+[n]*'*'

        Àñ        ' [arg] times
          2Ù      ' Duplicate the current line down twice
            Àl    ' Move right [arg] times
              2x  ' Delete two characters
                > ' Indent this line one space

Każda iteracja pętli, z której przechodzi bufor

|**   ***

Do

***   ***
 |** ***
***   ***

Gdzie |jest kursor ze *spodem

nmjcman101
źródło
Łał. Ci waaay outgolfed mnie. Dobra robota! Kilka wskazówek: Możesz zrobić Àé*ÄJÀälzamiast Àá*Àá Àá*, i możesz to zrobić <M-c>, tj. ã(Mnemonic: center ), aby przejść do środka linii, która jest bajtem krótszym niż Àl. Wypróbuj online!
DJMcMayhem
@DJMcMayhem Próbuję z tobą porozmawiać w wielu różnych miejscach. Myślę, że ukradnę pierwszą sugestię, ale <M-c>przerwy na wyższe liczby
nmjcman101,
3

05AB1E , 18 bajtów

Å4bS{I·ƒDÂ~„ *èJ,À

Wypróbuj online!

Wyjaśnienie

Przykład dla n=2

Å4                   # push a list of 4s with length as the input
                     # STACK: [4,4]
  b                  # convert each to binary
                     # STACK: [100, 100]
   S{                # split into digit list and sort
                     # STACK: [0, 0, 0, 0, 1, 1]
     I·ƒ             # input*2+1 times do
        D            # duplicate top of stack
                     # 1st iteration: [0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 1, 1]
                     # 2nd iteration: [0, 0, 0, 1, 1, 0], [0, 0, 0, 1, 1, 0]
                     # 3rd iteration: [0, 0, 1, 1, 0, 0], [0, 0, 1, 1, 0, 0]
         Â~          # or each item in the duplicate with its reverse
                     # 1st iteration: [0, 0, 0, 0, 1, 1], [1, 1, 0, 0, 1, 1]
                     # 2nd iteration: [0, 0, 0, 1, 1, 0], [0, 1, 1, 1, 1, 0]
                     # 3rd iteration: [0, 0, 1, 1, 0, 0], [0, 0, 1, 1, 0, 0]
           „ *èJ     # use the resulting binary list to index into the string " *"
                     # 1st iteration: [0, 0, 0, 0, 1, 1], "**  **"
                     # 2nd iteration: [0, 0, 0, 1, 1, 0], " **** "
                     # 3rd iteration: [0, 0, 1, 1, 0, 0], "  **  "
                ,    # print
                 À   # rotate list left
Emigna
źródło
3

V , 23 bajty

Àé*ÄJÀälÀñÙãlxx>ñyHæGVp

Wypróbuj online!

Hexdump:

00000000: c0e9 2ac4 4ac0 e46c c0f1 d9e3 6c78 783e  ..*.J..l....lxx>
00000010: f179 48e6 4756 70                        .yH.GVp

Z jakiegokolwiek powodu wyzwanie to jest znacznie trudniejsze w V niż w ostatnim. Od naszego ogólnego podejścia n razy, utwórz „x” nie zadziała tutaj, zamiast tego skonstruujemy górę X, skopiujemy ją i odwrócimy, a następnie połączymy dwie części razem.

Wyjaśnienie:

Àé*ÄJÀäl                " Insert ('*' * n) + (' ' * n) + ('*' * n) 
                        " The obvious way would be 'Àé*ÀÁ ÀÁ*', but this 
                        " non-obvious way saves us a byte
        Àñ      ñ       " 'n' times:
          Ù             "   Duplicate this line (below us)
           ãl           "   Move to the center of this line
             xx         "   Delete two characters
               >        "   And indent this line with one space.

Wykonanie wcięcia na końcu pętli pozwala nam skorzystać z niejawnych zakończeń . To również wygodnie tworzy linie n + 1 , czyli dokładnie górną połowę „X”. Powiedzmy, że dane wejściowe to 4. Wtedy bufor wygląda następująco:

****    ****
 ****  ****
  ********
   ******
    ****

I jesteśmy na ostatniej linii. Więc my:

                yH      " Copy the whole buffer and move to the first line
                  æG    " Reverse every line
                    Vp  " And paste what we just copied *over* the current
                        " line, deleting it in the process
DJMcMayhem
źródło
Zrobiłem to też ãxxna początku, ale myślę, że psuje się np. Dla n = 8?
nmjcman101
@ nmjcman101 Ah, masz rację. Jest to w porządku, jeśli to zrobisz ãl, lub jeśli wciśniesz przed centrowaniem, ale tak naprawdę nie oszczędza to żadnych bajtów. Nie rozumiem jednak, dlaczego to działa dla mniejszych liczb.
DJMcMayhem
3

C #, 139 130 115 bajtów

-1 bajt poprzez utworzenie łańcucha i wywołanie WriteLine, zapisując w ten sposób czek dla nowej linii.
-6 bajtów dzięki Kevinowi i jego mistrzowskim technikom gry w golfa!
-2 bajtów zastępując n*3-nw n*2.
-15 bajtów po tym, jak Kevin uprzejmie wskazał mi właściwy kierunek: mogę po prostu zwrócić ciąg zamiast go wydrukować, zapisując w ten sposób wywołanie System.Console.WriteLine(). I kilka innych wskazówek również ...

n=>{var s="";for(int i,j=0;j<=n*2;j++,s+='\n')for(i=0;i<n*3;)s+=i>=j&i<j+n|i<=n*3-j-1&i++>=n*2-j?'*':' ';return s;}

Wypróbuj online!

Nie golfowany:

class Program
{
    static void Main(string[] args)
    {
        System.Func<int, string> g = n =>
        {
            var s = "";
            for (int i, j = 0; j <= n*2; j++, s += '\n')
                for (i = 0; i < n*3;)
                    s += i >= j & i < j+n | i <= n*3-j-1 & i++ >= n*2-j ? '*' : ' ';
            return s;
        };

        System.Console.Write(f(1));
        System.Console.Write(f(2));
        System.Console.Write(f(3));
        System.Console.Write(f(5));
        System.Console.Write(f(8));

        System.Console.ReadKey();
    }
}

Po prostu iteruje wzdłuż wierszy i kolumn przestrzeni potrzebnej do wydrukowania dużego X i drukuje albo a, '*'albo w ' 'zależności od warunków.

Charlie
źródło
1
+1! Kilka małych rzeczy do gry w golfa. Wszystko, co &&może być &i ||może być |w tym przypadku. for(int j=0;może być, for(int j=0,i;a następnie możesz usunąć int przód iwewnętrznej pętli. Ponadto, po pierwszej zmianie &i |, możesz również usunąć i++wnętrze pętli for i zmienić i==n*3-1?...na i++==n*3-1?....
Kevin Cruijssen
@KevinCruijssen dziękuję bardzo! Zmieniłem wewnętrzną pętlę i teraz tworzę ciąg znaków, aby móc wywoływać WriteLine, zapisałem tylko 1 bajt. Więc teraz nie jestem pewien, co zrobić z twoją ostatnią radą.
Charlie
1
Przy okazji, dlaczego System.Console.WriteLine? Zwracanie ciągu: n=>{string s="";for(int i,j=0;j<n*2+1;j++,s+="\n")for(i=0;i<n*3;)s+=i>=j&i<j+n|i<=n*3-j-1&i++>n*2-j-1?'*':' ';return s;}jest krótszy [ 120 bajtów ] (i pozbywa się nawiasów, umieszczając wszystko w pętli for. Oto link TIO, który pokazuje, że działa. Możesz też dodać to (lub własne) Link TIO do twojej odpowiedzi. :)
Kevin Cruijssen
1
@KevinCruijssen Nie wiedziałem, że TIO może obsługiwać kod C #! Dodałem WriteLinekod, ponieważ OP poprosił o wyprowadzenie dużego X, a nie tylko o jego zwrócenie , więc czułem, że wyjście X (przez wywołanie WriteLinemetody) powinno być częścią kodu. Niemniej jednak nadal nie jestem przyzwyczajony do zasad gry w golfa i nie wiem, jakie licencje mogę uzyskać, pisząc kod. Właśnie widziałem, że niektóre inne odpowiedzi tutaj drukują X w kodzie, a inne drukują go w stopce. Jakie jest prawidłowe podejście w tym przypadku?
Charlie
1
Zwykle zwracanie łańcucha, a także używanie funkcji zamiast programu jest domyślnie dozwolone, chyba że zaznaczono inaczej. Ponadto w pytaniu jest napisane: „Dane wyjściowe mogą być wydrukowane lub ciąg znaków lub tablica ciągów znaków ”, więc zwracanie ciągu znaków jest dozwolone. :) Aha i ostatnia rzecz, na którą możesz grać w golfa: j<n*2+1może być j<=n*2. Stworzyłem również port Java 8 twojej odpowiedzi z tą samą liczbą bajtów, oczywiście podając twoją niesamowitą odpowiedź.
Kevin Cruijssen
3

Haskell , 88 87 86 bajtów

-1 dzięki @Laikoni

(!)=replicate
x n=[zipWith max(reverse m)m|m<-[i!' '++n!'*'++(n*2-i)!' '|i<-[0..n*2]]]

Wypróbuj online!

bartavelle
źródło
1
zipWith max m(reverse m)można skrócić do zipWith max(reverse m)m. Jest to to samo, co zipWith max=<<reverse$m, a następnie mmożna wstawić: Wypróbuj online!
Laikoni
2

MATLAB, 153 126 bajtów (17,6% ↓)

Dzięki @ komentarzu LuisMendo użytkownika, funkcja disp()może wyjście znaków bez apostrofami, więc mogę zapobiec korzystania fprintfz formatsi pominąć kilka bajtów. Poza tym jego komentarz przypomina mi, że muszę użyć char(32)spacji zamiast char(0)(null).

n=input('')
r=2*n+1
c=3*n
a=0
for i=0:n-1
a=a+[zeros(r,i),diag(1:r),zeros(r,c-r-i)];
end
a((a+flipud(a))>0)=10
disp([a+32 ''])

Wypróbuj online!

MATLAB, 153 bajty

n=input('')
r=2*n+1
c=3*n
a=0
for i=0:n-1 
a=a+[zeros(r,i),diag(1:r),zeros(r,c-r-i)];
end
a((a+flipud(a))>0)=42
fprintf([repmat('%c',1,c),'\n'],char(a)')

Przykład wyniku: n = 10

**********          **********
 **********        ********** 
  **********      **********  
   **********    **********   
    **********  **********    
     ********************     
      ******************      
       ****************       
        **************        
         ************         
          **********          
         ************         
        **************        
       ****************       
      ******************      
     ********************     
    **********  **********    
   **********    **********   
  **********      **********  
 **********        ********** 
**********          **********
Guoyang Qin
źródło
2

Python 2 , 93 90 89 83 bajtów

-3 bajty dzięki Leaky Nun
-1 bajt dzięki Zachary T
-6 bajtów dzięki xnor

n=input()
x=n*'*'+n*'  '
exec"print`map(max,x,x[::-1])`[2::5];x=' '+x[:-1];"*(n-~n)

[Wypróbuj online!] [TIO-j3xwsktf]

Zaczyna się od ciągu, takiego jak '*** 'for n=3, ubiegając się map/maxo wybranie *spacji dla każdej pozycji, następnie dodaj spację i usuń ostatni znak z ciągu i zrób to wszystko jeszcze raz.

Pręt
źródło
90 bajtów
Leaky Nun
Nie można zastąpić n*2*' 'z n*' '?
Zacharý
map(maxMożna dokonać bezpośrednio bez zip. Również n*2+1jest n-~n.
xnor
1

Haskell , 70 bajtów

f n=[[last$' ':['*'|y<-[1..n],(c-n-y)^2==r^2]|c<-[1..3*n]]|r<-[-n..n]]

Wypróbuj online!

Wyświetla listę ciągów znaków.

Dla każdej pozycji wiersza r, kolumny cużywa wzoru, aby ustalić, czy mieści się w jednym z dwóch ukośnych pasm i tak też jest *.

xnor
źródło
1

Java 8, 119 118 bajtów

n->{String r="";for(int i=0,j;i<=n*2;i++,r+="\n")for(j=0;j<n*3;r+=j>=i&j<i+n|j<=n*3-i-1&j++>=n*2-i?"*":" ");return r;}

Port z niesamowitej odpowiedzi C # @CarlosAlejo , po tym, jak pomogłem mu w grze w kilka rzeczy. Pamiętaj więc, aby go również głosować!

Wypróbuj tutaj.

Kevin Cruijssen
źródło
1

JavaScript (ES2017), 155 157 bajtów

n=>[...e=[...Array(n+1)].map((a,i)=>[...d=((b=''.padEnd(n))[c='slice'](i)+'*'.repeat(n)+b[c](0,i))[c](n/2)].reverse().join``+d[c](n%1)),...e.reverse()[c](1)]

Zwraca tablicę ciągów. Wykonuję operacje na tablicach, a następnie odbijam je. Prawdopodobnie można to zoptymalizować za pomocą macierzy takich jak inne odpowiedzi, ale chciałem być wyjątkowy.

Edycja: Jak wskazał Neil, dla parzystych wartości nlinia środkowa nie była nszeroka, więc dodałem moduł wykrywający parzyste / nieparzyste podczas przecinania kolumny.

n=5
['*****     *****',
 ' *****   ***** ',
 '  ***** *****  ',
 '   *********   ',
 '    *******    ',
 '     *****     ',
 '    *******    ',
 '   *********   ',
 '  ***** *****  ',
 ' *****   ***** ',
 '*****     *****']

Nie golfił

n => {
  e = [...Array(n+1)].map((a, i) => {   // Create and iterate over array with n+1 elements
    b = ''.padEnd(n)                    // String of n spaces
    d = (b.slice(i) + '*'.repeat(n) + b.slice(0, i)).slice(n/2) // Create row string
    return [...d].reverse().join`` + d.slice(1) // Mirror and combine row horizontally
  })
  return [...e,...e.reverse().slice(1)] // Mirror and combine vertically
}

Kwadrant

n=5
   *****
  ***** 
 *****  
*****   
****    
***     

Odbicie lustrzane w poziomie

n=5
*****     *****
 *****   ***** 
  ***** *****  
   *********   
    *******    
     *****     

Lustrzane odbicie w pionie

n=5
*****     *****
 *****   ***** 
  ***** *****  
   *********   
    *******    
     *****     
    *******    
   *********   
  ***** *****  
 *****   ***** 
*****     *****
andrewarchi
źródło
Daje to niepoprawne wyjście parzyste n- linia środkowa nie jest nszeroka.
Neil
0

Mathematica, 148 bajtów

T=Table;(a=Join[T[T["*",i],{i,(n=#)+2,2n,2}],T[Join[t=T["*",n],T[" ",y],t],{y,1,n,2}]];Column[Row/@Join[Reverse@a,{T["*",n]},a],Alignment->Center])&
J42161217
źródło
0

R, 102 bajty

Kod:

n=scan();x=matrix(" ",M<-3*n,N<-2*n+1);for(i in 1:N)x[c(i-1+1:n,M+2-i-1:n),i]="*";cat(x,sep="",fill=M)

Test:

> n=scan();x=matrix(" ",M<-3*n,N<-2*n+1);for(i in 1:N)x[c(i-1+1:n,M+2-i-1:n),i]="*";cat(x,sep="",fill=M)
1: 10
2: 
Read 1 item
**********          **********
 **********        ********** 
  **********      **********  
   **********    **********   
    **********  **********    
     ********************     
      ******************      
       ****************       
        **************        
         ************         
          **********          
         ************         
        **************        
       ****************       
      ******************      
     ********************     
    **********  **********    
   **********    **********   
  **********      **********  
 **********        ********** 
**********          **********
djhurio
źródło
0

CJam, 24 bajty

{:T2*){S*T'**+}%_W%..e>}

Jest to blok, który pobiera liczbę ze stosu i wysyła listę stosów do stosu.

Wyjaśnienie:

{                        e# Stack:           | 2
 :T                      e# Store in T:      | 2, T=2
   2*                    e# Multiply by 2:   | 4
     )                   e# Increment:       | 5
      {                  e# Map over range:  | [0
       S                 e#   Push space:    | [0 " "
        *                e#   Repeat string: | [""
         T               e#   Push T:        | ["" 2
          '*             e#   Push char '*': | ["" 2 '*
            *            e#   Repeat char:   | ["" "**"
             +           e#   Concatenate:   | ["**"
              }%         e# End:             | ["**" " **" "  **" "   **" "    **"]
                _        e# Duplicate:       | ["**" " **" "  **" "   **" "    **"] ["**" " **" "  **" "   **" "    **"]
                 W%      e# Reverse:         | ["**" " **" "  **" "   **" "    **"] ["    **" "   **" "  **" " **" "**"]
                   ..e>  e# Overlay:         | ["**  **" " ****" "  **" " ****" "**  **"]
                       } e# End
Esolanging Fruit
źródło
0

Python 2 , 110 bajtów

x=a=0
n=c=input()
while x<2*n+1:
    print ' '*a+'*'*n+' '*c+'*'*(2*n-2*a-c)
    x+=1
    a=n-abs(n-x)
    c=max(0, n-2*a)

Ten program dzieli każdą linię na 4 części, pierwsze spacje, pierwsze gwiazdy, drugie spacje, a następnie drugie gwiazdy. Dla każdej poziomej linii X oblicza, ile gwiazdek lub odstępów jest potrzebnych dla każdej z 4 sekcji linii, a następnie konstruuje i drukuje ten ciąg.

Jakub
źródło
0

Siatkówka , 144 bajty

.+
 $&$* $&$* $&
 
$`#$'¶
¶\d+$

( *)#( *)(\d+)
$1$3$**$2#$3$* #$2$3$**$1
( +)(\*+)( *)(# +#)\3\2\3 +
$3$2$1$4$1$2$3
+` (# +#)
$1 
+` #...
#
##

Wypróbuj online! Wyjaśnienie:

.+
 $&$* $&$* $&

Dodaj 2n + 1 spacji przed wartością wejściową (po jednej dla każdej linii wyjściowej).

$`#$'¶

Zamień każde miejsce na a #i zbierz wyniki. Daje to ukośną linię #s, po obu stronach wypełnioną spacją, z przyrostkiem wartości wejściowej.

¶\d+$

Usuń oryginalną wartość wejściową, ponieważ teraz mamy kopię w każdym wierszu.

( *)#( *)(\d+)
$1$3$**$2#$3$* #$2$3$**$1

Zbuduj dwie ukośne linie ns *, z kolumną separatora nspacji owiniętą parą #s.

( +)(\*+)( *)(# +#)\3\2\3 +
$3$2$1$4$1$2$3

Na liniach, gdzie *s są bliżej środka, zamień dwie połówki wokół. Daje to wygląd przypominający > | | <.

+` (# +#)
$1 

Przesuń | |s tak daleko w lewo, jak to możliwe, dając rodzaj >> > <wyglądu.

+` #...
#

Dla każdej spacji między #s usuń trzy następujące znaki. To łączy się > <w X.

##

Usuń niepotrzebne teraz #s.

Neil
źródło