Tính số Delacorte của hình vuông


12

Thách thức: thực hiện tính toán Số Delacorte bằng bất kỳ ngôn ngữ nào. Mã ngắn nhất sẽ thắng.

Đối với một ma trận vuông cho các số nguyên riêng biệt 1..n² (chiều dài cạnh có thể n ít nhất là từ 3 đến 27), Số Delacorte của nó là tổng của các sản phẩm gcd (a, b) × distance² (a, b) cho mỗi khác biệt cặp số nguyên {a, b}.

Ví dụ sau đây cho thấy hình vuông 3 × 3 với Số Delacorte là 160.

3 2 9
4 1 8
5 6 7

Trong hình vuông này, chúng ta có 36 cặp riêng biệt để tính toán, ví dụ cặp 4 và 6: gcd (4, 6) × khoảng cách ² (4, 6) = 4

Một ví dụ khác để thử nghiệm - cái này có Số Delacorte là 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

Số Delacorte được lấy từ cuộc thi lập trình này - xem tại đó để biết thêm chi tiết ... Cuộc thi kết thúc vào tháng 1 năm 2015. Thật vui!

Quy tắc:

Ngắt dòng cần thiết được tính là 1 char. Bạn có thể đăng giải pháp chơi gôn của mình với ngắt dòng, nhưng chúng chỉ được tính nếu cần thiết trong ngôn ngữ đó.

Bạn có thể chọn cách xử lý đầu vào và đầu ra và bạn không phải tính khuôn khổ cần thiết cho ngôn ngữ của mình, như tiêu đề bao gồm tiêu chuẩn hoặc chức năng chính. Chỉ tính mã thực tế (bao gồm cả định nghĩa phím tắt / bí danh), như trong ví dụ C # này:

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

Bạn cũng có thể nhập hình vuông dưới dạng mảng 2 chiều hoặc từ dấu nhắc hoặc dưới dạng chuỗi hoặc một số loại bộ sưu tập tiêu chuẩn. Mảng 2 chiều là cách duy nhất không phải tự tính chiều dài cạnh của hình vuông.
Không yêu cầu chức năng phụ cho công việc thực tế, bạn cũng có thể đặt mã trực tiếp trong Main ().

Thậm chí nhiều sự chuẩn bị được cho phép miễn phí, như ở đây:

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

Nếu bạn không chắc chắn liệu sự chuẩn bị lâu dài của bạn có theo tinh thần của các quy tắc này hay có thể được gọi là gian lận, chỉ cần hỏi :)


Âm thanh như, trong trường hợp của Python, tất cả bao gồm là miễn phí? Điều này có thể gây ra một số tối ưu hóa kỳ lạ ...
Falko

@Falko, câu hỏi là, bao gồm tiêu chuẩn là gì? Hãy cố gắng để hiểu tinh thần của các quy tắc và thích ứng chúng với ngôn ngữ của bạn. Vì vậy, không: xem usingví dụ của tôi - nếu nó được sử dụng để bao gồm một thư viện bởi vì nếu không bạn không thể gọi một số chức năng, thì nó là miễn phí. Nếu bạn sử dụng nó để xác định một số bí danh ngắn cho bất cứ điều gì, toàn bộ hướng dẫn sẽ được tính.
maf-soft

@Optimizer: Ý nghĩa của hàm khoảng cách có phần bị ẩn trong liên kết : Đó là bình phương của khoảng cách euclide giữa hai trường.
Falko

@Optimizer, thay vì xác định chính xác, tôi đã đưa ra một ví dụ, vì vậy bạn có thể chắc chắn ý nghĩa của nó là gì. Tôi nghĩ thế là đủ và thêm niềm vui ...
maf-soft

Và tôi phải nói rằng mặc dù đó là một câu hỏi chính đáng, có vẻ như bạn đã đăng nó ở đây để cuối cùng có thể tham gia cuộc thi đó;)
Trình tối ưu hóa

Câu trả lời:


6

APL (38)

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

Đây là một hàm lấy một ma trận làm đối số đúng của nó, như vậy:

      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

Giải trình:

  • ⊂¨⍳⍴Z←⍵: lưu trữ ma trận trong Z. Tạo một danh sách của mỗi cặp tọa độ có thể trong Z.
  • ∘.{... }⍨: cho mỗi cặp tọa độ, kết hợp với từng cặp tọa độ:
    • +/⊃×⍨⍺-⍵: tính toán distance^2: trừ cặp tọa độ thứ nhất từ ​​số thứ hai, nhân cả hai và tự tổng hợp kết quả
    • ∨/Z[⍺⍵]: lấy số Zcho cả hai cặp tọa độ và tìm GCD
    • ×: nhân chúng với nhau
  • +/∊: tổng hợp các yếu tố của kết quả đó
  • .5×: nhân với 0,5 (vì chúng tôi đã đếm từng cặp khác không hai lần trước đó)

Đây sẽ là 72 byte nếu chúng ta đếm bằng cách sử dụng byte UTF-8.
kennytm

2
@KennyTM: bộ ký tự APL vừa trong một byte. Mã hóa tồn tại mà sử dụng này. APL có trước Unicode hàng thập kỷ. Nó dường như được chấp nhận trên trang web này để tính các ký tự APL dưới dạng byte, miễn là không sử dụng ký tự Unicode nào. (tức là sử dụng mã điểm Unicode để mã hóa chuỗi hoặc thứ gì đó.)
marinus

@marinus, nghe có vẻ hợp lý. Bạn nghĩ gì về các ký tự unicode trong Mathicala?
maf-soft

@ maf-soft: tốt, nếu có một mã hóa hiện có mà tất cả các ký tự được sử dụng khớp với một byte (bao gồm cả các ký tự 'đặc biệt' và 'bình thường', do đó không thể có nhiều hơn 256 ký tự duy nhất ký tự), sau đó nó có thể được tính là một byte cho mỗi ký tự. Nếu không, thì không thể. Tuy nhiên, nếu Mathicala sử dụng ít hơn 128 ký tự Unicode duy nhất, chúng có thể được ánh xạ tầm thường vào nửa trên của byte, với ASCII ở nửa dưới. [1/2].
bến tàu

@ maf-soft: tuy nhiên, đây sẽ là một mã hóa mới (~ "ngôn ngữ"), do đó, bạn cần cung cấp chương trình dịch và bạn chỉ có thể sử dụng nó cho các câu hỏi mới hơn chương trình dịch của bạn, theo quy tắc nói rằng bạn chỉ có thể trả lời các câu hỏi bằng các ngôn ngữ có trước câu hỏi (điều này để ngăn người khác xác định ngôn ngữ bằng lệnh 1 byte để giải quyết chính xác câu hỏi). [2/2]
bến tàu

5

Toán học (83 82 79 69 67 66)

Sự chuẩn bị

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

Nếu chúng ta đếm bằng các ký tự Unicode: 62 :

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

Bạn có thể sử dụng phiên bản UTF của '-> `:
swish

@swish ->lấy 2 ký tự và lấy 1 ký tự, tuy nhiên, ->mất 2 byte và mất 3 byte trong UTF-8. Vì vậy, nó có thể dài hơn tùy thuộc vào số liệu.
kennytm

Hãy nhìn vào giải pháp APL, vì vậy tôi đoán rằng số liệu có trong các ký tự trên cái này;)
swish

@swish Đó là điều OP nên làm rõ vì byte UTF-8 là mặc định nếu không được nêu :)
kennytm

@KennyTM - Tôi không chắc những gì tốt nhất. Tôi muốn theo dõi những gì phổ biến trên trang web này. Hiện tại tôi không có thời gian để tìm hiểu. Ai đó có thể giúp đỡ với một số liên kết? Bạn cũng có thể sử dụng trò chuyện được đề cập trong các bình luận của OP.
maf-soft

5

Con trăn - 128 112 90 89 88

Sự chuẩn bị:

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

Tính toán số Delacorte (dòng tính):

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

Đầu ra:

print D

Kết quả:

5957

2
Bạn có thể thu gọn cả hai forvòng thành một trình tạo duy nhất và sumnó một lần. Ngoài ra, bạn có thể lưu P(R,R)vào một biến bằng *x,=product(R,R)cách sử dụng phép gán được gắn dấu sao để tạo một bản sao. Thậm chí tốt hơn, bạn có thể làm cho nó là sản phẩm bốn lần product(R,R,R,R)và chỉ cần làm for j,n,i,m in product(*[R]*4).
xnor

@xnor: Tuyệt! *[R]*4là những gì tôi đang tìm kiếm một mình nhưng không thể đi làm.
Falko

1
xem như sự chuẩn bị của bạn không được tính vào số byte, bạn có thể làm gì đó from fractions import gcd as gđể lưu byte trong phần quan trọng không?
FlipTack

3

Số 43

Câu trả lời này gần như chắc chắn có thể được đánh gôn hơn nữa; Tôi đặc biệt không thích tính toán khoảng cách.

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

Để thiết lập điều này, lưu trữ mảng đóng băng tuyến tính trong biến J. Bạn có thể làm điều này bằng cách viết:

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

Hãy thử trực tuyến .

Đầu ra một float. Tôi nghĩ điều này là hợp pháp, xin vui lòng cho tôi biết nếu tôi đã phá vỡ một quy tắc :)

Giải trình:

                                             : 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

Wow, cuối cùng tôi đã đánh bại Pyth với APL.
bến tàu

@marinus Haha, tôi vẫn đang cố gắng, nhưng tôi nghĩ rằng bạn đã đánh bại tôi, ít nhất là :)
FryAmTheEggman

Wow, thật là điên rồ. Tôi đang đọc doc.txt nhưng tôi thấy rất khó đọc!
rubik

@rubik Ít nhất đó không phải là APL: D Tài liệu không chính xác 100% vì toàn bộ ngôn ngữ này được một người đàn ông: isaacg . Nếu bạn có thắc mắc, vui lòng hỏi tôi / anh ấy trong cuộc trò chuyện :)
FryAmTheEggman

2

CJam, 55

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

Lấy ma trận là STDIN theo định dạng sau:

[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ùng thử trực tuyến tại đây


Tôi nghĩ rằng bạn có thể mã hóa ma trận miễn phí và sử dụng {}để tạo một khối thay vì sử dụng stdin. Ngoài ra, bạn có đang đổ ma trận vào một mảng một chiều không? Tôi nghĩ bạn có thể lấy ma trận đã được định dạng, xem các ví dụ của OP. (Tôi không biết rõ về CJam, vì vậy hãy dùng nó với một hạt muối;))
FryAmTheEggman

Đọc ma trận và chuyển đổi nó thành danh sách đơn là q~]một phần. ngắn hơn so với khi tôi mã hóa nó và sử dụng một khối (tôi đoán)
Trình tối ưu hóa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.