二項の二乗を示す


28

(任意の方法で)2つの異なる自然数(任意の妥当なサイズ)が与えられ、以下の例のようにそれらの合計の2乗を(任意の方法で)出力します。

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文字へのコードのパッキングは許可されていません。


ボーナス:数値の1つが0のときにコードが1つの正方形のみを出力する場合は-3。例えば、0と3が与えられた場合、出力:

9 9 9
9 9 9
9 9 9

入力数の最大値は何ですか?ありがとう。
明るくしない

1
@donbright人為的な制限はありません。表現、計算(選択したアルゴリズムを使用)、および結果に関して、コンピューターと言語が処理できるのは制限のみです。可能性として、データを行
ごとに

正方形の向きは与えられていますか、それとも90度回転できますか?
ジョンドヴォルザーク

1
なぜ値が0のボーナスなのでしょうか?1つの正方形だけではない場合、予想される出力はどうなりますか?
3月Ho

@MarchHoそのため、ボーナスが非常に小さいのです。それでも、一部の言語では空の配列を処理できない場合があります。
アダム

回答:


14

J、9バイト-3 = 6

#~@|.*/#~

@NBRA の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

また、0を入力するとサイズがゼロの部分行列が生成されるため、3バイトのボーナスも請求します。

   (#~@|.*/#~) 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

これは私が家にいるような気分にさせます。
アダム

3
このソリューションは、のあいまいなバリエーションのように見えるtable flipperASCIIの顔文字(╯°□°)╯(┻━┻
ピートTNT

10

オクターブ、45バイト-3 = 42

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

説明

これにより、2つのベクトルが構築されます(仮定m = 4およびn = 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]

たとえば、aby の最初の行の乗算は次のようになり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=ます。匿名関数/ラムダを変数に保存する必要がないという慣習があります。
-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

*元々、私は異なる解決策を考えていました。各長方形は、2つの引数の組み合わせごとに乗算テーブルを作成することによって個別に作成されます。次に、4つの正方形を垂直方向と水平方向にまとめます。次のようになります。

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

上記のプロンプト。引数を
,⍴×<結合(,)し、それを使用して、積(×)で塗りつぶされた長方形を形作ります()。
∘.()⍨各セルが(… で指定されたものであるテーブルを作成します)

⍪⌿セルを垂直に結合します。
,/セルを水平に結合します。


1
いいね!Jと同じスコアの同じアイデア:(|.*/])@#~
Zgarb

@Zgarb答えを更新して、私のような脚注を付けてください。Jに値する!
アダム

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

これは3つ以上の数値でも機能します。たとえば、(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

おそらくそれを有効な回答にするために、catまたはそれをまとめる必要がありwriteます。
デビッドアレンバーグ

@DavidArenburg理由がわかりませんか?「出力(とにかく)」と表示されます。出力する手段は1つだけだったので、要件の範囲内に収まりました。
freekvd

ええ、多分あなたは正しいです。それが何を意味するのか分かりません。
デビッドアレンバーグ

@DavidArenburgうん、大丈夫です。これはデータ/テキストのチャレンジであり、入力/出力のチャレンジではありません。
アダム

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

しかし、それは多くても1つの空白です。


4

Mathematica 56-3 = 53

更新:名前付き関数を使用する、まったく同じコードサイズの2番目のメソッドを追加しました。Arrayむしろを採用していますTableますが、同じロジックに従います。(下記参照。)

方法1

これにより、製品の表が作成され、その要因は行、列の値に依存します。数値のペアは、整数のリストとして入力されます。次のような匿名関数は、プログラムで一度だけ使用される場合に最も役立ちます。それ以外の場合は、名前付き関数を使用する方が理にかなっています。

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

各要素はIf-thenステートメントです:

  • If[r>#2,#,#2] 「行番号が2番目の入力よりも大きい場合は、最初の入力を係数として使用し、そうでない場合は2番目の入力を使用します。
  • If[c>#,#2,#] つまり、「列番号が最初の入力よりも大きい場合、係数として2番目の入力を使用し、そうでない場合は最初の入力を使用します。

例1

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

ex1


例2

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

ex2


方法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文字減らすことができます。
アダム

ありがとう。同じアプローチが名前付き関数で機能することを実感しました。上記の方法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.

素晴らしいですが、何がそんなに空白を引き起こし、それを減らすために何が必要でしょうか?
アダム

1
@NBZこれまでのところ、セル幅の信頼できる上限を計算するために見つけた最も短い方法は、入力文字列の長さの2倍を使用することです自体)。もちろん、結果の数値に基づいて必要な実際の金額を計算できますが、それはかなり長くなります。
マーティンエンダー

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));}

入力は関数の最初の2つのパラメーターで渡され、他の2つはダミーです。列は右揃えです。

注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です。また、ここにヒントがあります。通常、外部ループのカウンターを条件付きでインクリメントする場合、2つのループを1つに圧縮できます。私のソリューションは、それがどのように行われるかを示しています。
xsot

@xsotはい、puts()戻りコードは成功のためにのみ+ veであることが保証されています。ただし、glibcを使用した私のテストでは、戻り値が書き込まれたバイト数であることが示されているようです。ループの統合については-はい、私はその手法を認識しており、ここまで短縮しませんでした。
デジタル外傷

2

ルビー、(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ような多数を検討してください9999s通りに出てくる4の幅に非常にあなたがしているパディング、s+3 = 7しかし、9999^28桁の数字を必要とします。2*s代わりに使用することもできます。
マーティンエンダー

2
とにかく、ここにいくつかのゴルフのヒントがあります:するrjust前になぜ必要なのかわかりませんljust。あなたは短縮することができますprint$><<(とそれの後にスペースを取り除きます)。ARGVエイリアスがあり$*ます。codegolf.stackexchange.com/a/19493/8478のflattenようなものでアレイを構築することで、これを回避できるかもしれません。また、ここでは関数のみの回答が(名前のない関数であっても)間違いなく許可されているため、その関数は入力として整数を取ることができ、何もする必要はありません。.to_i
マーティンエンダー

@MartinBüttner、ヒントをありがとう。
過酷なグプタ

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文字列関数を使用して文字グリッドを作成し、文字を整数に置き換えて、フォーマットされた出力を出力します。


興味深い方法。
アダム

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));}

入力は、同じ行でスペースで区切られた2つの整数として取得されます。各セルには、入力文字列の2倍の長さまでスペースが埋め込まれます。


トラブルのgcc(4.8.4)でコンパイルするために、これを取得したイム...
明るいドン

1
debianパッケージgcc-4.6.1-2を使用するgolf.shinh.org/check.rbでこれをテストしました。どのようなコンパイルエラーが発生していますか?
xsot

すみません、私はすべて1行としてもう一度試してみましたが、うまくいきました...しかし、私が実行するとセグメンテーション違反が発生します。私は2 3ヒットリターン文字列を入力し、それがセグメンテーションフォールト(コアダンプ)言う
ドン明るい

申し訳ありませんが、なぜ機能しないのかわかりません。少なくとも、以前リンクしたサイトでコードを試すことができます:)
xsot

1

パイス、39 − 3 = 36

Pythには、行列の書式設定が組み込まれていないため、出力番号を手動で埋め込む必要があるため、サイズが大幅に増加します。これが私が思いついたものです。

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

オンラインでお試しください。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.