Sekali lagi terinspirasi oleh tugas untuk Pemrograman 101 inilah tantangan lain.
Memasukkan:
- Bilangan bulat positif
n >= 3
. (harus aneh)
Keluaran:
n
garis tanda bintang, di mana baris pertama memilikin
tanda 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 ken
tanda 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):
*****
***
*
***
*****
Jawaban:
Arang , 6 byte
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!
sumber
Python 2, 57 byte
Program lengkap. Lakukan garis demi garis, mencetak jumlah tanda bintang yang tepat di tengah.
Fungsi rekursif lebih panjang (67 byte):
atau
sumber
max
denganabs
, tetapi yang saya dapatkan adalahabs(n-1)+1
, yang lebih buruk karena penambahan membutuhkan tanda kurung'*'*-~abs(n-1)
, tetapi panjangnya sama dengan'*'*max(n,2-n)
.def f(n,s=''):r=s+'*'*n+'\n';return 1/n*r or r+f(n-2,s+' ')+r
untuk 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+' ')+r
masih 58 byte ...center
. Tidak pernah tahu itu ada sampai sekarang.V , 12 byte
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:
Sebagai catatan tambahan, ini secara langsung setara dengan
@ai*<esc>
di vim, dan register@a
diinisialisasi dengan "arg1". Ini membuat input numerik jauh lebih nyaman.Lalu, kita beralih karakter ke kanan dengan
h
. Inilah bagian yang menyenangkan:Sekarang secara teknis, bagian terakhir ini
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.sumber
C ++ Metatemplates, 186 byte
Dengan rumus eksplisit dari jawaban C saya , Metatemplates bersaing!
Tidak Disatukan:
pemakaian:
tidak bersaing
Hanya demi kesenangan:
Pemakaian:
sumber
PowerShell v2 +, 54 byte
Mengambil input
$n
(dijamin menjadi bilangan bulat ganjil), membangun dua rentang dengan$n..1
dan2..$n
dan menyatukannya, kemudian menggunakanWhere-Object
untuk 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 melaluiWrite-Output
insert implisit baris baru di antara mereka pada penyelesaian program.Contohnya
sumber
Python, 78 byte
Jadi hanya dengan lekukan:
Pemakaian:
sumber
C,
114109 byteungolfed:
Solusi rekursif sebelumnya:
sumber
JavaScript (ES6), 66 byte
Idenya di sini adalah untuk menghasilkan setiap jam pasir dari yang sebelumnya: tambahkan spasi di awal setiap baris, dan keduanya bertanda serta menambahkan
n
tanda bintang.sumber
05AB1E ,
21201917 byteDisimpan 2 byte berkat carusocomputing
Cobalah online!
Penjelasan
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!;ƒ'*¹N·-×Nð×ì})û»
gunakan perintah palindromize baru. -2 byte.ÅÉ
dan.c
mungkin belum tersedia pada saat Anda memposting ini. :)MATL , 12 byte
Cobalah online!
Penjelasan
Ini memanfaatkan fungsi rentang simetris yang baru ditambahkan .
sumber
PHP, 95 byte
Alih-alih menyimpan baris dalam array dan kemudian mengeluarkan semuanya, loop for turun hingga 1, dan kemudian kembali ke nomor asli.
sumber
C ++ 11, 93 byte
Sedikit tidak berbulu:
Pemakaian:
sumber
'\n'
dengan10
:)MATL , 20 byte
Cobalah online!
sumber
R, 77 byte
Membuat matriks karakter, yang kemudian dicetak melalui
cat
, denganfill=n
memastikan garis sejajar dengan benar. Perhatikan bahwa elemen disimpan dalam kolom-matriks pertama (yaitu dua elemen pertama adalahM[1,1]
danM[2,1]
, tidakM[1,2]
.)sumber
Java 7,
170 165164 byteTerima kasih kepada @Hypino karena telah menghemat 5 byte.
Terima kasih kepada Kevin karena telah menghemat 1 byte.
sumber
s=
daris=s+"\n"
dan 2 byte dengan mengubahreturn(n=--n-1)
kereturn(n=n-2)
untuk total 4 byte.String s="",c="",t="";
untukString s,c,t=s=c="";
( -2 bytes ), danreturn(n=n-2)>=0?s+"\n"+c+c(n,++x)+
untukreturn n-1>0?s+"\n"+c+c(n-2,++x)+
( -2 byte lagi)n=n-2
->n-1>0
karena n harus digunakan dalam argumen fungsi lainnya.n
untukn-2
di bagian itu.return(n=n-2)>=0 ... n
sedang diubah menjadireturn n-1>0 ... n-2
masih lebih pendek. PS: Anda berterima kasih kepada saya karena telah menyimpan byte, tetapi belum mengubah kode Anda dalam suntingan Anda. ;)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:"*";}
tanpat
( ideone test - 133 bytes )PHP - 95 byte
Menyimpan byte dengan menggunakan baris baru yang sebenarnya, bukan
"\r"
sumber
Pyth, 22 byte
Program yang mengambil input integer pada STDIN dan mencetak hasilnya.
Cobalah online
Bagaimana itu bekerja
sumber
C,
195191 BytesHarus turun golf sedikit lebih kecil
Kita bisa mengujinya di sini di ideone
sumber
C, 79 byte
Ini membagi variabel hitung mundur
k
menjadi 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.sumber
Ruby,
5554 bytesumber
?**n
bekerja; Anda tidak perlu ruang di sana.Java 7, 156 byte
Cukup sederhana. Melacak garis dengan
n
, bintang denganj
, spasi dengans
, dan arahd
. Saya benar-benar hanya ingin jawaban Java non-rekursif di papan tulis, tetapi tidak ada salahnya juga sedikit lebih pendek :)Dengan jeda baris:
sumber
APL, 19 byte
Uji:
Penjelasan:
sumber
1+
dan gunakan APL yang dimiliki⎕IO←0
.Haskell, 84 byte
sumber
putStr
dan Anda dapat menyingkirkanfromEnum
seperti ini .C (gcc) ,
8074 byteTerima kasih ceilingcat untuk 6 byte
Cobalah online!
sumber
PowerShell ,
5450 byteCobalah online!
sumber
PHP ,
10488 byteCobalah 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.
sumber
Groovy, 66 Bytes
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.sumber
.each
Blok kode bisa jadi{it%2&&println(("*"*it).center(n))}
.PHP, 191 byte
Jalankan seperti
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
for(;$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;
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\n
dengan baris baru yang sebenarnya untuk menyimpan byte.Pyke,
2219 byteCoba di sini!
sumber
C, 117 byte
Tidak disatukan
sumber