আসকি শিল্প সমীকরণ ভিজ্যুয়ালাইজার


10

ভাল সমীকরণ সম্পাদকের অভাবে সমীকরণের সাথে লেনদেন করা অগোছালো এবং অপ্রীতিকর। উদাহরণস্বরূপ, আমি যদি একটি অবিচ্ছেদ্য এবং এর সমাধান প্রকাশ করতে চাইতাম তবে এটি দেখতে এরকম কিছু হতে পারে:

ইন্টিগ্রাল [x ^ 3 ই ^ (- এমএক্স ^ 2 বি / 2), ডিএক্স] = - ((2 + বি এম x ^ 2) / (বি ^ 2 * ই ^ ((বি এম এক্স ^ 2) / 2) * মি ^ 2))

ইন্টিগ্রাল.ওল্ফ্রাম.কম এ একে "ইনপুট ফর্ম" বলা হয়। "ইনপুট ফর্ম" এ কোনও সমীকরণ দেখতে কারও পছন্দ হয় না। এই সমীকরণটি দেখার আদর্শ উপায় হ'ল:

এখানে চিত্র বর্ণনা লিখুন

(ওল্ফ্রাম এটিকে "traditionalতিহ্যবাহী রূপ" বলেছেন)

এই কোডগল্ফের জন্য, এমন একটি প্রোগ্রাম লিখুন যা "ইনপুট ফর্ম" এ ইনপুট হিসাবে কিছু সমীকরণ নেবে এবং সেই সমীকরণটিকে "traditionalতিহ্যবাহী ফর্ম" এর ascii উপস্থাপনায় কল্পনা করবে। সুতরাং, এই উদাহরণের জন্য আমরা এর মতো কিছু পেতে পারি:

       /\      3
       |      x
       | ------------  dx = 
       |       2
      \/   (m x  b)/2
          e

              2
     2 + b m x
-(-----------------)
            2
   2  (b m x )/2  2
  b  e           m

প্রয়োজনীয়তা:

  1. কোনওভাবেই ইনপুট পরিবর্তন, সরলকরণ বা পুনর্বিন্যাস করবেন না। একে একে একই আকারে রেন্ডার করুন এটি ইনপুট দ্বারা বর্ণিত হয়েছিল।
  2. চারটি বেসিক গাণিতিক ক্রিয়াকলাপ সমর্থন করুন (+, -, *, /)। দুটি সংলগ্ন সংখ্যার গুণ না করার সময় * চিহ্নটি অন্তর্ভুক্ত এবং বাদ দেওয়া উচিত।
  3. সংহতকরণের জন্য সমর্থন (উপরে উদাহরণে প্রদর্শিত হিসাবে) প্রয়োজন হয় না । ইন্টিগ্রেট [...] বা স্কয়ার্ট [...] এর মতো ফাংশনগুলির সাথে ইনপুট সমর্থন করতে সক্ষম হওয়া একটি বোনাস।
  4. সমর্থন উদাহরণগুলি উপরে উদাহরণ হিসাবে দেখানো হয়েছে (নবম মূলটি 1 / nth শক্তি বাড়িয়ে মডেল করা যেতে পারে)।
  5. অপ্রয়োজনীয় প্রথম বন্ধনী (উপরের উদাহরণে বৃহত্তর ভগ্নাংশের ডোনোমেনেটর এবং সংখ্যকের চারপাশের মতো) বাদ দেওয়া উচিত।
  6. ভগ্নাংশের ডিনোমিনেটর এবং অঙ্কগুলিতে প্রকাশটি অনুভূমিক বিভাজন রেখার উপরে এবং নীচে হওয়া উচিত।
  7. সমান চিহ্নের পরে কোনও নতুন লাইন শুরু করবেন কিনা তা আপনি চয়ন করতে পারেন। উপরের উদাহরণে, একটি নতুন লাইন শুরু হয়েছে।
  8. ক্রমের ক্রম অবশ্যই ইনপুটে যেমন হয় ঠিক তেমনই হতে পারে।

আপনার সমাধানটি পরীক্ষার জন্য ইনপুট এবং সম্পর্কিত আউটপুটের কয়েকটি উদাহরণ:

ইনপুট:

1/2 + 1/3 + 1/4

আউটপুট:

1   1   1
- + - + -
2   3   4

ইনপুট:

3x^2 / 2 + x^3^3

আউটপুট:

   2     3
3 x     3
---- + x   
 2

ইনপুট:

(2 / x) / (5 / 4^2)

আউটপুট:

2
-
x
--
5
--
 2
4

ইনপুট:

(3x^2)^(1/2)

আউটপুট:

    2 1/2
(3 x )

আপনার প্রশ্নের সাধারণত কোন ধরণের প্রতিযোগিতা তা প্রকাশ করে একটি ট্যাগ থাকা উচিত। আমি একটি যুক্ত করার স্বাধীনতা নিয়েছি কারণ আপনি পাঠ্যে "কোডগল্ফ" বলেছিলেন।
ডিএমকেকে --- প্রাক্তন মডারেটর বিড়ালছানা

3
কোড-গল্ফ হতে এই সমস্যাটি খুব নীচু। কোন কনস্ট্রাক্টসকে অবশ্যই সমর্থন করা উচিত, বা কী দেখতে তাদের দেখতে হবে তা আপনি বলবেন না। কেবলমাত্র +, -, *, এবং / যথেষ্ট সমর্থন করে? সিগমা কি সমর্থন করতে হবে? গ্রীক অক্ষর সম্পর্কে কি? আপনি যেমন প্রশ্ন করেছেন প্রশ্নের সম্ভাব্য সমাধানগুলি কোড-দৈর্ঘ্যের সাথে তুলনা করার জন্য কার্যকারিতাটিতে অনেক বেশি বৈচিত্রময় হতে পারে।
এমটিএনভিউমার্ক

@ ম্যাটনভিউমার্ক, আমি কিছু "প্রয়োজনীয়তা" যুক্ত করেছি ... গল্ফটি এখন আরও ভাল কিনা তা আমাকে জানান।
অমি

@ আমি - হ্যাঁ, অনেক
এমটিএনভিউমার্ক

আমি এমটিএনভিউমার্কের সাথে একমত, এটি খুব খোলা শেষ এবং অস্পষ্ট বলে মনে হচ্ছে। গল্ফিংয়ের উদ্দেশ্যে আপনি ইনপুট এবং আউটপুটকে টেস্টকেসগুলির একটি ভাল সংজ্ঞায়িত সেটটিতে সীমাবদ্ধ করা ভাল be আপনি একটি রেফারেন্স বাস্তবায়ন করেছেন?
gnibbler

উত্তর:


10

পাইথন 2, 1666 অক্ষর

লেআউটটি আসলে বেশ সহজ - এটি একটি রাজকীয় বেদনার ইনপুটটির বিশ্লেষণ। আমি এখনও নিশ্চিত না যে এটি সম্পূর্ণরূপে সঠিক।

import re,shlex
s=' '
R=range

# Tokenize.  The regex is because shlex doesn't treat 3x and x3 as two separate tokens.  The regex jams a space in between.                                                 
r=r'\1 \2'
f=re.sub
x=shlex.shlex(f('([^\d])(\d)',r,f('(\d)([^\d])',r,raw_input())))
T=[s]
while T[-1]:T+=[x.get_token()]
T[-1]=s

# convert implicit * to explicit *                                                                                                                                          
i=1
while T[i:]:
 if(T[i-1].isalnum()or T[i-1]in')]')and(T[i].isalnum()or T[i]in'('):T=T[:i]+['*']+T[i:]
 i+=1

# detect unary -, replace with !                                                                                                                                            
for i in R(len(T)):
 if T[i]=='-'and T[i-1]in'=+-*/^![( ':T[i]='!'
print T

# parse expression: returns tuple of op and args (if any)                                                                                                                   
B={'=':1,',':2,'+':3,'-':3,'*':4,'/':4,'^':5}
def P(t):
 d,m=0,9
 for i in R(len(t)):
  c=t[i];d+=c in'([';d-=c in')]'
  if d==0and c in B and(B[c]<m or m==B[c]and'^'!=c):m=B[c];r=(c,P(t[:i]),P(t[i+1:]))
 if m<9:return r
 if'!'==t[0]:return('!',P(t[1:]))
 if'('==t[0]:return P(t[1:-1])
 if'I'==t[0][0]:return('I',P(t[2:-1]))
 return(t[0],)

# parenthesize a layout                                                                                                                                                     
def S(x):
 A,a,b,c=x
 if b>1:A=['/'+A[0]+'\\']+['|'+A[i]+'|'for i in R(1,b-1)]+['\\'+A[-1]+'/']
 else:A=['('+A[0]+')']
 return[A,a+2,b,c]

# layout a parsed expression.  Returns array of strings (one for each line), width, height, centerline                                                                      
def L(z):
 p,g=z[0],map(L,z[1:])
 if p=='*':
  if z[1][0]in'+-':g[0]=S(g[0])
  if z[2][0]in'+-':g[1]=S(g[1])
 if p=='^'and z[1][0]in'+-*/^!':g[0]=S(g[0])
 if g:(A,a,b,c)=g[0]
 if g[1:]:(D,d,e,f)=g[1]
 if p in'-+*=,':
  C=max(c,f);E=max(b-c,e-f);F=C+E;U=[s+s+s]*F;U[C]=s+p+s;V=3
  if p in'*,':U=[s]*F;V=1
  return([x+u+y for x,u,y in zip((C-c)*[s*a]+A+(E-b+c)*[s*a],U,(C-f)*[s*d]+D+(E-e+f)*[s*d])],a+d+V,F,C)
 if'^'==p:return([s*a+x for x in D]+[x+s*d for x in A],a+d,b+e,c+e)
 if'/'==p:w=max(a,d);return([(w-a+1)/2*s+x+(w-a)/2*s for x in A]+['-'*w]+[(w-d+1)/2*s+x+(w-d)/2*s for x in D],w,b+e+1,b)
 if'!'==p:return([' -  '[i==c::2]+A[i]for i in R(b)],a+2,b,c)
 if'I'==p:h=max(3,b);A=(h-b)/2*[s*a]+A+(h-b+1)/2*[s*a];return(['  \\/|/\\  '[(i>0)+(i==h-1)::3]+A[i]for i in R(h)],a+3,h,h/2)
 return([p],len(p),1,0)

print'\n'.join(L(P(T[1:-1]))[0])

প্রশ্নের বড় ইনপুটটির জন্য, আমি পেয়েছি:

 /\         2                     2 
 |     - m x  b          2 + b m x  
 |     --------    = - -------------
 |  3      2                    2   
\/ x  e         dx         b m x    
                           ------   
                        2     2    2
                       b  e       m 

এখানে আরও কয়েকটি জটিল পরীক্ষার মামলা রয়েছে:

I:(2^3)^4
O:    4
  / 3\ 
  \2 / 

I:(2(3+4)5)^6
O:             6
  (2 (3 + 4) 5) 

I:x Integral[x^2,dx] y
O:   /\ 2     
  x  | x  dx y
    \/        

I:(-x)^y
O:     y
  (- x) 

I:-x^y
O:     y
  (- x)

শেষটিটি ভুল, পার্সারে কিছু অগ্রাধিকার ত্রুটি।


ইন্টিগ্রালের পরে অখণ্ড আর্গুমেন্টের বেসলাইনটি ভার্চুয়ালভাবে কেন্দ্রীভূত হওয়া উচিত নয়? বর্তমানে এটি ইন্টিগ্রালের সাবস্ক্রিপ্টের মতো আরও বেশি দেখাচ্ছে।
জো

পরিবর্তন করা শক্ত নয়, তবে এটি কিছু জায়গা নষ্ট করবে। আমি বর্তমানে অবিচ্ছেদ্য চিহ্নটি এটির যুক্তি ছড়িয়ে দিতে যথেষ্ট বড় করে তুলছি (একটি 3 উচ্চতম ন্যূনতম সহ)।
কিথ র্যান্ডাল

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