Keluarkan tenda terbalik

27

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) - 1garis 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 .

pengguna48538
sumber
1
Apakah spasi tambahan oke? Artinya, dapatkah kita menghasilkan empat string dengan panjang 12 (persegi panjang) untuk input 3misalnya?
AdmBorkBork
1
@TimmyD Mereka yang diperbolehkan.
user48538
2
@TimmyD yakin, yang itu mungkin merupakan tiruan dari sesuatu yang lain juga, saya tidak begitu yakin di mana rantai dimulai. Saya hanya berpikir kita sudah cukup melihat ini sekarang.
Nathaniel
5
Saya gagal melihat bagaimana pertanyaan-pertanyaan itu bahkan jauh mirip. Tentu, mereka berdua tantangan seni-ascii yang mengambil nomor dan membuat Anda menghasilkan iterasi ke-11 dari sesuatu, tapi di situlah kesamaan berakhir. Jika itu cukup untuk ditutup sebagai penipuan, kita seharusnya tidak mengambil tantangan ascii-art sama sekali.
DJMcMayhem
2
@Nathaniel Pedoman kami yang diterima untuk dua tantangan menjadi duplikat adalah apakah jawaban dari satu dapat digunakan kembali (secara kompetitif) di sisi lain dengan sedikit atau tanpa modifikasi. Apakah tantangan membawa sesuatu yang baru ke meja bukan merupakan bagian dari pedoman itu. Silakan gunakan downvotes untuk tantangan yang ingin Anda berkecil hati atau abaikan saja jika mereka tidak menganggapnya menarik dan biarkan mereka yang menikmatinya.
Martin Ender

Jawaban:

11

MATL , 55 53 52 51 byte

|95cy4*Y"DXytPEt0*yvG0>?P_]!'\/ 'w)95JG|G0<yEq:++&(

Cobalah online!

Penjelasan

Biarkan Nmenunjukkan input. Kode ini diproses dalam tiga langkah.

Pertama , baris pertama garis 4*Nbawah 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 1dan 2terkait dengan dua jenis garis miring, dan 0untuk ruang.

Ini dilakukan dengan menggabungkan empat matriks:

  1. Matriks identitas ukuran abs (N);
  2. Sebuah matriks dengan ukuran yang sama mengandung 2antidiagonal;
  3. Matriks nol dengan ukuran yang sama;
  4. Salinan matriks 2.

Menggabungkan empat matriks ini secara vertikal memberikan, menggunakan N=3sebagai contoh, 4*N × Nmatriks berikut :

1 0 0
0 1 0
0 0 1
0 0 2
0 2 0
2 0 0
0 0 0
0 0 0
0 0 0
0 0 2
0 2 0
2 0 0

(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, sehingga 1menjadi '\', 2menjadi '/'dan 0menjadi ' ', menghasilkan array char 2D

\    /     /
 \  /     / 
  \/     /  

Di sisi lain, jika input negatif kita balik vertikal dan secara aritmatik meniadakan 4*N × Nmatriks, menghasilkan

-2  0  0
 0 -2  0
 0  0 -2
 0  0  0
 0  0  0
 0  0  0
-2  0  0
 0 -2  0
 0  0 -2
 0  0 -1
 0 -1  0
-1  0  0

Indeks -1sekarang merujuk ke '/'dan -2ke '\'. 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.

Luis Mendo
sumber
Bukankah seharusnya garis-garis bawah pada awalnya adalah spasi?
DJMcMayhem
@DJMcMayhem Maaf, apa maksudmu?
Luis Mendo
Ketika saya menjalankan kode Anda, baris pertama adalah semua garis bawah. Output zyabin memberi tidak memilikinya.
DJMcMayhem
@DJMcMayhem saya tidak mengikuti. Baris pertama dalam kasus uji adalah garis bawah, bukan? Dan jawaban lain (bukan milikmu) juga melakukannya?
Luis Mendo
1
@DJMcMayhem :-D Aneh memang. Coba peramban lain?
Luis Mendo
9

Javascript (ES6), 139 byte

Membangun tenda secara rekursif:

f=(N,n=N>0?N:-N,i=0,r=(j,i)=>' _'[i||0].repeat(j),a=`\\${r(i)}/`,b=r(n*2+i-1,+!i))=>n--?f(N,n,i+2)+`
`+r(n)+(N<0?a+b+'/':'\\'+b+a):r(i*2,1)

Tidak diikat dan dikomentari

f = (
  N,                                  // N is the original parameter (remains unchanged)
  n = N > 0 ? N : -N,                 // n is initialized to abs(N)
  i = 0,                              // i is the row counter (*2)
  r = (j, i) => ' _'[i||0].repeat(j), // helper function to repeat ' ' or '_' j times
  a = `\\${r(i)}/`,                   // a = '\ /' pattern
  b = r(n*2+i-1, +!i)                 // b = padding pattern filled with ' ' or '_'
) =>
  n-- ?                               // if we haven't made it yet to the top row:
    f(N, n, i+2) + `\n` +             //   - compute next row(s) / append line break
    r(n) +                            //   - append leading spaces
    (N < 0 ? a+b+'/' : '\\'+b+a)      //   - append a/b patterns according to N sign
  :                                   // else:
    r(i*2, 1)                         //   - return top row, made of '_' characters

Contohnya

var f=(N,n=N>0?N:-N,i=0,r=(j,i)=>' _'[i||0].repeat(j),a=`\\${r(i)}/`,b=r(n*2+i-1,+!i))=>n--?f(N,n,i+2)+`
`+r(n)+(N<0?a+b+'/':'\\'+b+a):r(i*2,1)

console.log(f(3));
console.log(f(-4));

Arnauld
sumber
6

Python 2, 143 141 139 138 137 byte

-2 bytes terima kasih kepada @ Sp3000 (tidak perlu kurung exec di Python 2)
-1 byte terima kasih ke @ Sp3000 (gunakan cmp)

def f(n):d=cmp(n,0);a,b='\/'[::-d];s=n*d;x=2*s-1;y=4*s;print'_'*y;i=0;exec"print' '*i+(b+' '*(y-3-x-i-i)+a+'_ '[s-i>1]*x+a)[::d];i+=1;"*s

Uji di ideone

Pertama-tama kita melihat apakah nitu negatif dan d +1apakah itu benar atau -1tidak.
Lalu kita pilih dua garis miring, adan b, gunakan dsedemikian rupa sehingga a='\', b='/'kapan npositif dan a='/', b='\'kapan nnegatif.
Selanjutnya kita atur s=abs(n)yang mungkin dicapai oleh s=n*d.
Kemudian kita menghitung angka _di bagian atas (bagian bawah gambar), yang juga merupakan angka di samping tenda x=2*s-1.
Kemudian kita menghitung jumlah _di dasar tenda (bagian atas gambar), dan menyimpannya y=4*skarena akan digunakan dalam lingkaran untuk membuat sisa tenda.
Sekarang kita mencetak dasar tenda menggunakan print'_'*y.
Kemudian kami mencetak sisa tenda dengan mengeksekusi spernyataan cetak dengan variabel pengulangan idiinisialisasi dengan 0kenaikan 1untuk setiap pernyataan cetak.
Sisa tenda kemudian memiliki y-3-x-i-iruang di pintu dan xruang di tubuh sampai bagian atas tercapai, ketika s-i>1mengevaluasi 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].

Jonathan Allan
sumber
@ Sp3000 sayangnya cmp(0,0)kembali0
Jonathan Allan
5

Python 2, 121 byte

def f(n):i=k=abs(n);print'_'*k*4;exec"print' '*(k-i)+r'\\\%%s%\*%c%%*sc/'[n<0::2]%(' _'[i<2]*(2*k-1))%(2*i-1,47);i-=1;"*k

Hanya banyak pemformatan string.

Sp3000
sumber
5

C #, 215 214 byte

string t(int N){var n=N<0;N=n?-N:N;var t=new string('_',4*N);for(int i=0;i<N;){string f=new string(i<N-1?' ':'_',2*N-1),p=new string(' ',2*N-2*i-2);t+='\n'+new string(' ',i++)+'\\'+(n?p+'/'+f:f+'\\'+p)+'/';}return t;}

Ada kemungkinan untuk menyimpan beberapa byte saat menggunakan using s=string;sebelumnya.

s t(int N){var n=N<0;N=n?-N:N;var t=new s('_',4*N);for(int i=0;i<N;){s f=new s(i<N-1?' ':'_',2*N-1),p=new s(' ',2*N-2*i-2);t+='\n'+new s(' ',i++)+'\\'+(n?p+'/'+f:f+'\\'+p)+'/';}return t;}

yang akan menjadi 15 (menggunakan) + 184 (metode) = 199 byte.

BackFromExile
sumber
5
Selamat datang di PPCG, BackFromExile!
Erik the Outgolfer
Memang, selamat datang di PPCG! Jawaban pertama yang sangat bagus +1. Saya mencoba menemukan sesuatu untuk golf (cukup lama sejak saya memprogram dalam C #), dan pada akhirnya hanya dapat menemukan satu hal untuk -1 byte: Jika Anda mengubah yang pertama vardi dalam for-loop string, Anda dapat menghapus kedua var (termasuk ruang untuk menyimpan byte). Jadi var fmenjadi string f, dan ;var p=menjadi ,p=.
Kevin Cruijssen
4

TSQL, 195 byte

Golf:

DECLARE @ INT=-2
DECLARE @b INT=ABS(@),@i INT=0PRINT REPLICATE('_',4*@b)z:SET @i+=1PRINT SPACE(@i-1)+'\'+STUFF(REPLICATE(IIF(@i<@b,' ','_'),4*@b-2*@i),@b*2-IIF(@<0,@i*2-1,0),1,IIF(@<0,'/','\'))+'/'IF @i<@b GOTO z

Tidak Disatukan:

DECLARE @ INT=-2

DECLARE @b INT=ABS(@),@i INT=0

PRINT REPLICATE('_',4*@b)
z:
  SET @i+=1
  PRINT 
    SPACE(@i-1)+'\'
    +STUFF(REPLICATE(IIF(@i<@b,' ','_'),
      4*@b-2*@i),@b*2-IIF(@<0,@i*2-1,0),1,IIF(@<0,'/','\'))
    +'/'
IF @i<@b GOTO z

Biola

t-clausen.dk
sumber
4

V , 66 byte

é /ä
"aDoÀñá_>ñ^hr\A\/ò^hÄX$2é_Ó_/ òÄÒ_ñ/-
ddÍܨ[ _]*©Ü¨ *©/ܲ¯±

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:

0000000: e920 2fe4 0a22 6144 6f1b c0f1 e15f 3ef1  . /.."aDo...._>.
0000010: 5e68 725c 415c 2f1b f25e 68c4 5824 32e9  ^hr\A\/..^h.X$2.
0000020: 5fd3 5f2f 20f2 c4d2 5ff1 2f2d 0a64 64cd  _._/ ..._./-.dd.
0000030: dca8 5b20 5f5d 2aa9 dca8 202a a92f dcb2  ..[ _]*... *./..
0000040: afb1                                     ..
DJMcMayhem
sumber
4

05AB1E , 52 byte

Ä©'_4®*×,FNð×'\®·<N>®Qi'_ëð}×®N>-·ð×®¹Qi'\ës'/}s'/J,

Penjelasan

                                                     # implicit input, call this A
Ä©                                                   # store abs(A) in register for later use
  '_4®*×,                                            # print 4*A underscores (tent floor)
         F                                           # for each non-floor section in range(N)
          Nð×'\                                      # push N spaces at the beginning of the 
                                                     # row followed by a backslash
                  N>®Qi'_ëð}                         # if we're on the last row push an
                                                     # underscore, else a space
               ®·<          ×                        # repeat that char abs(A)*2-1 times
                             ®N>-·ð×                 # push 2*(abs(A)-(N+1)) spaces
                                    ®¹Qi'\ës'/}      # if input is positive push backslash
                                                     # else push a slash
                                               s'/   # move that char between the 2 sections
                                                     # of spaces
                                                  J, # join the row and print

Cobalah online!

Emigna
sumber
4

PowerShell v2 +, 217 205 190 187 184 byte

param($b)"_"*(($a=[math]::Abs($b))*4);$z,$y='/\'[($b=$b-lt0),!$b]
((($x=1..$a|%{($w=" "*($_-1))+$z+" "*(2*($a-$_))+$y+(' ','_')[$_-eq$a]*($a*2-1)+$y+$w})|%{-join$_[($a*4)..0]}),$x)[$b]

Mengambil input $bsebagai integer. Perhatikan bahwa jika $bnegatif, 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 $auntuk digunakan nanti. Selain itu, sekarang kami memiliki nilai absolut $bdisimpan ke dalam $a, kami berubah $bmenjadi Boolean untuk tanda, dan memilih garis miring kami disimpan ke dalam $ydan $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 $wuntuk 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, $badalah Falsekarena input positif), maka kita harus mengulang melalui $xdan reverse setiap item baris - ini adalah di mana ruang Trailing ikut bermain; itu memungkinkan kita untuk hanya membalikkan garis daripada menghitung ulang jarak.

Jika $badalah True, maka kanan setengah dari array $xyang dipilih sebagai gantinya.

Dalam kedua kasus tersebut, pipeline sekarang berisi array string. Output implisit melalui Write-Outputterjadi pada penyelesaian program, dengan baris baru default antar elemen.

Contohnya

PS C:\Tools\Scripts\golfing> .\print-upside-down-tent.ps1 (-5)
____________________
\        /         /
 \      /         / 
  \    /         /  
   \  /         /   
    \/_________/    

PS C:\Tools\Scripts\golfing> .\print-upside-down-tent.ps1 (4)
________________
\       \      /
 \       \    / 
  \       \  /  
   \_______\/   
AdmBorkBork
sumber
3

Haskell, 187 184 183 byte

f x=unlines$[(n*4)%'_']++((' '#)<$>[0..n-2])++['_'#(n-1)]where m#i=i%' '++'\\':m!i++"/";m!i|x>0=(2*n-1)%m++'\\':(2*(n-i-1))%' '|q<-2*(n-i-1)=q%' '++'/':(2*n-1)%m;n=abs x;m%c=c<$[1..m]

Saya merasa ini bukan nilai yang bagus untuk Haskell, jadi ide untuk perbaikan dipersilahkan.

Tidak disatukan

tent :: Int -> String
tent x = unlines $ [replicate (n*4) '_'] ++ (row ' '<$>[0..n-2]) ++ [row '_' (n-1)]
    where row m i = replicate i ' ' ++ "\\" ++ dir m i ++ "/"
          -- direction selector
          dir m i | x > 0 = side m ++ "\\" ++ entrance i ' '
                  | 1 > 0 = entrance i ' ' ++ "/" ++ side m
          side = replicate (2*n-1)
          entrance i = replicate (2*(n-i-1))
          n = abs x
sudee
sumber
Lebih baik daripada 290 byte saya, saya akan memposting ...
Myridium
Jika Anda tidak menambahkan mainsehingga menerima stdinsebagai input?
Myridium
Anda dapat memposting satu fungsi kecuali pertanyaannya menentukan sebaliknya. Ada meta utas untuk aturan umum dalam menjawab, saya akan mencoba mencarinya untuk Anda.
sudee
1
Anda dapat menyimpan 2 byte dengan mengubah tempat Anda menambahkan satu karakter untuk menggunakan :karakter tersebut. yaitu mengubah "\\" ++ entrance...ke '\\':entrance.
Myridium
1
Jangan sia-siakan penjaga "lain" : Anda bisa mengubahnya |1>0=(2*(n-i-1))%' 'menjadi |q<-2*(n-i-1)=q%' '.
nimi
2

C, 240 207 193 Bytes

#define P putchar
a,j,l,m;g(x,y,z){for(m=y+z+1;m--;P(m^z?l?32:95:x));}f(n){g(32,(a=abs(n))*4,0);for(P(10),j=2*(l=a)-1;l--;){for(m=a;--m>l;P(32));P(92);m=n>0?g(92,j,l*2):g(47,l*2,j);puts("/");}}

Kali ini saya mengoptimalkan fungsi g (...) untuk menggunakan satu untuk loop.

#define P putchar
a,j,l,m;g(x,y,z){for(;y--;P(l?32:95));for(P(x);z--;P(l?32:95));}f(n){g(32,(a=abs(n))*4,0);l=a;j=2*a-1;P(10);for(;l--;){for(m=a;--m>l;P(32));P(92);m=n>0?g(92,j,l*2):g(47,l*2,j);puts("/");}}

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.

#define P putchar
#define X(x,y,z){for(k=0;k++<y;P(l?32:95));P(x);for(k=0;k++<z;P(l?32:95));}
a,i,j,k,l,m;f(n){for(l=a=abs(n);i++<a*4;P(95));j=2*a-1;P(10);while(l--){for(m=a;--m>l;P(32));P(92);if(n>0)X(92,j,l*2)else X(47,l*2,j)puts("/");}}

Uji dengan fungsi utama ini; Seharusnya golf turun jauh lebih kecil.

main(c,v)char**v;
{
    f(atoi(v[1]));
}
Cleblanc
sumber
2

C # 241 231 Bytes

Disimpan 10 byte berkat @Kevin Cruijssen

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

Versi lama:

string f(int N){var f=N<0;N=N>0?N:-N;var o=new string('_',N*4);for(int j=0;j<N;){int z=-2*j+2*N-2;var O=j>N-2?'_':' ';o+='\n'+new string(' ',j)+'\\'+new string(' ',z)+(f?'/':O)+new string(O,j++*2)+(f?O:'\\')+new string(' ',z)+'/';}return o;}

Awalnya memiliki new string(...)sebagai Func<char,int,string>tetapi disimpan satu byte menggunakan konstruktor. Saya berharap int-> chartersirat

Cukup yakin matematika saya bisa diperbaiki juga, tapi saya tidak bisa melihatnya

pinkfloydx33
sumber
1
Anda bisa bermain golf lagi. Pertama-tama Anda dapat menghapus int sebelum z=dengan menambahkannya ke loop untuk-: int j=0,z. Dan karena Anda menggunakan stringcukup banyak, Anda dapat menggunakan alias using 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 )
Kevin Cruijssen
1

Swift 2.2.421 byte

Yah ... Ini adalah upaya.

Golf:

let t={(s:String,n:Int)->String in return String(count:n,repeatedValue:Character(s))};let e={(n:Int)in var w=[String]();w.append(t("_",abs(n)*4));let c = abs(n);let d = n>0 ? "/": "\\";let f = n>0 ? "\\": "/";for var i in 0...abs(n)-1 {w.append(t(" ",i)+d+t(" ",c*2-2-(2*i))+f+(i<c-1 ?t(" ",2*c-1)+f:t("_",2*c-1)+f)+(n>0 ?t(" ",i):""));};w=n<0 ?w:w.map(){String($0.characters.reverse())};print(w.joinWithSeparator("\n"))}

Tidak Disatukan:

let t={(s:String,n:Int) -> String in
    return String(count:n,repeatedValue:Character(s))
};
let e={(n:Int) in
    var w=[String]();
    w.append(t("_",abs(n)*4));
    let c = abs(n);
    let d = n>0 ? "/": "\\";
    let f = n>0 ? "\\": "/";
    for var i in 0...abs(n)-1 {
        w.append(t(" ",i)+d+t(" ",c*2-2-(2*i))+f+(i<c-1 ?t(" ",2*c-1)+f:t("_",2*c-1)+f)+(n>0 ?t(" ",i):""));
    };
    w=n<0 ?w:w.map(){String($0.characters.reverse())};
    print(w.joinWithSeparator("\n"))
}
Danwakeem
sumber
1

PHP, 143 byte

$t=str_repeat;echo$t(_,4*$s=$k=abs($n=$argv[1]));for(;$k--;$p.=" "){$f=$t("  ",$k);$r=$t($k?" ":_,2*$s-1);echo"
$p\\",$n<0?"$f/$r/":"$r\\$f/";}

jalankan bersama php -r '<code>' <parameter>

kerusakan

$t=str_repeat;  // function name to variable saves 10-1 bytes
echo$t(_,4*$s=$k=abs($n=$argv[1])); // print bottom
for(
    ;
    $k--;   // $k from abs($n-1) to 0
    $p.=" "                 // create padding
)
{
    $f=$t("  ",$k);         // create front
    $r=$t($k?" ":_,2*$s-1); // create side/roof
    echo"\n$p\\",$n<0
        ?"$f/$r/"   // print, entrance left
        :"$r\\$f/"  // print, entrance right
    ;
}
Titus
sumber
1

Batch, 289 byte

@echo off
set/pn=
set u=
for /l %%i in (2,1,%n:-=%)do call set u=_%%u%%_
echo _%u%__%u%_
set l=
set m=%u%/_%u%
if %n% gtr 0 set m=%u%_\%u%
set m=%m:_= %
for /l %%i in (2,1,%n:-=%)do call:l
set m=%m: =_%
:l
echo %l%\%m%/
set l= %l%
if %n% gtr 0 set m=  %m:~0,-2%
set m=%m:~2%

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 sebagai 2*(abs(n)-1)spasi, plus salah satu \atau /ditambah spasi (yang tidak dapat saya wakili dalam Penurunan harga), ditambah 2*(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.

Neil
sumber
1

Kanvas , 25 byte

⤢\║l╵:╷:«_×╋l/+L_×;∔⁸0>?↔

Coba di sini!

dzaima
sumber