Задача: осуществить подсчет числа Делакорта на любом языке. Самый короткий код выигрывает.
Для данной квадратной матрицы различных целых чисел 1..n² (возможная длина стороны n, по крайней мере, между 3 и 27) его число Делакокера является суммой произведений gcd (a, b) × расстояние² (a, b) для каждого отдельного пара целых чисел {a, b}.
В следующем примере показан квадрат 3 × 3 с номером Delacorte 160.
3 2 9
4 1 8
5 6 7
В этом квадрате мы рассчитываем 36 различных пар, например, пары 4 и 6: gcd (4, 6) × расстояние ² (4, 6) = 4
Еще один пример квадрата для тестирования - номер Делакорта 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
Номера Delacorte взяты из этого соревнования по программированию - подробности см. Там ... Конкурс завершился в январе 2015 года. Это было очень весело!
Правила:
Необходимые разрывы строк считаются за 1 символ. Вы можете опубликовать свое решение для игры в гольф с переносами строк, но они учитываются только при необходимости на этом языке.
Вы можете выбрать, как обрабатывать ввод и вывод, и вам не нужно подсчитывать необходимую структуру вашего языка, например стандартные заголовки или основные функции. Подсчитывается только фактический код (включая определения ярлыков / псевдонимов), как в этом примере 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();
}
}
}
Вы также можете ввести квадрат в виде двумерного массива или из приглашения, или в виде строки, или в некоторый стандартный тип коллекции. Двумерный массив - это единственный способ не рассчитывать длину стороны квадрата самостоятельно.
Подфункция для реальной работы не требуется, вы также можете поместить код непосредственно в Main ().
Еще больше подготовки предоставляется бесплатно, как здесь:
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();
}
}
Если вы не уверены, соответствует ли ваша длительная подготовка духу этих правил или может быть названа изменой, просто спросите :)
using
пример - если он используется для включения библиотеки, потому что в противном случае вы не можете вызвать какую-либо функцию, она бесплатна. Если вы используете его для определения какого-либо короткого псевдонима, вся команда будет иметь значение.Ответы:
APL (38)
Это функция, которая принимает матрицу в качестве правильного аргумента, вот так:
Объяснение:
⊂¨⍳⍴Z←⍵
: сохранить матрицу вZ
. Составьте список каждой возможной пары координат вZ
.∘.{
...}⍨
: для каждой пары координат в сочетании с каждой парой координат:+/⊃×⍨⍺-⍵
: рассчитатьdistance^2
: вычесть первую пару координат из второй, умножить обе на себя и суммировать результат∨/Z[⍺⍵]
: получить числоZ
для обеих пар координат и найти GCD×
: умножьте их друг на друга+/∊
: суммировать элементы результата этого.5×
: умножить на 0,5 (потому что мы посчитали каждую ненулевую пару дважды ранее)источник
Mathematica (
838279696766)подготовка
Код
Если посчитать с помощью символов Unicode: 62 :
источник
->
занимает 2 символа и
занимает 1 символ, однако->
занимает 2 байта и
занимает 3 байта в UTF-8. Так что это может быть дольше в зависимости от метрики.Питон -
128 112 90 8988Приготовление:
Вычисление номера Delacorte (строка, которая считает):
Выход:
Результат:
источник
for
петли в один генератор иsum
один раз. Кроме того, вы можете сохранитьP(R,R)
в переменной*x,=product(R,R)
, используя помеченное назначение, чтобы сделать копию. Еще лучше, вы можете сделать это четырехкратным продуктомproduct(R,R,R,R)
и просто делатьfor j,n,i,m in product(*[R]*4)
.*[R]*4
это то, что я искал сам, но не мог добраться до работы.from fractions import gcd as g
сохранения байтов в важном разделе?Pyth 43
Этот ответ почти наверняка можно продолжить в гольфе; Мне особенно не нравится расчет расстояния.
Чтобы установить это, сохраните линеаризованный массив в переменной J. Вы можете сделать это, написав:
Попробуйте онлайн .
Выводит поплавок. Я думаю, что это законно, пожалуйста, скажите мне, если я нарушил правило :)
Объяснение:
источник
CJam, 55
Принимает матрицу как STDIN в следующем формате:
Попробуйте онлайн здесь
источник
{}
для создания блока вместо использования стандартного ввода. Кроме того, вы выгружаете матрицу в одномерный массив? Я думаю, что вы можете взять матрицу уже отформатирован, см. Примеры ОП. (Я плохо знаю CJam, так что возьмите это сq~]
частью. который короче по сравнению с тем, когда я жестко кодирую его и использую блок (наверное)