正方形のデラコルテ数を計算する


12

課題:任意の言語でデラコルテ数の計算を実装します。最短のコードが優先されます。

異なる整数1..n²(少なくとも3〜27の間の可能な辺の長さn)の特定の正方行列の場合、そのデラコルテ数は、gcd(a、b)×distance²(a、b)の積の合計です。各個別整数のペア{a、b}。

次の例は、160のデラコルテ数を持つ3×3の正方形を示しています。

3 2 9
4 1 8
5 6 7

この正方形には、計算する36の異なるペアがあります。たとえば、ペア4と6です。gcd(4、6)× 距離 ²(4、6)= 4

テスト用の別の正方形の例-これには、5957のデラコルテ番号があります。

10  8 11 14 12
21  4 19  7  9
 5 13 23  1 16
18  3 17  2 15
24 22 25  6 20

デラコルテ番号は、このプログラミングコンテストから取得されます -詳細については、こちらをご覧ください...コンテストは2015年1月に終了しました。とても楽しかったです!

ルール:

必要な改行は1文字としてカウントされます。改行付きのゴルフソリューションを投稿できますが、その言語で必要な場合にのみカウントされます。

入出力の処理方法を選択でき、標準インクルードやメイン関数ヘッダーなど、言語の必要なフレームワークを数える必要はありません。このC#の例のように、実際のコードカウント(ショートカット/エイリアス定義を含む)のみ:

namespace System
{
    using Collections.Generic;
    using I=Int32; //this complete line counts
    class Delacorte
    {
        static I l(I[]a){return a.Length;} //of course this complete line counts

        static void CalculateSquare(int[] a, out int r)
        {
            r=0;for(I i=l(a);i-->0;)r+=a[i]; //here only this line counts
        }

        static void Main()
        {
            int result;
            CalculateSquare(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }, out result);
            Console.Write(result); //should output 140 for the example
            Console.ReadKey();
        }
    }
}

また、正方形を2次元配列として、プロンプトから、または文字列または標準的なコレクションタイプとして入力することもできます。2次元配列は、正方形の辺の長さを自分で計算する必要がない唯一の方法です。
実際の作業のためのサブ機能は必要ありません。Main()内にコードを直接配置することもできます。

次のように、さらに多くの準備が無料で許可されます。

using System;
unsafe class Delacorte
{
    static void CalculateSquare(int* a, out int r)
    {
        r=0;while(*a>0)r+=*a++; //only this line counts
    }

    static void Main()
    {
        var input = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; //adding a terminator
        int result;
        fixed (int* a = &input[0]) //necessary in C#
            CalculateSquare(a, out result);
        Console.Write(result);
        Console.ReadKey();
    }
}

長期にわたる準備がこれらのルールの精神に沿っているのか、それとも不正行為と呼ばれるのかわからない場合は、質問してください:)


Pythonの場合、すべてのインクルードは無料ですか?これは奇妙な最適化を引き起こす可能性があります...
Falko

@Falko、質問は、標準インクルードとは何ですか?ルールの精神を理解し、あなたの言語に適応させてください。だから、いいえ:私のusing例を参照してください-それがライブラリを含めるために使用されている場合、そうでなければあなたはいくつかの関数を呼び出すことができなかったので、それは無料です。これを使用して何かの短いエイリアスを定義すると、命令全体がカウントされます。
maf-soft

@Optimizer:距離関数の意味は、リンクに多少隠されています。2つのフィールド間のユークリッド距離の2乗です。
ファルコ14年

@Optimizerは、正確に定義するのではなく、例を示したので、意味を確認できます。私は...それは十分にあると思ったし、楽しみを追加
MAF-ソフト

そして、それは正当な質問ですが、最終的にそのコンテストに参加できるようにここに投稿したようです;)
オプティマイザー14年

回答:


6

APL(38)

{.5×+/∊∘.{(∨/Z[⍺⍵])×+/⊃×⍨⍺-⍵}⍨⊂¨⍳⍴Z←⍵}

これは、次のように行列を正しい引数として受け取る関数です。

      sq5←↑(10 8 11 14 12)(21 4 19 7 9)(5 13 23 1 16)(18 3 17 2 15)(24 22 25 6 20)
      sq5
10  8 11 14 12
21  4 19  7  9
 5 13 23  1 16
18  3 17  2 15
24 22 25  6 20
      {.5×+/∊∘.{(∨/Z[⍺⍵])×+/⊃×⍨⍺-⍵}⍨⊂¨⍳⍴Z←⍵}sq5
5957

説明:

  • ⊂¨⍳⍴Z←⍵:行列をに保存しZます。で可能な座標の各ペアのリストを作成しZます。
  • ∘.{... }⍨:座標の各ペアと組み合わせた座標の各ペア:
    • +/⊃×⍨⍺-⍵:計算distance^2:座標の最初のペアを2番目から減算し、両方を乗算して結果を合計します
    • ∨/Z[⍺⍵]Z座標の両方のペアの数値を取得し、GCDを見つけます
    • ×:互いに乗算します
  • +/∊:その結果の要素を合計する
  • .5×:0.5を掛けます(各非ゼロペアを2回早くカウントしたため)

UTF-8バイトを使用してカウントすると、これは72バイトになります。
ケニー14年

2
@KennyTM:APL文字セットは1バイトに収まります。これを使用するエンコーディングが存在します。APLはUnicodeに数十年前から存在します。このサイトでは、Unicode文字が使用されていない限り、APL文字をバイトとしてカウントすることが認められているようです。(つまり、Unicodeコードポイントを使用して文字列などをエンコードします。)
marinus

@marinus、それは理にかなっています。MathematicaのUnicode文字についてどう思いますか?
maf-soft 14

@ maf-soft:まあ、使用されているすべての文字がバイト内に収まる既存のエンコーディングがある場合文字)、それは文字ごとに1バイトとしてカウントすることができます。そうでない場合、それはできません。ただし、Mathematicaが128未満の一意のUnicode文字を使用している場合、ASCIIを下半分に、バイトの上半分に簡単にマッピングできます。[1/2]。
マリヌス14

@ maf-soft:ただし、これは斬新なエンコーディング(〜 "言語")になるので、翻訳プログラムを提供する必要があり、ルールにより、翻訳プログラムよりも新しい質問でのみ使用できます。これは、質問に先行する言語でのみ質問に回答できることを示しています(これにより、誰かが1バイトのコマンドで言語を定義して、質問を正確に解決できなくなります)。[2/2]
マリヌス14

5

Mathematica(83 82 79 69 67 66)

準備

a={{10,8,11,14,12},{21,4,19,7,9},{5,13,23,1,16},{18,3,17,2,15},{24,22,25,6,20}}

コード

#/2&@@Tr[ArrayRules@a~Tuples~2/.{t_->u_,v_->w_}->u~GCD~w#.#&[t-v]]

Unicode文字を使用してカウントする場合:62

Tr[ArrayRules@a~Tuples~2/.{t_u_,v_w_}u~GCD~w#.#&[t-v]]〚1〛/2

あなたは「はUTFバージョンを使用することができます- > `:
スウィッシュ

@swish ->は2文字と1文字を使用しますが、UTF-8では->2バイトと3バイトを使用します。そのため、メトリックによっては長くなる場合があります。
ケニー

APLソリューションをよく見てください。そのため、メトリックはこの1つの文字に含まれていると思います;)
swish

@swish明記されていない場合、UTF-8バイトがデフォルトであるため、OPが明確にする必要があります:)
kennytm

@KennyTM-何がベストかわからない。このサイトでよくあることをフォローしたいと思います。現在、調べる時間はありません。誰かがいくつかのリンクを手伝ってくれますか?OPコメントに記載されているチャットを使用することもできます。
MAF-ソフト

5

パイソン-128 112 90 89 88

準備:

import pylab as pl
from fractions import gcd
from numpy.linalg import norm
from itertools import product

A = pl.array([
    [10,  8, 11, 14, 12],
    [21,  4, 19,  7,  9],
    [ 5, 13, 23,  1, 16],
    [18,  3, 17,  2, 15],
    [24, 22, 25,  6, 20]])

デラコルテ番号(計算する行)の計算:

D=sum(gcd(A[i,j],A[m,n])*norm([m-i,n-j])**2for j,n,i,m in product(*[range(len(A))]*4))/2

出力:

print D

結果:

5957

2
両方のforループを1つのジェネレーターに折りたたむことができますsum。また、スター付きの割り当てを使用してコピーを作成することP(R,R)により*x,=product(R,R)、変数に保存できます。さらに良いことに、それを4つ折りの製品にしてproduct(R,R,R,R)、そのままにすることができますfor j,n,i,m in product(*[R]*4)
xnor 14年

@xnor:すばらしい!*[R]*4自分で探していたが、仕事に就けなかった。
ファルコ

1
準備がバイトカウントにカウントされないのでfrom fractions import gcd as g、重要なセクションにバイトを保存するようなことはできませんか?
FlipTack

3

Pyth 43

この答えは、ほぼ間違いなくさらにゴルフをすることができます。私は特に距離の計算が好きではありません。

K^lJ.5VJFdUN~Z*i@JN@Jd+^-/dK/NK2^-%dK%NK2;Z

これを設定するには、線形化された配列を変数Jに保存します。これを行うには、次のように記述します。

J[3 2 9 4 1 8 5 6 7)

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

フロートを出力します。これは合法だと思う、ルールを破ったかどうか教えてください:)

説明:

                                             : Z=0 (implicit)
K^lJ.5                                       : K=sqrt(len(J))
      VJ                                     : for N in range(len(J))
        FdUN                                 : for d in range(N)
            ~Z*                              : Z+= the product of
               i@JN@Jd                       : GCD(J[N],J[d])
                      +^-/dK/NK2^-%dK%NK2    : (d/K-N/K)^2 + (d%K-N%K)^2 (distance)
                                         ;Z  : end all loops, and print Z

うわー、私はついにAPLでPythを打ち負かしました。
マリヌ

@marinus母、私はまだ試みていますが、少なくとも私を打つことができたと思います:)
FryAmTheEggman

うわー、これはクレイジーです。私は今doc.txtを読んでいますが、読むのは本当に難しいと思います!
ルービック

@rubik少なくともAPLではありません:Dこの言語全体が1人の男isaacgによって管理されているため、ドキュメントは100%正確ではありません。質問がある場合は、チャットで自由に質問してください:)
FryAmTheEggman 14

2

CJam、55

q~:Q__,mqi:L;m*{_~{_@\%}h;\[Qf#_Lf/\Lf%]{~-_*}/+*}%:+2/

マトリックスを次の形式のSTDINとして取得します。

[10  8 11 14 12
 21  4 19  7  9
  5 13 23  1 16
 18  3 17  2 15
 24 22 25  6 20]

こちらからオンラインでお試しください


行列を無料でハードコーディングして、{}stdinを使用するのではなく、ブロックを作成するために使用できると思います。また、行列を1次元配列にダンプしていますか?既にフォーマットされたマトリックスを使用できると思います。OPの例を参照してください。(私はCJamをよく知らないので、これを塩の粒で取ります;))
FryAmTheEggman

マトリックスを読み取り、それを単一のリストに変換するのがq~]一部です。ハードコーディングしてブロックを使用する場合と比べて短い(推測)
オプティマイザー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.