Un peu de maths …

Bon, histoire de changer, je me suis dit (pendant que j’enquillais les longueurs de piscine) que le problème 28 était facilement abordable dés lors qu’on y réfléchissait un peu (comme c’est en fait le cas pour tous les problèmes, mais la plupart du temps je préfère ne pas y penser et coder comme un goret).
Regardons donc un peu les données dont nous disposons :
Si on extrait de la spirale initiale
21 22 23 24 25
20  7  8  9 10
19  6  1  2 11
18  5  4  3 12
17 16 15 14 13

Les diagonales dans leur ordre d’écriture direct, on obtient ça (j’ai été un peu plus loin pour mieux valider mes hypothéses)

Ligne D1 D2 D3 D4 Somme
1 3 5 7 9 24
2 13 17 21 25 76
3 31 37 43 49 160
4 57 65 73 81 276
Est-ce qu’il y a là-dedans quoi que ce soit qui vous saute aux yeux ?

 

Personnellement, j’ai tout de suite remarqué deux choses
  1. A chaque ligne l’écart entre les différentes est constant. Il est égal à 2(n-1).
  2. Les valeurs de la dernière colonne sont des carrés de nombre impair. D’ailleurs, leurs valeurs correspondent précisément aux valeurs de la suite (2n-1). En passant, WolframAlpha, les jours on on veut faire un peu de maths facilement, c’est trop pratique.
Du coup, partant de ces deux constatations, je peux réécrire mes diagonales sous des formes plus comrpessées :

 

 

Du coup, la somme de ces diagonales peut s’écrire 4(2n-1)²-12(n-1). Enfin, la somme pour un n donné, hein. Une somme qui peut d’ailleurs se simplifier en 16n²-28n+16.
Ce qui me donne, vous l’admettrez, une façon rapide et efficace de calculer cette sommme : sum_(n=1)^3 (4(2n-1)²-12(n-1)))-3
Bon, je reconnais que l’écriture dans WolframAlpha est assez peu intuitive. Cela dit, ça vous donne une idée du total. Et le « -3 » à la fin permet de s’affranchir du fait que 1 est compté 4 fois dans la formule (une fois pour chaque diagonale).
Je pourrais donc faire tout ce calcul dans WolframAlpha, simplement en remplaçant ^3 par ^501. Mais je vais quand même poser le one-liner Groovy qui fait tout ça, toujours pour le fun.
Bon, c’est pas vraiment un one-liner (honte à moi), mais le code est quand même assez court :

 

 

 

Avec, je trouve, une utilisation sympa de Collection#sum(Object, Closure).
Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s