Desafio: implemente o cálculo de um número Delacorte em qualquer idioma. O menor código vence.
Para uma dada matriz quadrada de números inteiros distintos 1..n² (comprimento lateral possível n pelo menos entre 3 e 27), seu número Delacorte é a soma dos produtos gcd (a, b) × distância² (a, b) para cada distinto par de números inteiros {a, b}.
O exemplo a seguir mostra um quadrado 3 × 3 com um número Delacorte de 160.
3 2 9
4 1 8
5 6 7
Nesse quadrado, temos 36 pares distintos para calcular, por exemplo, o par 4 e 6: gcd (4, 6) × distância ² (4, 6) = 4
Outro exemplo de quadrado para teste - esse número é 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
Os números Delacorte são retirados deste concurso de programação - veja mais detalhes ... O concurso terminou em janeiro de 2015. Foi muito divertido!
Regras:
Quebras de linha necessárias contam como 1 caractere. Você pode postar sua solução de golfe com quebras de linha, mas elas serão contabilizadas apenas se necessário nesse idioma.
Você pode escolher como lidar com entrada e saída e não precisa contar a estrutura necessária do seu idioma, como inclusões padrão ou cabeçalhos das funções principais. Somente o código real conta (incluindo definições de atalho / alias), como neste exemplo de 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();
}
}
}
Você também pode inserir o quadrado como matriz bidimensional ou a partir de um prompt ou como sequência ou algum tipo de coleção padrão. Uma matriz bidimensional é a única maneira de não precisar calcular o comprimento lateral do quadrado.
Não é necessária uma subfunção para o trabalho real. Você também pode colocar o código diretamente em Main ().
Ainda mais preparação é permitida gratuitamente, como aqui:
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();
}
}
Se você não tiver certeza se sua longa preparação está dentro do espírito dessas regras ou pode ser chamada de trapaça, basta perguntar :)
using
exemplo - se for usado para incluir uma biblioteca, porque, caso contrário, você não poderá chamar alguma função, ela será gratuita. Se você usá-lo para definir algum apelido curto para qualquer coisa, toda a instrução conta.