Calcular o número Delacorte de um quadrado


12

Desafio: implemente o cálculo de um número Delacorte em qualquer idioma. O menor código vence.

Para uma dada matriz quadrada de números inteiros distintos 1..n² (comprimento lateral possível n pelo menos entre 3 e 27), seu número Delacorte é a soma dos produtos gcd (a, b) × distância² (a, b) para cada distinto par de números inteiros {a, b}.

O exemplo a seguir mostra um quadrado 3 × 3 com um número Delacorte de 160.

3 2 9
4 1 8
5 6 7

Nesse quadrado, temos 36 pares distintos para calcular, por exemplo, o par 4 e 6: gcd (4, 6) × distância ² (4, 6) = 4

Outro exemplo de quadrado para teste - esse número é 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

Os números Delacorte são retirados deste concurso de programação - veja mais detalhes ... O concurso terminou em janeiro de 2015. Foi muito divertido!

Regras:

Quebras de linha necessárias contam como 1 caractere. Você pode postar sua solução de golfe com quebras de linha, mas elas serão contabilizadas apenas se necessário nesse idioma.

Você pode escolher como lidar com entrada e saída e não precisa contar a estrutura necessária do seu idioma, como inclusões padrão ou cabeçalhos das funções principais. Somente o código real conta (incluindo definições de atalho / alias), como neste exemplo de 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();
        }
    }
}

Você também pode inserir o quadrado como matriz bidimensional ou a partir de um prompt ou como sequência ou algum tipo de coleção padrão. Uma matriz bidimensional é a única maneira de não precisar calcular o comprimento lateral do quadrado.
Não é necessária uma subfunção para o trabalho real. Você também pode colocar o código diretamente em Main ().

Ainda mais preparação é permitida gratuitamente, como aqui:

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();
    }
}

Se você não tiver certeza se sua longa preparação está dentro do espírito dessas regras ou pode ser chamada de trapaça, basta perguntar :)


Parece que, no caso de Python, todas as inclusões são gratuitas? Isso pode fazer com que algumas otimizações estranhas ...
Falko

@ Falko, a questão é: o que são inclusões padrão? Por favor, tente entender o espírito das regras e adaptá-las ao seu idioma. Então, não: veja meu usingexemplo - se for usado para incluir uma biblioteca, porque, caso contrário, você não poderá chamar alguma função, ela será gratuita. Se você usá-lo para definir algum apelido curto para qualquer coisa, toda a instrução conta.
Maf-soft

@ Otimizador: O significado da função de distância está um pouco oculto no link : é o quadrado da distância euclidiana entre os dois campos.
Falko

@ Optimizer, em vez de defini-lo exatamente, dei um exemplo, para que você possa ter certeza do que se entende. Eu pensei que é suficiente e aumentar a diversão ...
MAF-soft

E devo dizer que, embora seja uma pergunta legítima, parece que você a postou aqui para finalmente poder participar do concurso;)
Optimizer

Respostas:


6

APL (38)

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

Esta é uma função que usa uma matriz como argumento correto, assim:

      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

Explicação:

  • ⊂¨⍳⍴Z←⍵: armazene a matriz em Z. Faça uma lista de cada possível par de coordenadas Z.
  • ∘.{... }⍨: para cada par de coordenadas, combinado com cada par de coordenadas:
    • +/⊃×⍨⍺-⍵: calcular distance^2: subtrair o primeiro par de coordenadas do segundo, multiplicar por eles mesmos e somar o resultado
    • ∨/Z[⍺⍵]: obtenha o número Zpara os dois pares de coordenadas e encontre o GCD
    • ×: multiplicá-los um pelo outro
  • +/∊: soma os elementos do resultado desse
  • .5×: multiplique por 0,5 (porque contamos cada par diferente de zero duas vezes antes)

Isso seria 72 bytes se contarmos usando bytes UTF-8.
kennytm

2
@KennyTM: o conjunto de caracteres APL cabe dentro de um byte. Existem codificações que usam isso. O APL é anterior ao Unicode há décadas. Parece ser aceito neste site contar caracteres APL como bytes, desde que nenhum caractere Unicode seja usado. (ou seja, utilizando pontos de código Unicode para codificar strings, ou algo.)
marinus

@ Marinus, isso parece razoável. O que você acha dos caracteres unicode no Mathematica?
Maf-soft

@ maf-soft: bem, se houver uma codificação existente pela qual todos os caracteres usados ​​se encaixam em um byte (de modo que inclua os caracteres 'especial' e 'normal', portanto, não poderá haver mais do que 256 caracteres únicos) caracteres), pode ser contado como um byte por caractere. Se não, então não pode. No entanto, se o Mathematica usar menos de 128 caracteres Unicode exclusivos, eles poderão ser mapeados trivialmente na metade superior do byte, com ASCII na metade inferior. [1/2].
marinus

@ maf-soft: essa seria uma nova codificação (~ "idioma"); portanto, você precisará fornecer um programa tradutor e só poderá usá-lo em perguntas mais recentes que o seu programa tradutor, pela regra que afirma que você só pode responder perguntas em idiomas anteriores à pergunta (para impedir que alguém defina um idioma com um comando de 1 byte para resolver exatamente a questão). [2/2]
marinus

5

Mathematica (83 82 79 69 67 66)

Preparação

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}}

Código

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

Se contarmos usando caracteres Unicode: 62 :

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

Você pode usar a versão UTF de '-> `: 
swish

O @swish utiliza ->2 caracteres e 1, no entanto, ->2 bytes e 3 bytes em UTF-8. Portanto, pode demorar mais, dependendo das métricas.
Kennytm 11/11

Bem, olhe para solução APL, então eu acho que a métrica é em caracteres em um presente;)
swish

@swish Isso é algo OP deve esclarecer como UTF-8 bytes é o padrão se não for indicado :)
kennytm

@KennyTM - Não sei o que é melhor. Gostaria de acompanhar o que é comum neste site. Atualmente não tenho tempo para descobrir. Alguém poderia ajudar com alguns links? Você também pode usar o bate-papo mencionado nos comentários do OP.
Maf-soft

5

Python - 128 112 90 89 88

Preparação:

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

Computando o número Delacorte (a linha que conta):

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

Resultado:

print D

Resultado:

5957

2
Você pode recolher os dois forloops em um único gerador e sumuma vez. Além disso, você pode salvar P(R,R)em uma variável *x,=product(R,R)usando a atribuição com estrela para fazer uma cópia. Ainda melhor, você pode torná-lo o produto quádruplo product(R,R,R,R)e apenas fazer for j,n,i,m in product(*[R]*4).
Xnor

@xnor: Ótimo! *[R]*4era o que eu estava procurando sozinho, mas não consegui trabalhar.
Falko

1
Como sua preparação não conta para a contagem de bytes, você não pode fazer algo como from fractions import gcd as gsalvar bytes na seção importante?
FlipTack # 04/16

3

Pitão 43

Essa resposta quase certamente poderia ser ainda mais jogada; Eu particularmente não gosto do cálculo da distância.

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

Para configurar isso, armazene a matriz linearizada na variável J. Você pode fazer isso escrevendo:

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

Experimente online .

Produz um flutuador. Eu acho que isso é legítimo, por favor me diga se eu quebrei uma regra :)

Explicação:

                                             : 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

Uau, eu finalmente venci o Pyth com o APL.
marinus

@marinus Haha, eu ainda estou tentando, mas eu acho que você tem me bater, pelo menos :)
FryAmTheEggman

Uau, isso é loucura. Estou lendo o doc.txt agora, mas acho realmente difícil de ler!
Rubik

@rubik Pelo menos não é APL: D O documento não é 100% exato, porque todo esse idioma é mantido por um cara: isaacg . Se você tem perguntas, sinta livre para me perguntar / ele no chat :)
FryAmTheEggman

2

CJam, 55

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

Toma a matriz como STDIN no seguinte formato:

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

Experimente online aqui


Eu acho que você pode codificar a matriz gratuitamente e usar {}para criar um bloco em vez de usar stdin. Além disso, você está despejando a matriz em uma matriz unidimensional? Eu acho que você pode pegar a matriz já formatada, veja os exemplos do OP. (Eu não conheço bem o CJam, então leve isso com um grão de sal;))
FryAmTheEggman 10/11/14

Ler a matriz e convertê-la em lista única é a q~]parte. que é menor em comparação com quando eu disco rígido código-lo e usar um bloco (eu acho)
Optimizer
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.