Défi: implémenter le calcul d'un numéro Delacorte dans n'importe quelle langue. Le code le plus court gagne.
Pour une matrice carrée donnée d'entiers distincts 1..n² (longueur de côté possible n au moins entre 3 et 27), son nombre Delacorte est la somme des produits pgc (a, b) × distance² (a, b) pour chaque distinct paire d'entiers {a, b}.
L'exemple suivant montre un carré 3 × 3 avec un nombre Delacorte de 160.
3 2 9
4 1 8
5 6 7
Dans ce carré, nous avons 36 paires distinctes à calculer, par exemple la paire 4 et 6: pgcd (4, 6) × distance ² (4, 6) = 4
Un autre exemple de carré pour les tests - celui-ci a un numéro 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
Les numéros Delacorte sont tirés de ce concours de programmation - voir ici pour plus de détails ... Le concours s'est terminé en janvier 2015. C'était très amusant!
Règles:
Les sauts de ligne nécessaires comptent pour 1 caractère. Vous pouvez publier votre solution golfée avec des sauts de ligne, mais ils ne sont comptés que si nécessaire dans cette langue.
Vous pouvez choisir comment gérer les entrées et les sorties et vous n'avez pas à compter le cadre nécessaire de votre langage, comme les en-têtes standard ou les fonctions principales. Seul le code réel compte (y compris les définitions de raccourci / alias), comme dans cet exemple 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();
}
}
}
Vous pouvez également saisir le carré sous forme de tableau à deux dimensions ou à partir d'une invite ou sous forme de chaîne ou d'un type de collection standard. Un tableau à deux dimensions est le seul moyen de ne pas avoir à calculer vous-même la longueur du côté du carré.
Une sous-fonction pour le travail réel n'est pas requise, vous pouvez également placer le code directement dans Main ().
Encore plus de préparation est autorisée gratuitement, comme ici:
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 vous ne savez pas si votre longue préparation est dans l'esprit de ces règles ou pourrait être qualifiée de tricherie, demandez simplement :)
using
exemple - s'il est utilisé pour inclure une bibliothèque car sinon vous ne pourriez pas appeler une fonction, c'est gratuit. Si vous l'utilisez pour définir un alias court pour quoi que ce soit, l'instruction entière compte.Réponses:
APL (38)
C'est une fonction qui prend une matrice comme argument de droite, comme ceci:
Explication:
⊂¨⍳⍴Z←⍵
: stocker la matrice dansZ
. Faites une liste de chaque paire de coordonnées possibleZ
.∘.{
...}⍨
: pour chaque paire de coordonnées, combinée à chaque paire de coordonnées:+/⊃×⍨⍺-⍵
: calculerdistance^2
: soustraire la première paire de coordonnées de la seconde, multiplier les deux par elles-mêmes et additionner le résultat∨/Z[⍺⍵]
: obtenir le nombreZ
pour les deux paires de coordonnées et trouver le GCD×
: multipliez-les les uns par les autres+/∊
: additionner les éléments du résultat de cette.5×
: multipliez par 0,5 (car nous avons compté chaque paire non nulle deux fois plus tôt)la source
Mathematica (
838279696766)Préparation
Code
Si on compte en utilisant des caractères Unicode: 62 :
la source
->
prend 2 caractères et
prend 1 caractère, cependant,->
prend 2 octets et
prend 3 octets en UTF-8. Cela peut donc être plus long selon les métriques.Python -
128 112 90 90 8988Préparation:
Calcul du nombre Delacorte (la ligne qui compte):
Production:
Résultat:
la source
for
boucles en un seul générateur et une seulesum
fois. En outre, vous pouvez enregistrerP(R,R)
dans une variable en*x,=product(R,R)
utilisant l'affectation suivie pour effectuer une copie. Encore mieux, vous pouvez en faire le produit quadrupleproduct(R,R,R,R)
et le fairefor j,n,i,m in product(*[R]*4)
.*[R]*4
est ce que je cherchais moi-même mais je n'ai pas pu me mettre au travail.from fractions import gcd as g
enregistrer des octets dans la section importante?Pyth 43
Cette réponse pourrait presque certainement être étudiée plus loin; Je n'aime pas particulièrement le calcul de la distance.
Pour configurer cela, stockez le tableau linéarisé dans la variable J. Vous pouvez le faire en écrivant:
Essayez-le en ligne .
Sort un flottant. Je pense que c'est légitime, dites-moi si j'ai enfreint une règle :)
Explication:
la source
CJam, 55
Prend la matrice comme STDIN dans le format suivant:
Essayez-le en ligne ici
la source
{}
pour créer un bloc plutôt que d'utiliser stdin. De plus, jetez-vous la matrice dans un tableau unidimensionnel? Je pense que vous pouvez prendre la matrice déjà formatée, voir les exemples de l'OP. (Je ne connais pas bien CJam, alors prenez ceci avec un grain de sel;))q~]
partie. qui est plus court que lorsque je le code en dur et utilise un bloc (je suppose)