Segitiga ASCII

30

Tugas Anda adalah menulis program atau fungsi yang mencetak segitiga ASCII. Mereka terlihat seperti ini:

|\
| \
|  \
----

Program Anda akan mengambil input numerik tunggal n, dengan kendala 0 <= n <= 1000. Segitiga di atas memiliki nilai n=3.

Segitiga ASCII akan memiliki ngaris miring terbalik ( \) dan garis vertikal ( |), n+1garis dan garis ( -), dan setiap garis akan memiliki jumlah ruang yang sama dengan nomor garis (berbasis 0, yaitu baris pertama adalah garis 0) selain garis pamungkas .

Contoh:

Memasukkan:

4

Keluaran:

|\
| \
|  \
|   \
-----

Memasukkan:

0

Keluaran:


Dalam kasus pengujian ini, output harus kosong. Tidak ada spasi putih.

Memasukkan:

1

Keluaran:

|\
--

Input & output harus persis seperti yang saya tentukan.

Ini , jadi usahakan kode sesingkat mungkin!

Okx
sumber
4
Apakah itu perlu program atau dapatkah itu berfungsi?
fəˈnɛtɪk
7
Saya pikir akan lebih baik jika kasing 0dapat memiliki keluaran yang tidak terduga karena
kasing
4
@Okx Sering ada pertanyaan di mana si penanya mengatakan program tetapi sebenarnya berarti program atau fungsi. Anda mungkin ingin mengklarifikasi bahwa Anda meminta program LENGKAP
fəˈnɛtɪk
9
Saya pasti akan pergi untuk program dan fungsi. Itu aturan default jika tidak ada yang ditentukan. Saya juga akan menghapus case 0-edge karena ini merupakan pelanggaran langsung dari " n + 1 garis dan garis (-) ".
Stewie Griffin
3
Tantangannya akan terlalu sederhana tanpa ukuran = 0 pengecualian. Bagian dari tantangannya adalah mencari cara untuk memperhitungkan ini dengan jumlah kode tambahan paling sedikit.
12Me21

Jawaban:

3

Jelly , 14 byte

’⁶x⁾|\jṄµ€Ṫ”-ṁ

Cobalah online!

Bagaimana itu bekerja.

’⁶x⁾|\jṄµ€Ṫ”-ṁ  Main link. Argument: n

        µ       Combine the links to the left into a chain.
         €      Map the chain over [1, ..., n]; for each k:
’                 Decrement; yield k-1.
 ⁶x               Repeat the space character k-1 times, yielding a string.
   ⁾\j            Join the character array ['|', '\'], separating by those spaces.
      Ṅ           Print the result, followed by a linefeed.
         Ṫ      Tail; extract the last line.
                This will yield 0 if the array is empty.
          ⁾-ṁ   Mold the character '-' like that line (or 0), yielding a string
                of an equal amount of hyphen-minus characters.  
Dennis
sumber
11

C, 58 byte

i;f(n){for(i=2*n;~i--;printf(i<n?"-":"|%*c\n",2*n-i,92));}

-

Terima kasih kepada @Steadybox yang mengomentari jawaban ini membantu saya mencukur beberapa byte dalam solusi saya di atas

Albert Renshaw
sumber
1
Saya berhasil mencapai 68, cukup bangga pada diri sendiri .. dan kemudian saya menggulir :( - Bagus!
Quentin
1
Sangat bagus! Punya +1
Steadybox
Saya sudah 2*ndi sana dua kali dan itu mengganggu saya, adakah yang bisa memikirkan cara cerdas untuk mempersingkatnya entah bagaimana?
Albert Renshaw
7

Javascript (ES6), 97 85 81 75 74 byte

n=>(g=(n,s)=>n?g(--n,`|${" ".repeat(n)}\\
`+s):s)(n,"")+"-".repeat(n&&n+1)

Ternyata saya tidak menggunakan rekursi yang hampir cukup

f=n=>(g=(n,s)=>n?g(--n,`|${" ".repeat(n)}\\
`+s):s)(n,"")+"-".repeat(n&&n+1)

console.log(f(0))
console.log(f(1))
console.log(f(2))
console.log(f(3))
console.log(f(4))

Jan
sumber
6

05AB1E , 16 15 16 byte

Menyimpan satu byte, terima kasih kepada Adnan

FðN×…|ÿ\}Dg'-×»?

Cobalah online!

Penjelasan

F       }         # for N in range [0 ... input-1]
 ðN×              # push <space> repeated N times
    …|ÿ\          # to the middle of the string "|\"
         Dg       # get length of last string pushed
           '-×    # repeat "-" that many times
              »   # join strings by newline
               ?  # print without newline
Emigna
sumber
ð×.svy¦…|ÿ\}¹>'-×», tebak ide saya .stidak sebagus yang saya kira. Penggunaan yang bagus ÿ, belum pernah melihat itu sebelumnya.
Magic Gurita Guci
@carusocomputing: Saya mempertimbangkan .suntuk memulai <Ýð×tetapi mengalami masalah dengan kasus khusus dengan metode tersebut.
Emigna
FðN×…|ÿ\}Dg'-×»untuk 15 byte
Adnan
@ Adnan: Tangkapan bagus dengan Dg! Terima kasih :)
Emigna
.sjuga menghasilkan array bersarang dan perataan yang membutuhkan lebih banyak byte.
Magic Octopus Mm
5

V , 18 17 16 byte

1 byte disimpan berkat @ nmjcman101 karena menggunakan cara lain untuk menghasilkan apa-apa jika inputnya 0

é\é|ÀñÙá ñÒ-xÀ«D

Cobalah online!

Hexdump:

00000000: e95c e97c c0f1 d9e1 20f1 d22d 78c0 ab44  .\.|.... ..-x..D

Penjelasan (kedaluwarsa)

Pertama-tama kita memiliki loop untuk memeriksa apakah argumennya benar 0. Jika demikian, kode di bawah ini dijalankan ( |\tertulis). Kalau tidak, tidak ada yang ditulis dan buffer kosong.

Àñ     ñ            " Argument times do:
  é\é|              " Write |\
      h             " Exit loop by creating a breaking error

Sekarang kita sudah mendapatkan bagian atas segitiga, kita perlu membuat tubuhnya.

Àñ   ñ              " Argument times do:
  Ù                 " Duplicate line, the cursor comes down
   à<SPACE>         " Append a space

Sekarang kita punya satu baris tambahan di bagian bawah buffer. Ini harus diganti dengan -s.

Ó-                  " Replace every character with a -
   x                " Delete the extra '-'

Jawaban ini akan lebih pendek jika kita dapat apa pun yang kita inginkan untuk input 0

V , 14 13 byte

é\é|ÀñÙá ñÒ-x

Cobalah online!

Kritixi Lithos
sumber
Seharusnya saya tidak berusaha sekeras itu untuk byte. Coba online!
nmjcman101
@ nmjcman101 Ah, «tentu saja. Pintar! :)
Kritixi Lithos
4

C #, 93 byte

n=>{var s=n>0?new string('-',n+1):"";while(n-->0)s="|"+new string(' ',n)+"\\\n"+s;return s;};

Fungsi anonim yang mengembalikan segitiga ASCII sebagai string.

Program lengkap dengan ungolf, fungsi komentar dan kasus uji:

using System;

class ASCIITriangles
{
    static void Main()
    {
      Func<int, string> f =
      n =>
      {
          // creates the triangle's bottom, made of dashes
          // or an empty string if n == 0
          var s = n > 0 ? new string('-', n + 1) : "";

          // a bottom to top process
          while ( n-- > 0)
          // that creates each precedent line
            s = "|" + new string(' ', n) + "\\\n" + s;

          // and returns the resulting ASCII art
          return s;
      };

      // test cases:
      Console.WriteLine(f(4));
      Console.WriteLine(f(0));
      Console.WriteLine(f(1));
    }
}
adrianmp
sumber
3

Python 2 , 69 byte

lambda x:'\n'.join(['|'+' '*n+'\\'for n in range(x)]+['-'*-~x*(x>0)])

Cobalah online!

tongkat
sumber
Jika Anda mencetaknya, Anda dapat menyimpan beberapa byte dengan mengubah ke python3, menghapus "".joindan menggantinya dengan *operator dan separgumen dalam fungsi sleep, jadilambda x:print(*['|'+' '*n+'\\'for n in range(x)]+['-'*-~x*(x>0)],sep="\n")
sagiksp
3

CJam , 24 22 21 byte

Disimpan 1 byte berkat Martin Ender

ri_{S*'|\'\N}%\_g+'-*

Cobalah online!

Penjelasan

ri                     e# Take an integer from input
  _                    e# Duplicate it
   {                   e# Map the following to the range from 0 to input-1
    S*                 e#   Put that many spaces
      '|               e#   Put a pipe
        \              e#   Swap the spaces and the pipe
         '\            e#   Put a backslash
           N           e#   Put a newline
            }%         e# (end of map block)
              \        e# Swap the top two stack elements (bring input to the top)
               _g+     e# Add the input's signum to itself. Effectively this increments any 
                       e#  non-zero number and leaves zero as zero.
                  '-*  e# Put that many dashes
Kucing Bisnis
sumber
2

SmileBASIC, 51 byte

INPUT N
FOR I=0TO N-1?"|";" "*I;"\
NEXT?"-"*(N+!!N)
12Me21
sumber
2

PowerShell , 51 67 byte

param($n)if($n){1..$n|%{"|"+" "*--$_+"\"};write-host -n ('-'*++$n)}

Cobalah online!

(Byte naik ke akun tanpa baris baru)

Mengambil input $ndan memverifikasi itu bukan nol. Kemudian loop untuk membangun segitiga, dan selesai dengan garis -. Tersirat Write-Outputterjadi pada penyelesaian program.

AdmBorkBork
sumber
Program ini mencetak baris tambahan, tetapi saya meminta keluaran persis seperti yang ditentukan, maaf!
Okx
@Okx Berubah dengan biaya 16 byte.
AdmBorkBork
2

Retina , 39 byte

.*
$*
*\`(?<=(.*)).
|$.1$* \¶
1
-
-$
--

Cobalah online

Konversi input desimal ke unary. Ganti masing 1- masing dengan |<N-1 spaces>\¶, cetak, dan batalkan ganti. Ganti masing 1- masing dengan tanda hubung, dan tanda hubung terakhir dengan 2 tanda hubung. Tadaa!

mbomb007
sumber
2

Gangguan umum, 89 86 byte

Menciptakan fungsi anonim yang mengambil input n dan mencetak segitiga ke *standard-output*(stdout, secara default).

Golf

(lambda(n)(when(< 0 n)(dotimes(i n)(format t"|~v@t\\~%"i))(format t"~v,,,'-<~>"(1+ n))))

Tidak disatukan

(lambda (n)
  (when (< 0 n)
    (dotimes (i n)
      (format t "|~v@t\\~%" i))
    (format t "~v,,,'-<~>" (1+ n))))

Saya yakin saya bisa membuat ini lebih pendek.

djeis
sumber
2

C 101 93 75 byte

f(n){i;for(i=0;i++<n;)printf("|%*c\n",i,92);for(;n--+1;)prin‌​tf("-");}

Versi tidak disatukan

void f(int n)
{
  int i;

  for(i=0;i++<n;)
    printf("|%*c\n",i,92);

  for(;n--+1;)
    printf("-");

}

@Steadybox Terima kasih telah menunjukkan, sangat masuk akal.

Abel Tom
sumber
1
Anda dapat memangkas beberapa byte dengan mengganti konstanta karakter dengan nilai ASCII-nya dan memindahkan i ++ pertama dalam loop body. Dan mengapa printf("%c",'_');begitu bertele-tele?
Jens
@Jens stimmt, Danke sehr :) Diperbarui
Abel Tom
Ini dapat dikurangi menjadi 74 byte:i;f(n){for(i=0;i++<n;)printf("%c%*c\n",124,i,92);for(;n--+1;)printf("-");}
Steadybox
Hingga 69 byte, sebenarnya:i;f(n){for(i=0;i++<n;)printf("|%*c\n",i,92);for(;n--+1;)printf("-");}
Steadybox
@Steadybox 68: n--+1dapat disingkat menjadi~n--
Albert Renshaw
2

Arang , 15 byte

Nβ¿β«↓β→⁺¹β↖↖β»

Cobalah online!

Kerusakan

Nβ¿β«↓β→⁺¹β↖↖β»
Nβ               assign input to variable β
   ¿β«         »  if β != 0:
      ↓β           draw vertical line β bars long
        →⁺¹β       draw horizontal line β+1 dashes long
            ↖      move cursor up one line and left one character
             ↖β    draw diagonal line β slashes long
Mike Bufardeci
sumber
Komentar sangat terlambat, tetapi penutupannya »bisa dihilangkan.
DLosc
2

Japt , 20 byte

Disimpan 2 byte berkat produk @ETH

o@'|+SpX +'\Ãp-pUÄ)·

Cobalah online!

Penjelasan

o@'|+SpX +'\Ãp-pUÄ)·
o                       // Creates a range from 0 to input
 @                      // Iterate through the array
  '|+                   // "|" + 
     SpX +              // S (" ") repeated X (index) times +
          '\Ã            // "\" }
             p-pU       // "-" repeated U (input) +1 times
                 Ä)·    // Join with newlines
Oliver
sumber
1
Yang bagus! Anda dapat menyimpan byte dengan mendorong baris terakhir sebelum bergabung: o@'|+SpX +'\Ãp'-pUÄ)·dan karena bug (benar-benar efek samping yang tidak disengaja dari fungsi-otomatis), Anda dapat menghapus 'in '-.
ETHproduk
Sebenarnya, seperti itu dengan semua huruf kecil, bukan hanya p. Sehingga Anda dapat melakukan mis m*2untuk menggandakan setiap elemen, atau mp2untuk mengkuadratkan masing
ETHproduk
2

J, 20 byte

-13 byte terima kasih kepada bob

*#' \|-'{~3,~2,.=@i.

Cobalah online!

asli: 33 byte

(#&'| \'@(1,1,~])"0 i.),('-'#~>:)

ungolfed

(#&'| \' @ (1,1,~])"0 i.) , ('-'#~>:)

Cobalah online!

Jonah
sumber
25 byte dengan*,&'-' '|',.'\'{."0~_1-i.
mil
22 byte dengan*,&'-' '|',.' \'{~=@i.
bob
@ Bob Itu sangat pintar untuk menggunakan matriks identitas
mil
@ Bob terima kasih atas sarannya. saya telah memperbarui pos
Jonah
1

Python2, 73 byte

n=input()
w=0
exec'print"|"+" "*w+"\\\\"+("\\n"+"-"*-~n)*(w>n-2);w+=1;'*n

Program lengkap. Saya juga mencoba interpolasi string untuk baris terakhir, tetapi ternyata beberapa byte lagi: /

exec'print"|%s\\\\%s"%(" "*w,("\\n"+"-"*-~n)*(w>n-2));w+=1;'*n

Solusi lain pada 73 byte:

n=j=input()
exec'print"|"+" "*(n-j)+"\\\\"+("\\n"+"-"*-~n)*(j<2);j-=1;'*n

Uji kasus

0:

1:
|\
--

2:
|\
| \
---

3:
|\
| \
|  \
----

6:
|\
| \
|  \
|   \
|    \
|     \
-------
Yytsi
sumber
Saya minta maaf atas komentar saya sebelumnya, fungsi sekarang diizinkan.
Okx
@ OKK Tidak masalah. Ini berdiri sebagai program lengkap. Saya tidak berpikir saya akan melihat ke dalam mode solusi fungsi :)
Yytsi
1

MATL , 19 byte

?'\|- '2GXyYc!3Yc!)

Cobalah online!

?         % Implicit input. If non-zero
  '\|- '  %   Push this string
  2       %   Push 2
  G       %   Push input
  Xy      %   Identity matrix of that size
  Yc      %   Prepend a column of 2's to that matrix
  !       %   Transpose
  3       %   Push 3
  Yc      %   Postpend a column of 3's to the matrix
  !       %   Transpose
  )       %   Index into string
          % Implicit end. Implicit display
Luis Mendo
sumber
1

QBIC , 41 byte

:~a>0|[a|?@|`+space$(b-1)+@\`][a+1|Z=Z+@-

Penjelasan

:~a>0|  Gets a, and checks if a > 0
        If it isn't the program quits without printing anything
[a|     For b=1; b <= a; b++
?@|`+   Print "|"
space$  and a number of spaces
(b-1)   euqal to our current 1-based line - 1
+@\`    and a "\"
]       NEXT
[a+1|   FOR c=1; c <= a+1; c++
Z=Z+@-  Add a dash to Z$
        Z$ gets printed implicitly at the end of the program, if it holds anything
        The last string literal, IF and second FOR loop are closed implicitly.
steenbergh
sumber
1

R, 101 byte

for(i in 1:(n=scan())){stopifnot(n>0);cat("|",rep(" ",i-1),"\\\n",sep="")};cat("-",rep("-",n),sep="")

Kode ini sesuai dengan n=0test case jika Anda hanya mempertimbangkan STDOUT!
Memang, stopifnot(n>0)sebagian berhenti eksekusi script, menampilkan apa-apa untuk STDOUTtetapi menulis Error: n > 0 is not TRUEuntuk SDTERR.

Tidak Disatukan:

for(i in 1:(n=scan()))
    {
    stopifnot(n>0)
    cat("|", rep(" ", i-1), "\\\n", sep = "")
    }

cat("-", rep("-", n), sep = "")
Frédéric
sumber
1
Mungkin ingin memperbaiki ejaan ungolfed
fəˈnɛtɪk
1

Python 2 , 62 byte

n=input();s='\\'
exec"print'|'+s;s=' '+s;"*n
if n:print'-'*-~n

Cobalah online!

Mencetak baris demi baris, setiap kali menambahkan spasi lain sebelum garis miring terbalik. Jika suatu fungsi yang tidak tercetak akan diizinkan, itu kemungkinan akan lebih pendek.

Tidak
sumber
Ternyata, fungsi tidak harus dicetak.
Yytsi
1

JavaScript (ES6), 71 byte

f=
n=>console.log(' '.repeat(n).replace(/./g,'|$`\\\n')+'-'.repeat(n+!!n))
<form onsubmit=f(+i.value);return!true><input id=i type=number><input type=submit value=Go!>

Output ke konsol. Simpan 6 byte jika mencetak ke shell JavaScript SpiderMonkey dapat diterima. Hemat 13 byte jika mengembalikan output dapat diterima.

Neil
sumber
Regex itu cerdik. Saya pertama kali mencoba sesuatu di sepanjang garis itu. Saya tidak tahu tentang $`polanya, tetapi tidak tahu apakah saya masih akan memikirkannya. Bagus.
Jan
1

Python 2 , 67 byte

Fungsi lain di Python 2, menggunakan rjust.

lambda n:('|'.join(map('\\\n'.rjust,range(n+2)))+'-'*-~n)[4:]*(n>0)

Cobalah online!

PidgeyDigunakanGust
sumber
1

Python 3 , 60 byte

f=lambda n,k=0:k<n and'|'+' '*k+'\\\n'+f(n,k+1)or'-'[:n]*-~n

Cobalah online!

Dua solusi lagi dengan jumlah byte yang sama.

f=lambda n,k=0:n and'|'+' '*k+'\\\n'+f(n-1,k+1)or-~k*'-'[:k]
f=lambda n,s='|':-~n*'-'[:n]if s[n:]else s+'\\\n'+f(n,s+' ')
Dennis
sumber
1

Perl, 63 byte

$n=shift;print'|',$"x--$_,"\\\n"for 1..$n;print'-'x++$n,$/if$n

Tidak Disatukan:

$ perl -MO=Deparse triangle.pl
$n = shift @ARGV;
print '|', $" x --$_, "\\\n" foreach (1 .. $n);
print '-' x ++$n, $/ if $n;

$"adalah pemisah daftar, yang defaultnya "". $/adalah pemisah rekaman keluaran, yang standarnya adalah "\ n". $_adalah variabel loop implisit.

Andy Lester
sumber
1
mungkin bisa menghemat dengan membaca input dari stdin? $n=<>?
Ven
1

Haskell , 82 65 byte

g 0=""
g n=((take n$iterate(' ':)"\\\n")>>=('|':))++([0..n]>>"-")

Cobalah online! Pemakaian:

Prelude> g 4
"|\\\n| \\\n|  \\\n|   \\\n-----"

Atau lebih baik lagi:

Prelude> putStr $ g 4
|\
| \
|  \
|   \
-----
Laikoni
sumber
1

Pyth, 23 18 byte

VQ++\|*dN\\)IQ*\-h

Test suite tersedia online.
Terima kasih Ven untuk bermain golf 5 byte.

Penjelasan

VQ++\|*dN\\)IQ*\-h
 Q           Q    Q  [Q is implicitly appended, initializes to eval(input)]
       d             [d initializes to ' ' (space)]
VQ         )         For N in range(0, eval(input)):
      *dN             Repeat space N times
   +\|                Prepend |
  +      \\           Append \
                      Implicitly print on new line
            IQ       If (input): [0 is falsy, all other valid inputs are truthy]
                 hQ   Increment input by 1
              *\-     Repeat - that many times
                      Implicitly print on new line
Mike Bufardeci
sumber
@Ven, terima kasih! Anda dapat memotong yang terakhir |untuk byte tambahan.
Mike Bufardeci
0

Javascript 101 (Program Lengkap), 94 (Output Fungsi), 79 (Kembali) byte

Program Lengkap

Tidak akan berjalan di Chrome (karena proses tampaknya tidak ada)
Tidak akan berjalan di TIO (karena prompt tampaknya tidak diizinkan)

x=prompt();s='';for(i=0;i<x;i++)s+='|'+' '.repeat(i)+`\\
`;process.stdout.write(s+'-'.repeat(x&&x+1))

Berfungsi dengan cetakan EXACT

x=>{s='';for(i=0;i<x;)s+='|'+' '.repeat(i++)+`\\
`;process.stdout.write(s+'-'.repeat(x&&x+1))}

Cobalah secara Online

Berfungsi dengan string kembali

x=>{s='';for(i=0;i<x;)s+='|'+' '.repeat(i++)+`\\
`;return s+'-'.repeat(x&&x+1)}

Cobalah secara Online

Mengulang karakter dalam Javascript adalah bodoh dan juga menekan baris baru pada output

fəˈnɛtɪk
sumber
0

Python 2 , 82 byte

def f(i,c=0):
 if c<i:print'|'+' '*c+'\\';f(i,c+1)
 print'-'*((c+1,c)[c<1]);exit()

Cobalah online!

Lebih lama jawaban Python yang lain tetapi fungsi rekursif hanya untuk menjadi berbeda.

Rasanya boros menggunakan dua printpernyataan tetapi saya tidak dapat menemukan cara yang lebih singkat untuk melakukannya. Juga exit()limbah 7 untuk menghentikannya mencetak menurunnya jumlah di -bawah segitiga.

ElPedro
sumber
Anda dapat melakukannya -~c*(c>0)di baris terakhir untuk menghemat 3 byte :)
Yytsi
Atau lebih baik lagi: c and-~c.
Yytsi