पाउली मैट्रिसेस को गुणा करें


12

पाउली मैट्रिक्स 2x2 मैट्रिक्स जो क्वांटम भौतिकी में बहुत सामान्य दिखाई देते हैं का एक सेट है (कोई, तो आप इस चुनौती के लिए किसी भी क्वांटम भौतिकी पता करने की जरूरत नहीं है)। यदि हम सेट में पहचान शामिल करते हैं, तो चार मैट्रेस हैं:

 σ0 =      σ1 =      σ2 =      σ3 = 
[1  0]    [0  1]    [0 -i]    [1  0]
[0  1]    [1  0]    [i  0]    [0 -1]

गुणा इनमें से दो हमेशा की तरह, एक और पाउली मैट्रिक्स दे देंगे, हालांकि यह जटिल चरणों में से एक से गुणा किया जा सकता है 1, i, -1, -i। उदाहरण के लिए, ।σ1σ3 = -iσ2

आपका काम कई पाउली मेट्रिसेस को गुणा करना और परिणामस्वरूप मैट्रिक्स और चरण को वापस करना है। मैट्रिक को दर्शाने के 0लिए अंकों के एक गैर-रिक्त स्ट्रिंग के रूप में इनपुट दिया जाएगा । आउटपुट एक स्ट्रिंग होना चाहिए जिसके परिणामस्वरूप मैट्रिक्स के लिए एक अंक हो, वैकल्पिक रूप से पूर्ववर्ती , या चरण को इंगित करने के लिए ( यह है )।3σ0σ3i--i--1

आप STDIN (या निकटतम विकल्प), कमांड-लाइन तर्क या फ़ंक्शन तर्क के माध्यम से इनपुट लेने और STDOUT (या निकटतम वैकल्पिक), फ़ंक्शन रिटर्न मान या फ़ंक्शन (आउट) पैरामीटर के माध्यम से परिणाम आउटपुट कर सकते हैं।

आपको पाउली मैट्रिसेस से संबंधित किसी भी अंतर्निहित (या 3-पार्टी) विशेषताओं का उपयोग नहीं करना चाहिए।

यह कोड गोल्फ है, सबसे छोटा उत्तर (बाइट्स में) जीतता है।

परीक्षण के मामलों

1 => 1
13 => -i2
000 => 0
123 => i0
03022 => 3
02132230 => -i3
1320130100032 => i2
311220321030322113103 => -2
0223202330203313021301011023230323 => -i0
1323130203022111323321112122313213130330103202032222223 => -1

3
मैंने अमूर्त-बीजगणित टैग जोड़ा है क्योंकि यह अनिवार्य रूप से सामान्यीकृत चतुर्भुज समूह में शब्दों के सरलीकरण के लिए कह रहा है ।
पीटर टेलर

जवाबों:


3

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

मुझे लगता है कि यह अभी भी गोल्फ है। लेकिन यह सीजेएम को बहुत हरा देता है।

p.U&-=T*q3l{[0bZ)^_1%-Zb3xbZmvdz@+c"i - -i")khT

इसे ऑनलाइन आज़माएँ: प्रदर्शन या टेस्ट सूट

व्याख्या

परिणामी मैट्रिक्स प्रकार का निर्धारण बस सभी नंबरों को प्राप्त करना है।

2 मेट्रिसेस को गुणा करते समय A*B, चरण बदलता है, यदि मैट्रिसेस का गैर है σ0और A != B

                                                 implicit: T=10, z=input string
                            mvdz                 evaluate each char of the input 
 .U                                              reduce: b=first value, for Y in mvdz[1:]
    -=T                                            T -= ...
        q3l{[0bZ)                                     (3 == len(set([0,b,Z])))
       *         ^_1%-Zb3                             * (-1)^((Z-b)%3)
   &                                               and
                         xbY                       update b by (b xor Y)
                                 +c"i - -i")k    the list ["i", "-", "-i", ""]
                                @            hT  take the element at index T+1 (modulo wrapping)
p                                                print phase and matrix

निश्चित रूप से मेरे पास 44 है अगर मैं उसी एल्गोरिथ्म का उपयोग करता हूं, जो अनिवार्य रूप से Sp300 का है।
ऑप्टिमाइज़र

9

पायथन 2, 108 89 87 86 बाइट्स

x=y=0
for m in map(int,raw_input()):x+=m*y and(m-y)%3*3/2;y^=m
print"--i"[~x%4::2]+`y`

(मदद के लिए @grc और @xnor को धन्यवाद)

व्याख्या

आइए गुणांक और आधार मैट्रिक्स को विभाजित करें। यदि हम केवल बेस मैट्रिक्स पर ध्यान केंद्रित करते हैं, तो हमें यह गुणन सारणी मिलती है (जैसे 13कि -i2, इसलिए हम डालते हैं 2):

  0123

0 0123
1 1032
2 2301
3 3210

जो सिर्फ बिटवाइज़ एक्सर करने के समान ही होता है।

अब हम गुणांक पर ध्यान केंद्रित करते हैं। यदि हम क्रमशः 0123निरूपित करते 1,i,-1,-iहैं, तो हम प्राप्त करते हैं:

  0123

0 0000
1 0031
2 0103
3 0310

इसके लिए हम पहले जाँचते हैं कि क्या या तो संख्या 0 है m*y, बाएँ स्तंभ और शीर्ष पंक्ति का ध्यान रखते हुए। (m-y)%3फिर जोड़ने में देता है:

  0123

0 0000
1 0021
2 0102
3 0210

जो करीब है, सिवाय इसके कि हमारे पास 2है 3। हम प्रदर्शन करके इसके लिए जिम्मेदार हैं *3/2

अनुक्रमण के लिए, हम देखते हैं कि यदि हम स्ट्रिंग लेते हैं "--i"और 0123हमें प्राप्त होने वाले सूचकांकों से शुरू होने वाले प्रत्येक दूसरे वर्ण का चयन करते हैं "-i","-","i",""


अच्छा स्ट्रिंग टुकड़ा करना, मैं इस बारे में भूल गया था । मैं आप कर सकते हैं का मानना है 3-n%4के रूप में ~n%4। मुझे संदेह है कि आप m*y and(m-y)%3*3/2एक जादू स्ट्रिंग में कम व्यक्त कर सकते हैं , लेकिन मेरा पहला प्रयास 877449216>>2*m+8*yकेवल बंधा हुआ है। वहाँ भी एक सुंदर बीजगणितीय सूत्र है, कि अगर Y=m^y, अभिव्यक्ति है (m-y)*(y-Y)*(Y-m)/2, लेकिन यह लंबा है।
xnor

@ एक्सनोर ओह ~, अच्छा - ऑफ-बाय-वन मुझे परेशान कर रहा था: / मुझे पूरा यकीन है कि m*y and(m-y)%3*3/2इसे भी छोटा किया जा सकता है, लेकिन मैंने पूरी रात बिताई और कहीं नहीं मिली ... अगर मैं इसे वापस आऊंगा समय है। शायद यह तथ्य कि मेरे पास स्वतंत्रता मॉड 4 है, मदद कर सकता है।
Sp3000

6

रेटिना , 77 बाइट्स

मुझे लगा कि मैं इस अवसर का उपयोग एक नई रेटिना सुविधा को दिखाने के लिए करूंगा: मल्टी-स्टेज लूप्स। यह कई कार्यों को काफी कम कर देना चाहिए (विशेषकर सशर्त प्रतिस्थापन)।

ii
-
+`(.)\1|0

(.)-|(\d)(\d)
-$1$3$2
12
i3
23
i1
31
i2
)`(\d)i
i$1
^\D*$
$&0

रेटिना मेरी खुद की रेगेक्स-आधारित प्रोग्रामिंग भाषा है। स्रोत कोड को चरणों में बांटा जा सकता है: प्रत्येक चरण में दो रेखाएं होती हैं, जहां पहले में रेगेक्स (और संभवतः कुछ कॉन्फ़िगरेशन) होता है और दूसरी पंक्ति प्रतिस्थापन स्ट्रिंग होती है। चरणों को तब क्रम में STDIN पर लागू किया जाता है और अंतिम परिणाम STDOUT में मुद्रित किया जाता है।

आप -sकमांड-लाइन स्विच के साथ एक स्रोत फ़ाइल के रूप में सीधे ऊपर का उपयोग कर सकते हैं । हालाँकि, मैं स्विच की गिनती नहीं कर रहा हूँ, क्योंकि आप प्रत्येक पंक्ति को एक अलग फ़ाइल में भी डाल सकते हैं (तब आप नई सुर्खियों के लिए 15 बाइट खो देते हैं, लेकिन अतिरिक्त फ़ाइलों के लिए +15 जोड़ सकते हैं)।

व्याख्या

इस समाधान के बारे में नई बात )प्रचलित अवस्था में है। यह एक मल्टी-स्टेज लूप बंद करता है। कोई मेल नहीं है (, जिसका अर्थ है कि लूप स्पष्ट रूप से पहले चरण में शुरू होता है। इसलिए, पहले 7 चरणों को दोहराया जाता है जब तक कि उनमें से सभी 7 के माध्यम से एक पूर्ण पास परिणाम को बदलना बंद कर देता है। ये 7 चरण बस विभिन्न परिवर्तनों का प्रदर्शन करते हैं जो धीरे-धीरे स्ट्रिंग में मैट्रिक्स की संख्या को कम करते हैं और चरणों को जोड़ते हैं। एक बार जब हम अंतिम परिणाम पर पहुंच जाते हैं, तो सात में से कोई भी पैटर्न किसी भी अधिक से मेल नहीं खाता है और लूप समाप्त होता है। बाद में, हम 0 को जोड़ते हैं यदि परिणाम में अभी तक कोई अंक नहीं है (जैसा कि उपर्युक्त चरणों के परिणाम सहित सभी पहचानों को छोड़ देते हैं)।

यहाँ व्यक्तिगत चरण क्या है:

ii
-

के सभी जोड़े को जोड़ती iमें -चरण पात्रों को कम।

+`(.)\1|0
<empty>

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

(.)-|(\d)(\d)
-$1$3$2

यह वास्तव में एक (गोल्फ के लिए) में दो अलग-अलग रूपांतरण हैं। ध्यान दें कि यदि पहला वैकल्पिक मैच, $2और $3खाली हैं, और यदि दूसरा एक मैच $1खाली है। तो यह इन दो चरणों में विघटित हो सकता है:

(\d)(\d)
-$2$1

यह सिर्फ अंकों के सभी जोड़े को स्वैप करता है और एक ऋण चिह्न जोड़ता है। जब से हम सभी को हटा दिया 0है और सभी में समान जोड़े, यह केवल से मेल खाएगी 12, 23, 31, 21, 32, 13। यह कदम अजीब लग सकता है, लेकिन यह मुझे बाद में इनमें से आधे मामलों की जांच करने की अनुमति देता है, क्योंकि जिन्हें मैं संसाधित नहीं कर सकता, उन्हें अगले पुनरावृत्ति में यहां स्वैप किया जाएगा।

उपरोक्त चरण का अन्य भाग था:

(.)-
-$1

यह धीरे-धीरे -सभी मार्गों को बाईं ओर ले जाता है (पुनरावृत्ति की एक स्थिति)। मैं ऐसा करता हूं कि अंततः वे एक दूसरे के बगल में हैं और पहले चरण में हल हो जाते हैं।

12
i3
23
i1
31
i2

ये तीन चरण अब केवल तीन जोड़ी उत्पादों को हल करते हैं। जैसा कि मैंने ऊपर कहा, यह केवल प्रासंगिक मामलों में से आधे को पकड़ लेगा, लेकिन अगले चरण में अन्य आधे को ध्यान में रखा जाएगा, पिछले चरण में सभी जोड़े को अदला-बदली के बाद।

)`(\d)i
i$1

यह लूप का अंतिम चरण है। यह एक के समान है -जो बाईं ओर शिफ्ट होता है, सिवाय इसके i। मुख्य अंतर यह है कि यह iकेवल अंकों के साथ स्वैप होता है। अगर मैं (.)iउन मामलों में उपयोग करता हूं, जहां मुझे एक -iया i-दो मिलते हैं , तो उन्हें अनिश्चित काल के लिए स्वैप किया जाएगा और कार्यक्रम समाप्त नहीं होगा। तो यह केवल उन्हें -संकेतों के दाईं ओर स्वैप करता है । यह पर्याप्त है - जब तक सभी -और iकिसी बिंदु पर एक साथ दिखाई देते हैं, उन्हें सही ढंग से हल किया जा सकता है।

^\D*$
$&0

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

एक उदाहरण के रूप में, यहां सभी मध्यवर्ती रूप हैं 0223202330203313021301011023230323(लंघन चरणों में जो कोई परिवर्तन नहीं करते हैं):

0223202330203313021301011023230323

321321312        # Remove identities
-23-31-12-132    # Swap all pairs
-23-31-i3-132    # Resolve 12
-i1-31-i3-132    # Resolve 23
-i1-i2-i3-132    # Resolve 31
-i-1i-2i-3-312   # Move - to the left and swap pairs
-i-1i-2i-3-3i3   # Resolve 12
-i-i1-i2-3-i33   # Move i to the left
-i-i1-i2-3-i     # Remove identities
--ii-1i-2-3i     # Move - to the left
--ii-i1-2-i3     # Move i to the left
----i1-2-i3      # Resolve ii
i1-2-i3          # Remove identities
i-1-2i3          # Move - to the left
i-1-i23          # Move i to the left
-i-1i-32         # Move - to the left and swap pairs
-i-i1-32         # Move i to the left
--ii-1-23        # Move - to the left and swap pairs
--ii-1-i1        # Resolve 23
----1-i1         # Resolve ii
1-i1             # Remove identities
-1i1             # Move - to the left
-i11             # Move i to the left
-i               # Remove identities. Now the loop can't change this any longer.
-i0              # Fix the result by adding in the 0.

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