一行流挑战
使用任意编程语言输出“九九乘法表”,要求:
1,仅使用一行代码实现
2,代码文件尽可能小(字符数量尽可能少,此为评价标准)
3,直接打印输出(而非给出一个函数的返回值)
4,“九九乘法表”内容如下,行尾空格可忽略
1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 1*6=6 1*7=7 1*8=8 1*9=9 2*2=4 2*3=6 2*4=8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18 3*3=9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27
4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36
5*5=25 5*6=30 5*7=35 5*8=40 5*9=45 6*6=36 6*7=42 6*8=48 6*9=54 7*7=49 7*8=56 7*9=63
8*8=64 8*9=72
9*9=81
由于要求代码文件尽可能小,因此打表是不现实的,采用语法糖包装的双重循环也许会比较好,例如,Python可以这样实现:
'\n'.join(' '.join(f"{i}*{j}={i*j}" for j in range(i, 10)) for i in range(1, 10))
说起来,这里面还涉及了一些语法问题。如果不多用一个join,e.g.
'
'.join(f"{i} * {j}={i*j}" for j in range(i, 10)) for i in range(1, 10)
会出现报错。因为这是一个生成器表达式,它的值没有被任何方法所接收,因此需要多加一个join,才能正确地使用生成器表达式。
群里的dalao(也是提出这个问题的人)还提供了用js解决的思路:
s='';for(a=1;a<10;a++){for(b=a;b<10;b++)s+=${a}*${b}=${a*b};s+='\n'};console.log(s)
如果不能用分号,也可以写成如下的形式:
[1,2,3,4,5,6,7,8,9].reduce((a,e,i,r)=>a+r.slice(i).reduce((s,n)=>s+e+'*'+n+'='+e*n+(n==9?'\n':' '),''),'')
这道题也许不实用,但是好玩或许也是一种实用吧!