打印三角形


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

啊,该死的,你打破了我的提议。尽快解决
参阅

Answers:


17

Joe5 3个字节(-t标志为+2或+3 )

好吧,显然我没有充分利用乔的全部潜力。当我第一次发布时,这是可能的。

\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级元素。以下示例与-tflag一起运行。

   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到N的每个项提供从1到x的范围。

-t标志将输出显示为类似J的表。

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

注意:该语言是非常新的语言,并不完整,但是在此挑战之前已发布了最新版本。


4
那么J不足以在基于阵列的挑战中占据优势吗?:D
Optimizer

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

这是一个很巧妙的技巧:将函数放在之前,printprint相反的顺序执行s。
xnor

8

APL,5

⍪⍳¨⍳⎕

创建一个向量1..n,并为每个元素创建另一个向量。

然后⍪在所有向量中组成一列。这避免了尾随空白的问题。

tryapl.org尝试


较旧的解决方案:

{⎕←⍳⍵}¨⍳⎕

创建一个向量1..n

{⎕←⍳⍵}是一个函数,它为每个(¨)元素在单独的行上输出向量1..n

遗憾的是,无法在tryapl.org上尝试使用此命令,因为⎕←在该处不起作用。


任何行中都不应有尾随空格。
randomra 2015年

啊,谢谢,我想念那一个。将纠正很快
莫里斯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"));
奥斯汀

@奥斯汀:我读过一段评论,说代码必须是从输入中读取的完整程序,或者是一个函数。非常棒的技巧,可以提高一点点/字节: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个字节。
奥斯汀

确实。如果我编辑我的答案以添加您的解决方案,您还可以吗?
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返回的列表,然后像VQjdaYhN将8
SP3000

2
a简要地用于返回附加列表。
Optimizer

我对Pyth不熟悉,所以您能详细说明为什么N+1+1-1吗?
Seequ 2015年

1
@Sieg r是Python范围函数,因此是-1(r1N创建list [1, 2, ..., N-1])。但是在循环的第N次迭代中,我需要列表[1, 2, ..., N+1],因此需要添加2Nr1hhN直接翻译成range(1, N+1+1)。另一种可能性是r1+N2range(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控制台。
Optimizer

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 2015年

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应作为程序输入,而不是在变量中初始化。
Zgarb 2015年

感谢您的提示。对此不确定。
pepp 2015年

2
抱歉,我应该更清楚了。我的意思是,您实际上必须N通过执行操作N=input()或类似操作进行定义,以便您的程序可以这样运行。是关于该主题的元讨论。
Zgarb 2015年

所以这是正确的,对吗?
pepp

现在看起来不错!
Zgarb 2015年

3

J,9个字符

作为默认的单子动词。

[:":\1+i.
  • i. y–从0到的数字y - 1
  • 1 + i. y–从1到 的数字y
  • ": yy表示为字符串的向量。
  • ":\ y–每个前缀y表示为一个字符串。
  • ":\ 1 + i. y–从1到的数字的每个前缀y表示为字符矩阵。

现在,这很聪明。+1
Seequ 2015年

这更像J风格,但这不违反每行上都没有尾随空格的规则吗?
英里

@miles确实如此!其他任何事情都会非常复杂。
FUZxxl

3

> <>(Fish)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个字节。但是,您可以通过将''替换为32并将'\ n'替换为10来将其缩减为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);}}
FatalSleep

1
不错的技巧,谢谢!
A. Breust

谢谢!我竭尽所能在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

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

有关本网站上的答案,您应该编写完整的程序或功能。您应该将结果打印到stdout,或从函数返回它们。应从输入中读取N或将其作为功能参数,而不应将其预定义为变量。
jimmy23013 2015年

@ user23013 OK,已修复!
Kasramvd 2015年

该函数定义需要包含在字节数中,因此我不认为这是61。调用该函数之类的简短名称可能是您的最大利益p。在另一方面,你可以删除两个空间-一个与print'\n'之间的其他)))for
Sp3000

@ Sp3000好,谢谢关注!已修正!;)
Kasramvd

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 2015年

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 2015年

我看到的主要问题是它不适用于n> 9。您可以通过将更!=改为来保存一个字节>
Geobits 2015年

@Bigtoes,现在固定的,我不知道我应该算import虽然声明
的Kristoffer萨勒- Storgaard

我知道他们会被我更熟悉的语言统计在内,因此很可能是这样。很烂,我知道:)
Geobits 2015年

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基本版为每个数字文字使用了6个更多的隐藏字节(一个常见的技巧是VAL("1")(6个字节,VAL为1)插入了1(7个字节))
edc65 2015年

1

R,28

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

输入值为0时,输出不正确。此外,还不清楚[1]每行的开头是否违反规范。
亚历克斯·

@AlexA。如果您仔细观察这个问题,您会看到我的评论,询问n = 0时应该采取什么行为。但是,感谢您为我指明了正确的方向!
freekvd 2015年

我看到了评论。问题是这不会为0打印任何内容,而是打印1; 1 0。(假装;是换行符。)
Alex A.

您可能还需要考虑使用cat(1:i,"\n")。即使比稍长print(1:i),也不[1]在每行上都包含一个引线。
Alex A.

1

TI-Basic,28个字节

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

1
不会按照格式指示输出;而是在主屏幕上显示该数组,括号和所有内容。
2015年

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不会)。

我使用@TheBestOne的java算法使它略短一些:

// 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个字符。
2015年

2
puts("");打印换行符。
Felix Bytow 2015年

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到n
  • 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 2015年

@Zgarb:谢谢,但是如果我换出了enumFromTo 1,我也必须给主函数起一个名字,所以它是5个字节。如果没有名称,它将是一个let构造:let e=enumFromTo 1 in (putStr.unlines.map(unwords.map show.e).e) 5
nimi


1

斯卡拉 73 65 62字节

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

不打高尔夫球

def printNumberTriangle(n: Int): Unit = {
  def rowString(m: Int): String = 1.to(m).mkString(" ")
  print(1.to(n).map(rowString).mkString("\n"))
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.