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.Respuestas:
APL (38)
Esta es una función que toma una matriz como argumento correcto, así:
Explicación:
⊂¨⍳⍴Z←⍵
: almacena la matriz enZ
. Haga una lista de cada posible par de coordenadas enZ
.∘.{
...}⍨
: para cada par de coordenadas, combinado con cada par de coordenadas:+/⊃×⍨⍺-⍵
: calculardistance^2
: restar el primer par de coordenadas de la segunda, multiplicar por sí mismos y sumar el resultado∨/Z[⍺⍵]
: obtenga el númeroZ
para ambos pares de coordenadas y encuentre el MCD×
: multiplíquelos entre sí+/∊
: suma los elementos del resultado de ese.5×
: multiplique por 0.5 (porque contamos cada par distinto de cero dos veces antes)fuente
Mathematica (
838279696766)Preparación
Código
Si contamos con caracteres Unicode: 62 :
fuente
->
toma 2 caracteres y
toma 1 carácter, sin embargo,->
toma 2 bytes y
toma 3 bytes en UTF-8. Por lo tanto, puede ser más largo dependiendo de las métricas.Python -
128112 90 8988Preparación:
Calcular el número de Delacorte (la línea que cuenta):
Salida:
Resultado:
fuente
for
bucles en un solo generador ysum
una vez. Además, puede guardarP(R,R)
en una variable*x,=product(R,R)
utilizando la asignación destacada para hacer una copia. Aún mejor, puede hacer que sea el producto cuádrupleproduct(R,R,R,R)
y simplemente hacerlofor j,n,i,m in product(*[R]*4)
.*[R]*4
es lo que estaba buscando solo pero no pude ir a trabajar.from fractions import gcd as g
guardar bytes en la sección importante?Pyth 43
Es casi seguro que esta respuesta se pueda seguir jugando; Particularmente no me gusta el cálculo de distancia.
Para configurar esto, almacene la matriz linealizada en la variable J. Puede hacer esto escribiendo:
Pruébalo en línea .
Emite un flotador. Creo que esto es legítimo, dígame si he infringido una regla :)
Explicación:
fuente
CJam, 55
Toma la matriz como STDIN en el siguiente formato:
Pruébalo en línea aquí
fuente
{}
para hacer un bloque en lugar de usar stdin. Además, ¿está volcando la matriz en una matriz unidimensional? Creo que puede tomar la matriz ya formateada, vea los ejemplos del OP. (No conozco bien a CJam, así que tómalo con un grano de sal;))q~]
parte. que es más corto en comparación con cuando lo codifico y uso un bloque (supongo)