ASCII треугольники

30

Ваша задача - написать программу или функцию, которая печатает треугольник ASCII. Они выглядят так:

|\
| \
|  \
----

Ваша программа будет принимать один числовой ввод nс ограничениями 0 <= n <= 1000. Вышеупомянутый треугольник имел значение n=3.

Треугольник ASCII будет иметь nобратную косую черту ( \) и вертикальные столбцы ( |), n+1строки и тире ( -), и каждая строка будет иметь количество пробелов, равное номеру строки (на основе 0, т.е. первая строка - это строка 0), кроме конечной строки ,

Примеры:

Входные данные:

4

Выход:

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

Входные данные:

0

Выход:


В этом тестовом примере выходные данные должны быть пустыми. Нет пробелов.

Входные данные:

1

Выход:

|\
--

Вход и выход должны быть точно такими, как я указал.

Это , поэтому стремитесь к максимально короткому коду!

Okx
источник
4
Это должна быть программа или функция?
fəˈnɛtɪk
7
Я думаю, было бы лучше, если бы случай 0мог иметь какой-либо неожиданный вывод, так как это крайний случай (особенно если учесть, что количество тире должно быть на единицу больше, чем число ввода)
Kritixi Lithos
4
@Okx Часто возникают вопросы, когда спрашивающий говорит «программа», но на самом деле имел в виду программу или функцию. Вы можете уточнить, что вы запрашиваете
ПОЛНУЮ
9
Я определенно пошел бы и на программу и на функцию. Это правило по умолчанию, если ничего не указано. Я бы также удалил случай с 0-краем, так как это прямое нарушение " n + 1 строк и тире (-) ".
Стьюи Гриффин
3
Задача была бы слишком простой без исключения size = 0. Часть проблемы заключается в том, чтобы найти способ объяснить это с наименьшим количеством дополнительного кода.
12Me21

Ответы:

3

Желе , 14 байт

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

Попробуйте онлайн!

Как это работает.

’⁶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 байт

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

-

Благодаря @Steadybox, комментарии к этому ответу помогли мне побрить несколько байтов в моем решении выше

Альберт Реншоу
источник
1
Мне удалось достичь 68, я был очень горд собой ... а потом прокрутил :( - Молодец!
Квентин,
1
Очень хорошо! Имейте +1
Steadybox
Я был 2*nтам дважды, и меня это беспокоит, кто-нибудь может придумать какой-нибудь умный способ как-то сократить его?
Альберт Реншоу
7

Javascript (ES6), 97 85 81 75 74 байта

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

Оказывается, я не использовал почти достаточно рекурсии

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 байт

Сохранил байт благодаря Аднану

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

Попробуйте онлайн!

объяснение

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
источник
ð×.svy¦…|ÿ\}¹>'-×»Угадай, моя идея .sне была так хороша, как я думал. Хорошее использование ÿ, не видел этого раньше.
Волшебная Урна Осьминога
@carusocomputing: я рассмотрел, .sкак начать, <Ýð×но столкнулся с проблемой в особом случае с этими методами.
Emigna
FðN×…|ÿ\}Dg'-×»для 15 байтов
Аднан
@Adnan: Хороший улов с Dg! Спасибо :)
Emigna
.sтакже привели к вложенным массивам и выравниванию, что потребовало больше байтов.
Волшебная Урна Осьминога
5

V , 18 17 16 байтов

1 байт сохранен благодаря @ nmjcman101 за использование другого способа ничего не выводить, если ввод 0

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

Попробуйте онлайн!

HexDump:

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

Объяснение (устарело)

Сначала у нас есть цикл, чтобы проверить, является ли аргумент 0. Если это так, код ниже выполняется ( |\написано). В противном случае ничего не пишется и буфер пуст.

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

Теперь, когда мы получили вершину треугольника, нам нужно создать его тело.

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

Теперь у нас есть одна дополнительная строка в нижней части буфера. Это должно быть заменено на -s.

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

Этот ответ был бы короче, если бы мы могли все, что мы хотим для ввода 0

V , 14 13 байт

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

Попробуйте онлайн!

Kritixi Lithos
источник
Я не должен был так стараться за байт. Попробуйте онлайн!
nmjcman101
@ nmjcman101 А, «конечно. Умная! :)
Kritixi Lithos
4

C #, 93 байта

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

Анонимная функция, которая возвращает треугольник ASCII в виде строки.

Полная программа с функцией ungolfed, с комментариями и контрольными примерами:

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
источник
3

Python 2 , 69 байт

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

Попробуйте онлайн!

прут
источник
Если вы печатаете его, вы можете сохранить несколько байтов, перейдя на python3, удалив "".joinи заменив его *оператором и sepаргументом в функции сна, поэтомуlambda x:print(*['|'+' '*n+'\\'for n in range(x)]+['-'*-~x*(x>0)],sep="\n")
sagiksp
3

CJam , 24 22 21 байт

Сохранено 1 байт благодаря Мартину Эндеру

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

Попробуйте онлайн!

объяснение

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 байт

INPUT N
FOR I=0TO N-1?"|";" "*I;"\
NEXT?"-"*(N+!!N)
12Me21
источник
2

PowerShell , 51 67 байт

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

Попробуйте онлайн!

(Увеличение байтов для учета отсутствия завершающего перевода строки)

Принимает данные $nи проверяет, что они ненулевые. Затем циклы, чтобы построить треугольник, и заканчивается строкой -. Неявное Write-Outputпроисходит при завершении программы.

AdmBorkBork
источник
Программа печатает завершающий символ новой строки, но я попросил, чтобы вывод был точно таким, как указано, извините!
Okx
@Okx Изменено по стоимости 16 байт.
AdmBorkBork
2

Сетчатка , 39 байт

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

Попробуйте онлайн

Преобразовать десятичный ввод в унарный. Замените каждый 1на |<N-1 spaces>\¶, распечатайте и отмените замену. Замените каждый 1дефисом, а последний дефис - двумя дефисами. Tadaa!

mbomb007
источник
2

Обыкновенный Лисп, 89 86 байт

Создает анонимную функцию, которая принимает n входных данных и печатает треугольник в *standard-output*(stdout, по умолчанию).

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

Я уверен, что мог бы сделать это как-то короче.

djeis
источник
2

C 101 93 75 байтов

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

Неуправляемая версия

void f(int n)
{
  int i;

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

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

}

@Steadybox Спасибо за указание, имеет большой смысл.

Абель Том
источник
1
Вы можете сбрить несколько байтов, заменив символьные константы их значением ASCII и переместив первый i ++ в теле цикла. А почему printf("%c",'_');так многословно?
Йенс
@Jens Stimmt, Danke Sehr :) Обновлено
Абель Том
Это может быть сокращено до 74 байтов:i;f(n){for(i=0;i++<n;)printf("%c%*c\n",124,i,92);for(;n--+1;)printf("-");}
Steadybox
До 69 байт, собственно:i;f(n){for(i=0;i++<n;)printf("|%*c\n",i,92);for(;n--+1;)printf("-");}
Steadybox
@Steadybox 68: n--+1можно сократить до~n--
Альберт Реншоу
2

Древесный уголь , 15 байт

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

Попробуйте онлайн!

Сломать

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
Майк Буфардечи
источник
Очень поздний комментарий, но закрытие »может быть опущено.
DLosc
2

Japt , 20 байт

Сохранено 2 байта благодаря @ETHproductions

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

Попробуйте онлайн!

объяснение

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
Хороший! Вы можете сохранить байты, нажав на последнюю строку до прихода: o@'|+SpX +'\Ãp'-pUÄ)·и из - за ошибки ( на самом деле непреднамеренный побочный эффект авто-функций), вы можете удалить 'в '-.
ETHproductions
На самом деле, это так со всеми строчными буквами, а не только p. Вот что вы можете сделать, например, m*2удвоить каждый элемент или mp2
возвести
2

J, 20 байт

-13 байт благодаря бобу

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

Попробуйте онлайн!

оригинал: 33 байта

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

ungolfed

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

Попробуйте онлайн!

Ион
источник
25 байтов с*,&'-' '|',.'\'{."0~_1-i.
милями
22 байта с *,&'-' '|',.' \'{~=@i.
Боб
@bob Это было очень умно, чтобы использовать матрицу идентичности
мили
@ Боб спасибо за предложение. я обновил пост
Иона
1

Python2, 73 байта

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

Полная программа. Я также пробовал интерполяцию строк для последней строки, но оказалось, что это на пару байт длиннее: /

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

Другое решение на 73 байта:

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

Контрольные примеры

0:

1:
|\
--

2:
|\
| \
---

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

6:
|\
| \
|  \
|   \
|    \
|     \
-------
Yytsi
источник
Я прошу прощения за мой предыдущий комментарий, функции теперь разрешены.
Okx
@Okx Нет проблем. Это стоит как полная программа. Я не думаю, что я буду смотреть на моду функционального решения :)
Yytsi
1

MATL , 19 байт

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

Попробуйте онлайн!

?         % 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 байт

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

объяснение

:~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
источник
1

R 101 байт

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

Этот код соответствует n=0тест-кейс, если вы только рассмотрите STDOUT!
Действительно, stopifnot(n>0)часть останавливает выполнение скрипта, ничего не отображает, STDOUTа пишет Error: n > 0 is not TRUEвSDTERR .

Ungolfed:

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

cat("-", rep("-", n), sep = "")
Фредерик
источник
1
Может быть, нужно исправить орфографию без гольфа
fəˈnɛtɪk
1

Python 2 , 62 байта

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

Попробуйте онлайн!

Печатает построчно, каждый раз добавляя еще один пробел перед обратной косой чертой. Если функция, которая не печатает, будет разрешена, она, вероятно, будет короче.

XNOR
источник
По-видимому, функции не должны печатать.
Yytsi
1

JavaScript (ES6), 71 байт

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

Выходы на консоль. Сохраните 6 байтов, если печать в оболочку SpiderMonkey JavaScript приемлема. Сохраните 13 байтов, если возвращаемый результат приемлем.

Нил
источник
Это регулярное выражение гениально. Я сначала попробовал что-то в том же духе. Я не знаю о $`шаблоне, но не знаю, подумал бы я об этом. Ницца.
Jan
1

Python 3 , 60 байт

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

Попробуйте онлайн!

Еще два решения с тем же количеством байтов.

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 байта

$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;

$"это разделитель списка, который по умолчанию равен "". $/это разделитель выходной записи, который по умолчанию равен "\ n". $_является неявной переменной цикла

Энди Лестер
источник
1
Возможно, можно было бы спасти некоторые данные, прочитав ввод с stdin? $n=<>?
Ven
1

Haskell , 82 65 байт

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

Попробуйте онлайн! Использование:

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

Или более красиво:

Prelude> putStr $ g 4
|\
| \
|  \
|   \
-----
Лайкони
источник
1

Pyth, 23 18 байт

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

Тестовый набор доступен онлайн.
Спасибо Ven за 5 байтов.

объяснение

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 Спасибо! Вы можете отрезать последний |для дополнительного байта.
Майк Буфардечи
0

Javascript 101 (полная программа), 94 (вывод функции), 79 (возврат) байтов

Полная программа

Не будет работать в Chrome (поскольку процесс, по-видимому, не существует)
Не будет работать в TIO (так как приглашение, по-видимому, не разрешено)

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

Функция с ТОЧНОЙ печатью

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

Попробуйте онлайн

Функция с возвращаемой строкой

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

Попробуйте онлайн

Повторять символы в Javascript глупо и поэтому подавляет переводы строк при выводе

fənɛtɪk
источник
0

Python 2 , 82 байта

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

Попробуйте онлайн!

Дольше, чем другой Python отвечает, но рекурсивная функция просто для того, чтобы отличаться.

Я чувствую расточительность, используя два printутверждения, но я не могу найти более короткий путь вокруг этого. Также exit()отходы 7 прекратят печатать уменьшая количество -под треугольником.

ElPedro
источник
Вы можете сделать -~c*(c>0)на последней строке, чтобы сохранить 3 байта :)
Yytsi
Или еще лучше c and-~c.
Yytsi