Gambar ASCII X besar


20

Masalah

Terinspirasi oleh tantangan sebelumnya melakukan hal serupa

Diberikan noutput input integer positif bentuk yang mengikuti pola ini:

masukan n=1:

* *
 *
* *

masukan n=2:

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

masukan n=3:

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

dan seterusnya...

Ini memiliki sifat-sifat ini:

n*2+1 garis tinggi

"lengan" nlebar kecuali ketika mereka bergabung

garis tengahnya nlebar

jika nbahkan garis-garis di atas dan di bawah pusatnya n*2lebar

jika naneh garis-garis di atas dan di bawah pusat n*2-1lebar

Aturan

  • Mengikuti baris baru diterima
  • Celah standar berlaku
  • Bytes terpendek menang
  • Output dapat dicetak atau string atau array string

Suntingan

  • n=0 tidak perlu ditangani
  • Ruang tambahan diperbolehkan

2
Apakah boleh jika output memiliki 1bukannya *dan 0bukannya ruang?
JungHwan Min

Bisakah pola kita diindeks 0?
Leaky Nun

@JungHwanMin Saya akan mengizinkannya tetapi kemudian Anda tidak diizinkan untuk menang, mungkin akan terombang-ambing jika Anda paling dibesarkan.
LiefdeWen

@LeakyNun 0 Diindeks baik
LiefdeWen

Jawaban:


9

Arang , 13 12 byte

Terima kasih kepada @ErikTheOutgolfer untuk satu byte

FN«PX⁺*×*Iθ→

Cobalah online!

Ini adalah jawaban pertama saya untuk Arang, dan saya cukup yakin ini bukan golf, tetapi saya pikir saya akan mulai dari suatu tempat.

 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 Saya tahu harus ada cara untuk melakukan itu! Terima kasih!
nmjcman101

Dan ya, itu tampak seperti golf.
Erik the Outgolfer

@EriktheOutgolfer Itu tidak sebelum Anda datang juga :)
nmjcman101

1
@thomasrutter Charcoal memiliki halaman kode khusus sendiri dengan 256 byte , di mana masing-masing karakter tersebut adalah 1 byte. Jadi itu tidak dikodekan dalam ASCII, di mana beberapa karakter ini memang akan menjadi beberapa byte. nmjcman101 +1 btw. Sedang mencoba jawaban Charcoal pertamaku kemarin, tetapi tidak benar-benar berhasil dalam beberapa menit sebelum pulang kerja. Jadi, Anda telah mengalahkan saya untuk itu. Saya memang belajar beberapa hal dari jawaban Anda, jadi terima kasih untuk itu.
Kevin Cruijssen

13

MATL , 16 byte

EQXyG:Y+tP+g42*c

Cobalah online!

Penjelasan

Pertimbangkan input 2sebagai contoh. Isi tumpukan ditunjukkan dengan yang lebih baru di bawah ini.

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

Anda lebih cepat dari saya ...
Leaky Nun

@LeakyNun Sangat jarang :-)
Luis Mendo

Saya berharap Jelly memiliki konvolusi 2D ... Saya harus menambahkan 0 di setiap baris dan kemudian menerapkan jumlah vektor ...
Leaky Nun


1
@LuisMendo Dalam hati saya, Anda adalah pemenang untuk menggunakan konvolusi, membawa kembali kenangan indah seperti itu.
LiefdeWen

9

Jelly , 15 byte

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

Cobalah online!


Sangat bagus. 8 byte lebih pendek dari saya.
Leaky Nun

@ LeakyNun Pendekatan langsung membantu sedikit.
Erik the Outgolfer

Pendekatan yang sangat bagus
Jonathan Allan

@ JonathanAllan Ya, terutama jika Anda belajar »vektorisasi ...
Erik the Outgolfer

1
Saya sangat suka nama pengguna Anda! Tapi saya berharap Anda menggunakan "vi" atau "vim" sebagai gantinya, sehingga Anda dapat memilih "Erik the vi King" ... (Penggemar Monty Python di sini ...)
Olivier Dulac

4

V , 18 17 byte

Menyimpan satu byte berkat trik input @ DJMcMayhem.

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

Cobalah online!

Penjelasan

Àé*ÄJÀäl

Ini menyisipkan [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

Setiap iterasi dari loop buffer berasal

|**   ***

Untuk

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

Di mana |kursor dengan *di bawahnya


Wow. Anda waaay mengungguli saya. Kerja bagus! Beberapa tips: Anda bisa melakukan Àé*ÄJÀälalih - alih Àá*Àá Àá*, dan Anda bisa melakukannya <M-c>, yaitu ã(mnemonic: center ) untuk pindah ke tengah garis, yang merupakan byte lebih pendek dari Àl. Cobalah online!
DJMcMayhem

@DJMcMayhem Saya mencoba untuk berbicara dengan Anda di banyak tempat yang berbeda. Saya akan mencuri saran pertama yang saya pikir, tetapi <M-c>jeda untuk angka yang lebih tinggi
nmjcman101

3

05AB1E , 18 byte

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

Cobalah online!

Penjelasan

Contoh untuk 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 byte

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

Cobalah online!

Hexdump:

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

Untuk alasan apa pun, tantangan ini jauh lebih sulit di V daripada yang terakhir. Karena pendekatan umum kita n kali, menumbuhkan 'x' tidak akan berfungsi di sini, sebagai gantinya kita akan membangun bagian atas X, menyalinnya dan membaliknya, lalu menempelkan kedua bagian bersama-sama.

Penjelasan:

Àé*Ä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.

Melakukan indentasi pada akhir loop, memungkinkan kita untuk mengambil keuntungan dari akhiran implisit . Ini juga dengan mudah membuat n + 1 baris, yang persis merupakan bagian atas dari 'X'. Katakanlah inputnya adalah 4. Kemudian pada titik ini, buffer terlihat seperti ini:

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

Dan kita berada di baris terakhir. Jadi kita:

                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

Saya melakukan ãxxhal itu pada awalnya juga, tetapi saya pikir itu rusak untuk misalnya n = 8?
nmjcman101

@ nmjcman101 Ah, Anda benar. Tidak apa-apa jika Anda melakukannya ãl, atau jika Anda membuat indentasi sebelum pemusatan, tetapi itu sebenarnya tidak menyimpan byte. Saya tidak mengerti mengapa ini bekerja untuk angka yang lebih kecil.
DJMcMayhem

3

C #, 139 130 115 byte

-1 byte dengan membuat string dan panggilan WriteLine, sehingga menghemat pemeriksaan untuk baris baru.
-6 byte terima kasih kepada Kevin dan teknik main golfnya!
-2 byte dengan mengganti n*3-ndengan n*2.
-15 byte setelah Kevin dengan ramah menunjuk saya ke arah yang benar: Saya hanya bisa mengembalikan string daripada mencetaknya, sehingga menghemat panggilan System.Console.WriteLine(). Dan beberapa tips lainnya juga ...

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

Cobalah online!

Tidak Terkumpul:

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

Itu hanya mengulang sepanjang baris dan kolom ruang yang diperlukan untuk mencetak X besar dan mencetak baik a '*'atau a ' 'tergantung pada kondisi.


1
+1! Beberapa hal kecil untuk golf. Semua &&bisa &dan ||bisa |dalam hal ini. for(int j=0;dapat for(int j=0,i;dan kemudian Anda dapat menghapus int di depan idalam lingkaran dalam. Juga, setelah perubahan pertama &dan |, Anda juga dapat menghapus bagian i++dalam for-loop, dan mengubah i==n*3-1?...kei++==n*3-1?... .
Kevin Cruijssen

@KevinCruijssen terima kasih banyak! Saya mengubah loop dalam dan sekarang saya membuat string sehingga saya bisa menelepon WriteLine, disimpan hanya 1 byte. Jadi sekarang saya tidak yakin apa yang harus dilakukan dengan saran terakhir Anda.
Charlie

1
Btw, mengapa System.Console.WriteLine? Mengembalikan string: 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;}lebih pendek [ 120 byte ] (dan juga menghilangkan tanda kurung dengan meletakkan segala sesuatu di dalam for-loop. Berikut ini adalah tautan-TIO untuk menunjukkannya berfungsi. Juga, jangan ragu untuk menambahkan ini (atau Anda sendiri) TIO-tautan ke jawaban Anda. :)
Kevin Cruijssen

1
@KevinCruijssen Saya tidak tahu bahwa TIO dapat menangani kode C #! Saya menambahkan WriteLinedalam kode karena OP meminta untuk mengeluarkan X besar, bukan hanya untuk mengembalikannya , jadi saya merasa bahwa keluaran X (dengan memanggil WriteLinemetode) harus menjadi bagian dari kode. Meskipun demikian, saya masih belum terbiasa dengan aturan kode-golf, dan saya tidak tahu lisensi apa yang dapat saya ambil saat menulis kode. Saya baru saja melihat bahwa beberapa jawaban lain di sini mencetak X dalam kode, dan beberapa lainnya mencetaknya di footer. Apa pendekatan yang valid dalam kasus ini?
Charlie

1
Biasanya mengembalikan string serta menggunakan fungsi sebagai ganti program diizinkan secara default, kecuali dinyatakan sebaliknya. Juga, dalam pertanyaan itu menyatakan " Output dapat dicetak atau string atau array string ", sehingga mengembalikan string diperbolehkan. :) Oh, dan satu hal lagi yang bisa dilakukan golf: j<n*2+1bisa j<=n*2. Saya juga telah membuat port Java 8 dari jawaban Anda dengan byte-count yang sama, mengkredit jawaban luar biasa Anda.
Kevin Cruijssen

3

Haskell , 88 87 86 byte

-1 terima kasih kepada @Laikoni

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

Cobalah online!


1
zipWith max m(reverse m)dapat disingkat menjadi zipWith max(reverse m)m. Ini sama dengan zipWith max=<<reverse$m, dan kemudian mdapat digarisbawahi: Coba online!
Laikoni


2

MATLAB, 153 126 byte (17,6% ↓)

Berkat komentar @ LuisMendo, fungsi disp()dapat menampilkan karakter tanpa tanda kutip tunggal, sehingga saya dapat mencegah penggunaan fprintfdengan formatsdan menghilangkan beberapa byte. Selain itu, komentarnya mengingatkan saya bahwa saya perlu menggunakan char(32)untuk memberikan ruang daripadachar(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 ''])

Cobalah online!

MATLAB, 153 byte

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

Contoh hasil: n = 10

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

2

Python 2 , 93 90 89 83 byte

-3 bytes berkat Leaky Nun
-1 byte terima kasih kepada Zachary T
-6 bytes berkat xnor

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

[Cobalah online!] [TIO-j3xwsktf]

Mulai dengan string seperti '*** 'untuk n=3, melamar map/maxuntuk mengambil *spasi untuk setiap posisi, lalu menambahkan spasi dan menghapus karakter terakhir dari string dan melakukan ini semua lagi.



Tidak bisakah Anda ganti n*2*' 'dengan n*' '?
Zacharý

The map(maxdapat dilakukan langsung tanpa zip. Juga, n*2+1adalah n-~n.
xnor

1

Haskell , 70 byte

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

Cobalah online!

Menghasilkan daftar string.

Untuk setiap posisi baris r, kolom c, menggunakan rumus untuk menentukan apakah itu termasuk dalam salah satu dari dua band diagonal dan begitu juga *.



1

Javascript (ES2017), 155 157 byte

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

Mengembalikan array string. Saya melakukan operasi pada array kemudian mirror itu. Ini mungkin dapat dioptimalkan dengan matriks seperti jawaban lain, tetapi saya ingin menjadi unik.

Sunting: Seperti yang ditunjukkan oleh Neil, untuk nilai genap n, garis tengah tidak nlebar, jadi saya menambahkan modulus untuk mendeteksi genap / ganjil saat mengiris kolom.

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

Tidak disatukan

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
}

Kuadran

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

Cermin Secara horizontal

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

Cermin Secara Vertikal

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

Ini menghasilkan output yang salah bahkan n- garis tengah tidak nlebar.
Neil

0

Mathematica, 148 byte

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 byte

Kode:

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)

Uji:

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

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

Ini adalah blok yang mengambil nomor dari tumpukan dan menampilkan daftar garis ke tumpukan.

Penjelasan:

{                        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 byte

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)

Program ini memecah setiap baris menjadi 4 bagian, spasi pertama, bintang pertama, spasi kedua dan kemudian bintang kedua. Untuk setiap garis horizontal X, ia menghitung berapa banyak bintang atau ruang yang dibutuhkan untuk masing-masing dari 4 bagian garis, kemudian membuat dan mencetak string itu.


0

Retina , 144 byte

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

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

Cobalah online! Penjelasan:

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

Tambahkan 2n + 1 spasi sebelum nilai input (satu untuk setiap jalur output).

$`#$'¶

Ganti setiap ruang dengan #dan kumpulkan hasilnya. Ini memberikan garis diagonal #s, ruang empuk di kedua sisi, dengan nilai input suffixed.

¶\d+$

Hapus nilai input asli, karena kami sekarang memiliki salinan di setiap baris.

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

Bangun dua garis diagonal ns *, dengan kolom pemisah nruang yang terbungkus sepasang #s.

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

Pada garis-garis di mana *s lebih dekat ke tengah, bertukar dua bagian di sekitar. Ini memberikan penampilan yang menyerupai > | | <.

+` (# +#)
$1 

Pindahkan | |s ke kiri sejauh mereka akan pergi, memberikan semacam >> > <penampilan.

+` #...
#

Untuk setiap spasi di antara #huruf s, hapus tiga karakter berikut. Ini bergabung > <menjadi X.

##

Hapus #s sekarang tidak perlu .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.