给定一个数字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
每行末尾没有尾随空格。
获胜的字节数最少,并且不允许出现标准漏洞。
给定一个数字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
每行末尾没有尾随空格。
获胜的字节数最少,并且不允许出现标准漏洞。
Answers:
-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级元素。以下示例与-t
flag一起运行。
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
注意:该语言是非常新的语言,并不完整,但是在此挑战之前已发布了最新版本。
⍪⍳¨⍳⎕
创建一个向量1..n,并为每个元素创建另一个向量。
然后⍪在所有向量中组成一列。这避免了尾随空白的问题。
较旧的解决方案:
{⎕←⍳⍵}¨⍳⎕
创建一个向量1..n
{⎕←⍳⍵}是一个函数,它为每个(¨)元素在单独的行上输出向量1..n
遗憾的是,无法在tryapl.org上尝试使用此命令,因为⎕←在该处不起作用。
编辑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.
for($a=1;@$i<$n;$a.=" ".(@++$i+print"$a\n"));
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个字节。
for($a=1;$i++<$n=$_GET[n];$a.=" ".($i+print"$a\n"));
->试试这个(完整代码,使用n
带有数字的url参数)
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";
VQjdr1hhN
真的以为可以做得更短,但事实并非如此。
在线尝试。
Q = input()
VQ For N in [0, 1, ..., Q-1]:
r1hhN create list [1, ..., N+1+1-1]
jd print joined with spaces
VQaYhNjdY
。如果只a
返回的列表,然后像VQjdaYhN
将8
a
简要地用于返回附加列表。
N+1+1-1
吗?
r
是Python范围函数,因此是-1(r1N
创建list [1, 2, ..., N-1]
)。但是在循环的第N次迭代中,我需要列表[1, 2, ..., N+1]
,因此需要添加2
到N
。r1hhN
直接翻译成range(1, N+1+1)
。另一种可能性是r1+N2
(range(1, N+2)
)。
mhdhN
,但这是一种完全不同的方法。
如此简单的任务,我想知道是否可以在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)}
这在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+=...)
。
Python 2- 62 54 65字节
def f(n):
for x in range(n):print' '.join(map(str,range(1,x+2)))
n
应作为程序输入,而不是在变量中初始化。
作为默认的单子动词。
[:":\1+i.
i. y
–从0
到的数字y - 1
。1 + i. y
–从1
到 的数字y
。": y
– y
表示为字符串的向量。":\ y
–每个前缀y
表示为一个字符串。":\ 1 + i. y
–从1
到的数字的每个前缀y
表示为字符矩阵。&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
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
它需要一些技巧,很容易解释。我认为可以大大改善。
b(n,c){if(n){b(n-1,32);printf("%d%c",n,c);}}r(n){if(n){r(n-1);b(n,10);}}
>>> 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
p
。在另一方面,你可以删除两个空间-一个与print
和'\n'
之间的其他)))
和for
。
def p(N):print'\n'.join(' '.join(map(str,range(1,i+2)))for i in range(N))
import string
N,s=int(input()),list(string.digits)
for i in range(1,N+1):
print(' '.join(s[1:i+1]))
for i in range(int(input())):print(' '.join("123456789"[:i+1]))
-请注意,字符串被视为列表。
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
!=
改为来保存一个字节>
。
import
虽然声明
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
VAL("1")
(6个字节,VAL为1)插入了1
(7个字节))
// 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个字符。
puts("");
打印换行符。
作为返回字符串的匿名函数编写的,该规范似乎并未禁止该字符串。
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, ...
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个字节。
enumFromTo 1
,我也必须给主函数起一个名字,所以它是5个字节。如果没有名称,它将是一个let
构造:let e=enumFromTo 1 in (putStr.unlines.map(unwords.map show.e).e) 5
Print@Row[Range@i," "]~Do~{i,#}&
TableForm[Range/@Range@#]&
样
Grid[Range/@Range@#]&
Grid
。)