说明二项式的平方


28

给定(通过任何方式)两个不同的自然数(任何合理大小),输出(通过任何方式)其总和的平方,如下例所示:

给定4和3,输出:

12 12 12 12  9  9  9
12 12 12 12  9  9  9
12 12 12 12  9  9  9
16 16 16 16 12 12 12
16 16 16 16 12 12 12
16 16 16 16 12 12 12
16 16 16 16 12 12 12

给定1和3,输出:

3 9 9 9
3 9 9 9
3 9 9 9
1 3 3 3

空格可能会在一定范围内有所不同,但列必须左对齐,右对齐或(伪)居中。

尾随换行符可以,但标准漏洞则不行。

这是因此请# LanguageName, 123在您的答案中包含一个标头,其中的数字是字符(非基于文本的语言的字节)。不允许将代码打包到大型Unicode字符中。


奖励: -3,如果数字之一为0时代码仅输出一个平方;例如给定0和3,输出:

9 9 9
9 9 9
9 9 9

输入数字的最大值是多少?谢谢。
唐明亮

1
@donbright没有人为限制。唯一的限制是您的计算机和语言在表示,计算(使用您选择的算法)和结果时可以处理的内容。潜在的,由线接收数据线配备了打印机的现代计算机,就几乎没有限制... :-)
亚当

正方形方向是给定的,还是可以将其旋转90度?
John Dvorak

1
为什么0值的奖金呢?如果不只是一个平方,预期的输出将是多少?
2015年

@MarchHo这就是为什么奖金这么少的原因。不过,某些语言可能无法处理空数组。
2015年

Answers:


14

J,9个字节-3 = 6

#~@|.*/#~

受到@NBZ的APL答案的启发,受到@randomra的欢迎。这定义了一个采用数字数组的动词。它的用法如下:

   (#~@|.*/#~) 4 3
12 12 12 12  9  9  9
12 12 12 12  9  9  9
12 12 12 12  9  9  9
16 16 16 16 12 12 12
16 16 16 16 12 12 12
16 16 16 16 12 12 12
16 16 16 16 12 12 12

我还声明了3字节的奖励,因为输入0会产生大小为零的子矩阵:

   (#~@|.*/#~) 4 0
16 16 16 16
16 16 16 16
16 16 16 16
16 16 16 16
   (#~@|.*/#~) 0 3
9 9 9
9 9 9
9 9 9

说明

J在这一挑战中具有一定优势。除了早餐时会出现数组操作问题外,默认情况下,它还会以正确的格式打印2D矩阵。

       #~  Replicate each number n in input n times
#~@|.      The same for reversed input
     */    Compute their multiplication table

这让我感到宾至如归。
2015年

3
此解决方案看起来像是table flipperASCII表情符号(╯°□°)╯︵┻━┻ 的晦涩变体
Pete TNT,

10

八度,45字节-3 = 42

s=@(m,n)[a=ones(n,1)*n;b=ones(m,1)*m].*[b;a]'

说明

这构造了两个向量(让我们假设m = 4n = 3):

ones(n, 1)构造一个size数组n x 1,因此将它们乘以n得到:

ones(n, 1) * n => [3 3 3]' (where ' is transpose... n x 1 is a column vector)

a = [3 3 3  4 4 4 4]'   %// a is a column vector
b = [4 4 4 4  3 3 3]    %// b is a row vector

然后将向量以元素方式乘以自动广播扩展,以使7个元素的向量生成7x7元素的矩阵:

    [3] .* [4 4 4 4 3 3 3]
    [3]
    [3]
    [4]
    [4]
    [4]
    [4]

例如,第一行的乘法a通过b给:

    [3] .* [4 4 4 4 3 3 3] = [12 12 12 12  9  9  9]

其余的行也类似a

输出:

>> s(4,3)
ans =

   12   12   12   12    9    9    9
   12   12   12   12    9    9    9
   12   12   12   12    9    9    9
   16   16   16   16   12   12   12
   16   16   16   16   12   12   12
   16   16   16   16   12   12   12
   16   16   16   16   12   12   12

>> s(3,0)
ans =

   9   9   9
   9   9   9
   9   9   9

您可以在ideone尝试


您可以删除s=。我们有一个约定,即匿名函数/ lambda不必存储在变量中。
flawr

6
@flawr,但答案不是42 ...
烧杯

OK。
亚当

9

Dyalog APL,10-3 = 7

受此答案的启发*,其中复制了参数,然后在乘法表中使用了参数:

⊖∘.×⍨(/⍨⎕)

发出提示(⎕:)并计算随后输入的任何表达式。(出于安全原因,这在TryAPL不起作用,但在NGN / APL上起作用。)
/⍨复制其参数本身时间(/⍨4 33 3 3 4 4 4 4
∘.×⍨创建一个乘法表。
上下颠倒。

这恰好适用于任何长度的输入(输入缩进6个空格,输出在左边距处):

      ⊖∘.×⍨(/⍨⎕)
⎕:
      ⍬      ⍝ Empty list (the square of nothing)
      ⊖∘.×⍨(/⍨⎕)
⎕:
      0      ⍝ 0​² = 0
      ⊖∘.×⍨(/⍨⎕)
⎕:
      0 1      ⍝ (0+1)​² = 1²
1
      ⊖∘.×⍨(/⍨⎕)
⎕:
      2 3      ⍝ (2+3)​² = 2² + 3²
6 6 9 9 9
6 6 9 9 9
6 6 9 9 9
4 4 6 6 6
4 4 6 6 6
      ⊖∘.×⍨(/⍨⎕)
⎕:
      1 2 3      ⍝ (1+2+3)​² = 1² + 2(1×2) + 2(1×3) + 2² + 2(2×3) + 3²
3 6 6 9 9 9
3 6 6 9 9 9
3 6 6 9 9 9
2 4 4 6 6 6
2 4 4 6 6 6
1 2 2 3 3 3
      ⊖∘.×⍨(/⍨⎕)
⎕:
      ⍳4    ⍝ Integers 1 through 4
4 8 8 12 12 12 16 16 16 16
4 8 8 12 12 12 16 16 16 16
4 8 8 12 12 12 16 16 16 16
4 8 8 12 12 12 16 16 16 16
3 6 6  9  9  9 12 12 12 12
3 6 6  9  9  9 12 12 12 12
3 6 6  9  9  9 12 12 12 12
2 4 4  6  6  6  8  8  8  8
2 4 4  6  6  6  8  8  8  8
1 2 2  3  3  3  4  4  4  4

*最初,我有一个不同的解决方案:通过为两个参数的每种组合创建一个乘法表来分别创建每个矩形。然后,将四个正方形垂直和水平地修补在一起。看起来像这样:

,/⍪⌿⊖∘.(,⍴×)⍨⎕

提示,如上所述。
,⍴×<合并(,)args并使用它来成形()填充有其乘积(×)的矩形。
∘.(... )⍨创建其中无论是在指定的每个细胞的表(... )
垂直翻转。
⍪⌿垂直合并细胞。
,/水平合并细胞。


1
真好!同样的想法,在J中得分相等:(|.*/])@#~
Zgarb 2015年

@Zgarb更新您的答案,并像我一样添加脚注。J值得!
2015年

7

R,31-3 = 28

rev(b<-rep(a<-scan(),a))%*%t(b)

说明:

           a<-scan()            # take numeric input and store as vector a
    b<-rep(         ,a)         # repeat each numeric input by itself and store as vector b
rev(                   )        # the reverse of vector b
                        %*%     # matrix multiplication
                           t(b) # the transposed of vector b

这也适用于两个以上的数字。例如,(5,3,2)的输出如下所示:

      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]   10   10   10   10   10    6    6    6    4     4
 [2,]   10   10   10   10   10    6    6    6    4     4
 [3,]   15   15   15   15   15    9    9    9    6     6
 [4,]   15   15   15   15   15    9    9    9    6     6
 [5,]   15   15   15   15   15    9    9    9    6     6
 [6,]   25   25   25   25   25   15   15   15   10    10
 [7,]   25   25   25   25   25   15   15   15   10    10
 [8,]   25   25   25   25   25   15   15   15   10    10
 [9,]   25   25   25   25   25   15   15   15   10    10
[10,]   25   25   25   25   25   15   15   15   10    10

您可能需要将其包装成catwrite使其成为有效答案。
David Arenburg

@DavidArenburg我不明白为什么吗?它说“输出(通过任何方式)”。我只花了一个平均值就输出了,这样我就可以满足要求了。
freekvd15年

是的,也许你是对的。不知道它们是什么意思。
David Arenburg 2015年

@DavidArenburg是的,很好。这是数据/文本挑战,而不是输入/输出挑战。
2015年

5

Haskell,153125字节-3 = 122

(#)=replicate
d=length.show
y%x=unlines$(>>= \n->(1+d(x*x+y*y)-d n)#' '++show n)<$>x#(y#(x*y)++x#(x*x))++y#(y#(y*y)++x#(x*y))

代码的一半用于输出格式化。它适用于任意大整数。输出示例:

> putStrLn $ 4 % 3
12 12 12 12  9  9  9
12 12 12 12  9  9  9
12 12 12 12  9  9  9
16 16 16 16 12 12 12
16 16 16 16 12 12 12
16 16 16 16 12 12 12
16 16 16 16 12 12 12

> putStrLn $ 6 % 0
36 36 36 36 36 36
36 36 36 36 36 36
36 36 36 36 36 36
36 36 36 36 36 36
36 36 36 36 36 36
36 36 36 36 36 36

有时数字之间会有一个额外的空格,因为我是根据x*x+y*y而不是来计算所需的空间max (x*x) (y*y),例如

> putStrLn $ 2 % 3
  6  6  9  9  9
  6  6  9  9  9
  6  6  9  9  9
  4  4  6  6  6
  4  4  6  6  6

但这最多是一个空白。


4

Mathematica 56-3 = 53

更新:我添加了第二种方法,其代码大小完全相同,该方法使用命名函数。它采用Array而不是a,Table但遵循相同的逻辑。(见下文。)

方法1

这将形成一个产品表,其因素取决于行,列的值。这对数字将作为整数列表输入。如果以下匿名函数在程序中仅使用一次,则它们将非常有用。否则,使用命名函数更有意义。

Grid@Table[If[r>#2,#,#2]If[c>#,#2,#],{r,#+#2},{c,#+#2}]&

每个因素都是If-then语句:

  • If[r>#2,#,#2] 表示:“如果行号大于第二个输入,请使用第一个输入作为因子,否则使用第二个输入。
  • If[c>#,#2,#] 意思是,“如果列号大于第一个输入,则使用第二个输入作为因子,否则使用第一个输入。

例子1

 Grid@Table[If[r>#2,#,#2]If[c>#,#2,#],{r,#+#2},{c,#+#2}]&@@{5,3}

例1


例子2

Grid@Table[If[r>#2,#,#2]If[c>#,#2,#],{r,#+#2},{c,#+#2}]&@@{0,3}

例2


方法2(也56-3 = 53)

这与方法1相似。但是在调用时需要较少的代码。而且这些单元是可寻址的,这与表中的单元不同。如果函数将被多次使用,则最好使用此方法。

a_~f~b_:=Grid@Array[If[#>a,a,b]If[#2>a,b,a]&,{a+b,a+b}]

上面的示例由以下内容产生:

例1:

f[4,3]

例2:

f[0,3]

1
那很巧妙。使用这种方法,我可以将自己的解决方案减少4个字符。
2015年

谢谢。我刚刚意识到,相同的方法可用于命名函数。请参阅上面的方法2。
DavidC

4

八度,34-3 = 31

@(a)rot90(b=repelems(a,[1,2;a]))*b

例子:

octave:1> f = @(a)rot90(b=repelems(a,[1,2;a]))*b;
octave:2> f([4,3])
ans =

   12   12   12   12    9    9    9
   12   12   12   12    9    9    9
   12   12   12   12    9    9    9
   16   16   16   16   12   12   12
   16   16   16   16   12   12   12
   16   16   16   16   12   12   12
   16   16   16   16   12   12   12

octave:3> f([0,3])
ans =

   9   9   9
   9   9   9
   9   9   9

哇,我不知道repelems。太棒了!
烧杯

4

CJam,27个字节-3 = 24

q:L~_]ze~_ff{*sL,2*Se[}W%N*

将输入作为CJam样式数组。它使用的间距比必要的要大,但是我认为这是“合理的”,并且始终正确对齐。

在这里测试。

说明

q:L    e# Read the input and store it in L.
~_     e# Evaluate the input, pushing [A B] onto the stack and duplicate it.
]z     e# Wrap both in an array and transpose it to get [[A A] [B B]].
e~     e# Run-length decode, getting A copies of A and B copies of B.
_ff{   e# Double map over each pair of entries in this new array...
  *s   e#   Multiply the two values.
  L,2* e#   Push twice the length of the input string.
  Se[  e#   Pad the result to this width with spaces (from the left).
}
W%     e# Reverse the resulting matrix to get the correct orientation.
N*     e# Join the rows with linefeed characters.

很好,但是什么原因导致那么多的空白,又需要什么来减少空白呢?
2015年

1
@NBZ到目前为止,我发现的用于计算单元格宽度的可靠上限的最短方法是使用输入字符串长度的两倍(因为较大的平方不超过数字的两倍)本身)。当然,我可以根据结果得出所需的实际数量,但这会更长一些。
马丁·恩德

4

C函数(使用glibc),122字节-3 = 119

通常是带有2个循环的简单实现。我希望在这里错过一些高尔夫运动机会:

f(n,m,x,y){for(x=0;x<n+m;x+=puts(""))for(y=0;y<n+m;y++)printf(" %*d",snprintf(0,0,"%d",n>m?n*n:m*m),(x<m?m:n)*(y<n?n:m));}

输入在函数的前两个参数中传递,其他两个是虚拟变量。列右对齐。

注意glibc puts()似乎总是返回写入的字节数,包括隐式尾随换行符,这是我们在这里需要的。不保证这将与任何其他libc一起使用。

在完整程序中:

f(n,m,x,y){for(x=0;x<n+m;x+=puts(""))for(y=0;y<n+m;y++)printf(" %*d",snprintf(0,0,"%d",n>m?n*n:m*m),(x<m?m:n)*(y<n?n:m));}

int main (int argc, char **argv) {
    if (argc == 3) {
        f(atoi(argv[1]),atoi(argv[2]));
    }
}

编译为gcc sqrbin.c -o sqrbin(或make sqrbin)。可以安全地忽略警告。

输出示例:

$ ./sqrbin 4 3
 12 12 12 12  9  9  9
 12 12 12 12  9  9  9
 12 12 12 12  9  9  9
 16 16 16 16 12 12 12
 16 16 16 16 12 12 12
 16 16 16 16 12 12 12
 16 16 16 16 12 12 12
$ ./sqrbin 4 0
 16 16 16 16
 16 16 16 16
 16 16 16 16
 16 16 16 16
$ 

根据我的经验,的返回值puts()取决于机器。例如,我的是10点。另外,这里有个提示:如果有条件地增加外部循环中的计数器,通常可以将两个循环压缩为一个循环。我的解决方案演示了如何实现。
xsot

@xsot是的,puts()返回代码只能保证成功。但是我对glibc的测试似乎表明返回值是写入的字节数。至于循环合并-是的,我知道这种技术,并且已经在这里尝试过了,到目前为止,在这种情况下没有缩短。
Digital Trauma 2015年

2

Ruby(133-3)= 130字节

s=1
a=ARGV.map{|e|s*=(e=e.to_i);[e]*e}.flatten
s=s.to_s.size
a.reverse.each{|i|a.each{|j|print (i*j).to_s.rjust(s).ljust(s+3)};puts}

为4,3

12   12   12   12    9    9    9   
12   12   12   12    9    9    9   
12   12   12   12    9    9    9   
16   16   16   16   12   12   12   
16   16   16   16   12   12   12   
16   16   16   16   12   12   12   
16   16   16   16   12   12   12

1,3

3   9   9   9   
3   9   9   9   
3   9   9   9   
1   3   3   3

为0.3

9   9   9   
9   9   9   
9   9   9

2
欢迎来到PPCG!我认为您的填充不足以容纳大量的对象。考虑有个1和个,如9999。Than s将以形式出现4,因此您要填充到的宽度,s+3 = 79999^2需要8位数字。您可能要2*s改用。
Martin Ender

2
无论如何,这里有一些打高尔夫球的技巧:我不明白为什么您需rjust要这样做ljust。您可以缩短print$><<(并删除其后的空格)。ARGV有一个别名$*。您可以flatten通过使用以下代码构建数组来避免这种情况:codegolf.stackexchange.com/a/19493/8478。另外,这里绝对允许使用仅函数的答案(甚至是未命名的函数),因此该函数可以将整数用作输入,而您无需执行任何操作.to_i
Martin Ender

@MartinBüttner,谢谢您的提示。
严苛的古塔2015年

2

Python 2,176字节-3 = 173

def g(m,n):
 y,x,z,l,f='y','x','z','l','%'+str(len(str(max(m*m,n*n))))+'s'
 d={y:m*n,x:n*n,z:m*m,l:'\n'}
 for i in map(lambda x:d[x],(y*m+x*n+l)*n+(z*m+y*n+l)*m): print f % i,

它使用Python字符串函数创建一个字符网格,然后将这些字符替换为整数并打印格式化的输出。


有趣的方法。
2015年

1

Matlab,58-3 = 55

使用匿名函数:

@(a,b)flipud(blkdiag(a^2*ones(a)-a*b,b^2*ones(b)-a*b)+a*b)

例:

>> @(a,b)flipud(blkdiag(a^2*ones(a)-a*b,b^2*ones(b)-a*b)+a*b)
ans = 
    @(a,b)flipud(blkdiag(a^2*ones(a)-a*b,b^2*ones(b)-a*b)+a*b)
>> ans(4,3)
ans =
    12    12    12    12     9     9     9
    12    12    12    12     9     9     9
    12    12    12    12     9     9     9
    16    16    16    16    12    12    12
    16    16    16    16    12    12    12
    16    16    16    16    12    12    12
    16    16    16    16    12    12    12

>> @(a,b)flipud(blkdiag(a^2*ones(a)-a*b,b^2*ones(b)-a*b)+a*b)
ans = 
    @(a,b)flipud(blkdiag(a^2*ones(a)-a*b,b^2*ones(b)-a*b)+a*b)
>> ans(0,3)
ans =
     9     9     9
     9     9     9
     9     9     9

(旧解)59 − 3 = 56

使用匿名函数:

@(a,b)[b*a*ones(b,a) b^2*ones(b);a^2*ones(a) a*b*ones(a,b)]

1

C,(125-3)字节

i,j,a;main(b,s){for(sscanf(gets(s),"%d %d",&a,&b);j<a+b;)printf(++i>a+b?i=!++j,"\n":"%*d",strlen(s)*2,(i<a?a:b)*(j<b?b:a));}

输入被视为同一行上两个以空格分隔的整数。每个单元格都用空格填充到输入字符串长度的两倍。


即时通讯在使用gcc(4.8.4)进行编译时遇到麻烦...
唐明亮

1
我在golf.shinh.org/check.rb上进行了测试,它使用了debian软件包gcc-4.6.1-2。您遇到什么编译错误?
xsot

抱歉,我再次尝试了所有一条线,但仍然有效,但是...当我运行时,出现了段错误。我输入了字符串2 3并按回车键,它说分段错误(核心已转储)
唐明亮

抱歉,但我不知道为什么它对您不起作用。至少您仍然可以在我之前链接的站点上尝试代码:)
xsot

1

Pyth,39-3 = 36

Pyth没有内置的矩阵格式,极大地增加了尺寸,因为必须手动填充输出数字。这是我想出的。

JAQL*b]jdm.[`d\ l`eS^R2Jsm*d]*bdJj+yHyG

在线尝试。


1

,51字节52 62 82 87(非竞争)

::`+`1|U;{`*`1}|A;`+`1,0+`1={`1^2}|;0+`,`1+`={`^2}|

取消高尔夫:

::
  ` + `1                    | Expand;
  {` * `1}                  | SetAll;
  ` + `1, 0 + `1 = {`1 ^ 2} | Set;
  0 + `, `1 + `  = {` ^ 2}  | Set

试试吧

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.