Diberi bilangan bulat, mengeluarkan tenda terbalik.
Input menentukan ukuran tenda (nilai absolut) dan apakah pintu masuk berada di sisi kiri (angka negatif) atau sisi kanan (angka positif).
If input = -1:
____
\/_/
If input = -2:
________
\ / /
\/___/
If input = -3:
____________
\ / /
\ / /
\/_____/
If input = 1:
____
\_\/
If input = 2:
________
\ \ /
\___\/
If input = 3:
____________
\ \ /
\ \ /
\_____\/
et cetera
Perhatikan bahwa bagian atas tenda (yaitu baris terakhir) memiliki 2 * abs(input) - 1
garis bawah.
Tidak boleh ada spasi awal, sehingga baris pertama langsung dimulai dengan garis bawah.
Asumsikan bahwa input tidak akan pernah ada 0
.
Kode Anda harus sesingkat mungkin.
Tantangan ini didasarkan pada tantangan obrolan mini oleh Helka Homba , yang diizinkan untuk digunakan dalam tantangan nyata di bawah ketentuan Lisensi Publik Hobi Calvin .
3
misalnya?Jawaban:
MATL ,
55535251 byteCobalah online!
Penjelasan
Biarkan
N
menunjukkan input. Kode ini diproses dalam tiga langkah.Pertama , baris pertama garis
4*N
bawah dibangun sebagai string dan ditampilkan (yang menghilangkannya dari tumpukan).Kedua , "bingkai" tenda dibangun menggunakan dua jenis garis miring. Untuk melakukan ini, array 2D numerik dibuat yang berisi
1
dan2
terkait dengan dua jenis garis miring, dan0
untuk ruang.Ini dilakukan dengan menggabungkan empat matriks:
abs (N)
;2
antidiagonal;Menggabungkan empat matriks ini secara vertikal memberikan, menggunakan
N=3
sebagai contoh,4*N × N
matriks berikut :(yang, dialihkan, mulai terlihat seperti tenda).
Kami sekarang menangani tanda input. Jika positif, kita cukup memindahkan matriks di atas dan indeks ke dalam string
'\/ '
. Pengindeksan adalah berbasis 1 dan modular, sehingga1
menjadi'\'
,2
menjadi'/'
dan0
menjadi' '
, menghasilkan array char 2DDi sisi lain, jika input negatif kita balik vertikal dan secara aritmatik meniadakan
4*N × N
matriks, menghasilkanIndeks
-1
sekarang merujuk ke'/'
dan-2
ke'\'
. Artinya, dua jenis garis miring telah dipertukarkan, sesuai kebutuhan. Sekali lagi transposing dan indexing ke dalam string'\/ '
dengan demikian memberikan tenda terbalik:Ketiga , garis bawah perlu diisi menjadi bagian dari baris terakhir array char 2D. Posisi horizontal garis ini tergantung pada tanda input, dan panjangnya adalah
abs(N)
.Setelah spasi yang sesuai diganti dengan garis bawah, hasilnya secara implisit ditampilkan, di bawah garis awal garis bawah yang sudah ditampilkan pada langkah pertama.
sumber
Javascript (ES6), 139 byte
Membangun tenda secara rekursif:
Tidak diikat dan dikomentari
Contohnya
sumber
Python 2,
143 141 139 138137 byte-2 bytes terima kasih kepada @ Sp3000 (tidak perlu kurung exec di Python 2)
-1 byte terima kasih ke @ Sp3000 (gunakan
cmp
)Uji di ideone
Pertama-tama kita melihat apakah
n
itu negatif dand
+1
apakah itu benar atau-1
tidak.Lalu kita pilih dua garis miring,
a
danb
, gunakand
sedemikian rupa sehinggaa='\', b='/'
kapann
positif dana='/', b='\'
kapann
negatif.Selanjutnya kita atur
s=abs(n)
yang mungkin dicapai olehs=n*d
.Kemudian kita menghitung angka
_
di bagian atas (bagian bawah gambar), yang juga merupakan angkadi samping tenda
x=2*s-1
.Kemudian kita menghitung jumlah
_
di dasar tenda (bagian atas gambar), dan menyimpannyay=4*s
karena akan digunakan dalam lingkaran untuk membuat sisa tenda.Sekarang kita mencetak dasar tenda menggunakan
print'_'*y
.Kemudian kami mencetak sisa tenda dengan mengeksekusi
s
pernyataan cetak dengan variabel pengulangani
diinisialisasi dengan0
kenaikan1
untuk setiap pernyataan cetak.Sisa tenda kemudian memiliki
y-3-x-i-i
ruang di pintu danx
ruang di tubuh sampai bagian atas tercapai, ketikas-i>1
mengevaluasi ke False, mengambil_
dari'_ '
.Untuk yang positif, pintu kiri, tenda seluruh tenda, tidak termasuk ruang terkemuka adalah back-to-front, jadi itu terbalik sementara positif, 'pintu kanan', tenda tidak dengan
[::d]
.sumber
cmp(0,0)
kembali0
Python 2, 121 byte
Hanya banyak pemformatan string.
sumber
C #,
215214 byteAda kemungkinan untuk menyimpan beberapa byte saat menggunakan
using s=string;
sebelumnya.yang akan menjadi 15 (menggunakan) + 184 (metode) = 199 byte.
sumber
var
di dalam for-loopstring
, Anda dapat menghapus keduavar
(termasuk ruang untuk menyimpan byte). Jadivar f
menjadistring f
, dan;var p=
menjadi,p=
.TSQL, 195 byte
Golf:
Tidak Disatukan:
Biola
sumber
V , 66 byte
Cobalah online!
Ini adalah pendekatan yang cukup naif, jadi saya akan mencoba menurunkannya lebih lanjut hari ini. Solusi ini mengandung karakter yang tidak patut dicetak, jadi inilah hexdump:
sumber
05AB1E , 52 byte
Penjelasan
Cobalah online!
sumber
PowerShell v2 +,
217205190187184 byteMengambil input
$b
sebagai integer. Perhatikan bahwa jika$b
negatif, Anda perlu mengelilinginya secara eksplisit dengan parens untuk memasukkannya dengan benar (lihat contoh), jika tidak, PowerShell akan menganggapnya sebagai string.Terlepas dari arah mana tenda menghadap, baris pertama adalah sama, sekelompok garis bawah; sebenarnya
4*abs(input)
banyak dari mereka. Angka itu juga disimpan$a
untuk digunakan nanti. Selain itu, sekarang kami memiliki nilai absolut$b
disimpan ke dalam$a
, kami berubah$b
menjadi Boolean untuk tanda, dan memilih garis miring kami disimpan ke dalam$y
dan$z
.Baris berikutnya adalah membangun dan merumuskan output, dan itu adalah doozy, jadi mari kita jabarkan.
Kami pada dasarnya mengindeks ke dalam array dua elemen,
(big long calculations saved into $x)
atau$x
, berdasarkan$b
.Perhitungannya adalah di mana badan tenda dibangun. Kami beralih dari
1..$a|%{...}
. Setiap iterasi kami membangun garis badan tenda. Kita mulai dengan jumlah spasi yang sama dengan baris # yang kita gunakan-1
, sehingga selaras kiri. Itu disimpan$w
untuk nanti, dan digabungkan dengan garis miring yang sesuai ($ z, berdasarkan$b
), lalu jumlah bingkai pintu, lalu garis miring lainnya$y
, lalu garis bawah atau spasi tergantung pada apakah kita berada di garis bawah atau tidak, kemudian garis miring lain$y
, dan akhirnya jumlah spasi tambahan yang sesuai ($w
) untuk membangun string persegi panjang. Array string yang dihasilkan disimpan ke dalam$x
.Jika kiri setengah dari array yang dipilih (yaitu,
$b
adalahFalse
karena input positif), maka kita harus mengulang melalui$x
dan reverse setiap item baris - ini adalah di mana ruang Trailing ikut bermain; itu memungkinkan kita untuk hanya membalikkan garis daripada menghitung ulang jarak.Jika
$b
adalahTrue
, maka kanan setengah dari array$x
yang dipilih sebagai gantinya.Dalam kedua kasus tersebut, pipeline sekarang berisi array string. Output implisit melalui
Write-Output
terjadi pada penyelesaian program, dengan baris baru default antar elemen.Contohnya
sumber
Haskell,
187184183 byteSaya merasa ini bukan nilai yang bagus untuk Haskell, jadi ide untuk perbaikan dipersilahkan.
Tidak disatukan
sumber
main
sehingga menerimastdin
sebagai input?:
karakter tersebut. yaitu mengubah"\\" ++ entrance...
ke'\\':entrance
.|1>0=(2*(n-i-1))%' '
menjadi|q<-2*(n-i-1)=q%' '
.C,
240207193 BytesKali ini saya mengoptimalkan fungsi g (...) untuk menggunakan satu untuk loop.
Kali ini makro X lebih baik sebagai fungsi g (...) dan karena y dan z adalah parameter dalam lingkup baru saya hanya bisa mengurangi mereka dalam lingkup g.
Uji dengan fungsi utama ini; Seharusnya golf turun jauh lebih kecil.
sumber
C #
241231 BytesDisimpan 10 byte berkat @Kevin Cruijssen
Versi lama:
Awalnya memiliki
new string(...)
sebagaiFunc<char,int,string>
tetapi disimpan satu byte menggunakan konstruktor. Saya berharapint
->char
tersiratCukup yakin matematika saya bisa diperbaiki juga, tapi saya tidak bisa melihatnya
sumber
int
sebelumz=
dengan menambahkannya ke loop untuk-:int j=0,z
. Dan karena Anda menggunakanstring
cukup banyak, Anda dapat menggunakan aliasusing s=System.String;
Jadi dengan total menjadi:using s=System.String;s f(int N){var f=N<0;N=N>0?N:-N;var o=new s('_',N*4);for(int j=0,z;j<N;){z=-2*j+2*N-2;var O=j>N-2?'_':' ';o+='\n'+new s(' ',j)+'\\'+new s(' ',z)+(f?'/':O)+new s(O,j++*2)+(f?O:'\\')+new s(' ',z)+'/';}return o;}
( 231 byte )Swift 2.2.421 byte
Yah ... Ini adalah upaya.
Golf:
Tidak Disatukan:
sumber
PHP, 143 byte
jalankan bersama
php -r '<code>' <parameter>
kerusakan
sumber
Batch, 289 byte
Mengambil input pada STDIN. Mulai dengan membuat string
2*(abs(n)-1)
garis bawah. Ini kemudian diulangi ditambah 4 garis bawah tambahan untuk dasar tenda. Sisa tenda kemudian terdiri dari indent (yang bertambah 1 pada setiap baris), a\
, tengah tenda, dan a/
. Bagian tengah tenda dimulai sebagai2*(abs(n)-1)
spasi, plus salah satu\
atau/
ditambah spasi (yang tidak dapat saya wakili dalam Penurunan harga), ditambah2*(abs(n)-1)
spasi lainnya . Saya menggunakan kembali garis bawah garis dan mengubahnya ke ruang untuk kenyamanan, tetapi kemudian mengubah ruang kembali ke garis bawah untuk baris terakhir. Setiap garis menghilangkan dua ruang dari satu sisi tengah tenda, meskipun sedikit lebih golf untuk memindahkan dua ruang ke awal tali terlebih dahulu jika perlu.sumber
Kanvas , 25 byte
Coba di sini!
sumber