グリッド内の長方形の数


29

さて、この課題は大きな成功であることが判明しましたが、解決するのは非常に簡単であることが判明しました。したがって、より多くの課題を探している人のために、この課題の続編を作成しました。この課題では、一意の長方形の数を数える必要があります。見てみな!

さて、この課題を解決したいとお考えの方のために、ここにきました。


さて、まだこのような挑戦はまだありませんので、ここに行きます。

この3 x 3長方形のグリッドを考えてみましょう:

Example

長方形はいくつありますか?視覚的に数えると、実際に36は、プレーン全体を含む長方形があり、それらはすべて以下のアニメーションGIFに表示されています。

Rectangles in Example

タスク

上記の長方形のカウントがタスクです。換言すれば、2つのより大きいか等しい整数で与えられ0mおよびnm幅を表し、およびn表し、高さ表す場合、長方形のm x nグリッド内の長方形の総数を出力します。

ルール

  • この問題を直接解決するビルトインの使用は明示的に禁止されています。

  • この課題は、最短の答えを見つけることではなく、すべての言語で最短の答えを見つけることです。したがって、回答は受け付けられません。

  • 標準的な抜け穴は禁止されています。

テストケース

次の形式で提示されますArray of Integers Input -> Integer Output

[0,0] -> 0
[1,1] -> 1
[3,3] -> 36 (Visualized above)
[4,4] -> 100
[6,7] -> 588

参照資料

これはであるため、最短のコードが勝つことを忘れないでください!


588最後のテストケースについて計算しました。
漏れの修道女

@LeakyNunそれでは、カウント中に見逃してしまったと思います。修正されました。
R. Kap

入力の最大値はいくらですか?
エリックアウトゴルファー16

回答:


34

Python、22バイト

lambda m,n:m*~m*n*~n/4

数式m*n*(m+1)*(n+1)/4は、ビット補数を使用して短縮され~m=-(m+1)、と表さ(m+1)*(n+1)~m*~nます。

長方形の数はなぜm*n*(m+1)*(n+1)/4ですか?各長方形は、2本の水平線(上下)と2本の垂直線(左右)の選択によって指定されます。m+1水平線があり、そのうち2つの異なる線のサブセットを選択します。したがって、選択肢の数choose(m+1,2)m*(m+1)/2です。n*(n+1)/2垂直線の選択肢を乗算すると、結果が得られます。


その+1トリックは素晴らしいです。
デビッドリュングマディソンステラ

11

よくやった。いいぞ。:)
R. Kap

24
説明する気?
Pureferret

また、他の4バイトの選択肢もבHPあり‘c2Pます。
マイル

1
@PureferretこれはOEISの式を使用し、これがの数nthmth三角数の積であることを示します。R各数値を1ベースのインデックスに変換します[1, 2, ..., n]Sは合計であり、「各」を意味するため、各リストが合計され、次のようなリストが生成されます[nth triangle number, mth triangle number]。次にP、そのリストの積を使用して、目的の結果を取得します。
FryAmTheEggman

1
@FryAmTheEggmanだからあなたのことわざが....マジック
-Pureferret


9

Mathematica、15バイト

##(1##+##+1)/4&

これは、2つの整数引数を取り、長方形の数を返す名前のない関数です。

説明

実装は基本的に、2つの三角形の数の積の非常にゴルフ形式です。詳細については、この投稿の「引数のシーケンス」セクションを読む価値があるかもしれませんが、ここで要点を要約してみます。

##すべての引数のシーケンスに展開します。これは、他の言語でのスプラッティングに似ています。たとえば、引数が3との4場合、{1, 2, ##, 5}が得られます{1, 2, 3, 4, 5}。しかし、これはリストの中だけの仕事をしませんが、いかなる式では、例えば、f[1, 2, ##, 5]まただろうf[1, 2, 3, 4, 5]

これは##、演算子と組み合わせると興味深いものになります。Mathematicaのすべての演算子は、いくつかのf[...]-like式(ネストされている可能性があります)の単なる省略形です。たとえば、a+bPlus[a, b]a-b実際に表しPlus[a, Times[-1, b]]ます。##演算子と組み合わせると、Mathematicaは最初に演算子を展開し##、単一のオペランドのように扱い、最後にのみ展開するようになります ##したがって、適切な場所に挿入することで、オペランドの乗算と追加の両方に使用できます。

上記のコードに対してこれを行いましょう:

##(1##+##+1)/4

完全な形式に拡張すると、次のようになります。

Times[##, Plus[Times[1, ##], ##, 1], Rational[1/4]]

関数の引数aを挿入してみましょうb

Times[a, b, Plus[Times[1, a, b], a, b, 1], Rational[1/4]]

そして今、それを標準の数学表記に変換します。

a * b * (a * b + a + b + 1) / 4

少し並べ替えると、これが三角数字の積であることがわかります。

a * b * (a + 1) * (b + 1) / 4
(a * (a + 1) / 2) * (b * (b + 1) / 2)
T(a) * T(b)

おもしろい事実:この実装は非常にゴルファーで、単一の三角形の数値を計算するための組み込みと同じ長さPolygonalNumberです。



8

クラゲ、16バイト

p|%/**+1
  4  Ei

入力形式は [x y]、出力は結果のみです。

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

代替ソリューション、同じバイト数:

pm%/*[*i
  4  +1

説明

クラゲにふさわしい紹介をする時間です!:)

Jellyfishは、2D構文の課題に基づいたZgarbの言語です。セマンティクスは主にJに触発されていますが、構文は芸術作品です。すべての機能は単一の文字であり、グリッド上に配置されます。関数は、南と東の次のトークンから引数を取り、結果を北と西に返します。これにより、複数の方向から複数の関数に値を渡すことで、値を再利用する興味深い関数呼び出しのウェブを作成できます。

上記のプログラムのトークンの一部が特別な演算子(高レベル関数)であるという事実を無視すると、上記のプログラムは正気の言語で次のように記述されます。

p(|( /*(i*(i+1)) % 4 ))

コードのボトムアップを見ていきましょう。入力はによって入力iされ[x y]ます。したがって、はに評価されます。

その+上にリテラル1と一緒にこの入力を受け取るため、両方の要素をインクリメントして与えます[(x+1) (y+1)](ほとんどの操作はリスト上で自動的にスレッド化されます)。

のもう一方の値iは左に送信されますが、E分割は東と北の引数です。ことを意味し、右への入力は、*実際にある[x y][(x+1) (y+1)]これを計算して[x*(x+1) y*(y+1)]

次の行*は実際には前の行によって変更さ/れ、折り畳み操作に変わります。折りたたみ*それは我々が得るように、乗算だけでペア上x*(x+1)*y*(y+1)

%はちょうど除算なので、計算しx*(x+1)*y*(y+1)/4ます。残念ながら、これは浮動小数点数になるため、単項で丸める必要があり|ます。最後に、この値はp最終結果を出力するために供給されます。


私は...私は整数の除算についてのドキュメントで何かを読ん宣誓ていたかもしれない
コナー・オブライエン

7

R、40 35バイト

さて、最後に飛び込む時です!@xnor answerに触発された私のRコードは次のとおりです。

a=scan();(n=a[1])*(m=a[2])*(n+1)*(m+1)/4 

編集:このバージョンでは、Rは入力を2回要求します。

(n=scan())*(m=scan())*(n+1)*(m+1)/4

cat(prod(choose(scan()+1,2)))29バイトです。
ジュゼッペ

6

CJam、12 10バイト

Martinのおかげで2バイト節約されました。

{_:)+:*4/}

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

これは、スタックから2つの要素のリストを取得し、ソリューションをスタックに残すブロックです。テストに使用できる完全なプログラム:riari+{_:)+:*4/}~

xnorの優れたpythonソリューションに基づいています。

説明:

{_:)+:*4/}
{        } -- Define a block
 _:)       -- Duplicate list, increment all values in new list
    +      -- Join the two lists
     :*    -- Fold multiply over all 4 elements
       4/  -- Divide by 4

2
2つの要素のリストを入力すると、これは10で機能すると思いますか?{_:~+:*4/}
マーティンエンダー

実際、~CJamで使用する必要はまったくありません。使用するだけ)です。
マーティンエンダー

5

Matlab、23 19バイト

@(x)prod([x/2,x+1])

式のm*n*(m+1)*(n+1)/4
使用法の使用法:ans([m,n])


4

MATL、6バイト

tQ*2/p

入力はの形式の配列です[m,n]

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

説明

式に基づく直接計算m*(m+1)*n*(n+1)/4

t     % Input array [m,n] implicitly. Duplicate
Q     % Add 1 to each entry of the copy: gives [m+1,n+1]
*     % Multiply element-wise: gives [m*(m+1),n*(n+1)]
2/    % Divide each entry by 2: [m*(m+1)/2,n*(n+1)/2]
p     % Product of the two entries: m*(m+1)*n*(n+1)/4. Display implicitly


4

Java 7、39 38バイト

int c(int a,int b){return~a*a*b*~b/4;}

Javaの8、26の 25 19 18 17バイト

a->b->a*~a*b*~b/4

@xnorの優れた回答に基づいています@DavidConradのおかげで複数のバイトが節約されました。ここで試してみてください。

テストコード(Java 7):

ここで試してみてください。

class M{
  static int c(int a,int b){return~a*a*b*~b/4;}

  public static void main(String[] a){
    System.out.println(c(0, 0));
    System.out.println(c(1, 1));
    System.out.println(c(3, 3));
    System.out.println(c(4, 4));
    System.out.println(c(6, 7));
  }
}

出力:

0
1
36
100
588

1
あなたはそれを必要としないreturna->b->より1バイト短いです(a,b)->
デビッドコンラッド

2
ラムダをパラメータとして取るメソッドにラムダを渡す場合、セミコロンが後に続かないので、セミコロンも必要ないと思いますFunction<Integer, Function<Integer, Integer>>
デビッドコンラッド

2
私は@DavidConradに同意します。私は;単一ステートメントJ8ラムダの終わりを数えません。
CAD97

@DavidConrad編集が非常に遅れて申し訳ありませんが、return .. を削除するためにあなたのコメントを読んだことに気づきました。また、Java 8でプログラムすることはほとんどありません(したがって、Java 7のすべての答えです)a->b->以下は、現在のケースのアイデアです。
ケビンCruijssen

1
返信が非常に遅くなってすみません!あなたが変更する必要があるので、機能をカレーする必要があるMathOperation.operation唯一の1を取るためにint、戻るFunction<Integer, Integer>、そしてあなたがそれを呼び出すときに、あなたが最初にのみ、最初のパラメータを渡し、aした後、呼び出し.apply(b)Function。インポートする必要もありjava.util.function.Functionます。これが変更点のアイデアです。
デビッドコンラッド

3

ルビー、22バイト

@xnorのトリックを盗んで、安定したラムダを作成します。

r=->(m,n){m*n*~m*~n/4}

呼び出しの例:

r[6,7]     # => 588

または、procとしても22バイト:

proc{|m,n|m*n*~m*~n/4}

それを呼び出すことができます:

proc{|m,n|m*n*~m*~n/4}.call(6,7)     # => 588

名前を付ける必要はありません。サイトの慣習に従って匿名機能は大丈夫です
コナーオブライエン

3

ラビリンス13 11バイト

*?;*_4/!
):

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

説明

これは、ほとんどの答えのように三角数の積も計算します。主要な2x2ブロックは小さなループです。

*?
):

最初の反復で*は何もしませんので、実際のループ順序は次のようになります。

?   Read integer N from STDIN or 0 at EOF and push onto stack. If 0, exit the loop.
:   Duplicate N.
)   Increment.
*   Multiply to get N*(N+1).

残りのコードは単なる線形です。

;   Discard the zero that terminated the loop.
*   Multiply the other two values.
_4  Push a 4.
/   Divide.
!   Print.

その後、ラビリンスは/再度実行を試み、ゼロによる除算によりプログラムを終了します。



2

05AB1E、4バイト

€LOP

説明

A096948で説明されている式を使用します

      # Implicit input, ex: [7,6]
€L    # Enumerate each, [[1,2,3,4,5,6,7],[1,2,3,4,5,6]]
  O   # Sum, [28,21]
   P  # Product, 588
      # Implicit display

入力を[n、m]として受け取ります

オンラインで試す


1

Pyth、8 6バイト

@DenkerAffeのおかげで2バイト節約されました。

*FmsSd

入力はのようなリストとして期待され[m,n]ます。ここで試してみてください

説明:

          Implicit assignment of Q to eval(input).
*         Multiplication.
 F        Splat the following sequence onto the arguments of the previous function.
  m       Map the following function of d over Q (Q is implicitly added to the end).
   s      Reduce the following list with addition, initial value of 0.
    Sd    Return range(1,d+1).

1
暗黙的に追加されるため、のF代わりに使用.*して削除できますQ
デンカー

私は知っていましたFが、使用方法がわからず、.*代わりに使用する必要があると考えました...ありがとう!
リゾマティック


1

Lua、74 63バイト

x,y=...n=0 for i=1,y do for j=i,i*x,i do n=n+j end end print(n)

関数は数値パラメーターとして入力を受け取ります。

Luaの実装方法により、これは技術的には変数argsを持つ関数であり、「function」ステートメントにラップするか、「loadstring」を使用してソースコードからロードすることで呼び出すことができます。


1
I / O専用のコードがたくさんあることがわかります。おそらく、2つの数値を取得して答えを返す関数を作成し、この不要なI / Oコードをすべて削除する方が短いでしょうか?
ツヴァイ

@Zwei関数がパラメーターによる入力を許可されることを忘れていました。それを指摘してくれてありがとう。
brianush1

この関数はバイトより7を節約するために、「F」のようなものはなく、全体の名称「機能」と命名することができ
ツヴァイ

Luaでは、関数を宣言するにはキーワード「関数」が必要です。名前が指定されていない場合(例: "function f()")、それは匿名関数です。(例: "function()")。したがって、コードが機能するには「関数」が必要です。
brianush1

ああ、luaがそのように機能することを忘れていました。私の悪い!
ツヴァイ


1

Brain-Flak84 80バイト

({}<>)({({})<({}[()])>}{})<>({({})<({}[()])>}{}[()]){<>(({}))<>({}[()])}<>({{}})

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

おそらく、三角形の数に関するコードの再利用のために、おそらく非常に最適ではありませんが、少なくとも機能するBrain-Flakソリューションがあります。

悲しいことに、0 0テストケースで無限にループすることで失敗するようですが、他のすべては正常に動作します。




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