Triangles ASCII


30

Votre tâche consiste à écrire un programme ou une fonction qui imprime un triangle ASCII. Ils ressemblent à ceci:

|\
| \
|  \
----

Votre programme prendra une seule entrée numérique n, avec les contraintes 0 <= n <= 1000. Le triangle ci-dessus avait une valeur de n=3.

Le triangle ASCII aura des nbarres obliques inverses ( \) et des barres verticales ( |), des n+1lignes et des tirets ( -), et chaque ligne aura un nombre d'espaces égal au numéro de ligne (basé sur 0, c'est-à-dire que la première ligne est la ligne 0) en plus de la ligne finale .

Exemples:

Contribution:

4

Sortie:

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

Contribution:

0

Sortie:


Dans ce cas de test, la sortie doit être vide. Pas d'espace.

Contribution:

1

Sortie:

|\
--

L'entrée et la sortie doivent être exactement comme je l'ai spécifié.

C'est du , alors visez le code le plus court possible!

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
Doit-il s'agir d'un programme ou d'une fonction?
fəˈnɛtɪk

7
Je pense que ce serait mieux si le cas 0peut avoir une sortie inattendue car c'est un cas de bord (d'autant plus que vous avez demandé que le nombre de tirets doit être un de plus que le nombre d'entrée)
Kritixi Lithos

4
@Okx Il y a souvent des questions où le demandeur dit programme mais voulait vraiment dire programme ou fonction. Vous voudrez peut-être préciser que vous demandez un programme COMPLET
fəˈnɛtɪk

9
Je serais certainement prêt pour les programmes et la fonction. C'est la règle par défaut si rien d'autre n'est spécifié. Je voudrais également supprimer le cas à bord 0 car il s'agit d'une violation directe de " n + 1 lignes et tirets (-) ".
Stewie Griffin, le

3
Le défi serait trop simple sans l'exception taille = 0. Une partie du défi consiste à trouver un moyen de tenir compte de cela avec le moins de code supplémentaire.
12Me21

Réponses:


3

Gelée , 14 octets

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

Essayez-le en ligne!

Comment ça marche.

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

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

-

Merci à @Steadybox qui les commentaires sur cette réponse m'ont aidé à raser quelques octets dans ma solution ci-dessus


1
J'ai réussi à atteindre 68, j'étais assez fier de moi .. puis j'ai fait défiler :( - Bien joué!
Quentin

1
Très agréable! Avoir un +1
Steadybox le

J'en ai 2*nlà deux fois et ça me dérange, quelqu'un peut-il penser à un moyen intelligent de le raccourcir d'une manière ou d'une autre?
Albert Renshaw

7

Javascript (ES6), 97 85 81 75 74 octets

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

Il s'avère que je n'utilisais pas assez de récursivité

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 octets

Un octet enregistré grâce à Adnan

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

Essayez-le en ligne!

Explication

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¦…|ÿ\}¹>'-×», je suppose que mon idée .sn'était pas aussi bonne que je le pensais. Bon usage de ÿ, je n'ai jamais vu ça auparavant.
Urne de poulpe magique le

@carusocomputing: J'ai envisagé .sde commencer, <Ýð×mais j'ai rencontré des problèmes avec le cas particulier de ces méthodes.
Emigna

FðN×…|ÿ\}Dg'-×»pour 15 octets
Adnan

@Adnan: Belle prise avec Dg! Merci :)
Emigna

.sa également entraîné des tableaux imbriqués et un aplatissement qui nécessitaient plus d'octets.
Urne de poulpe magique le

5

V , 18 17 16 octets

1 octet enregistré grâce à @ nmjcman101 pour avoir utilisé une autre façon de ne rien produire si l'entrée est 0

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

Essayez-le en ligne!

Hexdump:

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

Explication (obsolète)

Nous avons d'abord une boucle pour vérifier si l'argument l'est 0. Si c'est le cas, le code ci-dessous s'exécute ( |\est écrit). Sinon, rien n'est écrit et le tampon est vide.

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

Maintenant que nous avons atteint le sommet du triangle, nous devons créer son corps.

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

Nous avons maintenant une ligne supplémentaire au bas du tampon. Cela doit être remplacé par l' -art.

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

Cette réponse serait plus courte si nous pouvions tout ce que nous voulons pour l'entrée 0

V , 14 13 octets

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

Essayez-le en ligne!


Je n'aurais pas dû essayer autant pour un octet Essayez-le en ligne!
nmjcman101

@ nmjcman101 Ah, «bien sûr. Intelligent! :)
Kritixi Lithos

4

C #, 93 octets

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

Fonction anonyme qui renvoie le triangle ASCII sous forme de chaîne.

Programme complet avec fonction non testée et commentée et cas de test:

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 octets

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

Essayez-le en ligne!


Si vous l'imprimez, vous pouvez économiser quelques octets en passant à python3, en le supprimant "".joinet en le remplaçant par l' *opérateur et l' separgument dans la fonction de veille, donclambda x:print(*['|'+' '*n+'\\'for n in range(x)]+['-'*-~x*(x>0)],sep="\n")
sagiksp

3

CJam , 24 22 21 octets

1 octet enregistré grâce à Martin Ender

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

Essayez-le en ligne!

Explication

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 octets

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

2

PowerShell , 51 67 octets

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

Essayez-le en ligne!

(Augmentation d'octets pour ne pas prendre en compte la nouvelle ligne)

Prend l'entrée $net vérifie qu'elle est différente de zéro. Boucle ensuite pour construire le triangle et termine avec une ligne de -. Implicite Write-Outputse produit à la fin du programme.


Le programme imprime une nouvelle ligne de fin mais j'ai demandé que la sortie soit exactement comme spécifié, désolé!
Okx

@Okx Modifié au coût de 16 octets.
AdmBorkBork

2

Rétine , 39 octets

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

Essayez-le en ligne

Convertissez l'entrée décimale en unaire. Remplacez chacun 1par |<N-1 spaces>\¶, imprimez et annulez le remplacement. Remplacez chacun 1par un trait d'union et le dernier trait d'union par 2 traits d'union. Tadaa!


2

Lisp commun, 89 86 octets

Crée une fonction anonyme qui prend l'entrée n et imprime le triangle sur *standard-output*(stdout, par défaut).

Golfé

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

Non golfé

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

Je suis sûr que je pourrais raccourcir cela d'une façon ou d'une autre.


2

C 101 93 75 octets

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

Version non golfée

void f(int n)
{
  int i;

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

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

}

@Steadybox Merci de l'avoir signalé, cela a beaucoup de sens.


1
Vous pouvez raser quelques octets en remplaçant les constantes de caractères par leur valeur ASCII et en déplaçant le premier i ++ dans le corps de la boucle. Et pourquoi est printf("%c",'_');si verbeux?
Jens

@Jens stimmt, Danke sehr :) Mise à jour
Abel Tom

Cela peut être réduit à 74 octets:i;f(n){for(i=0;i++<n;)printf("%c%*c\n",124,i,92);for(;n--+1;)printf("-");}
Steadybox

À 69 octets, en fait:i;f(n){for(i=0;i++<n;)printf("|%*c\n",i,92);for(;n--+1;)printf("-");}
Steadybox le

@Steadybox 68: n--+1peut être raccourci en~n--
Albert Renshaw

2

Fusain , 15 octets

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

Essayez-le en ligne!

Panne

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

Commentaire très tardif, mais la fermeture »peut être omise.
DLosc

2

Japt , 20 octets

Enregistré 2 octets grâce à @ETHproductions

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

Essayez-le en ligne!

Explication

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
Joli! Vous pouvez enregistrer un octet en appuyant sur la dernière ligne avant de rejoindre: o@'|+SpX +'\Ãp'-pUÄ)·et en raison d'un bogue (vraiment un effet secondaire involontaire des fonctions automatiques), vous pouvez retirer le 'dans '-.
ETHproductions

En fait, c'est comme ça avec toutes les lettres minuscules, pas seulement p. C'est ainsi que vous pouvez faire par exemple m*2pour doubler chaque élément, ou mp2pour mettre en carré chacun
ETHproductions

2

J, 20 octets

-13 octets grâce à bob

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

Essayez-le en ligne!

original: 33 octets

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

non golfé

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

Essayez-le en ligne!


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

22 octets avec*,&'-' '|',.' \'{~=@i.
bob

@bob C'était très intelligent d'utiliser la matrice d'identité
miles

@bob merci pour la suggestion. j'ai mis à jour le message
Jonah


1

Python2, 73 octets

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

Un programme complet. J'ai également essayé l'interpolation de chaînes pour la dernière ligne, mais il s'est avéré être plus long de quelques octets: /

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

Une autre solution à 73 octets:

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

Cas de test

0:

1:
|\
--

2:
|\
| \
---

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

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

Je m'excuse pour mon commentaire précédent, les fonctions sont désormais autorisées.
Okx

@Okx Pas de problème. Il s'agit d'un programme complet. Je ne pense pas que j'examinerai la mode d'une solution fonctionnelle :)
Yytsi

1

MATL , 19 octets

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

Essayez-le en ligne!

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

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

Explication

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

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

Ce code est conforme au n=0cas de test si vous ne considérez que STDOUT!
En effet, la stopifnot(n>0)partie arrête l'exécution du script, affiche rien à STDOUTmais écrit Error: n > 0 is not TRUEà SDTERR.

Non golfé:

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

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

1
Pourrait corriger l'orthographe des non
golfés

1

Python 2 , 62 octets

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

Essayez-le en ligne!

Imprime ligne par ligne, en ajoutant à chaque fois un autre espace avant la barre oblique inverse. Si une fonction qui n'imprimait pas était autorisée, ce serait probablement plus court.


Apparemment, les fonctions n'ont pas à s'imprimer.
Yytsi

1

JavaScript (ES6), 71 octets

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

Sorties vers la console. Économisez 6 octets si l'impression sur le shell JavaScript SpiderMonkey est acceptable. Enregistrez 13 octets si le retour de la sortie est acceptable.


Ce regex est ingénieux. J'ai d'abord essayé quelque chose dans ce sens. Je ne connais pas le $`motif, mais je ne sais pas si j'y aurais quand même pensé. Agréable.
Jan


1

Python 3 , 60 octets

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

Essayez-le en ligne!

Deux autres solutions avec le même nombre d'octets.

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 octets

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

Non golfé:

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

$"est le séparateur de liste, qui est par défaut "". $/est le séparateur d'enregistrement de sortie, qui est par défaut "\ n". $_est la variable de boucle implicite.


1
pourrait probablement en sauver quelques-uns en lisant l'entrée de stdin? $n=<>?
Ven

1

Haskell , 82 65 octets

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

Essayez-le en ligne! Usage:

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

Ou plus joliment:

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

1

Pyth, 23 18 octets

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

Suite de tests disponible en ligne.
Merci à Ven d' avoir joué 5 octets.

Explication

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 Merci! Vous pouvez couper le dernier |pour un octet supplémentaire.
Mike Bufardeci

0

Javascript 101 (programme complet), 94 (sortie de fonction), 79 (retour) octets

Programme complet

Ne fonctionnera pas dans Chrome (car le processus n'existe pas apparemment)
Ne fonctionnera pas dans TIO (car l'invite n'est apparemment pas autorisée)

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

Fonction avec impression EXACT

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

Essayez-le en ligne

Fonction avec chaîne de retour

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

Essayez-le en ligne

La répétition de caractères en Javascript est stupide, tout comme la suppression des sauts de ligne en sortie


0

Python 2 , 82 octets

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

Essayez-le en ligne!

Plus longtemps que l'autre Python répond mais une fonction récursive juste pour être différent.

Cela me semble inutile d'utiliser deux printdéclarations, mais je ne peux pas trouver un moyen plus court de contourner cela. Aussi les exit()déchets 7 pour l'empêcher d'imprimer un nombre décroissant de -sous le triangle.


Vous pouvez faire -~c*(c>0)sur la dernière ligne pour économiser 3 octets :)
Yytsi

Ou mieux encore: c and-~c.
Yytsi
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.