숫자 삼각형 인쇄


25

숫자가 주어지면 NNxN 직각 삼각형을 출력하십시오. 여기서 각 행 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 Sure.
Tan WS

0에 대한 @freekvd는 출력이없고 n> 9의 경우 특별한 형식이 필요하지 않습니다
Tan WS

아아, 내 제출을 끊었 어 최대한 빨리 해결
5

답변:


17

, 5 3 바이트 ( -t플래그의 경우 +2 또는 +3 )

글쎄, 나는 분명히 Joe의 모든 잠재력을 활용하지 않았다. 내가 이것을 처음 게시했을 때 가능했습니다.

\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

이제 Rn0에서 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

Old : 5 바이트 ( -t 플래그 포함)

1R1R

이것은 숫자를 취하는 익명 함수이며 1에서 N까지의 목록을 만듭니다.1Rn ) 해당 값을 이전 범위에 매핑하여 1에서 N 범위의 각 항목에 대해 1에서 x까지의 범위를 지정 .

-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
나는 Joe가 당신의 평균 Joe가 아니라고 생각합니다 ...
Justin

10

파이썬 3, 48 45 바이트

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

부작용을위한 후 레이.


2
아무 것도 중첩되지 않았습니다. 이제 꼬인 것입니다.
seequ

s를 역순 print으로 실행 하기 전에 함수를 넣는 것은 멋진 트릭 print입니다.
xnor

8

APL, 5

⍪⍳¨⍳⎕

벡터 1..n을 만들고 각 요소마다 다른 벡터를 만듭니다.

그런 다음 ⍪는 모든 벡터에서 열을 만듭니다. 이렇게하면 공백이 뒤 따르는 문제를 피할 수 있습니다.

tryapl.org에서 사용해보십시오


이전 솔루션 :

{⎕←⍳⍵}¨⍳⎕

벡터를 만듭니다. 1.n

{⎕ ← ⍳⍵}는 각 (¨) 요소에 대해 별도의 라인에 벡터 1..n을 출력하는 함수입니다

불행히도 tryapl.org에서는 시도 할 수 없습니다. ⎕ ←는 작동하지 않기 때문입니다.


어떤 줄에도 후행 공백이 없어야합니다.
randomra

아 고마워요, 그거보고 싶었어요. 곧 해결 될 것입니다
Moris Zucca

나는 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 : Ismael Miguel 은 함수를 정의하는 대신 입력에서 읽을 것을 제안 했으므로 PHP의 점수는 이제 53 바이트입니다.

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 바이트)
Benoit Esnard

아, 그럼 당신이 할 것이라고 가정합니다 function f($n){for($a=1;@$i++<$n;$a.=" ".($i+print"$a\n"));}.60 바이트입니다.
Austin

과연. 솔루션을 추가하기 위해 답변을 편집해도 괜찮습니까?
Benoit Esnard

1
for($a=1;$i++<$n=$_GET[n];$a.=" ".($i+print"$a\n"));-> 이것을 시도하십시오 ( n숫자와 함께 url 매개 변수 를 사용하여 전체 코드 )
Ismael Miguel

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목록 만 반환하면 VQjdaYhN8 과 같습니다.
Sp3000

2
a추가 된 목록을 반환하는 데 간단히 사용됩니다.
Optimizer

나는 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))입니다.
Jakube

또는 심지어 mhdhN완전히 다른 접근 방식입니다.
Jakube

4

자바 스크립트 (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 콘솔입니다.
Optimizer

4

자바, 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
        ));
}

Bigtoes / Geobits 덕분에 1 바이트


당신은 이동하여 하나를 저장할 수 있습니다 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

파이썬 2- 62 54 65 바이트

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

숫자 n는 변수에 초기화되지 않고 프로그램에 입력으로 제공되어야합니다.
Zgarb

힌트 주셔서 감사합니다. 그것에 대해 확신하지 못했습니다.
pepp

2
죄송합니다. 더 명확해야했습니다. 내가 의미하는 것은 당신이 실제로 정의해야한다는 것입니다 N수행하여 N=input()프로그램이 같은 실행할 수 있습니다 그래서, 또는 이와 유사한. 다음 은 주제에 대한 메타 토론입니다.
Zgarb

그래서 이것이 맞을까요?
pepp

지금 좋아 보인다!
Zgarb

3

J, 9 자

암묵적인 동사로.

[:":\1+i.
  • i. y-에서 숫자 0y - 1.
  • 1 + i. y-에서 숫자 1y.
  • ": yy문자열로 표시 되는 벡터
  • ":\ y– 각 접두사 y는 문자열 로 표시됩니다.
  • ":\ 1 + i. y– 숫자의 각 접두사 가 문자 행렬 1y표시됩니다.

이제는 꽤 똑똑합니다. +1
seequ

이것은 더 J-esque이지만 각 줄에 후행 공백이 없다는 규칙을 위반하지 않습니까?
마일

@miles Indeed it does! Anything else would be very complicated.
FUZxxl

3

><> (Fish), 40 37 + 3 = 40 bytes

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

Once again, ><> does decently well at another number printing exercise. Run with the -v flag for input, e.g.

py -3 fish.py -v 4

Explanation

&               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 (with no loops, yeah!) - 72 bytes

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

This creates a function r(n) that can be used this way:

main(){ r(5); }

See it in action, here on tutorialspoint.com

It requires a very few tricks easily explained. I think it can be greatly improved.


1
Actually it's 75 bytes, not 74. However, you can cut it down to 72 bytes by replacing ' ' with 32 and '\n' with 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
Pretty nice trick, thanks!
A. Breust

Thanks! I did my best to one up you in the C category, but I couldn't make anything shorter! So I decided to shorten yours instead.
FatalSleep

64 bytes 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

For answers on this site, you should write a complete program or function. And you should print the result to stdout, or return them from a function. N should be read from input or taken as a function parameter, not predefined as a variable.
jimmy23013

@user23013 OK,fixed!
Kasramvd

The function definition needs to be included in the byte count, so I don't think this is 61. It's probably in your best interest to call the function something short, like p. On another note, you can remove two spaces - one between print and '\n' and the other between ))) and for.
Sp3000

@Sp3000 OK,thanks for attention! fixed!;)
Kasramvd

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

2

Perl, 28

Reads the parameter from stdin.

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

From the command line:

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

but I don't now how to count that (probably between 25 and 29).


1

Python

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

1
Doesn't this fail if N >= 10?
seequ

@Sieg Yes you're right. I just learning Python, was looking for way to convert list of int to list of strings.
bacchusbeale

63 bytes: for i in range(int(input())):print(' '.join("123456789"[:i+1])) - Note that strings are treated as lists.
seequ


1

Clip, 16

Jm[ijkw,1iwS},1n

Explanation

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

Go, 93 81 78 93 90 bytes

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

Current ungolfed

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
}

If we need to handle N > 9 we can use the following at 78 bytes, however it requires importing the fmt package.

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

If we include the import statement I'm now back at my initial 93 92 90 bytes

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

Test it online here: http://play.golang.org/p/BWLQ9R6ilw

The version with fmt is here: http://play.golang.org/p/hQEkLvpiqt


I'm not sure how I feel about the string cast, but any attempts to turn it into a byte array just makes it longer
Kristoffer Sall-Storgaard

The main problem I see is that it doesn't work for n>9. You can save a byte by changing != to >, though.
Geobits

@Bigtoes, fixed now, I dont know if I'm supposed to count the import statement though
Kristoffer Sall-Storgaard

I know they're counted for the languages I'm more familiar with, so most likely yes. Sucks, I know :)
Geobits

1

ZX / Sinclair BASIC - 39 bytes

ZX Basic uses 1 byte per keyword (all the uppercase words), so helps to keep the byte size down a bit...

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

Using n = 8

enter image description here


1
Nice. But ZX basic uses 6 more hidden bytes for each numeric literal (a common trick was VAL("1") (6 bytes as VAL is 1) insted of 1 (7 bytes))
edc65

1

R, 28

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

The output is incorrect for an input value of 0. Also, it's unclear whether the leading [1] on each line is in violation of the spec.
Alex A.

@AlexA. if you look closely at the question you'll see my comment asking what behavior should be for n=0. But thanks for pointing me in the right direction!
freekvd

I saw the comment. The thing is that this doesn't print nothing for 0, it prints 1; 1 0. (Pretend ; is a line break.)
Alex A.

You might want to also consider using cat(1:i,"\n"). Even though it's slightly longer than print(1:i), it doesn't include a leading [1] on each line.
Alex A.

1

TI-Basic, 28 bytes

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

1
This does not output as the format indicates; rather, the array is displayed, brackets and all, on the homescreen.
lirtosiast

1

C, 89 characters

// 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("");}}

To eliminate confusion about puts("");. This simply prints a newline character (as seen here):

Notice that puts not only differs from fputs in that it uses stdout as destination, but it also appends a newline character at the end automatically (which fputs does not).

I got it slightly shorter with @TheBestOne's java algorithm:

// 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"))
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.