Code-golf:输出乘法表到控制台

fle*_*her 18 language-agnostic code-golf rosetta-stone

我最近指出一名学生正在做一篇关于将乘法表转储到控制台的文章.它使用嵌套的for循环并乘以每个的步长值.

这看起来像.NET 2.0方法.我想知道,使用Linq和扩展方法,例如,要获得相同结果需要多少行代码.

stackoverflow社区是否能够应对挑战?

挑战:在控制台应用程序中,编写代码以生成如下示例的表:

01 02 03 04 05 06 07 08 09
02 04 06 08 10 12 14 16 18
03 06 09 12 15 18 21 24 27
04 08 12 16 20 24 28 32 36
05 10 15 20 25 30 35 40 45
06 12 18 24 30 36 42 48 54
07 14 21 28 35 42 49 56 63
08 16 24 32 40 48 56 64 72
09 18 27 36 45 54 63 72 81

当这变成了与语言无关的代码 - 高尔夫之战时,我将与社区决定哪个是接受答案的最佳解决方案.

有很多关于表格的规格和格式的讨论,我故意添加了00格式,但是双重换行最初只是因为我不知道如何在创建帖子时格式化文本!

MPe*_*ier 41

J - 8个字符 - 24个字符,格式正确

*/~1+i.9
Run Code Online (Sandbox Code Playgroud)

得到:

1  2  3  4  5  6  7  8  9
2  4  6  8 10 12 14 16 18
3  6  9 12 15 18 21 24 27
4  8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81

@earl找到的解决方案:

'r(0)q( )3.'8!:2*/~1+i.9
Run Code Online (Sandbox Code Playgroud)

得到:

01 02 03 04 05 06 07 08 09 
02 04 06 08 10 12 14 16 18 
03 06 09 12 15 18 21 24 27 
04 08 12 16 20 24 28 32 36 
05 10 15 20 25 30 35 40 45 
06 12 18 24 30 36 42 48 54 
07 14 21 28 35 42 49 56 63 
08 16 24 32 40 48 56 64 72 
09 18 27 36 45 54 63 72 81 

  • 这是我见过的最糟糕的C# (37认同)
  • 是的,我删除了答案,因为我认为这是一个C#代码打高尔夫问题的主题.似乎从那时起就添加了"语言不可知"标签.我的回答还包含一个做零填充的扩展版本:'r(0)q()3.' 8!:2*/~1 + i.9.如果你想给道具,请随意提出这个评论:) (21认同)
  • @MPelletier:我打高尔夫球的唯一原因就是他们给你带来的啤酒车,我真的不在乎他们说什么语言,只要它冷 (3认同)
  • 伯爵在3小时前发布了相同的答案,但由于某种原因删除了它 (2认同)

gno*_*ice 16

MATLAB - 10个字符

a=1:9;a'*a
Run Code Online (Sandbox Code Playgroud)

...或更严格的输出格式33个字符

a=1:9;disp(num2str(a'*a,'%.2d '))
Run Code Online (Sandbox Code Playgroud)

  • @phkahler:不可否认,我采取了一些自由,因为似乎没有一套明确的输出规则,只是它应该生成一个乘法表.我不喜欢零填充,因为它使数字更难读,但是这里有一个33个字符的解决方案,它产生更像输出的输出:`a = 1:9; disp(num2str(a'*a, '%.2d'))` (2认同)
  • @gnovice:确切地说,格式化字符串应该是''%02d'` (2认同)

Nab*_*abb 15

Brainf**k - 185个字符

>---------[++++++++++>---------[+<[-<+>>+++++++++[->+>>---------[>-<++++++++++<]<[>]>>+<<<<]>[-<+>]<---------<]<[->+<]>>>>++++[-<++++>]<[->++>+++>+++<<<]>>>[.[-]<]<]++++++++++.[-<->]<+]
Run Code Online (Sandbox Code Playgroud)

  • 这看起来像是与鱼尸交配的匕首的时间线. (15认同)
  • 我喜欢大脑这个词是如何被审查的,而不是f**k. (13认同)

Tho*_*mas 14

猫 - 252个字符

01 02 03 04 05 06 07 08 09

02 04 06 08 10 12 14 16 18

03 06 09 12 15 18 21 24 27

04 08 12 16 20 24 28 32 36

05 10 15 20 25 30 35 40 45

06 12 18 24 30 36 42 48 54

07 14 21 28 35 42 49 56 63

08 16 24 32 40 48 56 64 72

09 18 27 36 45 54 63 72 81
Run Code Online (Sandbox Code Playgroud)

假设需要一个尾随换行符; 否则,251个字符.

*运行*

  • +1因为这应该是基准.任何无法击败的语言都不应该费心去申请. (8认同)

Joh*_*ooy 8

Python - 61个字符

r=range(1,10)
for y in r:print"%02d "*9%tuple(y*x for x in r)
Run Code Online (Sandbox Code Playgroud)

  • @Jimmy Hoffa:你拼错了"Perl". (5认同)

Sru*_*uly 7

C#

这只有2行.它使用lambdas而不是扩展方法

 var nums = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
 nums.ForEach(n => { nums.ForEach(n2 => Console.Write((n * n2).ToString("00 "))); Console.WriteLine(); });
Run Code Online (Sandbox Code Playgroud)

当然,它可以在一条长不可读的线上完成

 new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }.ForEach(n => { new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }.ForEach(n2 => Console.Write((n * n2).ToString("00 "))); Console.WriteLine(); });
Run Code Online (Sandbox Code Playgroud)

所有这一切都假设您考虑使用labmda一行?

  • 令人惊讶的是你如何能够将这两条线路变成一条线路:> (5认同)

Joh*_*ooy 6

Fortran95 - 40个字符(以4个字符击败perl!)

该解决方案打印前导零按规范.

print"(9(i3.2))",((i*j,i=1,9),j=1,9);end
Run Code Online (Sandbox Code Playgroud)


ear*_*arl 6

K - 12个字符

让我们认真对待rosetta-stoning,并将Kdb +的K4与规范的J解决方案(*/~1+i.9)进行比较:

  a*/:\:a:1+!9
1 2  3  4  5  6  7  8  9 
2 4  6  8  10 12 14 16 18
3 6  9  12 15 18 21 24 27
4 8  12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
Run Code Online (Sandbox Code Playgroud)

J的"table"运算符(/)等于K"每个左右每个"(/:\:)成语.我们~在K中没有J非常方便的"反身"运算符(),所以我们必须传递a左右两个参数.


小智 5

Oracle SQL,103个字符:

select n, n*2, n*3, n*4, n*5, n*6, n*7, n*8, n*9 from (select rownum n from dual CONNECT BY LEVEL < 10)
Run Code Online (Sandbox Code Playgroud)


Mat*_*ted 5

C# - 117,113,99,96,95 89个字符

根据NickLarsen的想法更新

for(int x=0,y;++x<10;)
    for(y=x;y<x*10;y+=x)
        Console.Write(y.ToString(y<x*9?"00 ":"00 \n"));
Run Code Online (Sandbox Code Playgroud)

99,85,82 81个字符 ......如果你不关心前导零并且允许标签对齐.

for(int x=0,y;++x<10;)
{
    var w="";
    for(y=1;++y<10;)
        w+=x*y+"    ";
    Console.WriteLine(w);
}
Run Code Online (Sandbox Code Playgroud)

  • 不编译.消息:`命名空间不直接包含诸如字段或方法之类的成员. (2认同)
  • 确保包含`using System.Linq;`并且上面的代码在方法体内. (2认同)