Обчисліть число Делакорта квадрата


12

Завдання: здійснити обчислення числа Делакорте будь-якою мовою. Найкоротший код виграє.

Для даної квадратної матриці різних цілих чисел 1..n² (можлива довжина сторони n щонайменше між 3 і 27) її число Делакорте є сумою добутків gcd (a, b) × відстань² (a, b) для кожного окремого пара цілих чисел {a, b}.

Наступний приклад показує квадрат 3 × 3 з числом Делакорта 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].
marinus

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

5

Математика (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]])

Обчислення числа Делакорте (рядок, що рахується):

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

Піт 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

Нічого собі, я нарешті переміг Pyth APL.
marinus

@marinus Haha, я все ще намагаюся, але, думаю, ти мене побив, принаймні :)
FryAmTheEggman

Ого, це божевільно. Я читаю doc.txt зараз, але мені важко читати!
rubik

@rubik Принаймні це не APL: D Документ не на 100% точний, тому що всю цю мову підтримує один хлопець: isaacg . Якщо у вас є питання,
сміливо

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]

Спробуйте його онлайн тут


Я думаю, ви могли б жорстко кодувати матрицю безкоштовно і використовувати {}для створення блоку, а не використовувати stdin. Також ви скидаєте матрицю в одновимірний масив? Я думаю, ви можете взяти вже відформатовану матрицю, дивіться приклади ОП. (Я не знаю CJam добре, тому прийміть це з зерном солі;))
FryAmTheEggman

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