fork(1) download
  1. # -*- coding: utf-8 -*-
  2.  
  3. import re
  4. from fractions import Fraction
  5.  
  6. wyrazenie= re.compile( "{ *(-? *[0-9]*|\( *-? *[0-9]+ */ *-? *[0-9]+ *\)) *x *\+ *(-? *[0-9]*|\( *-? *[0-9]+ */ *-? *[0-9]+ *\)) *y *= *(-? *[0-9]+|-? *[0-9]+ */ *-? *[0-9]+) *$" )
  7.  
  8. def liczba_wymierna( napis ):
  9. if napis == "":
  10. return Fraction(1,1)
  11. if '/' in napis:
  12. a,b = map(int,napis.replace('(','').replace(')','').split('/'))
  13. if b == 0:
  14. raise RuntimeError, napis + " nie jest poprawną liczbą wymierną!"
  15. return Fraction(a,b)
  16. return Fraction(int(napis),1)
  17.  
  18. def rownanie( linia ):
  19. r = wyrazenie.match( linia )
  20. if not r:
  21. raise RuntimeError, "Wyrażenie " + repr(linia) + " jest niepoprawne!"
  22. return map( liczba_wymierna, r.groups() )
  23.  
  24. def rozwiarz( r1, r2 ):
  25. a1,b1,c1 = r1
  26. a2,b2,c2 = r2
  27.  
  28. w = a1*b2 - b1*a2
  29. w1 = c1*b2 - b1*c2
  30. w2 = a1*c2 - c1*a2
  31.  
  32. if w == 0:
  33. if w1 == 0 and w2 == 0:
  34. raise RuntimeError, "Rownanie ma nieskończenie wiele roziwązań!"
  35. else:
  36. raise RuntimeError, "Rownanie jest nieoznaczone!"
  37.  
  38. return w1/w, w2/w
  39.  
  40.  
  41. x,y = rozwiarz( rownanie( raw_input() ), rownanie( raw_input() ) )
  42.  
  43. def napis_liczby_wymiernej( f ):
  44. if f.denominator == 1:
  45. return str(f.numerator)
  46. return str(f.numerator)+'/'+str(f.denominator)
  47.  
  48. print "x= ", napis_liczby_wymiernej(x)
  49. print "y= ", napis_liczby_wymiernej(y)
  50.  
Success #stdin #stdout 0.08s 12440KB
stdin
{ (-1/3)x+(3/7)y= 1337/17
{ (2/3)x + (5/7)y = -666/13
stdout
x=  -362613/2431
y=  164080/2431