Gambarlah jam pasir

32

Sekali lagi terinspirasi oleh tugas untuk Pemrograman 101 inilah tantangan lain.

Memasukkan:

  • Bilangan bulat positif n >= 3. (harus aneh)

Keluaran:

  • ngaris tanda bintang, di mana baris pertama memiliki ntanda bintang dan setiap baris baru memiliki dua tanda bintang kurang dari garis sebelumnya. Sampai menabrak 1 tanda bintang. Dari sana setiap baris baru memiliki dua tanda bintang lebih dari garis sebelum sampai kembali ke ntanda bintang. Spasi atau sesuatu seperti spasi harus digunakan untuk menyelaraskan tanda bintang sehingga benar-benar akan terlihat seperti jam pasir.

Aturan umum:

  • Mengejar baris baru diizinkan tetapi tidak harus digunakan.
  • lekukan adalah suatu keharusan.
  • Ini adalah kode-golf, jadi jawaban tersingkat dalam byte menang.
  • Karena kursus diajarkan dalam C ++, saya ingin melihat solusi dalam C ++.

Test case (n = 5):

*****
 ***
  *
 ***
*****
Sickboy
sumber
diedit sesuai, terima kasih :-)
Sickboy
3
Kemungkinan rangkap dari Draw a asterisk triangle
Oliver Ni
3
@ Oliver Menimbang OP menulis "Draw a asterisk triangle", saya tidak sepenuhnya yakin bahwa menyebut tantangan ini duplikat adalah adil. Itu pasti terkait, meskipun.
Sherlock9
19
Karena tidak semua orang di sini tahu konteks penuh, OP awalnya memposting "Draw a asterisk triangle" dan mengedit tantangan ini sebagai tantangan tambahan. Kami mengatakan kepada mereka untuk menghapus bagian itu dan membuatnya menjadi tantangan yang berbeda (yang mereka lakukan). Tantangan ini bukan duplikat. OP melakukan apa yang direkomendasikan banyak pengguna tingkat tinggi, dan bahkan beberapa mod telah merekomendasikan.
DJMcMayhem
2
@JDL: Tidak, mengapa Anda mau? Ah, sekarang saya mengerti apa yang Anda maksud dengan kotak ... :-D
Sickboy

Jawaban:

20

Arang , 6 byte

G↘←↗N*

Sangat sederhana. Gambarkan poli G pada *, dengan panjang sisi yang diambil dari input N , di mana sisi turun-dan-kanan, kiri horizontal, dan atas-dan-kanan:

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

Kemudian lengkapi garis secara otomatis dan isilah.

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

Cobalah online!

DLosc
sumber
Hah, itu benar-benar gila!
CT14.IT
6
Bahasa ini sangat menarik! Saya akan menonton ini dari dekat mulai sekarang: hal.
Adnan
Belum pernah melihat bahasa ini sebelumnya ... Terlihat menarik! Saya ingin tahu apa yang akan Anda dapatkan jika Anda menggabungkannya dengan Jelly ...
Esolanging Fruit
12

Python 2, 57 byte

N=n=input()
exec"print('*'*max(n,2-n)).center(N);n-=2;"*n

Program lengkap. Lakukan garis demi garis, mencetak jumlah tanda bintang yang tepat di tengah.

Fungsi rekursif lebih panjang (67 byte):

f=lambda n,p='':p+n*'*'+'\n'+(1%n*' 'and f(n-2,p+' ')+p+n*'*'+'\n')

atau

f=lambda n,p='':1/n*(p+'*\n')or f(n-2,p+' ').join([p+n*'*'+'\n']*2)
Tidak
sumber
Saya ingin menyarankan mencoba untuk mengganti maxdengan abs, tetapi yang saya dapatkan adalah abs(n-1)+1, yang lebih buruk karena penambahan membutuhkan tanda kurung
njzk2
@ njzk2 Anda dapat memotong parens dengan melakukan '*'*-~abs(n-1), tetapi panjangnya sama dengan '*'*max(n,2-n).
xnor
Ada def f(n,s=''):r=s+'*'*n+'\n';return 1/n*r or r+f(n-2,s+' ')+runtuk 61 byte, tetapi masih lebih lama. Bahkan dengan baris baru terkemuka, def f(n,s='\n'):r=s+'*'*n;return 1/n*r or r+f(n-2,s+' ')+rmasih 58 byte ...
Dennis
+1 untuk mengajari saya tentang center. Tidak pernah tahu itu ada sampai sekarang.
DLosc
11

V , 12 byte

Àé*hòl3Äjxx>

Cobalah online!

Saya suka tantangan seperti ini karena saya bisa memamerkan keunggulan sifat 2D V. Penjelasan. Pertama, kita perlu membuat string n tanda bintang. Jadi, kami melakukan ini:

À           " Arg1 times:
 é          " Insert the following single character:
  *         " '*'

Sebagai catatan tambahan, ini secara langsung setara dengan @ai*<esc>di vim, dan register @adiinisialisasi dengan "arg1". Ini membuat input numerik jauh lebih nyaman.

Lalu, kita beralih karakter ke kanan dengan h. Inilah bagian yang menyenangkan:

ò           " Until an error is thrown:
 l          "   Move one character to the right. This will throw an error on anyline with only one asterisk in it
  3Ä        "   Make 3 copies of this line
    j       "   Move down one line
     xx     "   Delete two characters
       >    "   Indent this line once.

Sekarang secara teknis, bagian terakhir ini

òl3Äjxx>>ò

Karena perintah indent sebenarnya >>. V dengan nyaman mengasumsikan perintah tidak lengkap berlaku untuk baris saat ini, dan juga secara implisit mengisi òkarakter kedua untuk perulangan.

DJMcMayhem
sumber
10

C ++ Metatemplates, 186 byte

Dengan rumus eksplisit dari jawaban C saya , Metatemplates bersaing!

template<int N,int X=N*N+N-1>struct H{enum{I=X/(N+1)-N/2,J=X%(N+1)-N/2-1};S s{(J==-N/2-1?'\n':((I>=J&I>=-J)|(I<=J&I<=-J)?'*':' '))+H<N,X-1>().s};};template<int N>struct H<N,-1>{S s="";};

Tidak Disatukan:

using S=std::string;

template <int N, int X=N*N+N-1>
struct H{
 enum{I=X/(N+1)-N/2,J=X%(N+1)-N/2-1};
 S s{(J==-N/2-1 ? '\n' : ( (I>=J&I>=-J)|(I<=J&I<=-J) ?'*':' '))+H<N,X-1>().s};
};

template <int N> struct H<N,-1> {S s="";}; 

pemakaian:

std::cout << H<5>().s;

tidak bersaing

Hanya demi kesenangan:

//T: Tuple of chars
template <char C, char...Tail> struct T { S r=S(1,C)+T<Tail...>().r; };

//specialization for single char
template <char C> struct T<C> { S r=S(1,C); };

//M: Repeated char
template <int N, char C> struct M { S r=S(N,C); };

//U: concatenates T and M
template <class Head, class...Tail> struct U { S r=Head().r+U<Tail...>().r; };

//specialization for Tail=M
template <int N, char C> struct U<M<N,C>> { S r{M<N,C>().r}; };

//specialization for Tail=T
template <char...C> struct U<T<C...>> { S r=T<C...>().r; };

//finally the Hourglass
template <int N, int I=0> struct H {
 S s=U<
       M<I,' '>,
       M<N,'*'>,
       T<'\n'>
      >().r;
 S r{s + H<N-2,I+1>().r + s};
};

//specialization for recursion end
template <int I> struct H<1,I> {
 S r=U<
       M<I,' '>,
       T<'*','\n'>
      >().r;
};

Pemakaian:

std::cout << H<5>().r;
Karl Napf
sumber
2
+1 untuk mengalahkan PHP dengan bagian C ++ yang bertele-tele
matsjoyce
7

PowerShell v2 +, 54 byte

param($n)$n..1+2..$n|?{$_%2}|%{" "*(($n-$_)/2)+"*"*$_}

Mengambil input $n(dijamin menjadi bilangan bulat ganjil), membangun dua rentang dengan $n..1dan 2..$ndan menyatukannya, kemudian menggunakan Where-Objectuntuk memilih hanya yang aneh dengan |?{$_%2}. Itu dimasukkan ke dalam satu lingkaran. Setiap iterasi, kami membangun jumlah ruang yang sesuai, dipadu dengan jumlah tanda bintang yang sesuai. String-string tersebut ditinggalkan di jalur pipa, dan output melalui Write-Outputinsert implisit baris baru di antara mereka pada penyelesaian program.

Contohnya

PS C:\Tools\Scripts\golfing> 3,5,7|%{.\draw-an-hourglass.ps1 $_;""}
***
 *
***

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

*******
 *****
  ***
   *
  ***
 *****
*******
AdmBorkBork
sumber
7

Python, 78 byte

Jadi hanya dengan lekukan:

f=lambda n,i=0:n>1and' '*i+'*'*n+'\n'+f(n-2,i+1)+' '*i+'*'*n+'\n'or' '*i+'*\n'

Pemakaian:

print f(5)
Karl Napf
sumber
6

C, 114 109 byte

i,j;k(n){for(i=-n/2;i<=n/2;++i)for(j=-n/2;j<=n/2+1;++j)putchar(j==n/2+1?10:(i>=j&i>=-j)|(i<=j&i<=-j)?42:32);}

ungolfed:

i,j;
k(n){
 for(i=-n/2;i<=n/2;++i)
  for(j=-n/2;j<=n/2+1;++j)
   putchar(j==n/2+1?10:(i>=j&i>=-j)|(i<=j&i<=-j)?42:32);
}

Solusi rekursif sebelumnya:

p(a,c){while(a--)putchar(c);}
f(n,i){p(i,32);p(n,42);p(1,10);}
g(n,i){if(n>1)f(n,i),g(n-2,i+1);f(n,i);}
h(n){g(n,0);}
Karl Napf
sumber
5

JavaScript (ES6), 66 byte

f=(n,s="*".repeat(n))=>n>1?s+`
`+f(n-2).replace(/^/gm," ")+`
`+s:s

Idenya di sini adalah untuk menghasilkan setiap jam pasir dari yang sebelumnya: tambahkan spasi di awal setiap baris, dan keduanya bertanda serta menambahkan ntanda bintang.

Produksi ETH
sumber
4

05AB1E , 21 20 19 17 byte

Disimpan 2 byte berkat carusocomputing

;ƒ'*¹N·-×Nð×ì})û»

Cobalah online!

Penjelasan

;ƒ                   # for N in [0 ... floor(input/2)+1]
  '*                 # push an asterisk
    ¹N·-×            # repeat the asterisk input-N*2 times
         Nð×ì        # prepend N spaces
             }       # end loop
              )      # wrap stack in a list
               û     # palendromize
                »    # join with newlines
Emigna
sumber
Ir"*"×.pRû- Sejauh ini, telapak tangan ketika saya menyadari seberapa jauh saya, melihat Anda telah menjawab, akan mencoba belajar iterasi dalam bahasa ini sekarang menggunakan contoh ini. Terima kasih!
Magic Octopus Mmn
4
Saya benar-benar dapat membantu sekali: ;ƒ'*¹N·-×Nð×ì})û»gunakan perintah palindromize baru. -2 byte.
Magic Octopus Mmn
@carusocomputing: Terima kasih! Saya tidak tahu tentang perintah palendromize (saya belum memperbarui dokumen). Sangat berguna. Telah membutuhkannya beberapa kali sebelumnya :)
Emigna
9 byte , bahkan dalam warisan. Meskipun saya cukup yakin dengan builtin ÅÉdan .cmungkin belum tersedia pada saat Anda memposting ini. :)
Kevin Cruijssen
4

MATL , 12 byte

Q2/Zv&<~42*c

Cobalah online!

Penjelasan

Ini memanfaatkan fungsi rentang simetris yang baru ditambahkan .

Q     % Input n implicitly. Add 1
      % STACK: 6
2/    % Divide by 2
      % STACK: 3
Zv    % Symmetric range
      % STACK: [1 2 3 2 1]
&<~   % Matrix of all pairwise "greater than or or equal to" comparisons
      % STACK: [1 1 1 1 1
                0 1 1 1 0
                0 0 1 0 0
                0 1 1 1 0
                1 1 1 1 1]
42*   % Multiply by 42 (ASCII code of '*')
      % STACK: [42 42 42 42 42
                 0 42 42 42  0
                 0  0 42  0  0
                 0 42 42 42  0
                42 42 42 42 42]
c     % Convert to char. Implicitly display, with char 0 shown as space
      % STACK: ['*****'
                ' *** '
                '  *  '
                ' *** '
                '*****']
Luis Mendo
sumber
Bagus! Itu fitur yang keren. Ini adalah satu-satunya jawaban yang mendekati jawaban V saya, jadi sekarang saya akan terobsesi melepas satu atau dua byte. : D
DJMcMayhem
@DJMcMayhem Heh, saya tidak berpikir saya akan dapat mengurangi jumlah byte yang satu ini
Luis Mendo
Ya, saya pikir saya juga tidak bisa. Mungkin akan ada jawaban Jelly 4-byte dalam beberapa menit, hahaha ...
DJMcMayhem
4

PHP, 95 byte

for($c=str_pad,$m=$n=$argv[1];$n<=$m;$n+=$d=$d>0||$n<2?2:-2)echo$c($c('',$n,'*'),$m,' ',2)."
";

Alih-alih menyimpan baris dalam array dan kemudian mengeluarkan semuanya, loop for turun hingga 1, dan kemudian kembali ke nomor asli.

chocochaos
sumber
3

C ++ 11, 93 byte

#include<string>
using S=std::string;S f(int n,int i=0){S s=S(i,32)+S(n,42)+'\n';return n>1?s+f(n-2,i+1)+s:s;}

Sedikit tidak berbulu:

std::string f(int n,int i=0){
 auto s=std::string(i,' ') + std::string(n,'*') + '\n';
 return n>1 ? s+f(n-2,i+1)+s : s;
}

Pemakaian:

std::cout << f(5);
Karl Napf
sumber
Bagus! satu byte dapat disimpan dengan mengasumsikan ASCII dan mengganti '\n'dengan 10:)
Quentin
3

MATL , 20 byte

XyY>t1X!*t2X!+ZS42*c

Cobalah online!

DJMcMayhem
sumber
Anda dapat menyimpan beberapa byte dengan fungsi rentang simetris yang baru diperkenalkan: Q2 / Zv & <~ 42 * c
Luis Mendo
@LuisMendo Itu keren! Karena itu adalah benar-benar pendekatan yang berbeda, aku akan membiarkan Anda memilikinya.
DJMcMayhem
Ok, saya akan mempostingnya!
Luis Mendo
3

R, 77 byte

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

Membuat matriks karakter, yang kemudian dicetak melalui cat, dengan fill=nmemastikan garis sejajar dengan benar. Perhatikan bahwa elemen disimpan dalam kolom-matriks pertama (yaitu dua elemen pertama adalah M[1,1]dan M[2,1], tidak M[1,2].)

JDL
sumber
3

Java 7, 170 165 164 byte

Terima kasih kepada @Hypino karena telah menghemat 5 byte.
Terima kasih kepada Kevin karena telah menghemat 1 byte.

String c(int n,int x){String s,c,t=c=s=" ";int i=0;for(;i++<n;s+="*");for(i=x;i-->=0;c+=" ");for(i=x;i-->0;t+=" ");return(n=n-2)>=0?s+"\n"+c+c(n,++x)+"\n"+t+s:"*";} 
Numberknot
sumber
Anda dapat menyimpan 2 bytes dengan menghapus s=dari s=s+"\n"dan 2 byte dengan mengubah return(n=--n-1)ke return(n=n-2)untuk total 4 byte.
Hypino
Hai. Anda dapat golf dua bagian: String s="",c="",t="";untuk String s,c,t=s=c="";( -2 bytes ), dan return(n=n-2)>=0?s+"\n"+c+c(n,++x)+untuk return n-1>0?s+"\n"+c+c(n-2,++x)+( -2 byte lagi)
Kevin Cruijssen
Tapi pola @KevinCruijssen tidak seperti yang diharapkan setelah mengubah n=n-2-> n-1>0karena n harus digunakan dalam argumen fungsi lainnya.
Numberknot
@Numberknot saya tahu, tapi saya juga berubah nuntuk n-2di bagian itu. return(n=n-2)>=0 ... nsedang diubah menjadi return n-1>0 ... n-2masih lebih pendek. PS: Anda berterima kasih kepada saya karena telah menyimpan byte, tetapi belum mengubah kode Anda dalam suntingan Anda. ;)
Kevin Cruijssen
@Numberknot Umm .. Anda masih lupa tip kedua saya. Bagaimanapun, ini adalah varian yang lebih pendek: String c(int n,int x){String s,c=s="";int i=0;for(;i++<n;s+="*");for(i=x;i-->0;c+=" ");return n>1?s+"\n "+c+c(n-2,x+1)+"\n"+c+s:"*";}tanpa t( ideone test - 133 bytes )
Kevin Cruijssen
3

PHP - 95 byte

$c=2;for($i=$a=$argv[1];$i<=$a;$i-=$c*=$i<2?-1:1)echo str_pad(str_repeat("*",$i),$a," ",2)."
";

Menyimpan byte dengan menggunakan baris baru yang sebenarnya, bukan "\r"

CT14.IT
sumber
2

Pyth, 22 byte

j+J.e+*dk*b\*_:1hQ2_PJ

Program yang mengambil input integer pada STDIN dan mencetak hasilnya.

Cobalah online

Bagaimana itu bekerja

j+J.e+*dk*b\*_:1hQ2_PJ  Program. Input: Q
              :1hQ2     Range from 1 to Q+1 in steps of 2. Yields [1, 3, 5, ..., Q]
             _          Reverse
   .e                   Enumnerated map with b as elements and k as indices:
      *dk                 k spaces
         *b\*             b asterisks
     +                    Concatenate the spaces and asterisks
  J                     Store in J
                    PJ  All of J except the last element
                   _    Reverse
 +                      Concatenate J and its modified reverse
j                       Join on newlines
                        Implicitly print
TheBikingViking
sumber
2

C, 195 191 Bytes

Harus turun golf sedikit lebih kecil

x,y,i;f(n){for(i=0;i<n;i+=2,puts("")){for(y=n-i;y<n;y+=2,putchar(32));for(x=i;x++<n;putchar(42));}for(i=n-2;~i;i-=2,puts("")){for(y=n-i+2;y<n;y+=2,putchar(32));for(x=i-1;x++<n;putchar(42));}}

Kita bisa mengujinya di sini di ideone

Cleblanc
sumber
2

C, 79 byte

h(m,n,k){for(n=m++,k=n*m;--k;putchar(k%m?abs(k%m-m/2)>abs(k/m-n/2)?32:42:10));}

Ini membagi variabel hitung mundur kmenjadi indeks baris dan kolom. Jika indeks kolom adalah 0 (karakter terakhir berturut-turut), ini menghasilkan karakter baris baru (10). Kemudian menyesuaikan indeks baris dan kolom untuk berada di sekitar tanda bintang pusat. Kemudian, abs(x) < abs(y)adalah kondisi singkat untuk menghasilkan ruang.

anatolyg
sumber
2

Ruby, 55 54 byte

f=->n,s=0{puts a=' '*s+?**n;(f[n-2,s+1];puts a)if n>1}
Lee W
sumber
?**nbekerja; Anda tidak perlu ruang di sana.
Value Ink
2

Java 7, 156 byte

Cukup sederhana. Melacak garis dengan n, bintang dengan j, spasi dengan s, dan arah d. Saya benar-benar hanya ingin jawaban Java non-rekursif di papan tulis, tetapi tidak ada salahnya juga sedikit lebih pendek :)

String f(int n){String o="";int j=n,s=0,i,d=0;for(;n-->0;o+="\n"){for(i=0;i++<s;)o+=" ";for(i=0;i++<j;)o+="*";d+=j<2?1:0;j+=d<1?-2:2;s+=d<1?1:-1;}return o;}

Dengan jeda baris:

String f(int n){
    String o="";
    int j=n,s=0,i,d=0;
    for(;n-->0;o+="\n"){
        for(i=0;i++<s;)
            o+=" ";
        for(i=0;i++<j;)
            o+="*";
        d+=j<2?1:0;
        j+=d<1?-2:2;
        s+=d<1?1:-1;
    }
    return o;
}
Geobit
sumber
2

APL, 19 byte

' *'[1+∘.≤⍨(⊢⌊⌽)⍳⎕]

Uji:

      ' *'[1+∘.≤⍨(⊢⌊⌽)⍳⎕]
⎕:
      5
*****
 *** 
  *  
 *** 
*****

Penjelasan:

                 ⎕   ⍝ read number  
                ⍳    ⍝ 1..N
           ( ⌊ )     ⍝ at each position, minimum of
            ⊢        ⍝ 1..N
              ⌽      ⍝ and N..1 (this gives 1..N/2..1)
       ∘.≤⍨          ⍝ outer product with ≤
     1+              ⍝ add 1 to each value
' *'[             ]  ⍝ 1→space, 2→asterisk
marinus
sumber
Hapus 1+dan gunakan APL yang dimiliki ⎕IO←0.
Adám
2

Haskell, 84 byte

f n|l<-div n 2,k<-[-l..l]=putStr$unlines[[" *"!!(fromEnum$abs x<=abs y)|x<-k]|y<-k]
Angs
sumber
Solusi bagus! Tapi saya cukup yakin Anda tidak perlu putStrdan Anda dapat menyingkirkan fromEnumseperti ini .
ბიმო
2

C (gcc) , 80 74 byte

Terima kasih ceilingcat untuk 6 byte

-Du(x,k)=for(x=~n;x+=2,x<n;putchar(k))

i;j;f(n){u(i,10)u(j,i*i<j*j?32:42);}

Cobalah online!

l4m2
sumber
2

PHP ,104 88 byte

for(;$i++<$argn;$a.='**',$i++>1?$o=$s.$o:1)$o.=$s=str_pad("*$a",$argn,' ',2)."
";echo$o;

Cobalah online!

Ini tidak mengalahkan skor terendah untuk PHP pada tantangan ini, tetapi terlalu gila bagi saya untuk membuang.

Oke, jadi saya bermain golf sekarang untuk menjadi skor (tidak lama) terendah untuk PHP pada tantangan ini, tetapi itu tidak mengubah fakta bahwa itu masih gila.

$ echo 7|php -nF hour.php
*******
 *****
  ***
   *
  ***
 *****
*******
640KB
sumber
83? juga huh, php juga memiliki barewords, meskipun tidak berguna di sini
ASCII-saja
@ Hanya tikus ASCII! Sepertinya saya masih punya pekerjaan yang harus dilakukan! lol
640KB
1
82? alternatif 82
ASCII-satunya
@ Ya hanya ASCII, bagus sekali! Itu pasti pendekatan yang tepat!
640KB
1

Groovy, 66 Bytes

{n->((n..1)+(2..n)).each{if(it%2>0){println(("*"*it).center(n))}}}

Cobalah: https://groovyconsole.appspot.com/script/5145735624392704

Dijelaskan:

((n..1)+(2..n)) - Balikkan palindromize ke n [n,..,1,..,n]

.each{if(it%2>0){...} - Iterasi melalui elemen aneh.

println(("*"*it).center(n)) - Tengahkan n bintang dan cetak masing-masing pada baris baru.

Guci Gurita Ajaib
sumber
.eachBlok kode bisa jadi {it%2&&println(("*"*it).center(n))}.
manatwork
1

PHP, 191 byte

$b=[];for($i=$a=$argv[1]+1;$i>0;$i--){$i--;if($i<=1){$c=str_pad("*",$a," ",2)."\n";break;}$b[]=str_pad(str_repeat("*",$i),$a," ",2)."\n";}echo implode("",$b).$c.implode("",array_reverse($b));

Jalankan seperti php -f golf_hourglass.php 15

# php -f golf_hourglass.php 15
***************
 *************
  ***********
   *********
    *******
     *****
      ***
       *
      ***
     *****
    *******
   *********
  ***********
 *************
***************

Gagasan di baliknya adalah membuat bagian atas (bagian sebelum single *), kemudian hanya menggemakan bagian atas dua kali, tetapi kedua kalinya dalam urutan terbalik.

ʰᵈˑ
sumber
Saya pikir ini adalah awal yang lebih baik untuk tugas inifor(;$i<$a=$argv[1];$i+=2){$t=str_pad(str_pad("",$i+1,"*"),$a," ",2)."\n";$i?$s.=$t:$r=$t;}echo strrev($s)."\n".$r.$s;
Jörg Hülsermann
for(;$i<$a=$argv[1];$i++){$t=str_pad(str_pad("",$i+1+$i%2,"*"),$a," ",2)."\n";$i%2?$s.=$t:$s=$t.$s;}echo$s;ini lebih baik
Jörg Hülsermann
Ganti implode () dengan join () untuk menghemat 6 byte.
Alex Howansky
Ganti \ndengan baris baru yang sebenarnya untuk menyimpan byte.
Alex Howansky
1

Pyke, 22 19 byte

F-ed*ih\**+)2%'X_OX

Coba di sini!

F          )        -    for i in range(input)
 -                  -        Q-i
  e                 -       floor(^/2)
   d*               -      ^*" "
          +         -     ^+V
     ih             -       i+1
       \**          -      ^*"*"
            2%      -   ^[::2]
              'X_   - splat(^),
                       reversed(^)
                 OX - splat(^[:-1])
Biru
sumber
1

C, 117 byte

void p(c,n){while(n--)putchar(c);}void h(n){for(int i=n;i>=-n;i-=i==1?4:2){p(32,(n-abs(i))/2);p(42,abs(i));p(10,1);}}

Tidak disatukan

void printNum(c, n) {
  while (n--)
    putchar(c);
}

void hourGlass(n) {
  for (int i = n; i >= -n; i-=i==1?4:2) {
    printNum(32, (n - abs(i)) / 2);
    printNum(42, abs(i));
    printNum(10, 1);
  }
}
Kerndog73
sumber