Рассчитайте число Делакорта квадрата


12

Задача: осуществить подсчет числа Делакорта на любом языке. Самый короткий код выигрывает.

Для данной квадратной матрицы различных целых чисел 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();
    }
}

Если вы не уверены, соответствует ли ваша длительная подготовка духу этих правил или может быть названа изменой, просто спросите :)


Похоже, в случае с Python все включения бесплатны? Это может вызвать некоторые странные оптимизации ...
Falko

@ Фалько, вопрос в том, что стандартно включает? Пожалуйста, постарайтесь понять дух правил и адаптировать их к своему языку. Итак, нет: см. Мой usingпример - если он используется для включения библиотеки, потому что в противном случае вы не можете вызвать какую-либо функцию, она бесплатна. Если вы используете его для определения какого-либо короткого псевдонима, вся команда будет иметь значение.
maf-soft

@Optimizer: значение функции расстояния несколько скрыто в ссылке : это квадрат евклидова расстояния между двумя полями.
Фалько

@Optimizer, вместо точного определения, я привел пример, чтобы вы могли быть уверены, что имеется в виду. Я подумал, что этого достаточно и добавил веселья ...
maf-soft

И я должен сказать, что, хотя это законный вопрос, похоже, что вы разместили его здесь, чтобы, наконец, иметь возможность участвовать в этом конкурсе;)
Оптимизатор

Ответы:


6

APL (38)

{.5×+/∊∘.{(∨/Z[⍺⍵])×+/⊃×⍨⍺-⍵}⍨⊂¨⍳⍴Z←⍵}

Это функция, которая принимает матрицу в качестве правильного аргумента, вот так:

      sq5←↑(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)
      sq5
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
      {.5×+/∊∘.{(∨/Z[⍺⍵])×+/⊃×⍨⍺-⍵}⍨⊂¨⍳⍴Z←⍵}sq5
5957

Объяснение:

  • ⊂¨⍳⍴Z←⍵: сохранить матрицу в Z. Составьте список каждой возможной пары координат в Z.
  • ∘.{... }⍨: для каждой пары координат в сочетании с каждой парой координат:
    • +/⊃×⍨⍺-⍵: рассчитать distance^2: вычесть первую пару координат из второй, умножить обе на себя и суммировать результат
    • ∨/Z[⍺⍵]: получить число Zдля обеих пар координат и найти GCD
    • ×: умножьте их друг на друга
  • +/∊: суммировать элементы результата этого
  • .5×: умножить на 0,5 (потому что мы посчитали каждую ненулевую пару дважды ранее)

Это будет 72 байта, если мы будем считать с использованием байтов UTF-8.
Kennytm

2
@KennyTM: кодировка APL вписывается в байт. Существуют кодировки, которые используют это. APL предшествует Unicode десятилетиями. На этом сайте, по-видимому, принято считать символы APL в байтах, если символы Unicode не используются. (т. е. используя кодовые точки Unicode для кодирования строк или чего-то еще.)
marinus

@marinus, это звучит разумно. Что вы думаете о Unicode-символах в Mathematica?
maf-soft

@ maf-soft: хорошо, если существует существующая кодировка, в которой все используемые символы помещаются в байте (так что включает как «специальные», так и «нормальные» символы, поэтому не может быть более 256 уникальных символов), то его можно считать одним байтом на символ. Если нет, то не может. Однако, если Mathematica использует менее 128 уникальных символов Unicode, они могут быть тривиально отображены в верхнюю половину байта с ASCII в нижней половине. [1/2].
Маринус

@ maf-soft: это будет новая кодировка (~ "language"), поэтому вам нужно будет предоставить программу-переводчик, и вы можете использовать ее только по вопросам, которые новее, чем ваша программа-переводчик, по правилу в нем говорится, что вы можете отвечать на вопросы только на тех языках, которые предшествуют этому вопросу (это позволяет предотвратить определение языка с помощью 1-байтовой команды для точного решения вопроса). [2/2]
марин

5

Mathematica (83 82 79 69 67 66)

подготовка

a={{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}}

Код

#/2&@@Tr[ArrayRules@a~Tuples~2/.{t_->u_,v_->w_}->u~GCD~w#.#&[t-v]]

Если посчитать с помощью символов Unicode: 62 :

Tr[ArrayRules@a~Tuples~2/.{t_u_,v_w_}u~GCD~w#.#&[t-v]]〚1〛/2

Вы можете использовать UTF-версию '-> `: 
swish

@swish ->занимает 2 символа и занимает 1 символ, однако ->занимает 2 байта и занимает 3 байта в UTF-8. Так что это может быть дольше в зависимости от метрики.
Kennytm

Хорошо посмотрите на решение APL, так что я думаю, что метрика в символах на этом;)
swish

@swish Это то, что ОП должен уточнить, поскольку байты UTF-8 являются значениями по умолчанию, если не указано :)
kennytm

@KennyTM - я не уверен, что лучше. Я хотел бы следить за тем, что часто встречается на этом сайте. В настоящее время у меня нет времени, чтобы узнать. Может ли кто-нибудь помочь с некоторыми ссылками? Вы также можете использовать чат, упомянутый в комментариях ОП.
maf-soft

5

Питон - 128 112 90 89 88

Приготовление:

import pylab as pl
from fractions import gcd
from numpy.linalg import norm
from itertools import product

A = pl.array([
    [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 (строка, которая считает):

D=sum(gcd(A[i,j],A[m,n])*norm([m-i,n-j])**2for j,n,i,m in product(*[range(len(A))]*4))/2

Выход:

print D

Результат:

5957

2
Вы можете свернуть обе forпетли в один генератор и sumодин раз. Кроме того, вы можете сохранить P(R,R)в переменной *x,=product(R,R), используя помеченное назначение, чтобы сделать копию. Еще лучше, вы можете сделать это четырехкратным продуктом product(R,R,R,R)и просто делать for j,n,i,m in product(*[R]*4).
xnor

@xnor: Отлично! *[R]*4это то, что я искал сам, но не мог добраться до работы.
Фалько

1
поскольку ваша подготовка не учитывается в счетчике байтов, разве вы не можете сделать что-то вроде from fractions import gcd as gсохранения байтов в важном разделе?
FlipTack

3

Pyth 43

Этот ответ почти наверняка можно продолжить в гольфе; Мне особенно не нравится расчет расстояния.

K^lJ.5VJFdUN~Z*i@JN@Jd+^-/dK/NK2^-%dK%NK2;Z

Чтобы установить это, сохраните линеаризованный массив в переменной J. Вы можете сделать это, написав:

J[3 2 9 4 1 8 5 6 7)

Попробуйте онлайн .

Выводит поплавок. Я думаю, что это законно, пожалуйста, скажите мне, если я нарушил правило :)

Объяснение:

                                             : Z=0 (implicit)
K^lJ.5                                       : K=sqrt(len(J))
      VJ                                     : for N in range(len(J))
        FdUN                                 : for d in range(N)
            ~Z*                              : Z+= the product of
               i@JN@Jd                       : GCD(J[N],J[d])
                      +^-/dK/NK2^-%dK%NK2    : (d/K-N/K)^2 + (d%K-N%K)^2 (distance)
                                         ;Z  : end all loops, and print Z

Вау, я наконец победил Пита с помощью APL.
Маринус

@marinus Хаха, я все еще пытаюсь, но я думаю, что ты меня побил, по крайней мере :)
FryAmTheEggman

Вау, это безумие Я сейчас читаю doc.txt, но мне очень трудно его читать!
Рубик

@rubik По крайней мере, это не APL: D Документ не на 100% точен, потому что весь этот язык поддерживается одним парнем: isaacg . Если у вас есть вопросы, не стесняйтесь спрашивать меня / его в чате :)
FryAmTheEggman

2

CJam, 55

q~:Q__,mqi:L;m*{_~{_@\%}h;\[Qf#_Lf/\Lf%]{~-_*}/+*}%:+2/

Принимает матрицу как STDIN в следующем формате:

[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]

Попробуйте онлайн здесь


Я думаю, что вы могли бы жестко запрограммировать матрицу бесплатно и использовать ее {}для создания блока вместо использования стандартного ввода. Кроме того, вы выгружаете матрицу в одномерный массив? Я думаю, что вы можете взять матрицу уже отформатирован, см. Примеры ОП. (Я плохо знаю CJam, так что возьмите это с
крошкой

Чтение матрицы и преобразование ее в единый список является q~]частью. который короче по сравнению с тем, когда я жестко кодирую его и использую блок (наверное)
Optimizer
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.