ASCII Üçgenler


30

Göreviniz bir ASCII üçgeni basan bir program veya işlev yazmaktır. Buna benziyorlar:

|\
| \
|  \
----

Programınız nkısıtlamalarla birlikte tek bir sayısal girdi alacaktır 0 <= n <= 1000. Yukarıdaki üçgenin değeri vardı n=3.

ASCII üçgeni nters eğik çizgilere ( \) ve dikey çubuklara ( |), n+1çizgilere ve çizgilere ( -) sahip olacak ve her çizgide, nihai çizginin yanı sıra, satır numarasına (0 tabanlı, yani ilk satır 0'dır) eşit miktarda boşluk olacaktır. .

Örnekler:

Giriş:

4

Çıktı:

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

Giriş:

0

Çıktı:


Bu test durumunda, çıktı boş olmalıdır. Boşluk yok.

Giriş:

1

Çıktı:

|\
--

Giriş ve çıkış tam olarak benim belirttiğim gibi olmalı .

Bu , bu yüzden mümkün olan en kısa kodu hedefliyoruz!

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
Bir program mı olmalı yoksa bir işlev mi olabilir?
f Febnɛtɪk

7
Sanırım 0beklenmedik bir çıktının olması beklenmedik bir çıktı olsa bile daha iyi olacağını düşünüyorum (özellikle çizgi sayısının giriş sayısından bir tane olması gerektiğini talep ettiğinizden beri)
Kritixi Lithos

4
@Okx Sıkça sorulan kişinin program dediği ancak gerçekten program veya işlev anlamına gelen sorular var. TAM bir program istediğinizi açıklığa kavuşturmak isteyebilirsiniz
f Febn 8tɪk

9
Ben kesinlikle programa hem de işlev açısından gider. Başka bir şey belirtilmemişse, varsayılan kural budur. Ayrıca, " n + 1 satırları ve kısa çizgileri (-) " doğrudan ihlal ettiği için 0 kenarlı kılıfı da kaldırırdım .
Stewie Griffin,

3
Meydan = 0 istisna olmadan çok basit olurdu. Zorluğun bir kısmı, en az ekstra kodla bunu hesaba katmanın bir yolunu bulmak.
12Me21

Yanıtlar:


3

Jöle , 14 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır.

’⁶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 bayt

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

-

Bu cevapla ilgili yorum yapan @Steadybox sayesinde yukarıdaki çözümümde birkaç baytı tıraş etmeme yardımcı oldum


1
68'e ulaşmayı başardım, kendimle gurur duyuyordum .. ve sonra kaydırdım :( - Aferin!
Quentin

1
Çok hoş! +1
Steadybox

Ben 2*niki kez orada ve bu beni rahatsız ediyor, teneke herkes nasılsa kısaltmak için akıllı bir yol düşünemiyorum?
Albert Renshaw

7

Javascript (ES6), 97 85 81 75 74 bayt

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

Neredeyse yeterince özyineleme kullanmıyordum çıkıyor

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 bayt

Adnan sayesinde bir bayt kaydedildi

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

Çevrimiçi deneyin!

açıklama

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¦…|ÿ\}¹>'-×»sanırım benim fikrim .sdüşündüğüm kadar iyi değildi. Güzel kullanımı ÿ, daha önce görmedim.
Magic Octopus Urn

Ben kabul: @carusocomputing .syanı sıra ile başlayan <Ýð×ancak koştu o yöntemlerde özel bir durum ile sorun haline.
Emigna

FðN×…|ÿ\}Dg'-×»15 bayt için
Adnan

@Adnan: Güzel yakala Dg! Thanks :)
Emigna

.sayrıca iç içe diziler ve daha fazla bayt gerektiren düzleştirme ile sonuçlandı.
Magic Octopus Urn

5

V , 18 17 16 bayt

Girdi ise, hiçbir şey çıktısının başka bir yolunu kullanmak için @ nmjcman101 sayesinde 1 bayt kurtarıldı 0

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

Çevrimiçi deneyin!

HexDump:

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

Açıklama (eski)

İlk önce argümanın olup olmadığını kontrol etmek için bir döngümüz var 0. Eğer öyleyse, aşağıdaki kod yürütülür ( |\yazılır). Aksi takdirde, hiçbir şey yazılmaz ve arabellek boştur.

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

Şimdi üçgenin tepesini aldık, onun bedenini yaratmamız gerekiyor.

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

Şimdi tamponun altında bir ekstra satır var. Bu -s ile değiştirilmelidir .

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

Girdi için ne istiyorsak yapsak, bu cevap daha kısa olacaktır. 0

V , 14 13 bayt

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

Çevrimiçi deneyin!


Bunu bir bayt için çok denememeliydim Çevrimiçi deneyin!
nmjcman101

«Tabii ki @ nmjcman101 Ah . Zeki! :)
Kritixi Lithos,

4

C #, 93 bayt

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

ASCII üçgenini bir dizge olarak döndüren adsız işlev.

Ungolfed, yorum fonksiyonu ve test vakaları ile tam program:

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 bayt

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

Çevrimiçi deneyin!


Yazdırmadan ediyorsanız, python3 değişen kaldırarak birkaç byte kaydedebilirsiniz "".joinve onunla değiştirme *operatörü ve sepböylece, uyku işlevinde argümanlambda x:print(*['|'+' '*n+'\\'for n in range(x)]+['-'*-~x*(x>0)],sep="\n")
sagiksp

3

CJam , 24 22 21 bayt

Martin Ender sayesinde 1 bayt kaydedildi

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

Çevrimiçi deneyin!

açıklama

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 bayt

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

2

PowerShell , 51 67 bayt

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

Çevrimiçi deneyin!

(Sondaki yeni satır için hesaba Bayt artışı)

Girdiyi alır $nve sıfır olmadığını doğrular. Sonra üçgeni inşa etmek için döngüler ve bir çizgi ile biter -. Örtük Write-Output, program bitiminde olur.


Program sonunda yeni bir satır yazdırıyor, ancak çıktının tam olarak belirtilen şekilde olmasını istedim, üzgünüm!
Okx

@Okx 16 baytlık bir maliyetle değiştirildi.
AdmBorkBork

2

Retina , 39 bayt

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

Çevrimiçi deneyin

Ondalık girişi birime dönüştür. Her değiştirin 1ile |<N-1 spaces>\¶baskı, ve yerine geri al. Her birini 1kısa çizgi, son kısa çizgi 2 tire ile değiştirin. Tadaa!


2

Ortak Lisp, 89 86 bayt

N girişini alan ve üçgeni *standard-output*(varsayılan olarak stdout) olarak basan anonim bir işlev oluşturur .

golfed

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

Ungolfed

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

Bir şekilde bunu kısaltabileceğime eminim.


2

C 101 93 75 bayt

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

Ungolfed versiyonu

void f(int n)
{
  int i;

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

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

}

@ Steadybox İşaret için teşekkürler, çok mantıklı.


1
Karakter sabitlerini ASCII değerleriyle değiştirerek ve ilk i ++ 'ı döngü gövdesinde hareket ettirerek birkaç baytı tıraş edebilirsiniz. Ve neden bu printf("%c",'_');kadar ayrıntılı?
Jens

@Jens uyar, Danke sehr :) Güncelleme
Abel Tom

Bu 74 byte'a kadar i;f(n){for(i=0;i++<n;)printf("%c%*c\n",124,i,92);for(;n--+1;)printf("-");}
azaltılabilir

Aslında, 69 bayta:i;f(n){for(i=0;i++<n;)printf("|%*c\n",i,92);for(;n--+1;)printf("-");}
Steadybox

@ Steadybox 68: n--+1kısaltılabilir~n--
Albert Renshaw

2

Kömür , 15 bayt

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

Çevrimiçi deneyin!

Yıkmak

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

Çok geç yorum, ancak kapanma »ihmal edilebilir.
DLosc

2

Japt , 20 bayt

@ETHproductions sayesinde 2 bayt kaydedildi

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

Çevrimiçi deneyin!

açıklama

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
Güzel bir! Sen katılmadan önceki son satırı iterek byte kaydedebilirsiniz: o@'|+SpX +'\Ãp'-pUÄ)·ve nedeni teknik bir hata (otomatik fonksiyonların gerçekten bir kasıtsız yan etki) için, daha sonra kaldırabilirsiniz 'içinde '-.
ETHProductions

Aslında, sadece küçük harflerle değil, sadece küçük harflerle p. Öyleyse, örneğin m*2her bir öğeyi ikiye katlamak ya da mp2her birini kare yapmak için yapabilirsiniz
ETHproductions

2

J, 20 bayt

-13 bob sayesinde bayt

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

Çevrimiçi deneyin!

orijinal: 33 bayt

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

ungolfed

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

Çevrimiçi deneyin!


25 bayt ile*,&'-' '|',.'\'{."0~_1-i.
miles

22 byte with*,&'-' '|',.' \'{~=@i.
bob

@bob Kimlik matrisini kullanmak çok zekiydi
miles

@bob öneri için teşekkürler. Gönderiyi güncelledim
Jonah


1

Python2, 73 bayt

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

Tam bir program. Ayrıca, son satır için string enterpolasyonu denedim, fakat daha uzun bir kaç bayta dönüştü:

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

73 byte'ta başka bir çözüm:

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

Test durumları

0:

1:
|\
--

2:
|\
| \
---

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

6:
|\
| \
|  \
|   \
|    \
|     \
-------

Önceki yorumum için özür dilerim, işlevlere şimdi izin veriliyor.
Okx

@Okx Sorun yok. Bu tam bir program olarak duruyor. Bir fonksiyon çözümünün
modasını araştıracağımı sanmıyorum

1

MATL , 19 bayt

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

Çevrimiçi deneyin!

?         % 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 bayt

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

açıklama

:~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 bayt

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

Bu kod, n=0yalnızca dikkate alırsanız test durumuyla uyumludur STDOUT!
Nitekim, stopifnot(n>0)bölüm komut dosyası yürütme, gösteren, hiçbir şey durur STDOUTama yazma Error: n > 0 is not TRUEiçin SDTERR.

Ungolfed:

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

cat("-", rep("-", n), sep = "")

1
Ununged'in yazımını düzeltmek isteyebilir
fəˈnɛtɪk

1

Python 2 , 62 bayt

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

Çevrimiçi deneyin!

Her seferinde ters eğik çizgiden önce başka bir boşluk ekleyerek satır satır yazdırır. Yazdırılmayan bir işleve izin verilirse, bu daha kısa olacaktır.


Görünüşe göre, işlevlerin yazdırılması gerekmez.
Yytsi,

1

JavaScript (ES6), 71 bayt

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

Konsola çıkar. SpiderMonkey JavaScript kabuğuna yazdırmak kabul edilebilirse 6 bayt tasarruf edin. Çıktının döndürülmesi kabul edilebilirse, 13 bayt tasarruf edin.


Bu regex ustaca. İlk önce bu çizgiler boyunca bir şeyler denedim. $`Deseni bilmiyorum ama hala düşünebilir miydim bilmiyorum. Güzel.
Jan


1

Python 3 , 60 bayt

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

Çevrimiçi deneyin!

Aynı bayt sayısıyla iki çözüm daha.

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 bayt

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

Ungolfed:

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

$""" olarak varsayılan liste ayracıdır. $/"\ n" olarak varsayılan çıkış kayıt ayracıdır. $_Örtük döngü değişkeni.


1
muhtemelen stdin'in girişini okuyarak bazılarını kurtarabilir mi? $n=<>?
Ven,

1

Haskell , 82 65 bayt

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

Çevrimiçi deneyin! Kullanımı:

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

Ya da daha güzel:

Prelude> putStr $ g 4
|\
| \
|  \
|   \
-----

1

Pyth, 23 18 bayt

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

Test paketi çevrimiçi olarak kullanılabilir. 5 byte kapalı golf
için Ven teşekkürler .

açıklama

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 Teşekkürler! |Ek bir bayt için sonuncuyu kesebilirsin .
Mike Bufardeci,

0

Javascript 101 (Tam Program), 94 (İşlev Çıktısı), 79 (Dönüş) bayt

Tam Program

Chrome'da çalışmayacak (işlem görünüşte
olmadığı için ) TIO'da çalışmayacak (görünüşte istemeye izin verilmediğinden)

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

EXACT baskı ile işlev

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

Çevrimiçi Deneyin

Dönüş dizgeli işlev

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

Çevrimiçi Deneyin

Javascript'teki karakterleri tekrarlamak aptalca ve çıktıda yeni satırları bastırıyor


0

Python 2 , 82 bayt

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

Çevrimiçi deneyin!

Diğer Python cevap verdiğinde, ancak farklı olması için özyinelemeli bir işlev.

İki printifade kullanarak boşa harcıyor ama bunun etrafında daha kısa bir yol bulamıyorum. Ayrıca exit()atıkları 7 durdurmak için yazdırmayı durdurmak -için üçgenin altına düşen sayıdır .


Sen yapabilirsin -~c*(c>0)3 bayt :) kurtarmak için son satırında
Yytsi

Ya da daha iyisi: c and-~c.
Yytsi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.