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!

code-golf  ascii-art  code-golf  rubiks-cube  code-golf  path-finding  maze  regular-expression  code-golf  math  rational-numbers  code-golf  kolmogorov-complexity  graphical-output  code-golf  tips  code-golf  string  permutations  code-golf  sorting  base-conversion  binary  code-golf  tips  basic  code-golf  number  number-theory  fibonacci  code-golf  date  code-golf  restricted-source  quine  file-system  code-golf  code-golf  math  code-golf  ascii-art  code-golf  math  primes  code-golf  code-golf  math  matrix  code-golf  string  math  logic  factorial  code-golf  palindrome  code-golf  quine  stateful  code-golf  interactive  code-golf  board-game  code-golf  math  arithmetic  code-golf  string  code-golf  math  matrix  code-golf  math  abstract-algebra  polynomials  code-golf  date  code-golf  string  array-manipulation  sorting  code-golf  game  code-golf  string  code-golf  ascii-art  decision-problem  code-golf  number  sequence  code-golf  code-golf  code-golf  sequence  fibonacci  code-golf  math  geometry  random  code-golf  code-golf  math  decision-problem  fractal  rational-numbers  code-golf  number  number-theory  code-golf  combinatorics  permutations  card-games  code-golf  math  sequence  array-manipulation  fibonacci  code-golf  sequence  decision-problem  graph-theory  code-golf  ascii-art  parsing  lisp  code-golf  string  math  natural-language  logic  code-golf  math  logic  code-golf  string  alphabet  code-golf  string  code-golf  string 

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.  

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


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))


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

ð×.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!


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

3

Python 2 , 69 byte

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

Cobalah online!


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

2

SmileBASIC, 51 byte

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

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.


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!


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.


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.


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

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

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!


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:
|\
| \
|  \
|   \
|    \
|     \
-------

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

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.

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 = "")

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.


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.


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 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+' ')

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.


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
|\
| \
|  \
|   \
-----

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

@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


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.


Anda dapat melakukannya -~c*(c>0)di baris terakhir untuk menghemat 3 byte :)
Yytsi

Atau lebih baik lagi: c and-~c.
Yytsi
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.