Bir karenin Delacorte Sayısını hesaplayın


12

Zorluk: herhangi bir dilde bir Delacorte Numarası hesaplamasını uygulayın. En kısa kod kazanır.

1..n² (olası yan uzunluk n en az 3 ve 27 arasında) verilen belirli bir kare matris için , Delacorte Numarası her bir farklı için gcd (a, b) × mesafe² (a, b) ürünlerinin toplamıdır tam sayı çifti.

Aşağıdaki örnek, Delacorte Sayısı 160 olan 3 × 3 kareyi göstermektedir.

3 2 9
4 1 8
5 6 7

Bu karede hesaplamak için 36 farklı çiftimiz var, örneğin 4 ve 6 çifti: gcd (4, 6) × mesafe ² (4, 6) = 4

Test için başka bir örnek kare - bunun Delacorte 5957 sayısı vardır:

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 Numaraları bu programlama yarışmasından alınmıştır - daha fazla bilgi için oraya bakınız ... Yarışma Ocak 2015'te sona erdi. Çok eğlenceliydi!

Kurallar:

Gerekli satır sonları 1 karakter olarak sayılır. Golf çözümünüzü satır sonları ile gönderebilirsiniz, ancak bunlar yalnızca bu dilde gerekliyse sayılır.

Giriş ve çıkışın nasıl ele alınacağını seçebilirsiniz ve standart içerikler veya ana işlev başlıkları gibi dilinizin gerekli çerçevesini saymanız gerekmez . Bu C # örneğinde olduğu gibi yalnızca gerçek kod (kısayol / takma ad tanımları dahil) sayılır:

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

Kareyi ayrıca 2 boyutlu dizi olarak veya bir bilgi isteminden veya dize veya bazı standart toplama türü olarak girebilirsiniz. 2 boyutlu bir dizi, karenin yan uzunluğunu kendiniz hesaplamak zorunda kalmanın tek yoludur.
Gerçek iş için bir alt fonksiyon gerekli değildir, ayrıca kodu doğrudan Main () içine de koyabilirsiniz.

Burada olduğu gibi daha fazla hazırlığa ücretsiz izin verilir:

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

Uzun hazırlıklarınızın bu kuralların ruhunda olup olmadığından emin değilseniz veya hile olarak adlandırılabilirseniz, sormanız yeterlidir :)


Kulağa, Python söz konusu olduğunda, tüm içerikler ücretsiz mi? Bu bazı garip optimizasyonlara neden olabilir ...
Falko

@Falko, soru şu, standart içerikler nelerdir? Lütfen kuralların ruhunu anlamaya çalışın ve bunları dilinize uyarlayın. Yani, hayır: örneğime bakın using- aksi takdirde bazı işlevleri çağıramayacağınız için bir kitaplık eklemek için kullanılıyorsa, ücretsizdir. Herhangi bir şey için kısa bir takma ad tanımlamak için kullanırsanız, talimatın tamamı önemlidir.
maf-soft

@Optimizer: Uzaklık işlevinin anlamı , bağlantıda biraz gizlidir : İki alan arasındaki öklid mesafesinin karesidir.
Falko

@Optimizer, tam olarak tanımlamak yerine, bir örnek verdim, böylece ne anlama geldiğinden emin olabilirsiniz. Ben yeterli olduğunu düşündüm ve eğlenceli ekledi ...
maf-soft

Ve söylemeliyim ki, yasal bir soru olmasına rağmen, bu yarışmaya girmek için buraya gönderdiniz gibi görünüyor;)
Optimizer

Yanıtlar:


6

APL (38)

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

Bu, bir matrisi doğru argüman olarak alan bir işlevdir, şöyle:

      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

Açıklama:

  • ⊂¨⍳⍴Z←⍵: matrisi depolayın Z. İçindeki her olası koordinat çiftinin bir listesini yapın Z.
  • ∘.{... }⍨: her bir koordinat çifti için, her bir koordinat çifti ile birlikte:
    • +/⊃×⍨⍺-⍵: hesapla distance^2: ilk koordinat çiftini ikinciden çıkar, her ikisini de çarp ve sonucu topla
    • ∨/Z[⍺⍵]: Zher iki koordinat çifti için sayıyı alın ve GCD'yi bulun
    • ×: birbirleriyle çarpın
  • +/∊: bunun sonucunun unsurlarını toplayın
  • .5×: 0.5 ile çarpın (çünkü her sıfır olmayan çifti iki kez daha önce saydık)

UTF-8 bayt kullanarak sayarsak bu 72 bayt olur.
kennytm

2
@KennyTM: APL karakter seti bir bayt içine sığar. Bunu kullanan kodlamalar mevcuttur. APL onlarca yıl Unicode'dan önce gelir. Unicode karakterler kullanılmadığı sürece APL karakterlerini bayt olarak saymak bu sitede kabul ediliyor gibi görünüyor. (örneğin, dizeleri veya başka bir şeyi kodlamak için Unicode kod noktalarını kullanma.)
marinus

@marinus, kulağa makul geliyor. Mathematica'daki unicode karakterleri hakkında ne düşünüyorsunuz?
maf-soft

@ maf-soft: iyi, kullanılan tüm karakterlerin bir bayt içine sığdığı mevcut bir kodlama varsa (hem 'özel' hem de 'normal' karakterleri içerir, bu nedenle 256'dan fazla benzersiz olamaz karakter), daha sonra karakter başına bir bayt olarak sayılabilir. Değilse, yapamaz. Ancak, Mathematica 128'den az benzersiz Unicode karakter kullanıyorsa, önemsiz olarak baytın üst yarısına eşlenebilir ve alt yarıda ASCII olabilir. [1/2].
marinus

@ maf-soft: bu yeni bir kodlama (~ "dil") olurdu, bu nedenle bir çevirmen programı sağlamanız gerekir ve bunu kural olarak yalnızca çevirmen programınızdan daha yeni sorularda kullanabilirsiniz yalnızca sorudan önce gelen dillerde soruları yanıtlayabileceğinizi belirtir (bu, 1 baytlık bir komutla dili tanımlayan bir kişinin soruyu tam olarak çözmesini önlemek için). [2/2]
marinus

5

Mathematica (83 82 79 69 67 66)

Hazırlık

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

kod

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

Unicode karakterler kullanarak sayarsak: 62 :

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

'-> `: 
swish

@swish ->, 2 karakter alır ve 1 karakter alır, ancak UTF-8'de ->2 bayt alır ve 3 bayt alır. Dolayısıyla metriklere bağlı olarak daha uzun olabilir.
kennytm

APL çözümüne bakalım, bu yüzden metrik bu bir karakterde sanırım;)
swish

@swish OP belirtilmemişse varsayılan UTF-8 bayt olarak açıklığa kavuşturulması gereken bir şey :)
kennytm

@KennyTM - Neyin en iyi olduğundan emin değilim. Bu sitede ortak olanları takip etmek istiyorum. Şu anda öğrenecek vaktim yok. Birisi bazı bağlantılarda yardımcı olabilir mi? OP yorumlarında belirtilen sohbeti de kullanabilirsiniz.
maf-soft

5

Python - 128112 90 89 88

Hazırlık:

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

Delacorte Numarasının hesaplanması (önemli olan satır):

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

Çıktı:

print D

Sonuç:

5957

2
Her iki fordöngüyü de tek bir jeneratöre daraltabilirsiniz sum. Ayrıca, kopya oluşturmak için yıldızlı atamayı kullanarak P(R,R)bir değişkene kaydedebilirsiniz *x,=product(R,R). Daha da iyisi, dört kat ürün haline getirebilir product(R,R,R,R)ve yapabilirsiniz for j,n,i,m in product(*[R]*4).
xnor

@xnor: Harika! *[R]*4tek başıma aradığım ama iş bulamadım.
Falko

1
hazırlıklarınızın bayt sayısına dahil olmadığını görmek from fractions import gcd as g, önemli bölümde bayt kaydetmek gibi bir şey yapamaz mısınız?
FlipTack

3

Pyth 43

Bu cevap neredeyse kesinlikle daha fazla golf olabilir; Özellikle mesafe hesaplamasını sevmiyorum.

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

Bunu ayarlamak için, doğrusal izlenen diziyi J değişkeninde saklayın. Bunu aşağıdakileri yazarak yapabilirsiniz:

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

Çevrimiçi deneyin .

Bir şamandıra çıktılar. Bunun meşru olduğunu düşünüyorum, lütfen bir kuralı ihlal edip etmediğimi söyle :)

Açıklama:

                                             : 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

Vay canına, sonunda PyL'yi APL ile yendim.
marinus

@marinus Haha, hala deniyorum, ama en azından beni
dövüyorsun sanırım

Vay canına, bu çılgınca. Şimdi doc.txt dosyasını okuyorum ama okumayı gerçekten zor buluyorum!
rubik

@rubik En azından APL değil: D Doküman% 100 doğru değil çünkü bu dilin tamamı bir adam tarafından korunuyor : isaacg . Sorularınız varsa, bana sohbette sormaya çekinmeyin :)
FryAmTheEggman

2

CJam, 55

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

Matrisi aşağıdaki biçimde STDIN olarak alır:

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

Buradan çevrimiçi deneyin


Matrisi ücretsiz olarak kodlayabilir ve {}stdin kullanmak yerine bir blok yapmak için kullanabilirsiniz. Ayrıca, matrisi tek boyutlu bir diziye mi döküyorsunuz? Zaten biçimlendirilmiş matrisi alabileceğinizi düşünüyorum, OP örneklerine bakın. (CJam'ı iyi bilmiyorum, bu yüzden bunu bir tuz tanesi ile alın;))
FryAmTheEggman

Matrisi okumak ve tek bir listeye dönüştürmek bir q~]parçasıdır. hangi zaman sert kod ve bir blok kullanmak karşılaştırıldığında daha kısa (sanırım)
Optimizer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.