Распечатать номер треугольника


25

Для Nзаданного числа выведите NxN прямоугольный треугольник, где каждая строка iзаполнена числами до i.

пример

n = 0

(нет выхода)

n = 4

1
1 2
1 2 3
1 2 3 4

п = 10

1
1 2
1 2 3
.
.
.
1 2 3 4 5 6 7 8 9 10

(выравнивание не требуется)

n = N

1
1 2
1 2 3
.
.
.
1 2 3 4 .... N

В конце каждой строки нет пробела.

Наименьшее количество байтов побеждает, и стандартные лазейки не допускаются.


Может ли вывод быть вложенным списком чисел?
Seequ

Каким должно быть поведение при n = 0 и при n> 9?
freekvd

@ Sieg Конечно, пока вывод правильный.
Тан WS

@freekvd для 0 не выводится, для n> 9 не требуется специального форматирования
Tan WS

Ах, черт возьми, ты нарушил мое представление. Исправление как можно скорее
seequ

Ответы:


17

Джо , 5 3 байта (+2 или +3 для -tфлага)

Ну, очевидно, я не использовал весь потенциал Джо. Это было возможно еще тогда, когда я впервые опубликовал это.

\AR

Здесь Rдает диапазон от 0 до n, эксклюзив. Затем \Aпринимает последовательные префиксы этого ( Aфункция идентичности). Примеры:

С -tфлагом (примечание: теперь это стандартный вывод даже без флага):

   (\AR)5
0
0 1
0 1 2
0 1 2 3
0 1 2 3 4
   \AR5
0
0 1
0 1 2
0 1 2 3
0 1 2 3 4
   \AR2
0
0 1
   \AR1
0
   \AR0

Без этого:

   \AR5
[[0], [0, 1], [0, 1, 2], [0, 1, 2, 3], [0, 1, 2, 3, 4]]
   (\AR)5
[[0], [0, 1], [0, 1, 2], [0, 1, 2, 3], [0, 1, 2, 3, 4]]
   \AR2
[[0], [0, 1]]
   \AR1
[[0]]
   \AR0
[]

Правила немного изменились. Мой старый код не работал правильно с N = 0. Кроме того, теперь выходные данные могут быть просто вложенным списком, поэтому -tих можно отбросить.

1R1+R

Теперь Rnдает диапазон от 0 до n, эксклюзив. Если задано 0, возвращается пустой список. 1+добавляет 1 к каждому элементу этого диапазона. 1Rсопоставляет значения с диапазонами от 1 до x. Пустые лиаты, при отображении возвращают пустые списки.

Пример вывода:

   1R1+R0
[]
   1R1+R5
[[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4, 5]]

Обновление: я только что заметил что-то. Функция автоматически сопоставляется с рангом 0 элементов. Следующий пример запускается с -tфлагом.

   1R1+R3 5 8
1
1 2
1 2 3

1
1 2
1 2 3
1 2 3 4
1 2 3 4 5

1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
1 2 3 4 5 6
1 2 3 4 5 6 7
1 2 3 4 5 6 7 8

Старый: 5 байт (с -tфлагом)

1R1R

Это анонимная функция, которая принимает число, создает список от 1 до N ( 1Rn) и отображает эти значения в предыдущий диапазон, давая диапазон от 1 до x для каждого элемента в диапазоне от 1 до N.

-tФлаг дает выходной сигнал в виде J-подобной таблицы.

   1R1R5
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5

Примечание: язык очень новый и не полный, но перед этим испытанием была выпущена последняя версия.


4
Значит, J было недостаточно для того, чтобы иметь преимущество в задачах на основе массива? : D
Оптимизатор

4
@ Оптимизатор Оптимизация важна.
Seequ

4
Внезапно мой самый голосующий ответ - тот, на который я потратил меньше всего времени. Несправедливость
seequ

1
Я думаю, Джо не ваш средний Джо ...
Джастин

10

Python 3, 48 45 байт

f=lambda n:n and[f(n-1),print(*range(1,n+1))]

Ура для побочных эффектов.


2
Вложенное ничто. Теперь это искажено.
seequ

Это отличный трюк: поставить функцию перед тем , printчтобы выполнить printс в обратном порядке.
xnor

8

APL, 5

⍪⍳¨⍳⎕

создает вектор 1..n и для каждого элемента другой такой вектор.

Тогда ⍪ делает столбец из всех векторов. Это позволяет избежать проблемы с конечными пробелами.

Попробуйте это на tryapl.org


Старое решение:

{⎕←⍳⍵}¨⍳⎕

Создает вектор 1..n

{⎕ ← ⍳⍵} - это функция, которая выводит для каждого (¨) элемента вектор 1..n в отдельной строке

К сожалению, этого нельзя попробовать на tryapl.org, потому что ⎕ ← там не работает.


Там не должно быть никаких пробелов в любой строке.
Рандомра

ах спасибо, я скучал по этому. Скоро
исправлю

Я знал, что APL будет решением
Конор О'Брайен

О Боже, что видят мои глаза
Codefun64

6

J, 27 байт

J не подходит для числового вывода без массива. Эта функция создает правильно отформатированную строку из чисел.

   ;@(<@,&LF@":@:>:@:i.@>:@i.)

   (;@(<@,&LF@":@:>:@:i.@>:@i.)) 4
1
1 2
1 2 3
1 2 3 4

Попробуйте это онлайн здесь.


Вы также можете использовать, ]\@i.чтобы получить;@(<@,&LF@":@:>:@:]\@i.)
seequ

6

PHP, 53 байта

Изменить 2: Исмаэль Мигель предложил читать из ввода вместо определения функции, поэтому оценка теперь составляет 53 байта для PHP:

for($a=1;@$i++<$n=$argv[1];$a.=" ".($i+print"$a\n"));

И еще раз, это может быть улучшено, если PHP настроен на игнорирование ошибок (52 байта):

for($a=1;$i++<$n=$argv[1];$a.=" ".($i+print"$a\n"));
for($a=1;$i++<$n=$_GET[n];$a.=" ".($i+print"$a\n"));

Редактировать: Остин предложил 60-байтовую версию в комментариях:

function f($n){for($a=1;@$i++<$n;$a.=" ".($i+print"$a\n"));}

Что можно улучшить, если мы не отображаем ошибки PHP (59 байт):

function f($n){for($a=1;$i++<$n;$a.=" ".($i+print"$a\n"));}

$aхранит следующую строку, которая будет напечатана, и каждый раз, когда она печатается, пробел и следующий номер ( printвсегда возвращается 1) конкатенируются к нему.


Рекурсивные функции (65 байт):

function f($n){$n>1&&f($n-1);echo implode(' ',range(1,$n))."\n";}
function f($n){$n>1&&f($n-1);for(;@$i++<$n;)echo$i,' ';echo"\n";}   // Using @ to hide notices.

Более короткая рекурсивная функция с отключенным сообщением об ошибках (64 байта):

function f($n){$n>1&&f($n-1);for(;$i++<$n;)echo$i,' ';echo"\n";}

Еще более короткая рекурсивная функция с отключенным сообщением об ошибках и пустой строкой перед реальным выводом (62 байта):

function f($n){$n&&f($n-1);for(;$i++<$n;)echo$i,' ';echo"\n";}

Просто для удовольствия, нерекурсивные функции:

function f($n){for($i=0;$i<$n;print implode(' ',range(1,++$i))."\n");}    // 70 bytes
function f($n){for(;@$i<$n;print implode(' ',range(1,@++$i))."\n");}      // 68 bytes, hiding notices.
function f($n){for(;$i<$n;print implode(' ',range(1,++$i))."\n");}        // 66 bytes, error reporting disabled.

2
45 байтов:for($a=1;@$i<$n;$a.=" ".(@++$i+print"$a\n"));
Остин

@Austin: Я прочитал в комментарии, что код должен быть либо полным чтением программы с ввода, либо функцией. Очень хороший трюк, его можно улучшить бит / байт: for($a=1;@$i++<$n;$a.=" ".($i+print"$a\n"));(44 байта)
Бенуа Эснард

Ах, хорошо, тогда я полагаю, вы бы сделали function f($n){for($a=1;@$i++<$n;$a.=" ".($i+print"$a\n"));}, что составляет 60 байтов.
Остин

Верно. Вы в порядке, если я отредактирую свой ответ, чтобы добавить ваше решение?
Бенуа Эснард

1
for($a=1;$i++<$n=$_GET[n];$a.=" ".($i+print"$a\n"));-> попробуйте это (полный код, используя параметр url nс номером)
Исмаэль Мигель

5

CJam, 13 12 байт

ri{),:)S*N}/

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

ri{       }/     "Run the block input number of times with iteration index from 0 to N-1";
   )             "Increment the iteration index (making it 1 to N)";
    ,            "Get an array of 0 to iteration index";
     :)          "Increment each of the above array members by 1";
       S*        "Join all above array numbers with space";
         N       "Add a new line. After all iterations, things are automatically printed";

Попробуйте онлайн здесь


4

Pyth, 9 байт

VQjdr1hhN

Действительно думал, что это можно сделать короче, но это не так.

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

            Q = input()
VQ          For N in [0, 1, ..., Q-1]:
    r1hhN       create list [1, ..., N+1+1-1]
  jd            print joined with spaces

1
Альтернатива 9: VQaYhNjdY. Если бы только aвернули список, то что-то вроде VQjdaYhNбы было 8.
Sp3000

2
aкратко используется для возврата в добавленный список.
Оптимизатор

Я не знаком с Пифом, поэтому не могли бы вы объяснить, почему N+1+1-1?
Seequ

1
@Sieg r- это функция диапазона Python, поэтому -1 ( r1Nсоздает список [1, 2, ..., N-1]). Но в N-й итерации цикла мне нужен список [1, 2, ..., N+1], поэтому мне нужно добавить 2к N. r1hhNпереводит прямо в range(1, N+1+1). Другая возможность будет r1+N2( range(1, N+2)).
Якуб

Или даже mhdhN, но это совершенно другой подход.
Якуб

4

JavaScript (ES6) 49 52

Такая простая задача, мне интересно, можно ли это сделать короче в JS (Обновление: да, с помощью рекурсии)

Рекурсивный 49

f=n=>alert((r=w=>n-i++?w+'\n'+r(w+' '+i):w)(i=1))

Итераив 52

f=n=>{for(o=r=i=1;i++<n;o+='\n'+r)r+=' '+i;alert(o)}

Где я могу проверить это? Кажется, я не могу найти какие-либо игровые площадки ES6, которые бы принимали это
Кристоффер Салл-Сторгард

@ KristofferSall-Storgaard Firefox поддерживает ES6 по умолчанию. Итак, Firefox Console.
Оптимизатор

4

Java, 85 84 байта

Это удивительно мало в Java.

void a(int a){String b="";for(int c=0;c++<a;System.out.println(b+=(c>1?" ":"")+c));}

Отступ:

void a(int a){
    String b="";
    for(int c=0;
        c++<a;
        System.out.println(
                b+=(c>1?" ":"")+c
        ));
}

1 байт благодаря Bigtoes / Geobits


Вы можете сохранить один, перемещая b+=...в println(b+=...).
Geobits

3

Пролог - 119

h(N):-setof(X,(between(1,N,K),setof(Y,between(1,K,Y),X)),[L]),k(L),nl,fail.
k([A|B]):-write(A),(B=[];write(" "),k(B)).

3

Python 2 - 62 54 65 байт

def f(n):
 for x in range(n):print' '.join(map(str,range(1,x+2)))

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

Спасибо за подсказку. Не был уверен в этом.
Пепп

2
Извините, мне следовало быть понятнее. Я имел в виду, что вы должны на самом деле определить N, делая N=input()или что-то подобное, чтобы ваша программа могла работать как таковая. Вот мета-обсуждение по теме.
Згарб

Так что это будет правильно, верно?
Пепп

Хорошо выглядит сейчас!
Згарб

3

J, 9 символов

Как молчаливый, монадический глагол.

[:":\1+i.
  • i. y - числа от 0 до y - 1.
  • 1 + i. y - числа от 1 до y.
  • ": y - вектор y представленный в виде строки.
  • ":\ y - каждый префикс y представлен в виде строки.
  • ":\ 1 + i. y- каждый префикс чисел от 1до yпредставлен в виде матрицы символов.

Теперь это довольно умно. +1
seequ

Это скорее J-esque, но не нарушает ли правило, что в каждой строке нет пробелов?
мили

@ Miles Это действительно так! Все остальное было бы очень сложно.
FUZxxl

3

> <> (Рыба) , 40 37 + 3 = 40 байт

&1>:&:&)?;1\
(?v:n" "o1+>}:{:@
ao\~1+

Еще раз,> <> неплохо справляется с другим упражнением по печати чисел. Запустите с -vфлагом для ввода, например

py -3 fish.py -v 4

объяснение

&               Put n in register
1               Push 1 (call this "i")

[outer loop]

:&:&)?          If i > n...
;                 Halt
1                 Else push 1 (call this "j")

[inner loop]

}:{:@(?         If j > i...
~1+ao             Pop j, print newline, increment i and go to start of outer loop
:n" "o1+          Else print j, print a space, increment j and go to start of inner loop

3

C (без петель, да!) - 72 байта

b(n,c){if(n){b(n-1,32);printf("%d%c",n,c);}}r(n){if(n){r(n-1);b(n,10);}}

Это создает функцию, r(n)которую можно использовать следующим образом:

main(){ r(5); }

Посмотрите это в действии, здесь на tutorialspoint.com

Требуется очень мало трюков, которые легко объяснить. Я думаю, что это может быть значительно улучшено.


1
На самом деле это 75 байтов, а не 74. Однако вы можете сократить его до 72 байтов, заменив '' на 32, а '\ n' на 10:b(n,c){if(n){b(n-1,32);printf("%d%c",n,c);}}r(n){if(n){r(n-1);b(n,10);}}
FatalSleep

1
Довольно хороший трюк, спасибо!
А. Брест

Благодарность! Я сделал все возможное, чтобы поднять вас в категории С, но я не мог сделать ничего короче! Поэтому я решил сократить ваш вместо.
FatalSleep

b(n,c){n&&b(n-1,32)^printf("%d%c",n,c);}r(n){n&&r(n-1)^b(n,10);} Wandbox на
o79y

2

Python 2 - 72

>>> def p(N):print'\n'.join(' '.join(map(str,range(1,i+2)))for i in range(N))
... 
>>> p(5)
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5

Для ответов на этом сайте, вы должны написать полную программу или функцию. И вы должны напечатать результат в стандартный вывод или вернуть их из функции. N следует читать из ввода или принимать как параметр функции, а не предопределять как переменную.
jimmy23013

@ user23013 ОК, исправлено!
Касрамвд

Определение функции должно быть включено в число байтов, так что я не думаю, что это 61. Вероятно, в ваших же интересах вызвать функцию как-нибудь коротко, например p . С другой стороны, вы можете удалить два пробела - один между printи, '\n'а другой между )))и for.
Sp3000

@ Sp3000 Хорошо, спасибо за внимание! исправлено !;)
Касрамвд

72:def p(N):print'\n'.join(' '.join(map(str,range(1,i+2)))for i in range(N))
seequ

2

Perl, 28

Читает параметр из стандартного ввода.

@x=1..$_,print"@x
"for 1..<>

Из командной строки:

perl -E'$,=$";say 1..$_ for 1..<>'

но я не знаю, как считать это (вероятно, между 25 и 29).


1

питон

import string
N,s=int(input()),list(string.digits)
for i in range(1,N+1):
    print(' '.join(s[1:i+1]))

1
Разве это не терпит неудачу, если N> = 10?
seequ

@ Sieg Да, ты прав. Я только изучал Python, искал способ конвертировать список int в список строк.
bacchusbeale

63 байта: for i in range(int(input())):print(' '.join("123456789"[:i+1]))- Обратите внимание, что строки обрабатываются как списки.
seequ


1

клип , 16

Jm[ijkw,1iwS},1n

объяснение

J                   .- join with newlines                           -.
 m[i        },1n    .- map numbers from 1 to numeric value of input -.
    jkw   wS        .- join with spaces                             -.
       ,1i          .- numbers from 1 to index                      -.

1

Идти, 93 81 78 93 90 байт

func r(n int)(s string){s=string(n+48);if n!=1{s=r(n-1)+" "+s};println(s);return}

Текущий негольфированный

func r(n int) (s string) {
    // Convert n to a string, we do not have to initialize s since
    // we hijacked the return value.
    // Numbers in the ascii table starts at 48
    s = string(n | 48)
    // Unless we are on our last iteration, we need previous iterations,
    // a space and our current iteration
    if n != 1 {
        // Collect the result of previous iteration for output
        s = r(n-1) + " " + s
    }
    println(s)
    // We can use a naked return since we specified the
    // name of our return value in the function signature
    return
}

Если нам нужно обработать N> 9, мы можем использовать следующее в 78 байтах, однако это требует импорта fmt пакета.

func r(n int)(s string){s=Sprint(n);if n!=1{s=r(n-1)+" "+s};Println(s);return}

Если мы включим оператор импорта, я вернусь к моей первоначальной 93 92 90 байт

import."fmt";func r(n int)(s string){s=Sprint(n);if n>1{s=r(n-1)+" "+s};Println(s);return}

Проверьте это онлайн здесь: http://play.golang.org/p/BWLQ9R6ilw

Версия с fmtздесь: http://play.golang.org/p/hQEkLvpiqt


Я не уверен, что я чувствую по отношению к приведению строки, но любые попытки превратить его в массив байтов просто
удлиняют

Основная проблема, которую я вижу, состоит в том, что она не работает для n> 9. Вы можете сохранить байт, изменив !=на >.
Geobits

@Bigtoes, исправлено сейчас, я не знаю, если я должен считать importзаявление, хотя
Кристоффер Салл-Сторгард

Я знаю, что они рассчитаны на языки, с которыми я более знаком, так что, скорее всего, да. Отстой, я знаю :)
Geobits

1

ZX / Sinclair BASIC - 39 байт

ZX Basic использует 1 байт на ключевое слово (все заглавные слова), поэтому помогает немного уменьшить размер байта ...

1 INPUT n:FOR i=1 TO n:FOR j=1 TO i:PRINT j;" ";:NEXT j:PRINT:NEXT i

Используя n = 8

введите описание изображения здесь


1
Ницца. Но ZX basic использует еще 6 скрытых байтов для каждого числового литерала (общий трюк был VAL("1")(6 байтов, поскольку VAL равен 1), вставлен из 1(7 байтов))
edc65

1

Р, 28

for(i in 1:scan())print(1:i)

Вывод неверен для входного значения 0. Кроме того, неясно, является ли ведущий [1]в каждой строке нарушением спецификации.
Алекс А.

@AlexA. если вы внимательно посмотрите на вопрос, вы увидите мой комментарий, спрашивающий, какое поведение должно быть при n = 0. Но спасибо, что указал мне правильное направление!
freekvd

Я видел комментарий. Дело в том, что это ничего не печатает для 0, оно печатает 1; 1 0. (Притворись, ;что это разрыв строки.)
Алекс А.

Вы можете также рассмотреть возможность использования cat(1:i,"\n"). Несмотря на то, что он немного длиннее print(1:i), он не включает в себя ведущие [1]в каждой строке.
Алекс А.

1

TI-Basic, 28 байтов

Input N
For(I,1,N
randIntNoRep(1,N->L1
SortA(L1
Disp L1
End

1
Это не выводится, как указывает формат; скорее, массив отображается, скобки и все, на домашнем экране.
lirtosiast

1

C, 89 символов

// 90 characters
f(int n){int a=1,b;for(;n--;++a){for(b=0;b<a;++b)printf("%c%d",(!!b)*' ',b+1);puts("");}}

Чтобы устранить путаницу по поводу puts("");. Это просто печатает символ новой строки (как видно здесь ):

Обратите внимание, что put не только отличается от fputs тем, что он использует stdout в качестве места назначения, но также автоматически добавляет символ новой строки в конце (чего не делает fputs).

Я получил немного короче с Java-алгоритмом @ TheBestOne:

// 89 characters
f(int a){char b[999]="",*p=b+1;int c=0;for(;a--&&(sprintf(b,"%s %d",b,++c)&&puts(p)););}

puts("");ничего не делает. Вы можете использовать char b[999]=""вместо того, char b[999]={0}чтобы сохранить 1 символ.
Мч

2
puts("");печатает символ новой строки.
Феликс Бытов

1

Perl: 34 символа

print"@$_\n"for map[1..$_],1..$_;

Этот код получает входной номер, указанный через специальную переменную $_.


1
Большинство скобок здесь избыточны: print"@$_\n"for map[1..$_],1..$_тоже работает.
nutki

Я скорректировал код.
Феликс Бытов

1

C # - 94 байта

Написано как анонимная функция, которая возвращает строку, которая не запрещена спецификацией.

n=>String.Join("\n\n",Enumerable.Range(1,n).Select(l=>String.Join(" ",Enumerable.Range(1,l))))

Вот негольфированная версия (комментарии читаются в порядке BDCA):

n =>
    String.Join("\n\n",                    //...then join it together with newlines.
        Enumerable.Range(1, n).Select(l => //For each l from 1 to n, ...
                String.Join(" ",              //...and join it with spaces, ...
                    Enumerable.Range(1, l)    //...get the range from 1 to l, ...

1

Bash + coreutils, 26 байт

seq $1|sed "x;G;s/\n/ /;h"
  • seq просто генерирует числа от 1 до п
  • sed сохраняет весь вывод для данной строки в области удержания, а затем добавляет к ней следующую строку.

1

Haskell, 62 57 байт

e=enumFromTo 1
f=putStr.unlines.map(unwords.map show.e).e

Бессмысленный стиль. Пример использования:

Prelude> f 5
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5

Это e=enumFromTo 1экономит 7 байтов.
Згарб

@Zgarb: Спасибо, но если я поменяюсь enumFromTo 1, я тоже должен дать имя главной функции, так что это 5 байт. Без названия это была бы letконструкция:let e=enumFromTo 1 in (putStr.unlines.map(unwords.map show.e).e) 5
nimi

1

Математика, 32

Print@Row[Range@i," "]~Do~{i,#}&

1
Как насчет TableForm[Range/@Range@#]&?
Мартин Эндер

1
Короче:Grid[Range/@Range@#]&
алефальфа

И это даже выглядит лучше. :) (Я постоянно забываю Grid.)
Мартин Эндер

Но я не уверен, что в конце каждой строки нет пробела.
алефальфа

О, хороший вопрос. :(
Мартин Эндер

1

Scala, 73 65 62 байта

(n:Int)=>print(1 to n map(1 to _ mkString " ") mkString "\n")

Ungolfed

def printNumberTriangle(n: Int): Unit = {
  def rowString(m: Int): String = 1.to(m).mkString(" ")
  print(1.to(n).map(rowString).mkString("\n"))
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.