정사각형의 델라 코트 수 계산


12

도전 과제 : 모든 언어로 딜라 코트 번호 계산을 구현하십시오. 가장 짧은 코드가 승리합니다.

별개의 정수 1..n² ( 적어도 측면 길이 n 은 3에서 27 사이) 의 주어진 정사각 행렬의 경우, 델라 코트 수는 각 별개 의 곱 gcd (a, b) × distance² (a, b)의 합 입니다. 정수 쌍 {a, b}.

다음 예제는 Delacorte Number가 160 인 3x3 정사각형을 보여줍니다.

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 Numbers는 이 프로그램 콘테스트 에서 가져 왔습니다. 자세한 내용은 여기를 참조하십시오. 콘테스트는 2015 년 1 월에 종료되었습니다. 정말 재미있었습니다!

규칙 :

필요한 줄 바꿈은 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();
        }
    }
}

사각형을 2 차원 배열 또는 프롬프트 또는 문자열 또는 일부 표준 컬렉션 유형으로 입력 할 수도 있습니다. 2 차원 배열은 정사각형의 측면 길이를 직접 계산할 필요가없는 유일한 방법입니다.
실제 작업에 대한 하위 함수는 필요하지 않으며 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();
    }
}

긴 준비가 이러한 규칙의 정신에 해당되는지 또는 부정 행위라고 할 수 있는지 확실하지 않은 경우 다음을 문의하십시오. :)


파이썬의 경우 모든 포함은 무료입니까? 이것은 이상한 이상한 최적화를 일으킬 수 있습니다 ...
Falko

@ 팔코, 문제는 표준 포함이란 무엇입니까? 규칙의 정신을 이해하고 귀하의 언어에 맞게 조정하십시오. 따라서 아니오 : 내 using예를 참조하십시오 -그렇지 않으면 함수를 호출 할 수 없기 때문에 라이브러리를 포함하는 데 사용되는 경우 무료입니다. 이를 사용하여 임의의 짧은 별칭을 정의하면 전체 명령이 계산됩니다.
maf-soft

@Optimizer : 거리 함수의 의미 는 링크에 다소 숨겨져 있습니다. 두 필드 사이의 유클리드 거리의 제곱입니다.
Falko

@Optimizer는 정확히 정의하는 대신 예제를 제공하므로 의미가 무엇인지 확신 할 수 있습니다. 충분하다고 생각하고 재미를 더했습니다 ...
maf-soft

합법적 인 질문이지만 최종적으로 콘테스트에 참가할 수 있도록 여기에 게시 한 것 같습니다.)
Optimizer

답변:


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를 곱하십시오 (0이 아닌 각 쌍을 두 번 더 일찍 계산했기 때문에)

UTF-8 바이트를 사용하여 계산하면 72 바이트입니다.
kennytm

2
@ KennyTM : APL 문자셋은 바이트 안에 들어갑니다. 이것을 사용하는 인코딩이 존재합니다. APL은 유니 코드보다 수십 년 앞서 있습니다. 유니 코드 문자를 사용하지 않는 한 APL 문자를 바이트로 계산하는 것이이 사이트에서 허용되는 것 같습니다. (즉, 유니 코드 코드 포인트를 사용하여 문자열 등을 인코딩)
marinus

@marinus, 그것은 합리적으로 들립니다. Mathematica의 유니 코드 문자에 대해 어떻게 생각하십니까?
maf-soft

@ maf-soft : 음, 사용 된 모든 문자가 바이트 내에 맞는 기존 인코딩이있는 경우 ( '특수'및 '일반'문자를 모두 포함하므로 256 개를 초과 할 수 없음) 문자 당 1 바이트로 계산할 수 있습니다. 그렇지 않으면 할 수 없습니다. 그러나 Mathematica가 128 개 미만의 고유 한 유니 코드 문자를 사용하는 경우 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]]

유니 코드 문자를 사용하는 경우 : 62 :

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

UTF 버전의 '->`를 사용할 수 있습니다. 
swish

@swish ->는 2자를 사용하고 1자를 사용하지만 UTF-8 ->에서는 2 바이트를 사용하고 3 바이트를 사용합니다. 따라서 측정 항목에 따라 더 길어질 수 있습니다.
kennytm

APL 솔루션을 살펴보면 메트릭이 문자로 표시됩니다.;)
swish

@swish UTF-8 바이트가 명시되어 있지 않다면 OP가 명확히해야하는 것입니다. :)
kennytm

@ KennyTM-최고의 것이 확실하지 않습니다. 이 사이트의 일반적인 내용을 따르고 싶습니다. 현재는 찾을 시간이 없습니다. 누군가가 일부 링크를 도울 수 있습니까? OP 의견에 언급 된 채팅을 사용할 수도 있습니다.
maf-soft

5

파이썬 -128112 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). 더 나은, 당신은이 4 배 제품이 될 수 있습니다 product(R,R,R,R)그냥 할 for j,n,i,m in product(*[R]*4).
xnor

@ xnor : 좋아! *[R]*4내가 혼자 찾고 있었지만 일할 수 없었습니다.
Falko

1
준비가 바이트 수에 포함되지 않기 from fractions import gcd as g때문에 중요한 섹션에서 바이트를 절약 하는 것과 같은 일을 할 수 없습니까?
FlipTack 2016

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

와우, 나는 마침내 APL과 함께 Pyth를 이겼습니다.
marinus

하하 @marinus, 나는 아직도 노력하고있어,하지만 난 당신이 :) 나를 적어도, 이길 수있어 생각
FryAmTheEggman

와, 이건 미친 짓이야 지금 doc.txt를 읽고 있지만 실제로 읽기가 어렵습니다!
rubik

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

여기에서 온라인으로 사용해보십시오


매트릭스를 무료로 하드 코딩하고 {}stdin을 사용하는 대신 블록을 만드는 데 사용할 수 있다고 생각합니다 . 또한 행렬을 1 차원 배열로 덤프하고 있습니까? 이미 포맷 된 행렬을 취할 수 있다고 생각합니다 (OP의 예 참조). (그래서 에누리이을 잘 CJam를 모르는))
FryAmTheEggman

행렬을 읽고 단일 목록으로 변환하는 것이 q~]부분입니다. 내가 그것을 하드 코딩하고 블록을 사용할 때와 비교하여 더 짧습니다 (
최적화
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.