Masalah
Terinspirasi oleh tantangan sebelumnya melakukan hal serupa
Diberikan n
output 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" n
lebar kecuali ketika mereka bergabung
garis tengahnya n
lebar
jika n
bahkan garis-garis di atas dan di bawah pusatnya n*2
lebar
jika n
aneh garis-garis di atas dan di bawah pusat n*2-1
lebar
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
1
bukannya*
dan0
bukannya ruang?Jawaban:
Arang ,
1312 byteTerima kasih kepada @ErikTheOutgolfer untuk satu byte
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.
sumber
I
untuk -1.MATL , 16 byte
Cobalah online!
Penjelasan
Pertimbangkan input
2
sebagai contoh. Isi tumpukan ditunjukkan dengan yang lebih baru di bawah ini.sumber
Jelly , 15 byte
Cobalah online!
sumber
»
vektorisasi ...V ,
1817 byteMenyimpan satu byte berkat trik input @ DJMcMayhem.
Cobalah online!
Penjelasan
Ini menyisipkan
[n]*'*'+[n]*' '+[n]*'*'
Setiap iterasi dari loop buffer berasal
Untuk
Di mana
|
kursor dengan*
di bawahnyasumber
Àé*ÄJÀäl
alih - alihÀá*Àá Àá*
, dan Anda bisa melakukannya<M-c>
, yaituã
(mnemonic: center ) untuk pindah ke tengah garis, yang merupakan byte lebih pendek dariÀl
. Cobalah online!<M-c>
jeda untuk angka yang lebih tinggi05AB1E , 18 byte
Cobalah online!
Penjelasan
Contoh untuk
n=2
sumber
V , 23 byte
Cobalah online!
Hexdump:
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:
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:
sumber
ãxx
hal itu pada awalnya juga, tetapi saya pikir itu rusak untuk misalnya n = 8?ã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.C #,
139 130115 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-n
dengann*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 ...Cobalah online!
Tidak Terkumpul:
Itu hanya mengulang sepanjang baris dan kolom ruang yang diperlukan untuk mencetak X besar dan mencetak baik a
'*'
atau a' '
tergantung pada kondisi.sumber
&&
bisa&
dan||
bisa|
dalam hal ini.for(int j=0;
dapatfor(int j=0,i;
dan kemudian Anda dapat menghapusint
di depani
dalam lingkaran dalam. Juga, setelah perubahan pertama&
dan|
, Anda juga dapat menghapus bagiani++
dalam for-loop, dan mengubahi==n*3-1?...
kei++==n*3-1?...
.WriteLine
, disimpan hanya 1 byte. Jadi sekarang saya tidak yakin apa yang harus dilakukan dengan saran terakhir Anda.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. :)WriteLine
dalam kode karena OP meminta untuk mengeluarkan X besar, bukan hanya untuk mengembalikannya , jadi saya merasa bahwa keluaran X (dengan memanggilWriteLine
metode) 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?j<n*2+1
bisaj<=n*2
. Saya juga telah membuat port Java 8 dari jawaban Anda dengan byte-count yang sama, mengkredit jawaban luar biasa Anda.Haskell ,
888786 byte-1 terima kasih kepada @Laikoni
Cobalah online!
sumber
zipWith max m(reverse m)
dapat disingkat menjadizipWith max(reverse m)m
. Ini sama denganzipWith max=<<reverse$m
, dan kemudianm
dapat digarisbawahi: Coba online!Jelly ,
242316 byteCobalah online!
sumber
MATLAB,
153126 byte (17,6% ↓)Berkat komentar @ LuisMendo, fungsi
disp()
dapat menampilkan karakter tanpa tanda kutip tunggal, sehingga saya dapat mencegah penggunaanfprintf
denganformats
dan menghilangkan beberapa byte. Selain itu, komentarnya mengingatkan saya bahwa saya perlu menggunakanchar(32)
untuk memberikan ruang daripadachar(0)
(null).Cobalah online!
MATLAB, 153 byte
Contoh hasil: n = 10
sumber
Python 2 ,
93908983 byte-3 bytes berkat Leaky Nun
-1 byte terima kasih kepada Zachary T
-6 bytes berkat xnor
[Cobalah online!] [TIO-j3xwsktf]
Mulai dengan string seperti
'*** '
untukn=3
, melamarmap/max
untuk mengambil*
spasi untuk setiap posisi, lalu menambahkan spasi dan menghapus karakter terakhir dari string dan melakukan ini semua lagi.sumber
n*2*' '
dengann*' '
?map(max
dapat dilakukan langsung tanpazip
. Juga,n*2+1
adalahn-~n
.Haskell , 70 byte
Cobalah online!
Menghasilkan daftar string.
Untuk setiap posisi baris
r
, kolomc
, menggunakan rumus untuk menentukan apakah itu termasuk dalam salah satu dari dua band diagonal dan begitu juga*
.sumber
Java 8,
119118 bytePort dari @CarlosAlejo jawaban C # yang luar biasa , setelah saya membantunya bermain golf beberapa hal. Jadi, pastikan Anda juga mendukungnya!
Coba di sini.
sumber
Javascript (ES2017),
155157 byteMengembalikan 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 tidakn
lebar, jadi saya menambahkan modulus untuk mendeteksi genap / ganjil saat mengiris kolom.Tidak disatukan
Kuadran
Cermin Secara horizontal
Cermin Secara Vertikal
sumber
n
- garis tengah tidakn
lebar.Mathematica, 148 byte
sumber
R, 102 byte
Kode:
Uji:
sumber
CJam, 24 byte
Ini adalah blok yang mengambil nomor dari tumpukan dan menampilkan daftar garis ke tumpukan.
Penjelasan:
sumber
Python 2 , 110 byte
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.
sumber
Retina , 144 byte
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.Hapus nilai input asli, karena kami sekarang memiliki salinan di setiap baris.
Bangun dua garis diagonal ns
*
, dengan kolom pemisahn
ruang yang terbungkus sepasang#
s.Pada garis-garis di mana
*
s lebih dekat ke tengah, bertukar dua bagian di sekitar. Ini memberikan penampilan yang menyerupai> | | <
.Pindahkan
| |
s ke kiri sejauh mereka akan pergi, memberikan semacam>> > <
penampilan.Untuk setiap spasi di antara
#
huruf s, hapus tiga karakter berikut. Ini bergabung> <
menjadiX
.Hapus
#
s sekarang tidak perlu .sumber