Reto: implementar el cálculo de un número de Delacorte en cualquier idioma. El código más corto gana.
Para una matriz cuadrada dada de enteros distintos 1..n² (longitud de lado posible n al menos entre 3 y 27), su número de Delacorte es la suma de los productos gcd (a, b) × distancia² (a, b) para cada distinto par de enteros {a, b}.
El siguiente ejemplo muestra un cuadrado de 3 × 3 con un número de Delacorte de 160.
3 2 9
4 1 8
5 6 7
En este cuadrado tenemos 36 pares distintos para calcular, por ejemplo, el par 4 y 6: mcd (4, 6) × distancia ² (4, 6) = 4
Otro cuadrado de ejemplo para pruebas: tiene un número de Delacorte de 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
Los números de Delacorte se toman de este concurso de programación . Vea allí para más detalles ... El concurso terminó en enero de 2015. ¡Fue muy divertido!
Reglas:
Los saltos de línea necesarios cuentan como 1 carácter. Puede publicar su solución de golf con saltos de línea, pero solo se cuentan si es necesario en ese idioma.
Puede elegir cómo manejar la entrada y la salida y no tiene que contar el marco necesario de su idioma, como cabeceras de funciones principales o de inclusión estándar. Solo el código real cuenta (incluidas las definiciones de acceso directo / alias), como en este ejemplo 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();
}
}
}
También puede ingresar el cuadrado como una matriz bidimensional o desde una solicitud o como una cadena o algún tipo de colección estándar. Una matriz bidimensional es la única forma de no tener que calcular la longitud lateral del cuadrado usted mismo.
No se requiere una subfunción para el trabajo real, también puede poner el código directamente dentro de Main ().
Se permite aún más preparación de forma gratuita, como aquí:
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();
}
}
Si no está seguro de si su larga preparación está en el espíritu de estas reglas o podría llamarse trampa, solo pregunte :)
using
ejemplo: si se usa para incluir una biblioteca porque de lo contrario no podría llamar a alguna función, es gratis. Si lo usa para definir algunos alias cortos para cualquier cosa, toda la instrucción cuenta.