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 :)
using
exemplo - 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.Respostas:
APL (38)
Esta é uma função que usa uma matriz como argumento correto, assim:
Explicação:
⊂¨⍳⍴Z←⍵
: armazene a matriz emZ
. Faça uma lista de cada possível par de coordenadasZ
.∘.{
...}⍨
: para cada par de coordenadas, combinado com cada par de coordenadas:+/⊃×⍨⍺-⍵
: calculardistance^2
: subtrair o primeiro par de coordenadas do segundo, multiplicar por eles mesmos e somar o resultado∨/Z[⍺⍵]
: obtenha o númeroZ
para 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)fonte
Mathematica (
838279696766)Preparação
Código
Se contarmos usando caracteres Unicode: 62 :
fonte
->
2 caracteres e
1, no entanto,->
2 bytes e
3 bytes em UTF-8. Portanto, pode demorar mais, dependendo das métricas.Python -
128 112 90 8988Preparação:
Computando o número Delacorte (a linha que conta):
Resultado:
Resultado:
fonte
for
loops em um único gerador esum
uma vez. Além disso, você pode salvarP(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ádruploproduct(R,R,R,R)
e apenas fazerfor j,n,i,m in product(*[R]*4)
.*[R]*4
era o que eu estava procurando sozinho, mas não consegui trabalhar.from fractions import gcd as g
salvar bytes na seção importante?Pitão 43
Essa resposta quase certamente poderia ser ainda mais jogada; Eu particularmente não gosto do cálculo da distância.
Para configurar isso, armazene a matriz linearizada na variável J. Você pode fazer isso escrevendo:
Experimente online .
Produz um flutuador. Eu acho que isso é legítimo, por favor me diga se eu quebrei uma regra :)
Explicação:
fonte
CJam, 55
Toma a matriz como STDIN no seguinte formato:
Experimente online aqui
fonte
{}
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;))q~]
parte. que é menor em comparação com quando eu disco rígido código-lo e usar um bloco (eu acho)