एक वर्ग की Delacorte संख्या की गणना करें


12

चुनौती: किसी भी भाषा में एक Delacorte नंबर की गणना को लागू करना। सबसे छोटा कोड जीतता है।

अलग पूर्णांकों का एक दिया वर्ग मैट्रिक्स के लिए 1..n² (संभावित दुष्प्रभावों लंबाई n 3 और 27 के बीच कम से कम), उसके डेलाकोर्ट संख्या उत्पादों का योग है gcd (ए, बी) × distance² (क, ख) प्रत्येक विशिष्ट के लिए पूर्णांक {a, b} की जोड़ी।

निम्नलिखित उदाहरण 160 की Delacorte संख्या के साथ एक 3 × 3 वर्ग दिखाता है।

3 2 9
4 1 8
5 6 7

इस वर्ग में हमारे पास गणना करने के लिए 36 अलग जोड़े हैं, उदाहरण के लिए जोड़ी 4 और 6: gcd (4, 6) × दूरी 6 (4, 6) = 4

परीक्षण के लिए एक और उदाहरण वर्ग - इसमें 5957 की एक Delacorte संख्या है:

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 नंबर इस प्रोग्रामिंग प्रतियोगिता से लिए गए हैं - आगे के विवरण के लिए देखें ... प्रतियोगिता जनवरी 2015 में समाप्त हो गई। यह बहुत मजेदार था!

नियम:

आवश्यक लाइन ब्रेक 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-आयामी सरणी ही वर्ग की साइड लंबाई की गणना करने का एकमात्र तरीका नहीं है।
वास्तविक कार्य के लिए एक उप-कार्य की आवश्यकता नहीं है, आप कोड को सीधे मेन () में भी डाल सकते हैं।

यहां तक ​​कि यहां भी अधिक तैयारी की अनुमति है:

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

यदि आप अनिश्चित हैं कि आपकी लंबी तैयारी इन नियमों की भावना में है या इसे धोखा कहा जा सकता है, तो बस पूछें :)


लगता है, पायथन के मामले में, सभी मुफ्त में शामिल हैं? इसके कारण कुछ अजीब अनुकूलन हो सकते हैं ...
फाल्को

@ फाल्को, सवाल यह है कि मानक-शामिल क्या हैं? कृपया नियमों की भावना को समझने और उन्हें अपनी भाषा में ढालने का प्रयास करें। तो, नहीं: मेरा usingउदाहरण देखें - यदि इसका उपयोग लाइब्रेरी को शामिल करने के लिए किया जाता है क्योंकि अन्यथा आप कुछ फ़ंक्शन नहीं कह सकते, यह मुफ़्त है। यदि आप किसी चीज के लिए कुछ छोटे उपनामों को परिभाषित करने के लिए इसका उपयोग करते हैं, तो पूरा निर्देश मायने रखता है।
माफ़-सॉफ्ट

@ ऑप्टिमाइज़र: दूरी फ़ंक्शन का अर्थ लिंक में कुछ छिपा हुआ है : यह दो क्षेत्रों के बीच यूक्लिडियन दूरी का वर्ग है।
फाल्को

@ ऑप्टिमाइज़र, इसे ठीक से परिभाषित करने के बजाय, मैंने एक उदाहरण दिया, ताकि आप सुनिश्चित हो सकें कि इसका क्या मतलब है। मैंने सोचा कि यह पर्याप्त है और मज़ेदार है ...
माफ़-शीतल

और मुझे यह कहना चाहिए कि यद्यपि यह एक कानूनी प्रश्न है, ऐसा लगता है कि आपने इसे यहाँ पोस्ट किया है जो अंततः उस प्रतियोगिता में प्रवेश करने में सक्षम हो;)
ऑप्टिमाइज़र

जवाबों:


6

एपीएल (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 से गुणा करें (क्योंकि हमने प्रत्येक नॉनजो जोड़ी को पहले दो बार गिना था)

अगर हम यूटीएफ -8 बाइट्स का उपयोग करते हैं तो यह 72 बाइट्स होगा।
kennytm

2
@ केनीटीएम: एपीएल चारसेट एक बाइट के भीतर फिट बैठता है। एनकोडिंग मौजूद हैं जो इसका उपयोग करते हैं। APL दशकों से यूनिकोड से पहले का है। यह इस साइट पर एपीएल वर्णों को बाइट्स के रूप में गिनने के लिए स्वीकार किया जाता है, जब तक कि कोई यूनिकोड वर्ण उपयोग नहीं किया जाता है। (यानी यूनिकोड कोडपॉइंट्स का उपयोग स्ट्रिंग्स, या कुछ को एन्कोड करने के लिए।)
मरीनस

@marinus, जो उचित लगता है। मैथेमेटिका में यूनिकोड वर्ण के बारे में आप क्या सोचते हैं?
माफ़-सॉफ्ट

@ maf-soft: ठीक है, अगर कोई मौजूदा एन्कोडिंग है, जिसके द्वारा सभी वर्ण बाइट के भीतर फिट होते हैं (ताकि इसमें 'विशेष' और 'सामान्य' दोनों अक्षर शामिल हों, तो 256 से अधिक अद्वितीय नहीं हो सकते वर्ण), फिर इसे प्रति वर्ण एक बाइट के रूप में गिना जा सकता है। यदि नहीं, तो यह नहीं हो सकता। हालांकि, अगर गणितज्ञ 128 से अधिक अद्वितीय यूनिकोड वर्णों का उपयोग करता है, तो उन्हें निचले आधे भाग में ASCII के साथ, बाइट के ऊपरी आधे हिस्से में तुच्छ रूप से मैप किया जा सकता है। [1/2]।
मारिनस

@ maf-soft: यह एक उपन्यास एन्कोडिंग (~ "भाषा") होगा, हालाँकि, आपको एक अनुवादक कार्यक्रम प्रदान करने की आवश्यकता होगी, और आप इसे केवल उन सवालों पर उपयोग कर सकते हैं जो नियम से आपके अनुवादक कार्यक्रम से नए हैं। यह बताता है कि आप केवल उन भाषाओं के प्रश्नों का उत्तर दे सकते हैं जो प्रश्न से पहले हैं (यह प्रश्न को हल करने के लिए 1-बाइट कमांड के साथ किसी भाषा को परिभाषित करने से रोकने के लिए है)। [२/२]
१us

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 वर्ण लेता है, हालाँकि, ->2 बाइट्स लेता है और UTF-8 में 3 बाइट्स लेता है। तो यह मैट्रिक्स के आधार पर लंबा हो सकता है।
kennytm

); ठीक है, एपीएल समाधान को देखो तो मुझे लगता है कि मीट्रिक इस पर अक्षरों में है
बेंत की मार

@swish कि कुछ ओपी को स्पष्ट करना चाहिए क्योंकि UTF-8 बाइट्स डिफ़ॉल्ट है यदि नहीं कहा गया है :)
kennytm

@ केनीटीएम - मुझे यकीन नहीं है कि सबसे अच्छा क्या है। मैं इस साइट पर क्या सामान्य है का पालन करना चाहते हैं। वर्तमान में मेरे पास यह जानने का समय नहीं है। किसी को कुछ लिंक के साथ मदद कर सकता है? आप ओपी टिप्पणियों में उल्लिखित चैट का भी उपयोग कर सकते हैं।
माफ़-सॉफ्ट

5

अजगर - 128 112 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)। इससे भी बेहतर, आप इसे चार गुना उत्पाद बना सकते हैं product(R,R,R,R)और बस कर सकते हैं for j,n,i,m in product(*[R]*4)
xnor

@ एक्सनॉर: बढ़िया! *[R]*4वह है जो मैं अपने लिए देख रहा था लेकिन काम नहीं कर पाया।
फल्को

1
यह देखते हुए कि आपकी तैयारी बाइट गिनती की ओर नहीं है, क्या आप from fractions import gcd as gमहत्वपूर्ण खंड में बाइट्स को बचाने के लिए कुछ नहीं कर सकते हैं ?
FlipTack

3

पायथ ४३

यह जवाब लगभग निश्चित रूप से आगे गोल्फ हो सकता है; मुझे विशेष रूप से दूरी की गणना पसंद नहीं है।

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

इसे सेट करने के लिए, वैरिएबल-ऑइज़्ड सरणी को वेरिएबल जे में स्टोर करें। आप यह लिखकर कर सकते हैं:

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

वाह, मैंने आखिरकार एपीएल के साथ पायथ को हराया।
मारिनस

@marinus Haha, मैं अभी भी कोशिश कर रहा हूं, लेकिन मुझे लगता है कि आपने मुझे हरा दिया है, कम से कम :)
FryAmTheEggman

वाह, यह पागल है। मैं अभी doc.txt पढ़ रहा हूँ, लेकिन मुझे यह पढ़ना बहुत कठिन लगता है!
रुबिक

@rubik कम से कम यह एपीएल नहीं है: डी डॉक्टर 100% सटीक नहीं है क्योंकि यह पूरी भाषा एक आदमी द्वारा mantained है: 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]

इसे यहाँ ऑनलाइन आज़माएँ


मुझे लगता है कि आप मैट्रिक्स को हार्ड-कोड मुक्त {}करने के लिए उपयोग कर सकते हैं और स्टड का उपयोग करने के बजाय एक ब्लॉक बनाने के लिए उपयोग कर सकते हैं। इसके अलावा, क्या आप मैट्रिक्स को एक-आयामी सरणी में डंप कर रहे हैं? मुझे लगता है कि आप पहले से प्रारूपित मैट्रिक्स को ले सकते हैं, ओपी के उदाहरण देख सकते हैं। (मैं सीजेएम को अच्छी तरह से नहीं जानता, इसलिए इसे नमक के एक दाने के साथ लें;))
फ्राईमईएग्गमैन

मैट्रिक्स को पढ़ना और इसे एकल सूची में परिवर्तित करना q~]भाग है। जब मैं इसे कठिन कोड की तुलना में छोटा है और एक ब्लॉक का उपयोग करता हूं (मुझे लगता है)
ऑप्टिमाइज़र
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.