计算正方形的Delacorte数


12

挑战:以任何语言实现Delacorte数的计算。最短的代码获胜。

对于不同整数的一个给定的方阵1..n²(可能边长Ñ在3和27之间至少),其德拉科特数是产品的总和满足gcd(A,B)×distance²(A,B)为每个不同的对整数{a,b}。

以下示例显示了Delacorte数为160的3×3正方形。

3 2 9
4 1 8
5 6 7

在这个正方形中,我们有36个不同的对来计算,例如对4和6:gcd(4,6)× 距离 ²(4,6)= 4

另一个用于测试的示例正方形-的Delacorte数为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

Delacorte Numbers摘自该编程竞赛 -有关详细信息,请参阅此处。竞赛于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();
        }
    }
}

您也可以将正方形输入为二维数组,也可以从提示输入,也可以输入为字符串或某些标准收集类型。二维数组是不必自己计算正方形的边长的唯一方法。
不需要用于实际工作的子函数,您也可以将代码直接放在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 2014年

@Falko,问题是,标准包括什么?请尝试理解规则的精神,并使其适应您的语言。所以,不:请看我的using示例-如果它用于包含库,因为否则您无法调用某些函数,那么它是免费的。如果使用它为任何东西定义一些简短的别名,那么整个指令就很重要。
maf-soft 2014年

@Optimizer:距离函数的含义在链接中有些隐蔽:这是两个字段之间的欧几里德距离的平方。
Falko 2014年

我提供了一个示例,而不是确切定义@Optimizer,因此您可以确定它的含义。我认为就足够了,并增加了乐趣……
maf-soft 2014年

我必须说,尽管这是一个合法问题,但看来您已经将它张贴在这里,终于可以进入比赛了;)
Optimizer

Answers:


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:从第二对中减去第一对坐标,将它们自己相乘并求和
    • ∨/Z[⍺⍵]:获取Z两个坐标对的数字,并找到GCD
    • ×:彼此相乘
  • +/∊:求和结果的元素
  • .5×:乘以0.5(因为我们之前对每个非零对进行了两次计数)

如果我们使用UTF-8字节计数,则为72字节。
kennytm 2014年

2
@KennyTM:APL字符集适合一个字节。存在使用此编码。APL比Unicode早几十年。只要不使用Unicode字符,在本站点上似乎可以将APL字符计数为字节。(即使用Unicode代码点编码字符串等)
marinus

@marinus,听起来很合理。您如何看待Mathematica中的Unicode字符?
maf-soft 2014年

@ maf-soft:好吧,如果存在现有的编码,使用的所有字符都适合一个字节(因此包括“特殊”和“普通”字符),因此唯一的字符数不能超过256字符),则可以算作每个字符一个字节。如果没有,那就不能。但是,如果Mathematica使用少于128个唯一的Unicode字符,则可以将它们简单地映射到字节的上半部分,而ASCII则在下半部分中。[1/2]。
marinus 2014年

@ maf-soft:不过,这将是一种新颖的编码(〜“语言”),因此您需要提供一个翻译程序,并且按照规则,您只能在比您的翻译程序新的问题上使用它指出您只能以问题之前的语言回答问题(这是为了防止有人使用1字节命令定义语言来准确解决问题)。[2/2]
marinus

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

@swish 在UTF-8中需要2个->字符和1个字符,但是,->需要2个字节和3个字节。因此,根据指标可能会更长。
kennytm 2014年

好吧,请看一下APL解决方案,所以我想度量标准就是这个字符;)
swish 2014年

@swish这是OP应该澄清的事情,因为如果未声明,则默认为UTF-8字节:)
kennytm 2014年

@KennyTM-我不确定什么是最好的。我想了解本网站上的常见信息。目前,我没有时间找出答案。有人可以帮忙一些链接吗?您还可以使用OP注释中提到的聊天。
maf-soft 2014年

5

蟒蛇-128112 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]])

计算Delacorte数(计数的行):

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循环折叠成一个生成器,sum然后生成一次。此外,您还可以P(R,R)通过*x,=product(R,R)使用星标赋值来创建副本来通过保存到变量。更好的是,您可以使其成为四重产品product(R,R,R,R),只需这样做即可for j,n,i,m in product(*[R]*4)
xnor 2014年

@xnor:太好了!*[R]*4是我自己在寻找的东西,但无法上班。
Falko 2014年

1
看到您的准备工作不计入字节数,难道您不能做一些想from fractions import gcd as g在重要部分保存字节的事情吗?
FlipTack

3

腐霉病 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 2014年

@marinus Haha,我仍在尝试,但我想至少可以让我击败:)
FryAmTheEggman 2014年

哇,这太疯狂了。我现在正在阅读doc.txt,但我觉得很难阅读!
rubik 2014年

@rubik至少它不是APL:D该文档不是100%准确的,因为整个语言是由一个人维护的isaacg。如果您有问题,请随时在聊天中问我/他:)
FryAmTheEggman 2014年

2

果酱,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。另外,您是否将矩阵转储为一维数组?我认为您可以采用已经格式化的矩阵,请参阅OP的示例。(我不太了解CJam,所以带一点盐吧;))
FryAmTheEggman 2014年

读取矩阵并将其转换为单个列表是其中的q~]一部分。与我对其进行硬编码并使用块的时间相比,它要短一些(我猜)
Optimizer
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.