संख्याओं को जोड़ना और गुणा करना


16

विभाजन जटिल संख्याओं , जिसे "हक्का-बक्का संख्या" के रूप में जाना जटिल संख्याओं के समान हैं। i^2 = -1हालांकि, इसके बजाय , हमारे पास है j^2 = 1; j != +/-1। प्रत्येक संख्या का रूप लेता है z = x + j*y

इस चुनौती की जटिलता को सीमित करने के एक प्रयास में, मैं प्रतीक -का उपयोग नकारात्मकता का प्रतिनिधित्व करने के लिए करूंगा, क्योंकि इसमें कोई घटाव नहीं होगा।

आपके आनंद को देखने के लिए यहां कुछ उदाहरण दिए गए हैं:

6 * 9 = 54            // real numbers still act normally
5 + -7 = -2
j*1 + j*1 = j*2           // two `j`s added together make a j*2
7 * j*1 = j*7           // multiplication is commutative & associative
j*1 + 2 = 2+j*1           // like oil and water, "combine" to form a split-complex number
j*1 + j*-3 = j*-2          // seems okay so far
j*j*1 = j*-1*j*-1 = 1     // kinda sketchy, but such is its inherent nature
j*j*-1 = j*-1*j*1 = -1  
(2+j*3)+(4+j*7) = 6+j*10  // combine like terms
7 * (2+j*3) = 14+j*21 // distributive property
j * (2+j*3) = (j*2) + (j*j*3) = 3+j*2   // since j^2 = 1, multiplying my j "swaps" the coefficients
(2+j*3)*(4+j*7) = (2*4)+(2*j*7)+(j*3*4)+(j*3*j*7) = 8+j*14+j*12+21 = 29+j*26 // a complete multiplication

चुनौती

इस चुनौती का लक्ष्य विभाजन-जटिल संख्याओं के साथ एक अभिव्यक्ति का मूल्यांकन करना है।

यह कोड-गोल्फ है, सबसे कम बाइट्स जीतता है।

इनपुट

इनपुट एक सिंगल लाइन होगी जिसमें केवल वैकल्पिक न्यूलाइन के साथ केवल प्रतीक +*()-, अंक 0123456789और पत्र होंगे j। यह स्ट्रिंग एक अभिव्यक्ति का प्रतिनिधित्व करती है, infix संकेतन और ऑपरेटर पूर्वता (कोष्ठक के साथ जोड़ से पहले गुणा) का उपयोग करते हुए।

  • प्रतीक -हमेशा उपेक्षा का प्रतिनिधित्व करेगा, कभी घटाव नहीं। यदि आप चाहते हैं, तो आप या -तो_~ आसानी से I / O की जगह ले सकते हैं
  • समूहन को निरूपित करने के लिए कोष्ठक को तीन बार तक घोंसला बनाया जा सकता है: (1+(1+(1)))
  • पत्र jकभी भी नकारात्मकता के साथ सीधे उपसर्ग नहीं होगा, और हमेशा उसके बाद होगा *
  • कोष्ठक नकारात्मकता से पहले नहीं होगा -(7), बल्कि इसके बजाय-1*(j*5+2)
  • कभी भी निहितार्थ नहीं होंगे। सभी गुणा के रूप में व्यक्त किया जाएगा (7)*7के बजाय (7)7, और के रूप में j*5के बजाय j5
  • कोई अग्रणी शून्य नहीं।

उत्पादन

आउटपुट के रूप में होगा X+j*Y, जहां एक्स और वाई कोई भी पूर्णांक हो सकता है। यदि एक पूर्णांक ऋणात्मक है, तो इसे ऋण चिन्ह के साथ उपसर्ग करना चाहिए।

अतिरिक्त प्रतिबंध

यद्यपि मुझे देशी समर्थन के साथ किसी भी भाषा के बारे में पता नहीं है, अंतर्निहित विभाजन से निपटने के लिए बिल्ट-इन निषिद्ध हैं। नियमित जटिल संख्याएं निष्पक्ष खेल हैं।

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

उपर्युक्त उदाहरणों के समान ही, लेकिन यह स्पष्ट है। एक लाइन पर इनपुट और नीचे की लाइन आउटपुट।

(2+j*3)+(4+j*7)
6+j*10

(2+j*3)*(4+j*7)
29+j*26

(-5+j*1+j*2+2)*(4+j*7)
9+j*-9

(1+j*-1)*(1+j*1)
0+j*0 // this is why division does not exist.

j*((j*-1)+2)
-1+j*2

(2+(5+-1*(j*1))+2)
9+j*-1

जवाबों:


13

पायथन 2, 62 बाइट्स

def f(s):b,a=[eval(s)/2.for j in-1,1];print'%d+j*%d'%(a+b,a-b)

हम तो बस अभिव्यक्ति का मूल्यांकन sके साथ j=1और j=-1, और उत्पादन अपने आधे राशि और के गुणांक के रूप में उनके आधे अंतर 1और j

यह काम करता है, क्योंकि दोनों j=1और j=-1परिभाषित करने समीकरण को परिभाषित समीकरण को संतुष्ट j*j==1। इसलिए, मूल और सरलीकृत अभिव्यक्ति इन दोनों मूल्यों के लिए समान होनी चाहिए। सरलीकृत अभिव्यक्ति रैखिक है, इसलिए यह दो अज्ञात में दो रैखिक समीकरण देता है:

x + 1*y  = s(1)  = 2*a
x - 1*y  = s(-1) = 2*b

जिसके द्वारा हल किया जाता है x=a+b, y=a-b


मैट्रिक्स ऑपरेशन वाली एक भाषा भी अभिव्यक्ति का मूल्यांकन कर सकती है j=[0 1; 1 0]और शीर्ष पंक्ति से गुणांक को पढ़ सकती है।
xnor

2

अजगर 2, 258

class c(complex):__mul__=lambda s,o:c(s.real*o.real+s.imag*o.imag,s.real*o.imag+s.imag*o.real);__add__=lambda s,o:c(sum(map(complex,[s,o])))
import re
r=eval(re.sub("j","c(0,1)",re.sub(r"(-?\d+)",r"c(\1)",raw_input())))
print`int(r.real)`+"+j*"+`int(r.imag)`

यह शायद सबसे अच्छा दृष्टिकोण नहीं है, लेकिन यह पहली बार था कि ओओपी कोड गोल्फ के लिए पायथन में एक निष्क्रिय विचार की तरह लग रहा था, तो क्यों नहीं?

एक वर्ग बनाता है cजो जटिल से विरासत में मिला है लेकिन एक अलग mulऑपरेशन है। addआपरेशन भी इतना है कि यह प्रकार का ऑब्जेक्ट देता है बदल गया है cऔर नहीं complex, इस व्यवहार के मामले रोकने के लिए आवश्यक है (a + b) * (c + d)इस विशेष प्रकार के बजाय जटिल गुणा कर।

इनपुट स्ट्रिंग को तब स्ट्रिंग में परिवर्तित किया जाता है जिसका मूल्यांकन स्वाभाविक रूप से अजगर द्वारा किया जा सकता है। यह हर संख्या को c(number)और फिर हर jमें बदलकर ऐसा करता है c(0,1)

इसे ऑनलाइन आज़माएं या टेस्ट सूट चलाएं


1

जीएपी , 38 बाइट्स

j:=X(Integers,"j");f:=t->t mod(j^2-1);

पहले jएक अनिश्चितता के रूप में परिभाषित किया गया है, इसलिए हम बहुपद बना सकते हैं j। संबंधित समान संख्या प्राप्त करने के लिए, हम (यानी बहुपद के शेष भाग को लेते हैं) घटाते हैं j^2-1। यह एक रैखिक (या स्थिर) शब्द देता है, और हम GAP की बहुपद उत्पादन करने की क्षमता पर भरोसा कर सकते हैं।

उदाहरण:

gap> f((2+j*3)+(4+j*7));
10*j+6
gap> f((1+j*-1)*(1+j*1));
0

कैविएट: 1. यह इनपुट के रूप में एक स्ट्रिंग नहीं लेता है, लेकिन जीएपी की भाषा में एक वास्तविक शब्द है। ठीक करने के लिए, मैं उपयोग कर सकता हूं EvalString। 2. आउटपुट अच्छा और स्पष्ट है, लेकिन बिल्कुल निर्दिष्ट नहीं है: ऑर्डर बदल दिया जाता है, और अनावश्यक शून्य दबा दिए जाते हैं। मुझे लगता है और उम्मीद है कि यह अभी भी चुनौती की भावना में है, अन्यथा मुझे लगता है कि मैं @ xnor के मैट्रिक्स दृष्टिकोण का उपयोग करना बेहतर होगा।


1
गणितज्ञ के PolynomialMod[#,j^2-1]&समान गुण हैं। वास्तव में, यदि हमने कभी भी दो से अधिक पेप्लेक्स संख्याओं को एक साथ गुणा नहीं किया है (जैसे परीक्षण के मामले नहीं), तो Expand@#/.j^2->1पर्याप्त है।
ग्रेग मार्टिन

इसी तरह, t->t%(j^2-1)परी / जीपी में।
एलेफल्फा

1

Axiom, 20 42 बाइट्स

f(x,n)==x^(n rem 2);m:=rule('j^n==f('j,n))

पूर्ववर्ती समाधान में एक समस्या है n<0, j^n लेकिन अगर यह अधिक ठोस लगता है, और अच्छी तरह से सलाह दें कि कुछ गड़बड़ है, भले ही पूर्णता उदाहरण के लिए वापस आ जाएगी j ^ 1.2 या j ^ sqrt (-1) एक ही अभिव्यक्ति का मूल्यांकन न करें

(9) -> f(x,n)==x^(n rem 2);m:=rule('j^n==f('j,n))
         n
   (9)  j  == 'f(j,n)
                    Type: RewriteRule(Integer,Integer,Expression Integer)
(10) -> [m((2+j*3)+(4+j*7)), m((2+j*3)*(4+j*7)), m((-5+j*1+j*2+2)*(4+j*7))]
   (10)  [10j + 6,26j + 29,- 9j + 9]
                                            Type: List Expression Integer
(11) -> [m((1+j*-1)*(1+j*1)), m(j*((j*-1)+2)), m(2+(5+-1*(j*1))+2)]
   (11)  [0,2j - 1,- j + 9]
                                            Type: List Expression Integer
(12) -> [m(j*j*j*j),m(j*j*j),m(j^200)]
   (12)  [1,j,1]
                                            Type: List Expression Integer
(13) -> [m(j^0),m(j^-1),m(j^-2), m(j^-3)]
            1   1
   (13)  [1,-,1,-]
            j   j
                                            Type: List Expression Integer
(14) -> m(j^(3.4))
   There are no library operations named m
      Use HyperDoc Browse or issue

यदि मैं प्रश्न के कुछ कानून का पालन नहीं करता हूं: तो मुझे कहें कि और मैं "प्रतिस्पर्धी नहीं" जोड़ता हूं। मेरा मतलब है कि सूत्र को सरल बनाने के लिए यह एक स्वयंसिद्ध है


0

बैच, 52 बाइट्स

@set/aj=1,a=%1,j=-1,a-=b=(a-(%1))/2
@echo %a%+j*%b%

@ Xnor का उत्कृष्ट उत्तर नामांकन देखने के बाद मैंने इसे पोर्ट करने के लिए मजबूर महसूस किया।

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