Друк трикутник


25

Враховуючи число N, виведіть прямокутний трикутник NxN, де кожен рядок iзаповнений цифрами до i.

Приклад

n = 0

(немає виходу)

n = 4

1
1 2
1 2 3
1 2 3 4

n = 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 Впевнений, якщо результат правильний.
Tan 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
@Optimizer Оптимізація важлива.
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щоб виконати prints у зворотному порядку.
xnor

8

APL, 5

⍪⍳¨⍳⎕

створює вектор 1..n і для кожного елемента інший такий вектор.

Тоді ⍪ робить стовпчик з усіх векторів. Це дозволяє уникнути проблеми із задніми заготовками.

Спробуйте це на tryapl.org


Старіше рішення:

{⎕←⍳⍵}¨⍳⎕

Створює вектор 1..n

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

На жаль, цього не можна спробувати на tryapl.org, оскільки ⎕ ← там не працює.


У жодному рядку не повинно бути пробілів.
випадкова

а, дякую, я пропустив це. Буде виправлено незабаром
Моріс Зукка

Я знав, що APL буде рішенням
Conor O'Brien

О Боже, що бачать мої очі
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";}

Просто для розваги, нерекурсивні fucntions:

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коротко використовується для повернення доданого списку.
Оптимізатор

Я не знайомий з Pyth, тож ви могли б пояснити, чому 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, які це сприймають
Kristoffer Sall-Storgaard

@ KristofferSall-Storgaard Firefox підтримує ES6 за замовчуванням. Отже, консоль Firefox.
Оптимізатор

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+=...).
Геобіц

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

Пітон 2 - 62 54 65 байт

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

Цифру nслід вказати як вхід до програми, а не ініціалізувати змінною.
Згарб

Дякую за підказку. Не був у цьому впевнений.
pepp

2
Вибачте, я мав би бути зрозумілішим. Що я мав на увазі, це те, що ви повинні насправді визначитись N, виконуючи N=input()щось подібне, щоб ваша програма могла працювати як така. Ось мета дискусія з цієї теми.
Згарб

Так це було б правильно, правда?
pepp

Зараз добре виглядає!
Згарб

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
Дуже приємний трюк, дякую!
А. Брест

Спасибі! Я зробив все можливе, щоб перемогти вас у категорії C, але я не зміг зробити щось коротшим! Тож я вирішив замість вашого скоротити.
FatalSleep

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

Пітон 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

Для відповідей на цьому веб-сайті слід написати повну програму або функцію. І слід надрукувати результат у stdout або повернути їх з функції. 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

Перл, 28

Читає параметр з stdin.

@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


Я не впевнений, як я ставлюся до передачі рядків, але будь-які спроби перетворити його на байтовий масив просто затягують його
Kristoffer Sall-Storgaard

Основна проблема, яку я бачу, полягає в тому, що вона не працює для n> 9. Ви можете зберегти байт, перейшовши !=на >.
Геобіт

@ Bigtoes, виправлено зараз, я не знаю, чи повинен я вважати importзаяву, хоча
Kristoffer Sall-Storgaard

Я знаю, що їх розраховують за більш відомі мені мови, тому, швидше за все, так. Відстій, я знаю :)
Геобіц

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

enter image description here


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

1

R, 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
Це не виводиться як показує формат; скоріше, масив відображається, дужки та все, на головному екрані.
ліртосіаст

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("");. Це просто надрукує символ нового рядка (як видно тут ):

Зауважте, що ставка відрізняється не лише від 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(""); does nothing. You can use char b[999]="" instead of char b[999]={0} to save 1 character.
mch

2
puts(""); prints a newline character.
Felix Bytow

1

Perl: 34 characters

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

This code gets the input number supplied through the special variable $_.


1
Most brackets are redundant here: print"@$_\n"for map[1..$_],1..$_ also works.
nutki

I adjusted the code.
Felix Bytow

1

C# - 94 bytes

Written as an anonymous function that returns a string, which doesn't seem to be disallowed by the spec.

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

Here's an ungolfed version (comments are read in BDCA order):

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 bytes

seq $1|sed "x;G;s/\n/ /;h"
  • seq simply generates the numbers 1 to n
  • sed saves the entire output for a given line in the hold space, and then appends the next line to it.

1

Haskell, 62 57 bytes

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

Point-free style. Usage example:

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

Doing e=enumFromTo 1 saves 7 bytes.
Zgarb

@Zgarb: Thanks, but if I swap out enumFromTo 1, I have to give the main function a name, too, so it's 5 bytes. Without the name it would be a let construct: let e=enumFromTo 1 in (putStr.unlines.map(unwords.map show.e).e) 5
nimi


1

Scala, 73 65 62 bytes

(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.