বিভ্রান্তিকর সংখ্যাগুলি যোগ করুন এবং গুণ করুন


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এবং অক্ষর থাকবে janচ্ছিক নতুনলাইন। এই স্ট্রিংটি ইনফিক্স নোটেশন এবং অপারেটর অগ্রাধিকার (প্রথম সংখ্যার সাথে প্রথম বন্ধনী সহ) ব্যবহার করে একটি অভিব্যক্তি উপস্থাপন করে।

  • প্রতীক -সর্বদা প্রত্যাখ্যান, কখনও বিয়োগকে উপস্থাপন করবে। আপনি যদি ইচ্ছা করেন তবে আপনি নিজের -সাথে প্রতিস্থাপন করতে পারেন _বা~ 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> f((2+j*3)+(4+j*7));
10*j+6
gap> f((1+j*-1)*(1+j*1));
0

ক্যাভেট: ১. এটি ইনপুট হিসাবে স্ট্রিং নেয় না, তবে জিএপি-র ভাষায় একটি আসল পদ। ঠিক করার জন্য, আমি ব্যবহার করতে পারি EvalString। ২. আউটপুটটি সুন্দর এবং পরিষ্কার, তবে ঠিক যেমনটি নির্দিষ্ট করা যায় না: ক্রম পরিবর্তন করা হয় এবং অপ্রয়োজনীয় শূন্যগুলি দমন করা হয়। আমি মনে করি এবং আশা করি এটি এখনও চ্যালেঞ্জের চেতনায় রয়েছে, অন্যথায় আমি অনুমান করি যে @ xnor এর ম্যাট্রিক্স পদ্ধতির ব্যবহার থেকে আমি আরও ভাল থাকব।


1
গণিতেরও PolynomialMod[#,j^2-1]&একই বৈশিষ্ট্য রয়েছে। প্রকৃতপক্ষে, যদি আমরা কখনই দু'জনের চেয়ে বেশি সংখ্যক জটিল সংখ্যাকে একসাথে গুণিত করি না (যেমন পরীক্ষার কেসগুলি না করে), তবে Expand@#/.j^2->1যথেষ্ট।
গ্রেগ মার্টিন

একইভাবে t->t%(j^2-1)পরী / জিপিতে।
আলেফাল্ফ

1

অ্যাক্সিয়াম, 20 42 বাইট

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

পূর্ববর্তী সমাধান যদি একটি সমস্যা আছে n<0মধ্যে j^n কিন্তু এই এটি আরো কঠিন বলে মনে হয় এবং পরামর্শ ভাল যেখানে কিছু অস্বাভাবিক হয়, এমনকি যদি পরিপূর্ণতা আগমন উদাহরণ ঞ ^ 1.2 বা ঞ হবে ^ 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 এর উত্তরের উত্তর নমুনা দেখার পরে আমি এটি বন্দর করতে বাধ্য হলাম।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.