Wyzwanie: wdrożyć obliczenia liczby Delacorte w dowolnym języku. Najkrótszy kod wygrywa.
Dla danej macierzy kwadratowej różnych liczb całkowitych 1..n² (możliwa długość boku n co najmniej od 3 do 27), jej liczba Delacorte jest sumą produktów gcd (a, b) × odległość² (a, b) dla każdej odrębnej para liczb całkowitych {a, b}.
Poniższy przykład pokazuje kwadrat 3 × 3 z liczbą Delacorte 160.
3 2 9
4 1 8
5 6 7
W tym kwadracie mamy 36 różnych par do obliczenia, na przykład pary 4 i 6: gcd (4, 6) × odległość ² (4, 6) = 4
Kolejny przykładowy kwadrat do testowania - ma on liczbę 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
Numery Delacorte zostały zaczerpnięte z tego konkursu programistycznego - zobacz tam więcej szczegółów ... Konkurs zakończył się w styczniu 2015 roku. To była świetna zabawa!
Zasady:
Niezbędne podziały linii liczą się jako 1 znak. Możesz opublikować swoje rozwiązanie w golfa z podziałem linii, ale są one liczone tylko w razie potrzeby w tym języku.
Możesz wybrać sposób obsługi danych wejściowych i wyjściowych i nie musisz liczyć niezbędnej struktury swojego języka, na przykład nagłówków standardowych lub głównych funkcji. Liczy się tylko rzeczywisty kod (w tym definicje skrótów / aliasów), jak w tym przykładzie 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();
}
}
}
Możesz również wprowadzić kwadrat jako tablicę dwuwymiarową lub z wiersza polecenia lub jako ciąg znaków lub inny standardowy typ kolekcji. Dwuwymiarowa tablica to jedyny sposób, aby samodzielnie nie obliczać długości boku kwadratu.
Podfunkcja do faktycznej pracy nie jest wymagana, możesz także umieścić kod bezpośrednio w Main ().
Jeszcze więcej przygotowań jest dozwolone za darmo, jak tutaj:
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();
}
}
Jeśli nie masz pewności, czy twoje długie przygotowania są zgodne z duchem tych zasad, czy można je nazwać oszustwem, po prostu zapytaj :)
usingprzykład - jeśli jest używany do dołączenia biblioteki, ponieważ w przeciwnym razie nie można wywołać jakiejś funkcji, jest darmowy. Jeśli użyjesz go do zdefiniowania jakiegoś krótkiego aliasu, liczy się cała instrukcja.