ड्यूरर के जादू वर्ग का निर्माण करें


14

चुनौती

ड्यूरर के प्रसिद्ध जादू वर्ग के एक सरणी या स्ट्रिंग प्रतिनिधित्व को आउटपुट करें :

यहाँ छवि विवरण दर्ज करें

अर्थात्,

16  3  2 13
 5 10 11  8
 9  6  7 12
 4 15 14  1

इस वर्ग के कुछ गुण , जिनका शायद शोषण किया जा सकता है:

  • यह से प्रत्येक पूर्णांक शामिल 1करने के लिए 16वास्तव में एक बार
  • प्रत्येक स्तंभ या पंक्ति का योग, साथ ही दो विकर्णों में से प्रत्येक का योग समान होता है। यह एक जादू वर्ग की परिभाषित संपत्ति है । योग वर्ग का जादू स्थिरांक है।
  • इसके अलावा, इस विशेष वर्ग के लिए, चार चतुर्भुज में से प्रत्येक का योग भी जादू के बराबर होता है, जैसा कि केंद्र के चार वर्गों और चार वर्गों के योग का योग होता है।

नियम

जादू के वर्गों को उत्पन्न करने वाले Bultins की अनुमति नहीं है (जैसे कि Matlab magicया Mathematica की MagicSquare)। किसी भी अन्य बिलिन का उपयोग किया जा सकता है।

कोड एक कार्यक्रम या एक फ़ंक्शन हो सकता है।

कोई इनपुट नहीं है।

संख्या आधार 10 में होनी चाहिए। आउटपुट स्वरूप हमेशा की तरह लचीला होता है। कुछ संभावनाएं हैं:

  • एक नेस्टेड सरणी (या तो फ़ंक्शन आउटपुट, या इसके स्ट्रिंग प्रतिनिधित्व, विभाजक के साथ या बिना, किसी भी प्रकार के मिलान ब्रैकेट):

    [[16, 3, 2, 13], [5, 10, 11, 8], [9, 6, 7, 12], [4, 15, 14, 1]]
    
  • एक 2D सरणी:

    {16, 3, 2, 13; 5, 10, 11, 8; 9, 6, 7, 12; 4, 15, 14, 1}
    
  • चार तार की एक सरणी, या चार लाइनों से मिलकर एक स्ट्रिंग। संख्याएँ सही-संरेखित हो सकती हैं

    16  3  2 13
     5 10 11  8
     9  6  7 12
     4 15 14  1
    

    या बाएं-संरेखित करें

    16 3  2  13
    5  10 11  8
    9  6  7  12
    4  15 14  1
    
  • पंक्ति और स्तंभ के लिए दो अलग विभाजकों के साथ एक स्ट्रिंग, जैसे

    16,3,2,13|5,10,11,8|9,6,7,12|4,15,14,1
    

आउटपुट स्वरूप स्पष्ट रूप से पंक्तियों और स्तंभों में अंतर करना चाहिए। उदाहरण के लिए, यह एक फ्लैट सरणी, या रिक्त स्थान द्वारा अलग किए गए सभी नंबरों के साथ एक स्ट्रिंग को आउटपुट करने की अनुमति नहीं है।

कोड गोल्फ। सबसे छोटी जीत।



4
दिलचस्प है, संख्या 5, 8, 9 और 12 उनके (1-अनुक्रमित) पदों में हैं, 6, 7, 10 और 11 को लंबवत परिलक्षित किया गया है, 2, 3, 14 और 15 को क्षैतिज और 1, 4, 13 परिलक्षित किया गया है। और 16 को 180 ° घुमाया गया है। मुझे संदेह है कि हालांकि किसी की मदद करेगा।
नील

2
संभवतः उपयोगी अवलोकन: यदि आप प्रत्येक संख्या से 1 [15]घटाते हैं, तो आप सरणी के साथ शुरू करके वर्ग उत्पन्न कर सकते हैं , फिर बार-बार इसे प्रत्येक आइटम के साथ 13, 3, 8, और 15 द्वारा XORed के साथ संक्षिप्त कर सकते हैं।
ETHproductions

6
यह गैर-गोल्फ भाषाओं में संपीड़ित करने के बजाय कठिन लगता है। मुझे लगता है कि एक बड़ा जादू वर्ग ने बेहतर किया होगा।
22

1
मुझे पूरा यकीन है कि प्रत्येक घुमाव या वर्ग का प्रतिबिंब समान गुण होगा।
डेनिस

जवाबों:


7

जेली , 15 बाइट्स

“¡6ṡƘ[²Ḳi<’ḃ⁴s4

TryItOnline!

बहुत उबाऊ, खेद:

Prep: वर्ग को लिया, इसे पंक्तियों द्वारा पढ़ा, विशेषण आधार 16 से परिवर्तित किया, इसे आधार 250 में परिवर्तित किया, उन "अंकों" ( ¡6ṡƘ[²Ḳi<) के लिए कोड पेज इंडेक्स को देखा ।

जेली तब इंडेक्स को आधार 250 नंबर बनाने के लिए पढ़ती है, विशेषण बेस 16 ( ḃ⁴) में परिवर्तित हो जाती है और आकार 4 के टुकड़े में विभाजित हो जाती है s4


यदि हमें एक अलग अभिविन्यास के उत्पादन की अनुमति है, तो 14 में उल्टा संभव है :

“#⁷ƙ¤ṆWȷỤ’ḃ⁴s4

परीक्षा


सिद्धांत रूप में, 16!पूर्णांकों के लिए पर्याप्त मेमोरी दिए जाने से हमें 14 में सही अभिविन्यास मिलेगा :

⁴Œ!“ŒCġŀḌ;’ịs4

यह [१० ९] के सभी क्रमपरिवर्तन को बनाएगा ⁴Œ!और १ ९ 93००५ ९ ३०६०६० (१-आधारित) मूल्य को आधार २५० प्रतिनिधित्व का उपयोग करके उठाएगा ŒCġŀḌ;और इसे ४ के साथ लंबाई के भाग में विभाजित करेगा s4


तब से मैं चार नए परमाणुओं (जोड़ लिया है Œ?, Œ¿, œ?, और œ¿पते ऐसी स्थितियों के लिए जेली के लिए)।
मोनाड Œ?एक पूर्णांक (या पूर्णांकों की पुनरावृत्ति) लेता है और उन संख्याओं के सभी क्रमपरिवर्तन की क्रमबद्ध सूची की सूची में दिए गए अनुक्रमणिका (या अनुक्रमणिका) को सबसे कम संभव क्रमांक देता है, जिसमें दिए गए अनुक्रमणिका (या अनुक्रमणिका) होते हैं।
... और यह किसी भी क्रमपरिवर्तन सूची बनाए बिना ऐसा करता है।
जैसा कि निम्नलिखित अब 12 के लिए काम करेगा (जाहिर है गैर-प्रतिस्पर्धात्मक):

“ŒCġŀḌ;’Œ?s4

इसकी कोशिश करें!


यह आपके जेली कांटे में छोटा होना चाहिए (जो मैं अभी तक भूल गया था, क्षमा करें)।
डेनिस 3

ओह? तुम कैसे सोचते हो?
जोनाथन एलन

8

पायथ, 18 बाइट्स

c4.PC"H#ût"_S16

कोड चलाएँ।

c4.PC"H#ût"_S16

    C"H#ût"       Convert the packed string to the number 1122196781940
  .P       _S16   Take that-numbered permutation of the reversed range [16,15,...,1]
c4                Chop into piece of length 4

रेंज को उलटने का मतलब था कि क्रमचय सूचकांक को कम करना, क्योंकि आउटपुट 16 से शुरू होता है, लेकिन मुझे लगता है कि यह केवल टूट गया।

इसने तालिका को सीधे आधार 17 में बदलने की एक अधिक उबाऊ रणनीति को हरा दिया और फिर 20 बाइट्स के लिए एक स्ट्रिंग ( लिंक ):

c4jC"úz(ás¸H"17 

8

जेली , 16 15 बाइट्स

4Œ!.ịm0µZḂÞ’×4+

इसे ऑनलाइन आज़माएं!

पृष्ठभूमि

यदि हम वर्ग में संख्याओं से 1 घटाते हैं और उन्हें 4 से विभाजित करते हैं (भागफल और शेष की गणना करते हैं), तो एक पैटर्न स्पष्ट हो जाता है।

quotients and remainders    quotients    remainders

   3 3  0 2  0 1  3 0        3 0 0 3      3 2 1 0
   1 0  2 1  2 2  1 3        1 2 2 1      0 1 2 3
   2 0  1 1  1 2  2 3        2 1 1 2      0 1 2 3
   0 3  3 2  3 1  0 0        0 3 3 0      3 2 1 0

शेष मैट्रिक्स एक स्पष्ट पैटर्न का अनुसरण करता है और उत्पन्न करना आसान है। शेष मैट्रिक्स को स्थानांतरित करके और मध्य पंक्तियों को स्वैप करके भाग मैट्रिक्स प्राप्त किया जा सकता है।

यह काम किस प्रकार करता है

4Œ!.ịm0µZḂÞ’×4+  Main link. No arguments.

4Œ!              Compute the array of all permutations of [1, 2, 3, 4], in
                 lexicographical order.
   .ị            Take the permutations at the indices adjacent to 0.5, i.e., the
                 ones at indices 0 ([4, 3, 2, 1]) and 1 ([1, 2, 3, 4]).
     m0          Concatenate the resulting [[4, 3, 2, 1], [1, 2, 3, 4]] with a
                 reversed copy, yielding the matrix
                 M := [[4, 3, 2, 1], [1, 2, 3, 4], [1, 2, 3, 4], [4, 3, 2, 1]].
       µ         Begin a new, monadic chain. Argument: M
        Z        Zip/transpose M, yielding the matrix
                 [[4, 1, 1, 4], [3, 2, 2, 3], [2, 3, 3, 2], [1, 4, 4, 1]].
         ḂÞ      Sort the rows by the lexicographical order of their parities,
                 yielding [[4, 1, 1, 4], [2, 3, 3, 2], [3, 2, 2, 3], [1, 4, 4, 1]].
           ’     Subtract 1 to yield the matrix of quotients, i.e.,
                 [[3, 0, 0, 3], [1, 2, 2, 1], [2, 1, 1, 2], [0, 3, 3, 0]].
            ×4+  Multiply the quotient by 4 and add the result to M (remainders).

5

जे, 37 27 बाइट्स

मीलों तक 10 बाइट्स बचाए!

4 4$1+19800593106059 A.i.16

अब कम उबाऊ के साथ! यह 19800593106059सूची का क्रमांकन लेता है i.16, जो है 15 2 1 12 4 9 10 7 8 5 6 11 3 14 13 0। फिर, कि वृद्धि की जाती है, तो एक में आकार का है 4द्वारा 4सूची।

वैकल्पिक संस्करण, जिसमें कोई व्हाट्सएप नहीं है:

_4]\1+19800593106059&A.i.16

उत्पादन, पोस्टर के लिए:

   _4]\1+19800593106059&A.i.16
16  3  2 13
 5 10 11  8
 9  6  7 12
 4 15 14  1
   4 4$1+19800593106059 A.i.16
16  3  2 13
 5 10 11  8
 9  6  7 12
 4 15 14  1

मुझे लगता है कि _4]\1+19800593106059&A.i.16काम करता है लेकिन इसे संभवतः कम किया जा सकता है
मीलों

@ मीलों ऊ, का अच्छा उपयोग A.। आपने उस नंबर पर जुर्माना कैसे लगाया?
कॉनर ओ'ब्रायन

मोनाडिक A.शून्य-अनुक्रमित क्रमपरिवर्तन का क्रमांक सूचकांक पाता है
मील

@ मीलों हुह। मुझे लगता है कि मुझे उन कार्यों के बारे में थोड़ा और सीखना चाहिए।
कॉनर ओ'ब्रायन

4

05AB1E , 18 17 बाइट्स

बाइट बचाने के लिए एमिगा को धन्यवाद !

•3øѼž·Üý;•hSH>4ô

CP-1252 एन्कोडिंग का उपयोग करता है । इसे ऑनलाइन आज़माएं!


चूनिंग से पहले वृद्धि एक बाइट ( >4ô) बचाता है ।
Emigna

@Emigna आह, बिल्कुल! धन्यवाद! :)
अदनान

4

रूबी, 49 बाइट्स (भोले समाधान से कम!)

मुख्य धारा की भाषा में इस चुनौती के लिए एक स्निपेट लिखने के लिए काफी प्रयास किए गए जो कि इसके मूल्यांकन से कम था! सामान्य नियमों के अनुसार मैंने इसे pआउटपुट से जोड़कर एक प्रोग्राम बनाया है।

p [15,4,8,3].map{|i|[1+i,1+i^=13,1+i^=3,1+i^=13]}

यह एरे के एक सरणी को आउटपुट (स्ट्रिंग प्रतिनिधित्व) करता है। यह वाट के रूबी समाधान से अधिक लंबा है जो एक अलग-अलग स्वरूपित स्ट्रिंग को आउटपुट करता है, लेकिन नीचे दिए गए भोले कार्यक्रम की तुलना में एक बाइट कम है जो केवल शाब्दिक सरणी देता है।

p [[16,3,2,13],[5,10,11,8],[9,6,7,12],[4,15,14,1]] #naive solution, 50 bytes
p [15,4,8,3].map{|i|[1+i,1+i^=13,1+i^=3,1+i^=13]}  #submission, 49 bytes

स्पष्टीकरण: संख्या ०.१५ (३! बाइट्स) से शुरू करें!

यह वह जगह है जहाँ मैंने शुरू किया और यह बहुत आसान है। यदि हम 0..15 वर्ग को द्विआधारी में बदलते हैं, तो हम ध्यान देते हैं कि प्रत्येक सेल में उसके स्तंभ के निचले भाग में मूल्य होता है, जिसकी पंक्ति के दाईं ओर मूल्य के साथ XORed होता है:

15 2  1  12            1111 0010 0001 1100
4  9  10 7             0100 1001 1010 0111
8  5  6  11            1000 0101 0110 1011
3  14 13 0             0011 1110 1101 0000

इससे हम नीचे दिए गए कोड को प्राप्त करते हैं। लेकिन अंतिम कॉलम के बजाय पहले कॉलम का उपयोग करके, हम एक बाइट को बचाते हैं, जैसा कि दिखाया गया है।

p [12,7,11,0].map{|i|[i^3,i^14,i^13,i]}            #0..15 square, 39 bytes         
p [15,4,8,3].map{|i|[i,i^13,i^14,i^3]}             #0..15 square, 38 bytes

आवश्यक 1..16 संस्करण अधिक कठिन था। अंत में मुझे ऐसा करने का तरीका पता चला कि इसे 0..15 वर्ग के प्रत्येक सेल में 1 जोड़ना था। लेकिन जैसा ^कि +मैंने बहुत कम कोष्ठक की जरूरत को प्राथमिकता दी है, जो बाइट खाती है। अंत में मैं उपयोग करने के विचार पर मारा ^=। 1 में जोड़े जाने से पहले iसंवर्धित असाइनमेंट द्वारा नए मूल्य की गणना ^=की जाती है, इसलिए गणना सही क्रम में की जाती है।


अच्छा लक्षण वर्णन! पायथन में एक साधारण सा एहसास हार्डकोड के ऊपर 6 वर्ण है for a in 12,7,11,0:print[(a^b)+1for b in 3,14,13,0]:। अगर हम 0 से 15 कर सकते हैं तो यह जीत जाएगा for a in 12,7,11,0:print[a^3,a^14,a^13,a]
xnor

3

जावास्क्रिप्ट (ईएस 6), 43 बाइट्स

_=>`16,3,2,13
5,10,11,8
9,6,7,12
4,15,14,1`

नई कहानियों से अलग, फिर अल्पविराम। मुझे संदेह है कि कोई भी छोटा रास्ता है ...


हाँ, यह शायद सबसे कम संभव है।
कॉनर ओ'ब्रायन

2

सीड 39 बाइट्स

c16,3,2,13|5,10,11,8|9,6,7,12|4,15,14,1

इसे ऑनलाइन आज़माएं!

यह इससे ज्यादा सरल नहीं हो सकता। और, दुर्भाग्य से, मुझे नहीं लगता कि यह किसी भी छोटी हो सकती है।


2

जेली, 20 बाइट्स

“Ѥ£Æ¦½¿®µ©¬€¥ÐÇ¢‘s4

इसे ऑनलाइन आज़माएं!

यह बस प्रत्येक वर्ण के जेली कोड बिंदु को देखता है, फिर 4 की लंबाई के उप-टुकड़ों में स्लाइस करता है s4


2

DASH , 24 बाइट्स

<|>4tc"................"

काल को 16, 3, 2, 13, 5, 10, 11, 8, 9, 6, 7, 12, 4, 15, 14, और 1 के वर्णों से बदलें।

व्याख्या

बस वर्णों को चारकोल और विखंडू की एक सरणी में 4 से परिवर्तित करता है।



2

ग्रूवी, 57 बाइट्स / 46 बाइट्स

"F21C49A7856B3ED0".collect{Eval.me("0x$it")+1}​.collate(4)​

हेक्सिडेसिमल अंक के रूप में प्रत्येक को पार्स करें और 1 जोड़ें, एक 2 डी सरणी में 4 से टकराएं।

[[16, 3, 2, 13], [5, 10, 11, 8], [9, 6, 7, 12], [4, 15, 14, 1]]

छोटा, लेकिन यह भी लंगड़ा:

print '16,3,2,13|5,10,11,8|9,6,7,12|4,15,14,1'

2

जावास्क्रिप्ट ईएस 6, 66 65 55 बाइट्स

हां, यह सबसे छोटा नहीं है। और हां, इसे कम किया जा सकता है।

_=>`f21c
49a7
856b
3ed0`.replace(/./g,_=>'0x'+_-~0+' ')

अभी के लिए, यह सही नहीं है। लेकिन कुछ तो है!


@Neil के सुझाव के लिए धन्यवाद , जो 5-8 बाइट्स को बचा सकता है, और इससे प्रेरित @ETHproductions सुझाव है जो 10 बाइट बचाता है!

यह उनके 43 बाइट्स समाधान की तुलना में केवल 12 बाइट्स का उत्तर देता है ।


1
आप gइसके बजाय 0और उपयोग कर सकते हैं parseInt(c,17), जो मुझे लगता है कि आप 4 बाइट्स बचाता है, या आप + का उपयोग कर सकते हैं + 0x${c}16, जो मुझे लगता है कि आप 5 बाइट्स बचाता है, और फिर आप सभी अंकों में से 1 घटा सकते हैं और बाद में इसे वापस जोड़ सकते हैं, जो मुझे लगता है कि आप एक और बाइट बचाता है।
नील

1
@ नील के सुझावों के आधार पर, आप कम से कम 10 बाइट बचा सकते हैं ।
ETHproductions

@ नील आपको इस विचार के लिए बहुत धन्यवाद। बेस 17 का उपयोग करना वास्तव में कुछ बाइट्स को बचाता है। यह वास्तव में कुछ है जो मैंने नहीं सोचा था।
इस्माइल मिगुएल

@ETHproductions सुझाव के लिए बहुत बहुत धन्यवाद! मैं अभी भी समझने की कोशिश कर रहा हूं कि यह कैसे काम करता है। लेकिन मुझे लगता है कि मैं वहां पहुंच जाऊंगा। अब, आपको हरा करने के लिए केवल 13 बाइट्स को छोटा करने की आवश्यकता है। लेकिन ऐसा लगता है कि आपका उत्तर जावास्क्रिप्ट में सबसे कम संभव है
इस्माइल मिगुएल

1

PowerShell v2 +, 40 बाइट्स

'16,3,2,13
5,10,11,8
9,6,7,12
4,15,14,1'

एक शाब्दिक मल्टीलाइन स्ट्रिंग, पाइप लाइन पर छोड़ दिया। निहितार्थ के माध्यम से आउटपुट Write-Outputकार्यक्रम पूरा होने पर होता है। अच्छा और उबाऊ।


निर्मित संस्करण, 77 बाइट्स

'f21c59a7856b3dc0'-split'(....)'-ne''|%{([char[]]$_|%{"0x$_+1"|iex})-join','}

स्ट्रिंग लेता है, -splitयह हर चार तत्वों को देता है, उन पर लूप करता है, प्रत्येक को एक हेक्स में 0x$_जोड़ता है और जोड़ता है 1, पाइप को iex(कम Invoke-Expressionऔर इसी तरह के eval), फिर विभाजक के रूप -joinमें एक स्ट्रिंग में परिणाम को जोड़ते हैं ,। अंतर्निहित मुद्रण के साथ, पाइप लाइन पर चार तार आउटपुट करता है।


1

रूबी, 60 बाइट्स - पहला प्रयास

%w(f21c 49a7 856b 3ed0).map{|i|i.chars.map{|i|i.to_i(16)+1}}

रूबी, 45 बाइट्स - सस्ते

puts '16,3,2,13|5,10,11,8|9,6,7,12|4,15,14,1'


1

05AB1E , 15 बाइट्स

16Lœ•iPNÍš¯•è4ä

व्याख्या

16L              # range [1 ... 16]
   œ             # compute all permutations of the range
    •iPNÍš¯•è    # take the permutation at index 19800593106059
             4ä  # split the permutation into 4 parts

सूत्र के उपयोग से क्रमपरिवर्तन का सूचकांक पाया गया:

a*15! + b*14! + c*13!+ ... + o*1! + p*0!

जहां लक्ष्य सूची में प्रत्येक संख्या के लिए चर को उन मौजूदा तत्वों की संख्या से बदला जाता है जो वर्तमान सूचकांक में संख्या से छोटे हैं।
[16, 3, 2, 13, 5, 10, 11, 8, 9, 6, 7, 12, 4, 15, 14, 1]

क्रमपरिवर्तन के बाद हमारी मांग जो है
a=15, b=2, c=1, d=10, e=2, f=6, g=6, h=4, i=4, j=2, k=2, l=2, m=1, n=2 o=1, p=0

यह हमें सूत्र देता है: 15*15!+2*14!+1*13!+10*12!+2*11!+6*10!+6*9!+4*8!+4*7!+2*6!+2*5!+2*4!+1*3!+2*2!+1*1!+0*0!

जो के बराबर है 19800593106059


1

मतलाब, 38 35 बाइट्स

अनाम फ़ंक्शन:

@()['pcbm';'ejkh';'ifgl';'dnoa']-96

प्रत्यक्ष मुद्रण (38 बाइट्स):

disp(['pcbm';'ejkh';'ifgl';'dnoa']-96)

Matlab में पूर्णांक की एक सरणी का निर्माण करने का सबसे अच्छा तरीका हालांकि एक स्ट्रिंग है।


एक अनाम फ़ंक्शन का उपयोग करने से कुछ बाइट्स @()['pcbm';'ejkh';'ifgl';'dnoa']-96
बचती हैं

@LuisMendo मैंने ध्यान नहीं दिया कि वापसी मूल्य भी स्वीकार्य है, धन्यवाद!
पजाँक

1

स्काला, 52 बाइट्स

()=>Seq(15,4,8,3)map(x=>Seq(x,x^13,x^14,x^3)map(1+))

Ungolfed:

()=>
  Seq(15, 4, 8, 3)
  .map(x=>
    Seq(x, x^13, x^14, x^3)
    .map(1+)
  )

लेवल रिवर सेंट के माणिक जवाब से प्रेरित है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.