Narysuj duży ukośnik X

21

Biorąc pod uwagę nieujemną liczbę całkowitą, wydrukuj Xtak dużą wartość. Xjest wyjściem dla danych wejściowych 0, a dodasz ukośniki równe wejściowi w każdym kierunku, aby rozszerzyć Xdla większych danych wejściowych.

Przypadki testowe

0

X

1

\ /
 X
/ \

2)

\   /
 \ /
  X
 / \
/   \

...

10

\                   /
 \                 /
  \               /
   \             /
    \           /
     \         /
      \       /
       \     /
        \   /
         \ /
          X
         / \
        /   \
       /     \
      /       \
     /         \
    /           \
   /             \
  /               \
 /                 \
/                   \

Zasady

Możesz albo wydrukować wynik, albo zwrócić ciąg lub listę ciągów z funkcji. Końcowy znak nowej linii, a także dodatkowe białe znaki wewnętrzne, które nie wpływają na wygląd, są dozwolone.

To jest , więc wygrywa najkrótsza odpowiedź w bajtach!

Stephen
źródło
6
... Będę tylko czekał na rozwiązanie 1-bajtowe z węglem drzewnym.
Leaky Nun
@LeakyNun Byłbym zaskoczony, gdyby węgiel drzewny mógł łatwo poradzić sobie Xw środku (część tego, dlaczego go dodałem), ale kto wie: D
Stephen

Odpowiedzi:

6

Płótno , 3 bajty

╵\┼

Wypróbuj tutaj!

połowa wielkości odpowiedzi na węgiel drzewny: D

╵    increment the input
 \   create a diagonal that long
  ┼  and quad-palindromize, mirroring what's required, with 1 overlap;
     This overlaps the `/` and `\`, resulting in `X`
dzaima
źródło
Cholera, to jest krótkie.
dylnan
: ||||||| +1 za golfa
tylko ASCII
zastanawiam się też, czy języki oparte na stosie w zasadzie zawsze przewyższają inne języki?
Tylko ASCII
@ Galaretka zawierająca tylko ASCII
Okx
@Okx * oparty na stosie / tacit
tylko ASCII
22

Węgiel , 6 bajtów

PX⁺¹NX

Twoje bzdury mnie nie powstrzymują;)

Wypróbuj online!

Okx
źródło
2
TIO wygląda ... interesująco, gdy włożysz do niego naprawdę dużą liczbę
Stephen
@StephenS Tylko z powodu zawijania.
Okx
Wiem, po prostu intuicyjne jest to, że wszystkie zawinięte `` są wyrównane w lewo (ponieważ spacje nie są zawijane)
Stephen
5 znaków (wyzwanie po datach) tylko po to, aby zbliżyć się do Canvas
tylko ASCII
16

JavaScript (ES6), 79 bajtów

Używa funkcji rekurencyjnej g, która przechodzi przez siatkę i buduje znak wyjściowy po znaku.

n=>(g=x=>`/\\ X
`[~x?x-y?x+y-w&&2:x-n?1:3:4]+(~y?g(~x--?x:y--&&w):''))(y=w=n*2)

W jaki sposób?

Obie zmienne x i y iteracyjne od 2N do -1 , gdzie n jest wprowadzanie danych.

Dla każdej pozycji (x, y) w siatce wybieramy jeden z następujących znaków:

  • 0: /
  • 1: \
  • 2: spacja
  • 3: X
  • 4: nowa linia

za pomocą następujących testów:

  • ~x: Falsy, jeśli x == -1 : osiągnęliśmy koniec linii.
  • x-y: Falsy, jeśli x == y : znajdujemy się na przekątnej.
  • x+y-w: Falsy, jeśli x + y == w : znajdujemy się na przekątnej.
  • x-n: Falsy, jeśli x == n : ponieważ ten test jest wykonywany tylko, gdy x == y , oznacza to, że znajdujemy się dokładnie w środku siatki.

oraz następujące drzewo decyzyjne:

drzewo decyzyjne

Próbny

Arnauld
źródło
4
To jest ... JavaScript? Co ci się stało, stary przyjacielu.
roberrrt-s
13

MATL , 16 bajtów

'\/X 'iEQXytEP+)

Wypróbuj online!

Rozważ dane wejściowe 2jako przykład. Stos pokazano tutaj do góry nogami, tzn. Elementy dolne to te, które ostatnio zostały wypchnięte.

'\/X '  % Push this string
        %   STACK: '\/X '
iEQ     % Input a number, n. Multiply by 2, add 1: gives 2*n+1
        %   STACK: '\/X '
                   5
Xy      % Identity matrix of that size
        %   STACK: '\/X '
                   [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]
tEP     % Duplicate, multiply each entry by 2, flip vertically
        %   STACK: '\/X '
                   [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]
                   [0 0 0 0 2;
                    0 0 0 2 0;
                    0 0 2 0 0;
                    0 2 0 0 0;
                    2 0 0 0 0]
+       % Add the two matrices
        %   STACK: '\/X '
                   [1 0 0 0 2;
                    0 1 0 2 0;
                    0 0 3 0 0;
                    0 2 0 1 0;
                    2 0 0 0 1]
)       % Index into the string. Indexing is 1-based and modular, so 1 picks
        % the first character ('\'), ..., 0 picks the last (space)
        %   STACK: ['\   /';
                    ' \ / ';
                    '  X  ';
                    ' / \ ';
                    '/   \']
        % Implicit display
Luis Mendo
źródło
Chciałem zrobić coś podobnego w Octave, ale pobiłeś mnie do tego, a w MATL jest nawet krótszy niż Octave, więc świetna robota!
Michthan,
@Michthan Thanks! Na pewno warto opublikować wersję Octave. Moja próba ma 38 bajtów, co jest twoje?
Luis Mendo,
Myślałem o tym przez cały weekend i nie mogłem znaleźć bardziej wydajnego sposobu niż ten, którego tu używasz. Więc wszystkie kredyty powinny zostać przekazane na wersję oktawową.
Michthan
6

C, 108 106 bajtów

a;g(n){for(int b=2*n,i=1,c=47;a+=i;b?puts(""):(i=-i,c=92),b-=2*i)printf("%*c%*c",a,b?c+45*i:88,b,b?c:10);}

Wypróbuj online!

(-2 golfa dzięki MD XF)

Drukuje dwa znaki (początkowo c = 47ukośnik i c + 45odwrotny ukośnik; potem zamieniane) z dynamiczną szerokością pola.

Szerokość pola zaczyna się na 1i 2n, a przy każdej iteracji pierwsza szerokość jest zwiększana o 1, a druga jest zmniejszana o 2.

Gdy szerokość drugiego pola wynosi 0, to 'X'zamiast zwykłych znaków wypisywany jest znak nowej linii i odwraca kierunek przyrostów ( i). Nowa linia jest drukowana osobno dla wszystkich pozostałych linii ( puts("")).

anatolyg
źródło
106 bajtów: a,b,i=1,c;g(n){for(b=2*n,c=47;a+=i;b?puts(""):(i=-i,c=92),b-=2*i)printf("%*c%*c",a,b?c+45*i:88,b,b?c:10);} wypróbuj online!
MD XF
Dzięki za pomysł! Użyłem tylko jego części, aby upewnić się, że kod można wywołać dwukrotnie.
anatolyg
5

shortC , 111 bajtów

s(x){Wx--)R" ")}j;f(x){O;j<x;j++)s(j),P92),s((x-j)*2-1),R"/\n");s(x);R"X\n");Wj--)s(j),P47),s((x-j)*2-1),R"\\\n

Na podstawie mojego C odpowiedź . Konwersje:

  • R -> printf(
  • P -> putchar(
  • W -> while(
  • O -> for(
  • Automatyczne wstawianie zamknięcia ");}

To również używa kodów ASCII dla \i /.

Wypróbuj online!

MD XF
źródło
5

C, 168 155 150 bajtów

-5 dzięki Computronium

#define p printf(
s(x){while(x--)p" ");}j;f(x){for(;j<x;j++)s(j),p"\\"),s((x-j)*2-1),p"/\n");s(x);p"X\n");while(j--)s(j),p"/"),s((x-j)*2-1),p"\\\n");}

Z pewnością można grać w golfa; Robię to Wypróbuj online!

Nie golfowany:

int space(int x)
{
    while (x--)
        putchar(' ');
}

int f(int x)
{
    for (int j = 0; j < x; j++) {
        space(j);
        printf("\\");
        space((x-j)*2-1);
        printf("/\n");
    }

    space(x);
    puts("X");

    while (j--) {
        space(j);
        putchar('/');
        space((x-j)*2-1);
        printf("\\\n");
    }
}
MD XF
źródło
2
Możesz stracić 5 znaków, definiując p jako „printf (” zamiast „printf”.
Computronium
3

V , 21 bajtów

éXÀñ>HÄÒ r\Á/YGpr/$r\

Wypróbuj online!

Hexdump:

00000000: e958 c0f1 3e48 c4d2 2072 5cc1 2f59 4770  .X..>H.. r\./YGp
00000010: 722f 2472 5c                             r/$r\

Wyjaśnienie:

éX                      " Insert an 'X'
  Àñ                    " Arg1 times:
    >H                  "   Add a space to every line.
                        "   Conveniently, this also puts us on the first line
      Ä                 "   Duplicate this line
       Ò                "   And replace the whole line with spaces
         r\             "   Replace the first char with '\'
           Á/           "   Append a '/' char
             Y          "   Yank this line
              G         "   Move to the last line
               p        "   And paste the line we yanked
                r/      "   Replace the first character with a '/'
                  $     "   Move to the end of the line
                   r\   "   And replace the last character with a '\'

Zasadniczo mamy Wstaw X, n razy przedłużamy ukośniki .

Ale to nie jest takie proste, ponieważ musimy również dodać ukośniki za pierwszym razem. Jeśli ukośniki już tam były, moglibyśmy napisać rozciągać ukośniki jako:

>HÄX2pGÙX2p

Co zaoszczędziłoby nam 6 bajtów.

DJMcMayhem
źródło
3

C #, 157 122 120 bajtów

_=d=>"".PadLeft(d)
a=>{var s=_(a)+"X\n";for(int i=0;++i<=a;)s=$@"{_(a-i)}\{_(i*2-1)}/
{s+_(a-i)}/{_(i*2-1)}\
";return s;}

Wersja bez golfa:

 Func<int, string> _ = (d) =>"".PadLeft(d);
        Func<int, string> func = a => {

            var s = _(a) + "X\n";

            for (int i = 0; ++i <= a;) {

                s = $@"{_(a - i)}\{_(i * 2 - 1)}/
{s + _(a - i)}/{_(i * 2 - 1)}\
";

            }
            return s;
        };
LiefdeWen
źródło
1
Możesz przenieść inną anonimową funkcję z pierwszej, a następnie dołączyć ją jako _=d=>new string(' ',d);(nie ma potrzeby używania nawiasów klamrowych d). Możesz usunąć nawiasy klamrowe wokół pętli for. Skorzystaj z pełnego ciągu, aby nie trzeba było uciekać przed wszystkimi odwrotnymi ukośnikami. Jeśli ustawisz, i=0możesz to zrobić ++i<a+1i usunąć i++.
TheLethalCoder,
Również w przypadku ciągów dosłownych nie trzeba \npodawać rzeczywistej linii, ale nie jestem pewien, czy będziesz w stanie usunąć nawiasy klamrowe wokół pętli for, musisz spróbować.
TheLethalCoder,
1
Po nałożeniu pierwszej sugestię przez TheLethalCoder , można również wymienić ++i<a+1na ++i<=a EDIT można również oszczędzania 4 więcej bajtów zmieniając Funcod new string(' ',d)do"".PadLeft(d)
auhmaan
Dzięki za sugestie, @TheLethalCoder czy wolno mi zadeklarować 2 funkcje w ten sposób, czy nie skróciłoby to dużo C # golfa, gdybyśmy mogli to zrobić?
LiefdeWen
1
@StefanDelport Jest gdzieś na ten temat meta dyskusja, ale w tej chwili uważam, że możesz tak długo, jak długo wyświetlasz nazwę funkcji. W tym przypadku _.
TheLethalCoder
3

Mathematica, 71 bajtów

(Częściowo zainspirowany 104-bajtowym rozwiązaniem Jenny_mathy)

""<>#&/@(#"\\"+Reverse@#"/"&@IdentityMatrix[2#+1]/.{0->" ",a_+_->"X"})&

Zwraca listę ciągów.

Objaśnienie: IdentityMatrix[2#+1]tworzy macierz o odpowiednim rozmiarze z 1s wzdłuż przekątnej i 0s w innym miejscu. Następnie mnożymy go przez "\\"(uciekający ukośnik odwrotny), co czyni go macierzą z ukośnikami odwrotnymi wzdłuż przekątnej i 0 w innych miejscach, ponieważ oczywiście 1 razy odwrotny ukośnik jest odwrotnym ukośnikiem, a 0 razy odwrotny ukośnik to 0. Dodajemy to do "/"razy odwrotność, aby zrobić kształt X. Prawie skończyliśmy, ale wszędzie są jeszcze zero, a środek jest "\\" + "/". Naprawiamy te dwie rzeczy, zastępując " "za 0i "X"za a_+_, co pasuje do dowolnej sumy dwóch rzeczy (tak jak _+_powinno, ale Mathematica jest zbyt sprytna dla własnego dobra i interpretuje to jako 2 razy _). Na koniec ""<>#&/@zamienia to w listę ciągów.

Nie drzewo
źródło
3

Java (OpenJDK 8) , 135 bajtów

i->{int k=0,j,l=2*i+1;String[]s=new String[l];for(;k<l;k++)for(s[k]="",j=0;j<l;j++)s[k]+=j==k?j==i?"X":"\\":j==l-1-k?"/":" ";return s;}

Wyrażenie lambda, które przyjmuje liczbę całkowitą i zwraca tablicę ciągów

Wypróbuj online!

Nie golfowany:

i->{
    int k=0,j,l=2*i+1;                // Some variables to be used
    String[]s=new String[l];            // Return array (size 2*i+1)
    for(;k<l;k++)                       // For each array entry
        for(s[k]="",j=0;j<l;j++)        // Set each character to 
            s[k]+=j==k?j==i?"X":"\\"    // \ or X if it's the jth character of the jth row
                 :j==l-1-k?"/"          // / if it's the opposite char
                 :" ";                  // else blank
    return s;
}
PunPun1000
źródło
3

T-SQL, 201 bajtów

DECLARE @ INT SELECT @=a FROM t DECLARE @i INT=@
WHILE @>0BEGIN PRINT SPACE(@i-@)+'\'+SPACE(2*@-1)+'/'SET @-=1 END
PRINT SPACE(@i)+'X'WHILE @<@i BEGIN SET @+=1 PRINT SPACE(@i-@)+'/'+SPACE(2*@-1)+'\'END

Sformatowany:

DECLARE @ INT 
SELECT @=a FROM t 
DECLARE @i INT=@
WHILE @>0
    BEGIN
        PRINT SPACE(@i-@)+'\'+SPACE(2*@-1)+'/'
        SET @-=1 
    END
PRINT SPACE(@i)+'X'
WHILE @<@i 
    BEGIN 
        SET @+=1 
        PRINT SPACE(@i-@)+'/'+SPACE(2*@-1)+'\'
    END

Dane wejściowe są w kolumnie a w nazwanej tabeli t , zgodnie z naszymi wytycznymi .

BradC
źródło
3

Rubin , 66 bajtów

Funkcja rekurencyjna.

f=->x{?X[x]||"\\#{s=' '*(2*x-1)}/
#{f[x-1].gsub /^/,' '}
/#{s}\\"}

Wypróbuj online!

Wyjaśnienie

f=->x{                  # Start of recursive function named `f`
      ?X[x]||           # Return 'X' if x==0, otherwise the following:
"\\#{s=' '*(2x-1)}/     #  Top edge of the cross. Save no. of spaces needed
#{f[x-1]                #  Get result of f[x-1]
        .gsub /^/,' '}  #  Regex sub to left-pad every line w/ a space
/#{s}\\"                #  Bottom edge of cross (insert saved no. of spaces)
Wartość tuszu
źródło
3

Galaretka , 24 17 bajtów

Ḥ‘=þ`µḤ+Uị“/\x ”Y

Wypróbuj online!

Jak to działa

Ḥ‘=þ`µḤ+Uị“/\x ”Y   main link, input a
Ḥ‘                  input doubled and incremented
   þ                Make a table: Apply  
  =                 "equals"/ to      
    `               each element in range(2a+1) cartesian multiplied with itself.
                      eg. For input 1: [1=1,1=2,1=3],[2=1,2=2,2=3],[3=1,3=2,3=3]      
     µ              on this array:
       +            add: 
      Ḥ             double of it to
        U           its reverse (changes south-east to north-west)
         ị“/\x ”    index into the string "/\x " to get the right characters
                Y   join by newlines for the final output.

-6 bajtów dzięki @LeakyNun i -1 bajtów z dodatkową poprawą

fireflame241
źródło
18 bajtów
Leaky Nun
2

Partia, 201 bajtów

@echo off
set s= /
for /l %%i in (2,1,%1)do call set s=  %%s%%
set s=\%s%
for /l %%i in (-%1,1,%1)do call:c
exit/b
:c
echo %s%
set s=%s:\ = \%
set s=%s:X =/\%
set s=%s:\/=X %
set s=%s: /=/ %

Zaczyna się od zbudowania górnej linii, a następnie po wydrukowaniu każdej linii przesuwa \prawą spację i /lewą spację raz, upewniając się, że tworzą Xśrodek.

Neil
źródło
2

PHP , 115 bajtów

for(;$i<$c=1+2*$argn;$b?:$t[$i-1]="\\".!$t[$c-$i]="/",$o.="$t\n")$t=str_pad(" X"[$b=$argn==+$i++],$c," ",2);echo$o;

Wypróbuj online!

Jörg Hülsermann
źródło
2

Siatkówka , 74 bajty

.+
$* X
+`^ ( *).( *)
$1\  $2/¶$&
+`¶ ( *).( *).?$
$&¶$1/  $2\
m` (\W)$
$1

Wypróbuj online! Wyjaśnienie:

.+
$* X

Umieść X.

+`^ ( *).( *)
$1\  $2/¶$&

Zaczynając od X, pracując w górę, za \każdym razem umieść po przekątnej w lewo. /Po /ostatnim czasie umieść jeszcze dwa spacje .

+`¶ ( *).( *).?$
$&¶$1/  $2\

Zaczynając od X, pracując w dół, za /każdym razem umieść po przekątnej w lewo. \Po /ostatnim czasie umieść jeszcze dwa spacje .

m` (\W)$
$1

Liczba spacji między dwiema przekątnymi musi być nieparzysta, więc ostatnia spacja w każdej linii (z wyjątkiem oryginalnej Xlinii) jest usuwana.

Neil
źródło
2

Mathematica, 131 bajtów

(F[x_,y_]:=Table[x<>StringJoin@Table[" ",i]<>y,{i,1,#*2,2}];Column[Join[Reverse@F["\\","/"],{"X"},F["/","\\"]],Alignment->Center])&


Mathematica, 104 bajty

oto inne podejście z wykorzystaniem siatki

(S=DiagonalMatrix[Table["\\",r=2#+1]];Table[S[[r+1-i,0+i]]="/",{i,r}];S[[#+1,#+1]]="X";Grid@S/. 0->" ")&
J42161217
źródło
2

APL (Dyalog) , 25 bajtów

Wymaga ⎕IO←0ustawienia domyślnego w wielu systemach.

' \/X'[(⊢+2×⌽)∘.=⍨⍳1+2×⎕]

Wypróbuj online!

' \/'[] Indeksuj ciąg za pomocą

 uzyskać dane wejściowe

 pomnóż przez dwa

1+ Dodaj jeden

 niż wiele liczb całkowitych

∘.=⍨ tabela równości (tj. matryca tożsamości; przekątna NW-SE)

() Zastosuj do tego następującą milczącą funkcję

   argument

  + plus

   dwa razy

   argument lustrzany w poziomie (tj. przekątna NE-SW)

Adám
źródło
2

Bash , 138 bajtów

for i in `seq $1;seq $[$1-1] -1 1`
{ $[a++]
printf "%*c%*s\n" `echo ' '$i $[a>$1?1:2] $[($1-i)*2]' '$[a<$1?1:2]`
}|sed 's/22/X/'|tr 12 /\\

Wypróbuj online!

Naprawdę długi, bash ogrzewa „\ i /”

Mniej golfa

 for i in {1..10} {9..1};{
   $[a++];                      #argument as padding, prints 1 for \ and 2 for /
   printf "%*c%*s\n" `echo ' '$i $[a>$1?1:2] $[($1-i)*2]' '$[a<$1?1:2]`;
  }|sed 's/22/X/g' | tr 12 /\\
marcosm
źródło
2

Python 2 , 95 84 bajtów

-10 bajtów dzięki @FelipeNardiBatista

f=lambda s,i='\n':i+(s and'\\'+'  '*~-s+' /'+f(s-1,i+' ')+i+'/'+'  '*~-s+' \\'or'X')

Wypróbuj online!

ovs
źródło
1
85 bajtów: TIO
Felipe Nardi Batista,
@FelipeNardiBatista bardzo dziękuję
dniu
1

Perl 5, 110 + 1 = 111 bajtów

Używa -nflagi.

$x=$_;$,="\n";push@x,$"x($x-$_)."\\".$"x(2*--$_+1)."/"while$_>0;say@x,$"x$x."x";for(reverse@x){y!\\/!/\\!;say}
Chris
źródło
1

QBIC , 90 bajtów

~b=0|?@X`\[0,:-1|X=space$(a)┘Z=Z+X+@\`+space$((b-a)*2-1)+@/`+X+@┘`]Z=Z+space$(b)+A+_fZ

Jak działa ta potworność, pozostawia się czytelnikowi jako ćwiczenie ...

Przykładowe dane wyjściowe:

Command line: 3
\     /
 \   / 
  \ /  
   X
  / \  
 /   \ 
/     \
Steenbergh
źródło
1

Visual Basic.Net , 454 450 bajtów

Option Strict Off
module m
sub main(a As String())
dim v=Convert.toInt32(a(0))
for i as Integer=v to 1 step -1
for j as Object=1 to v-i
w(" ")
next
w("\")
for j as Object=1 to i*2-1
w(" ")
next
console.writeline("/")
next
console.writeline(new String(" ",v)&"X")
for i as Object=1 to v
for j as Object=1 to v-i
w(" ")
next
w("/")
for j as Object=1 to i*2-1
w(" ")
next
console.writeline("\")
next
end sub
sub w(s)
console.write(s)
end Sub
end module

nie jestem pewien, czy zrobienie func writelinepozwoli zaoszczędzić niektóre bajty dzięki Stephenowi S za wskazanie na as ...usunięcie również zmienił się integerna object ostatnią edycję zmienił pierwszy wstecz

polyglotrealIknow
źródło
Jesteś odważny :) Wierzę, że możesz usunąć wszystkie as Types, ponieważ jeśli tak Option Strict Off, VB.NET działa jak luźno napisany język.
Stephen
Obecnie na Linuksie mono jest nieprzyjemny
polyglotreal
mono nie dba o Option Strict, a przynajmniej tak myślę
polyglotrealIknow
Och, wydawało się, że functions ! = for loops Dzięki za golfa
polyglotrealIknow
Option StrictDomyślnie nie jest wyłączone? Jest przynajmniej w Visual Studio
Stephen
1

05AB1E , 22 bajty

F'\IN-úR.∞})Âí'Xs)˜.c»

Wypróbuj online!

Wyjaśnienie

F                        # for N in [0...input-1] do
 '\                      # push a backslash
   IN-ú                  # prepend input-N spaces
       R                 # reverse
        .∞               # mirror
          }              # end loop
           )             # wrap stack in a list
            Â            # bifurcate
             í           # reverse each item
              'Xs        # push an "X" between the 2 lists on the stack
                 )˜      # wrap in flattened list
                   .c    # pad lines to equal length
                     »   # join on newlines

Alternatywne rozwiązanie 22-bajtowe

F'\N·>ú'/ì})Âí'X¸«ì.c»
Emigna
źródło
1

Pyke, 14 bajtów

\XQV.X \   /\/

Wypróbuj tutaj!

\X             - "X"
  QV           - repeat input times:
    .X \   /\/ -  surround(^, all=" ", 
                              tl="\", 
                              left=" ",  
                              right=" ",  
                              lower=" ",  
                              tr="/",  
                              br="\",  
                              bl="/")
niebieski
źródło
1

tcl, 134

proc P {x s b} {time {puts [format %[incr ::i $x]s%[expr ($::n-$::i)*2+2]s $s $b]} $::n}
P 1 \\ /
puts [format %[incr i]s X]
P -1 / \\

próbny

Ustaw nw pierwszym wierszu.

Być może mogę bardziej zagrać w golfa, stosując podejście rekurencyjne

sergiol
źródło
1

R , 75 72 bajtów

y=diag(b<-2*scan()+1);write(c(" ",'\\','/','X')[y+2*y[,b:1]+1],'',b,,'')

Zainspirowany tą odpowiedzią , generuje ukrytą matrycę i zapisuje ją na standardowe wyjście; czyta rozmiar ze standardowego wejścia. Musi zbudować macierz znaków spacji i używa sep=''b / c, w przeciwnym razie ma problemy ze spacjami .

diag(b)                     # generates a main diagonal of 1, rest 0
2*diag(b)[,b:1]             # the other diagonal is 2
                            # [,b:1] reverses columns
                            # [b:1,] reverses the rows; they're equivalent
diag(b)+2*diag(b)[,b:1]     # sums, so we get 1 for main diagonal
                            # 2 for other diagonal, 3 for center
diag(b)+2*diag(b)[,b:1]+1   # add 1 since R is 1-indexed
                            # the result is indices for the vector
c(' ','\\','/','X')

Wypróbuj online!

Giuseppe
źródło