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

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


@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: ['**  **';
                  ' **** ';
                  '  **  ';
                  ' **** ';
                  '**  **']

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!


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


Ł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

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

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.


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



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

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

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.



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 *.



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

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

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

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

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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.