Triángulos ASCII


30

Su tarea es escribir un programa o una función que imprima un triángulo ASCII. Se ven así:

|\
| \
|  \
----

Su programa tomará una sola entrada numérica n, con las restricciones 0 <= n <= 1000. El triángulo anterior tenía un valor de n=3.

El triángulo ASCII tendrá nbarras invertidas ( \) y barras verticales ( |), n+1líneas y guiones ( -), y cada línea tendrá una cantidad de espacios igual al número de línea (basado en 0, es decir, la primera línea es la línea 0) además de la última línea. .

Ejemplos:

Entrada:

4

Salida:

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

Entrada:

0

Salida:


En este caso de prueba, la salida debe estar vacía. Sin espacios en blanco.

Entrada:

1

Salida:

|\
--

La entrada y salida deben ser exactamente como las especifiqué.

Este es el , ¡así que busca el código más corto posible!

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 

44
¿Tiene que ser un programa o puede ser una función?
fəˈnɛtɪk

77
Creo que sería mejor si el caso 0puede tener una salida inesperada, ya que es un caso límite (especialmente porque solicitó que el número de guiones debe ser uno más que el número de entrada)
Kritixi Lithos

44
@Okx Con frecuencia hay preguntas en las que el autor de la pregunta dice programa, pero realmente quería decir programa o función. Es posible que desee aclarar que está solicitando un programa COMPLETO
fəˈnɛtɪk

99
Me cabe duda de que para ambos programas y la función. Esa es la regla predeterminada si no se especifica nada más. También eliminaría el caso de borde 0 ya que es una violación directa de " n + 1 líneas y guiones (-) ".
Stewie Griffin

3
El desafío sería demasiado simple sin la excepción size = 0. Parte del desafío es encontrar una manera de explicar esto con la menor cantidad de código adicional.
12Me21

Respuestas:


3

Jalea , 14 bytes

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

Pruébalo en línea!

Cómo funciona.

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

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

-

Gracias a @Steadybox, los comentarios de esta respuesta me ayudaron a reducir algunos bytes en mi solución anterior.


1
Logré llegar a 68, estaba muy orgulloso de mí mismo ... y luego me desplacé :( - ¡Bien hecho!
Quentin

1
¡Muy agradable! Tener un +1
Steadybox

Tengo 2*ndos veces allí y me molesta, ¿alguien puede pensar en una forma inteligente de acortarlo de alguna manera?
Albert Renshaw

7

Javascript (ES6), 97 85 81 75 74 bytes

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

Resulta que no estaba usando suficiente recursión

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 bytes

Salvó un byte gracias a Adnan

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

Pruébalo en línea!

Explicación

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¦…|ÿ\}¹>'-×»Supongo que mi idea .sno era tan buena como pensaba. Buen uso de ÿ, no he visto eso antes.
Urna mágica de pulpo

@carusocomputing: lo consideré .sademás de comenzar, <Ýð×pero tuve problemas con el caso especial de esos métodos.
Emigna

FðN×…|ÿ\}Dg'-×»para 15 bytes
Adnan

@Adnan: ¡Buena captura con Dg! Gracias :)
Emigna

.sTambién resultó en matrices anidadas y aplanamiento que requirieron más bytes.
Urna mágica del pulpo

5

V , 18 17 16 bytes

1 byte guardado gracias a @ nmjcman101 por usar otra forma de no generar nada si la entrada es 0

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

Pruébalo en línea!

Hexdump:

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

Explicación (obsoleta)

Primero tenemos un ciclo para verificar si el argumento es 0. Si es así, el siguiente código se ejecuta ( |\está escrito). De lo contrario, no se escribe nada y el búfer está vacío.

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

Ahora que tenemos la parte superior del triángulo, necesitamos crear su cuerpo.

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

Ahora tenemos una línea extra en la parte inferior del búfer. Esto tiene que ser reemplazado con -s.

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

Esta respuesta sería más corta si pudiéramos ingresar lo que queramos 0

V , 14 13 bytes

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

Pruébalo en línea!


No debería haber intentado tanto por un byte ¡ Pruébelo en línea!
nmjcman101

@ nmjcman101 Ah, «por supuesto. ¡Inteligente! :)
Kritixi Lithos

4

C #, 93 bytes

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

Función anónima que devuelve el triángulo ASCII como una cadena.

Programa completo con función no comentada y comentada y casos de prueba:

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 bytes

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

Pruébalo en línea!


Si lo está imprimiendo, puede guardar algunos bytes cambiando a python3, eliminándolo "".joiny reemplazándolo con el *operador y el separgumento en la función de suspensión, así quelambda x:print(*['|'+' '*n+'\\'for n in range(x)]+['-'*-~x*(x>0)],sep="\n")
sagiksp

3

CJam , 24 22 21 bytes

Guardado 1 byte gracias a Martin Ender

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

Pruébalo en línea!

Explicación

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 bytes

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

2

PowerShell , 51 67 bytes

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

Pruébalo en línea!

(Aumento de bytes para no tener en cuenta la nueva línea final)

Toma entrada $ny verifica que no sea cero. Luego realiza un bucle para construir el triángulo y termina con una línea de -. Implícito Write-Outputsucede al finalizar el programa.


El programa imprime una nueva línea final pero le pedí a la salida que fuera exactamente como se especifica, lo siento
Okx

@Okx cambiado a un costo de 16 bytes.
AdmBorkBork

2

Retina , 39 bytes

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

Pruébalo en línea

Convierta la entrada decimal a unario. Reemplace cada uno 1con |<N-1 spaces>\¶, imprimir y deshacer reemplazar. Reemplace cada uno 1con un guión, y el último guión con 2 guiones. Tadaa!


2

Lisp común, 89 86 bytes

Crea una función anónima que toma la entrada n e imprime el triángulo en *standard-output* (stdout, por defecto).

Golfed

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

Sin golf

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

Estoy seguro de que podría hacer esto más corto de alguna manera.


2

C 101 93 75 bytes

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

Versión sin golf

void f(int n)
{
  int i;

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

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

}

@ Steadybox Gracias por señalar, tiene mucho sentido.


1
Puede eliminar algunos bytes reemplazando las constantes de caracteres con su valor ASCII y moviendo el primer i ++ en el cuerpo del bucle. ¿Y por qué es printf("%c",'_');tan detallado?
Jens

@Jens stimmt, Danke sehr :) Actualizado
Abel Tom

Esto se puede reducir a 74 bytes:i;f(n){for(i=0;i++<n;)printf("%c%*c\n",124,i,92);for(;n--+1;)printf("-");}
Steadybox

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

@Steadybox 68: n--+1se puede acortar a~n--
Albert Renshaw

2

Carbón de leña , 15 bytes

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

Pruébalo en línea!

Descompostura

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

Comentario muy tardío, pero el cierre »puede omitirse.
DLosc

2

Japt , 20 bytes

Guardado 2 bytes gracias a @ETHproductions

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

Pruébalo en línea!

Explicación

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
¡Buena esa! Puede guardar un byte empujando la última fila antes de unirse: o@'|+SpX +'\Ãp'-pUÄ)·y debido a un error (en realidad es un efecto secundario no intencional de funciones automáticas), a continuación, puede quitar el 'en '-.
ETHproductions

En realidad, es así con todas las letras minúsculas, no solo p. Eso es para que pueda hacer, por ejemplo, m*2duplicar cada elemento o mp2cuadrar cada uno
ETHproductions

2

J, 20 bytes

-13 bytes gracias a bob

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

Pruébalo en línea!

original: 33 bytes

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

sin golf

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

Pruébalo en línea!


25 bytes con*,&'-' '|',.'\'{."0~_1-i.
millas

22 bytes con*,&'-' '|',.' \'{~=@i.
bob

@bob Fue muy inteligente usar una matriz de identidad
millas

@bob gracias por la sugerencia. He actualizado la publicación
Jonás


1

Python2, 73 bytes

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

Un programa completo También probé la interpolación de cadenas para la última línea, pero resultó ser un par de bytes más: /

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

Otra solución a 73 bytes:

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

Casos de prueba

0:

1:
|\
--

2:
|\
| \
---

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

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

Pido disculpas por mi comentario anterior, las funciones ahora están permitidas.
Okx

@Okx No hay problema. Esto se destaca como un programa completo. No creo que
vaya

1

MATL , 19 bytes

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

Pruébalo en línea!

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

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

Explicación

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

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

¡Este código cumple con el n=0caso de prueba si solo lo considera STDOUT!
De hecho, la stopifnot(n>0)parte detiene la ejecución del script, no se muestra nada a STDOUTpero escribe Error: n > 0 is not TRUEa SDTERR.

Sin golf:

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

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

1
Podría querer arreglar la ortografía de los no
golfistas

1

Python 2 , 62 bytes

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

Pruébalo en línea!

Imprime línea por línea, cada vez que agrega otro espacio antes de la barra diagonal inversa. Si se permitiera una función que no se imprime, probablemente sería más corta.


Aparentemente, las funciones no tienen que imprimirse.
Yytsi

1

JavaScript (ES6), 71 bytes

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

Salidas a la consola. Ahorre 6 bytes si la impresión en el shell SpiderMonkey JavaScript es aceptable. Ahorre 13 bytes si devolver la salida es aceptable.


Esa expresión regular es ingeniosa. Primero intenté algo en ese sentido. No sé sobre el $`patrón, pero no sé si aún lo hubiera pensado. Agradable.
Jan


1

Python 3 , 60 bytes

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

Pruébalo en línea!

Dos soluciones más con el mismo número de bytes.

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 bytes

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

Sin golf:

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

$"es el separador de lista, que por defecto es "". $/es el separador de registro de salida, que por defecto es "\ n". $_es la variable de bucle implícito.


1
Probablemente podría ahorrar algo al leer la entrada de stdin? $n=<>?
Ven

1

Haskell , 82 65 bytes

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

Pruébalo en línea! Uso:

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

O más amablemente:

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

1

Pyth, 23 18 bytes

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

Conjunto de pruebas disponible en línea.
Gracias a Ven por jugar golf 5 bytes.

Explicación

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 Gracias! Puede cortar el último |por un byte adicional.
Mike Bufardeci

0

Javascript 101 (Programa completo), 94 (Salida de función), 79 (Retorno) bytes

Programa completo

No se ejecutará en Chrome (ya que aparentemente el proceso no existe)
No se ejecutará en TIO (ya que aparentemente no se permite la solicitud)

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

Función con impresión EXACTA

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

Pruébalo en línea

Función con cadena de retorno

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

Pruébalo en línea

La repetición de caracteres en Javascript es tonta y también lo es la supresión de nuevas líneas en la salida


0

Python 2 , 82 bytes

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

Pruébalo en línea!

Más tiempo que el otro Python responde pero una función recursiva solo para ser diferente.

Se siente un desperdicio usar dos print declaraciones, pero no puedo encontrar una forma más corta de evitarlo. También los exit()desperdicios 7 para detener su impresión disminuyendo el número de -debajo del triángulo.


Puedes hacerlo -~c*(c>0)en la última línea para guardar 3 bytes :)
Yytsi

O mejor aún: c and-~c.
Yytsi
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.